-2

我正在努力解决一个基本的浮点精度问题。这是问题所在:

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 (达到合理的精度......正如上面代码的明确意图)......我该怎么做?我希望答案不是:

if (d > 0.2999 && d < 0.3001) ...

也..这行得通

float f = 0.1;
f += 0.1;
f += 0.1;

f == 0.3f ? std::cout << "yes" : std::cout << "no";

但我在该语言中找不到等效的“0.3d”。

谢谢

4

3 回答 3

3

将相等性测试到某个“容差水平”的一种常见方法是使用fabs

if (fabs(d - 0.3) < 1E-8) {
     ...
}
于 2013-05-16T13:38:48.003 回答
2

您可能需要比较一个非常小的数字之间d的差异。0.3f

你可以试试:

 float epsilon = 1e-5;
 if (fabs(d - 0.3f) < epsilon)
 {
     std::cout << "yes" ;
 }
 else{
     std::cout << "no " ;
 }
于 2013-05-16T13:39:29.653 回答
0

0.3ffloat字面意思。如果你想要一个double文字,你必须使用0.3(不带后缀),这double是默认的。0.3l将是一个long double.

于 2013-05-16T13:45:12.953 回答