C / C ++浮点问题

时间:2013-05-16 13:36:41

标签: c++ c floating-point

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

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

由于

3 个答案:

答案 0 :(得分:3)

测试平等到某个“容忍级别”的一种常用方法是使用fabs

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

答案 1 :(得分:2)

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

您可以尝试:

 float epsilon = 1e-5;
 if (fabs(d - 0.3f) < epsilon)
 {
     std::cout << "yes" ;
 }
 else{
     std::cout << "no " ;
 }

答案 2 :(得分:0)

0.3ffloat字面值。如果您需要double字面值,则必须使用0.3(不带后缀),因为double是默认值。 0.3l将是long double