私は、ユーザーからの文字列を取り込んで解析する数学計算機を作成しました。これは計算時にすべての値を保持するために倍精度を使用します。一度に解決、私はそれを印刷して、必ずそれが(例えば0.9999999
のためにプリントアウト上1
なり、正しく出力させるためにstd::setprecision()
を使用倍精度/浮動小数点誤差の補償
出力される文字列を返す:。
//return true or false if this is in the returnstring.
if (returnString.compare("True") == 0 || returnString.compare("False") == 0) return returnString;
//create stringstream and put the answer into the returnString.
std::stringstream stream;
returnString = std::to_string(temp_answer.answer);
//write into the stream with precision set correctly.
stream << std::fixed << std::setprecision(5) << temp_answer.answer;
return stream.str();
私は倍精度浮動小数点数を使用するときの精度の問題を認識しています。今日は、ユーザーが2つの数学的な文字列を比較できるようにコードの作業を開始しました。比較演算子の各側の数式表現パーサを使用して、回答を比較します。
私が今直面している問題は、ユーザが1/3*3=1
のようなものを入力したときです。もちろん、私は2倍を使用しているので、パーサは答えとして0.999999
を返します。通常、非比較の問題を解決するときには、前述のように、これは印刷時にstd::setprecision()
で補正されます。しかし、2つの倍を比較すると、それは0.99999!=1
として偽に戻ります。この不正確さが補償されている倍数を比較すると、どのようにしてそれを得ることができ、答えは正しく返されますか?ここでは数値を比較するために使用するコードを示します。
bool math_comparisons::equal_to(std::string lhs, std::string rhs)
{
auto lhs_ret = std::async(process_question, lhs);
auto rhs_ret = std::async(process_question, rhs);
bool ReturnVal = false;
if (lhs_ret.get().answer == rhs_ret.get().answer)
{
ReturnVal = true;
}
return ReturnVal;
}
何らかの丸めが必要だと思っていますが、それを正しく達成する方法は100%わかりません。これがすでに解決されていれば私を許してください - 私は検索であまり見つけられませんでした。ありがとう!
あなたは 'double'が不正確であるので、どのように' double'使用停止について知っていますか? – MikeCAT
ユーザが整数だけを入力できる場合は、浮動小数点の代わりに小数点以下を使用して作業します(自分で書いてください)。 – molbdnilo
ユーザが '1-.00001'を入力するとどうなりますか?それはまた1と等しいでしょうか? –