比较不';t与<;=操作人员 我有以下C++代码: float test(0.2); cout << 1.8 + test << " " << boolalpha << (1.8 + test <= 2) << endl;
但问题是我应该有这样的输出:比较不';t与<;=操作人员 我有以下C++代码: float test(0.2); cout << 1.8 + test << " " << boolalpha << (1.8 + test <= 2) << endl;,c++,c++11,floating-point,C++,C++11,Floating Point,但问题是我应该有这样的输出: 2 false 2 true 我怎样才能纠正这个问题 错误在哪里 这是一个舍入误差。1.8和0.2都不能以二进制浮点格式精确表示,因此使用的实际值略有不同。这意味着最终结果可能不完全是2;但是将其流式传输到cout会将其四舍五入到小数点后几位,然后打印2 通过更精确地打印,您可以自己看到这一点: cout << setprecision(20) << 1.8 + test << " " << boolalpha &
2 false
2 true
我怎样才能纠正这个问题
错误在哪里
这是一个舍入误差。1.8
和0.2
都不能以二进制浮点格式精确表示,因此使用的实际值略有不同。这意味着最终结果可能不完全是2;但是将其流式传输到cout
会将其四舍五入到小数点后几位,然后打印2
通过更精确地打印,您可以自己看到这一点:
cout << setprecision(20) << 1.8 + test << " " << boolalpha << (1.8 + test <= 2) << endl;
// Output: 2.0000000029802320611 false
cout解决浮点运算相关问题的一种方法是使用阈值而不是原始值来比较相等性
也就是说,而不是像
double a = // some value
double b = // another value
if (a == b)
// ...
您可以执行以下操作
if (abs(a - b) <= 1e-5)
// ...
if(abs(a-b)错误是浮点运算。@chris Ok。我该如何纠正这个问题呢?小心double
升级(例如1.8F+test!=1.8+test
)和浮点数字,这不是十进制arithmetic@LucasWillems设置相等的阈值怎么样?隐式转换为double
也没有帮助
if (abs(a - b) <= 1e-5)
// ...