2

我需要在 Linux 上的 C++ 应用程序中检查无穷大的双精度值。在大多数平台上,这通过与std::numeric_limits<double>::infinity(). 但是,在某些旧平台上(例如 RedHat 9,使用 gcc 3.2.2),这是不可用的,并且std::numeric_limits<double>::has_infinity在那里是错误的。

您会为这些平台推荐什么解决方法?

4

3 回答 3

3

如果您使用 IEEE 754 算术,几乎可以肯定的是,无穷大是定义明确的值,并且为所有算术运算定义了结果。尤其,

infinity - infinity = NaN

正负无穷大和NaN值是唯一正确的值。NaN 是特殊的“非数字”值,用于指示函数的域错误,例如sqrt(-1). 还:

NaN != NaN

NaNs 是唯一正确的值。

所以:

bool is_infinite(double x) {
    double y = x - x;
    return x == x && y != y;
}

当且仅当x是正无穷或负无穷时才会返回真。x > 0如果您只想检查正无穷大,请添加一个测试。

于 2009-01-15T17:06:04.570 回答
1

在大多数情况下,std::numeric_limits::max() 可以有效替代 std::numeric_limits::infinity()。

但是,您必须更加小心地使用它。对于溢出,我相信如果检测到溢出,您将不得不手动检测溢出并将结果显式设置为最大值。

于 2009-01-15T16:44:11.820 回答
1

好的,我现在已经在该特定机器上使用INFINITYandNAN宏 - 似乎工作正常。他们来自math.h.

于 2009-01-19T10:13:50.690 回答