公式サンプル電卓の計算について
kg 2018/03/25(Sun) 07:38
公式のサンプルプログラムにある電卓に突いて質問なんですが、
# include <Siv3D.hpp>
void Main()
{
Graphics::SetBackground(Color(240));
const Font font(40);
String expression;
while (System::Update())
{
Input::GetCharsHelper(expression);
font(expression).draw(10, 10, Palette::Black);
if (const auto result = EvaluateOpt(expression))
{
font(result.value()).draw(10, 250, Palette::Black);
}
}
}
このコードのどこで計算しているのでしょうか?
勝手に答えを求めて表示してくれると思うのですが、答えがある桁を超えると変な答えになってしまうので
出た答えを数値として判定し、ある数値を越えて無ければ表示、ということをしたいのですが
計算結果を別の変数に代入して、それはまだ文字だと思うのでそれを数値に変換し
その代入したあとの変数を判定に使いたいのですが、どうすればよいでしょうか?
ご教授お願いします!
Reputeless 2018/03/27(Tue) 15:47
数式の文字列から計算結果を求めているのは EvaluateOpt(const String&) 関数です。
おそらく "inf" のことを「変な答え」と思われているようですが、
これは一般的なプログラミングにおける浮動小数点数演算において
double 型で扱える範囲を超えたときの「無限」の表現で、正しい挙動です。
EvaluateOpt() の計算結果 result は文字列ではなく Optional<double> 型です。
result が値を持つ場合は result.value() で中身の double 型の値を取得できます。
ある double 型の値 x が有限な値かどうかは IsFinite(x) で判定できます。