Luc*_*ems -1 c++ floating-point c++11
我有以下C++代码:
float test(0.2);
cout << 1.8 + test << " " << boolalpha << (1.8 + test <= 2) << endl;
Run Code Online (Sandbox Code Playgroud)
而这个输出:
2 false
Run Code Online (Sandbox Code Playgroud)
但问题是我应该有这个输出:
2 true
Run Code Online (Sandbox Code Playgroud)
我该如何纠正这个问题?
错误在哪里?
这是一个舍入错误.在二进制浮点格式中既1.8不能也不能0.2完全表示,因此使用的实际值略有不同.这意味着最终结果可能不完全是2; 但cout将其流式传输将会将其四舍五入并打印出来2.
您可以通过更精确地打印它来自己看到:
cout << setprecision(20) << 1.8 + test << " " << boolalpha << (1.8 + test <= 2) << endl;
// Output: 2.0000000029802320611 false
Run Code Online (Sandbox Code Playgroud)
我该如何纠正这个问题?
这取决于你正在尝试用浮点数做什么.通常,您可以简单地允许对误差的小容差,例如
float tolerance = 1e-6;
cout << 1.8 + test << " " << boolalpha << (1.8 + test <= 2 + tolerance) << endl;
Run Code Online (Sandbox Code Playgroud)
但是,一般来说,管理错误和计算可接受的容差可能是一种黑暗的艺术,需要很好地理解算法的细节.