我需要在 Linux 上的 C++ 应用程序中检查无穷大的双精度值。在大多数平台上,这通过与std::numeric_limits<double>::infinity()
. 但是,在某些旧平台上(例如 RedHat 9,使用 gcc 3.2.2),这是不可用的,并且std::numeric_limits<double>::has_infinity
在那里是错误的。
您会为这些平台推荐什么解决方法?
如果您使用 IEEE 754 算术,几乎可以肯定的是,无穷大是定义明确的值,并且为所有算术运算定义了结果。尤其,
infinity - infinity = NaN
正负无穷大和NaN
值是唯一正确的值。NaN 是特殊的“非数字”值,用于指示函数的域错误,例如sqrt(-1)
. 还:
NaN != NaN
NaN
s 是唯一正确的值。
所以:
bool is_infinite(double x) {
double y = x - x;
return x == x && y != y;
}
当且仅当x
是正无穷或负无穷时才会返回真。x > 0
如果您只想检查正无穷大,请添加一个测试。
在大多数情况下,std::numeric_limits::max() 可以有效替代 std::numeric_limits::infinity()。
但是,您必须更加小心地使用它。对于溢出,我相信如果检测到溢出,您将不得不手动检测溢出并将结果显式设置为最大值。
好的,我现在已经在该特定机器上使用INFINITY
andNAN
宏 - 似乎工作正常。他们来自math.h
.