我有以下C ++代码:
float test(0.2);
cout << 1.8 + test << " " << boolalpha << (1.8 + test <= 2) << endl;
这个输出:
2 false
但问题是我应该有这个输出:
2 true
如何更正此问题?
答案 0 :(得分:7)
错误在哪里?
这是一个舍入错误。 1.8
和0.2
都不能以二进制浮点格式表示,因此使用的实际值略有不同。这意味着最终结果可能不完全是2;但将其流式传输到cout
会将其四舍五入到小数位并打印2
。
您可以通过更精确地打印来自己看到:
cout << setprecision(20) << 1.8 + test << " " << boolalpha << (1.8 + test <= 2) << endl;
// Output: 2.0000000029802320611 false
如何更正此问题?
这完全取决于您尝试使用浮点数进行的操作。通常,您可以简单地允许对错误的小容差,例如
float tolerance = 1e-6;
cout << 1.8 + test << " " << boolalpha << (1.8 + test <= 2 + tolerance) << endl;
但是,一般来说,管理错误和计算可接受的容差可能是一种黑暗的艺术,需要很好地理解算法的细节。
答案 1 :(得分:0)
解决与浮点运算相关的问题的一种方法是使用阈值而不是使用原始值来比较相等性。
也就是说,而不是做像
这样的事情double a = // some value
double b = // another value
if (a == b)
// ...
您执行以下操作
if (abs(a - b) <= 1e-5)
// ...
会导致一些错误。实际阈值不一定是1e-5
,您可以选择另一个。