[英]Comparison doesn't work with the <= operator
我有以下C ++代码:
float test(0.2);
cout << 1.8 + test << " " << boolalpha << (1.8 + test <= 2) << endl;
而这个输出:
2 false
但是问题是我应该有以下输出:
2 true
我该如何解决这个问题?
错误在哪里?
这是一个舍入错误。 1.8
和0.2
都不能以二进制浮点格式精确表示,因此使用的实际值略有不同。 这意味着最终结果可能不完全是2。 但将其流式传输到cout
会将其舍入到小数点后2
并打印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;
但是,总的来说,管理错误和计算可接受的公差可能是一门黑手艺,需要对算法的细节有所了解。
解决与浮点算法有关的问题的一种方法是使用阈值而不是原始值来比较相等性。
也就是说,不要做类似的事情
double a = // some value
double b = // another value
if (a == b)
// ...
你做以下
if (abs(a - b) <= 1e-5)
// ...
这导致了一些错误。 实际阈值不必精确地为1e-5
,您可以选择其他阈值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.