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

标签 c++ comparison precision

我编写了一个数学计算器,它从用户那里接收一个字符串并对其进行解析。它使用 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/

相关文章:

C++ 在 unique_ptr 的映射上迭代 std::accumulate():没有已知的转换

c++ - 错误 C2064 : term does not evaluate to a function taking 1 arguments, 如何克服此错误?

objective-c - objective-c - 委托(delegate)和事件

c - 多个 char* 比较的段错误

c++如何写一个构造函数?

c++ - 类中重载 I/O 运算符的奇怪行为

php - 将字符串与 mysql 中的值进行比较

matlab - max 会引入舍入误差吗?

c++ - 使用 double 运算的快速 SSE 低精度指数

math - float 学坏了吗?