【发布时间】:2020-01-03 12:09:00
【问题描述】:
要检查两个浮点变量是否相等,我们不能使用 a==b 之类的东西。但是如何使用头文件中的 islessgreater() 函数呢?
从 C++11 开始,有如下三个重载
bool islessgreater (float x , float y);
bool islessgreater (double x , double y);
bool islessgreater (long double x, long double y);
编辑 #1 我知道有一些解决方法可以检查很多人的两个浮点变量的相等性。例如, Floating-point Comparison From Boost How to correctly and standardly compare floats?
我关心的是我们是否可以使用 C++11 中的标准函数 islessgreater() 来检查 (float a == float b) 与否? 例如
int main() {
float a = 1E-10;
float b = 1.001E-10;
bool res = !isnan(a) && !isnan(b) && !islessgreater(a, b);
std::cout << std::boolalpha;
if (res) std::cout << "a == b" << endl;
else std::cout << "a != b" << endl;
return 0;
}
【问题讨论】:
-
通常您使用 epsilon 来比较浮点值。一般采用
abs(x - y) < SELECTED_EPSILON的形式。如果该条件为真,则认为值相等。 -
"要检查两个浮点变量是否相等,我们不能使用 a==b 之类的东西"。你介意提供你的理由吗?是因为存在 NaN 还是某些“基于精度”的原因?
-
islessgreater(a, b)等价于a < b || a > b,由于nan没有设置浮点异常,所以不如检查a == b。此外,“我们不能使用 a==b 之类的东西” 是一个过于宽泛的说法,在某些情况下,==显然可以用于比较浮点数。 -
关于不将浮点值与
==进行比较的准则的原因是,由于计算中的精度损失,可能预期相等的值不会比较相等。没有解决方法 - 仅使用具有某些特定适用性但不通用的技术(例如abs(x-y) << std::numeric_limits<float_type>::epsilon.
标签: c++ floating-point-comparison