gpt4 book ai didi

c++ - 补偿 double/float 不准确

转载 作者:行者123 更新时间:2023-11-28 00:00:56 26 4
gpt4 key购买 nike

我编写了一个数学计算器,它从用户那里接收一个字符串并对其进行解析。它使用 double 来保存计算时涉及的所有值。解决后,我将其打印出来,并使用 std::setprecision() 确保其输出正确(例如 0.9999999 将变为 1 打印出来。

返回将要输出的字符串:

//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();

我知道使用 double 和 float 时的准确性问题。今天我开始编写代码,以便用户可以比较两个数学字符串。例如,1=1 将评估为真,2>3 为假...等。这是通过为比较运算符的每一侧运行我的数学表达式解析器,然后比较答案来实现的。

我现在面临的问题是当用户输入类似1/3*3=1 的内容时。当然因为我使用的是 double 解析器将返回 0.999999 作为答案。通常,在解决非比较问题时,如前所述,这会在打印时使用 std::setprecision() 进行补偿。但是,当比较两个 double 时,它将返回 false,如 0.99999!=1。我怎样才能得到它,以便在比较 double 时补偿这种不准确性,并正确返回答案?这是我用来比较数字本身的代码。

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% 确定如何正确完成它。如果这个问题已经得到解决,请原谅我——我通过搜索找不到太多东西。谢谢!

最佳答案

假设 answer 是一个 double,替换这个

lhs_ret.get().answer == rhs_ret.get().answer

abs(lhs_ret.get().answer - rhs_ret.get().answer) < TOL

其中 TOL 是适当的公差值。

float 不应该与 == 进行比较,而是通过检查绝对差异是否小于给定的公差来进行比较。

有一个难点需要说一下:double的精度大约是16位小数。所以你可以设置 TOL=1.0e-16。这仅在您的数字小于 1 时有效。对于 16 位数字,这意味着公差必须与 1 一样大。

因此,要么假设您的数字小于 10e8 并使用相对较大的公差,例如 10e-8,要么您需要做一些更复杂的事情。

关于c++ - 补偿 double/float 不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38990695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com