C/C++ floating point issue
本问题已经有最佳答案,请猛点这里访问。
我正在努力解决一个基本的浮点精度问题。问题是:
1 2 3 4 5 | double d = 0.1; d += 0.1; d += 0.1; d == 0.3 ? std::cout <<"yes" : std::cout <<"no"; |
运行代码,就会得到"否"
我理解C/C++在二进制中存储值,二进制存储不能精确地存储每一个值。我还了解到,这些小错误在对它们进行各种数学运算(即d+=0.1;)时是复合的。
我的问题是,如果d==0.3(达到合理的精度),是否需要测试。正如上面代码的明确意图一样……我该怎么做?我希望答案不是:
1 | if (d > 0.2999 && d < 0.3001) ... |
号
也。。这个工作
1 2 3 4 5 | float f = 0.1; f += 0.1; f += 0.1; f == 0.3f ? std::cout <<"yes" : std::cout <<"no"; |
但在语言中我找不到等价的"0.3d"。
谢谢
一种常用的测试"公差水平"相等性的方法是使用
1 2 3 | if (fabs(d - 0.3) < 1E-8) { ... } |
您可能需要将
您可以尝试:
1 2 3 4 5 6 7 8 | float epsilon = 1e-5; if (fabs(d - 0.3f) < epsilon) { std::cout <<"yes" ; } else{ std::cout <<"no" ; } |
号