我正在努力解决基本的浮点精度问题。这是问题所在:
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”。
由于
答案 0 :(得分:3)
测试平等到某个“容忍级别”的一种常用方法是使用fabs
:
if (fabs(d - 0.3) < 1E-8) {
...
}
答案 1 :(得分:2)
您可能需要将d
和0.3f
之间的差异与非常小的数字进行比较。
您可以尝试:
float epsilon = 1e-5;
if (fabs(d - 0.3f) < epsilon)
{
std::cout << "yes" ;
}
else{
std::cout << "no " ;
}
答案 2 :(得分:0)
0.3f
是float
字面值。如果您需要double
字面值,则必须使用0.3
(不带后缀),因为double
是默认值。 0.3l
将是long double
。