C / C ++浮点问题

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"。

谢谢


一种常用的测试"公差水平"相等性的方法是使用fabs

1
2
3
if (fabs(d - 0.3) < 1E-8) {
     ...
}


您可能需要将d0.3f之间的差异与非常小的数字进行比较。

您可以尝试:

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" ;
 }


0.3ffloat文字。如果你想要一个double字,你必须使用0.3(没有后缀),因为double是默认值。0.3l就是long double