我需要在Linux上的C++应用程序中检查无穷大的双精度值。在大多数平台上,这是通过与std::numeric_limits<double>::infinity()进行比较来实现的。然而,在一些旧的平台上(例如RedHat 9,带有gcc 3.2.2),这是不可用的,并且std::numeric_limits<double>::has_infinity在那里是假的。
对于这些平台,您有什么建议的解决方法?
发布于 2009-01-19 10:13:51
好的,我现在已经求助于在那台特定的机器上使用INFINITY和NAN宏-似乎工作得很好。它们来自math.h。
发布于 2009-01-15 17:06:05
如果您使用的是IEEE754算术,那么无穷大是定义良好的值,并且对所有算术运算都有定义的结果。特别地,
infinity - infinity = NaN对于正负无穷大值和NaN值,只有正负无穷大值为真。NaN是特殊的“非数字”值,用于指示函数的域错误,例如sqrt(-1)。另外:
NaN != NaNNaNs是唯一对其为真的值。
因此:
bool is_infinite(double x) {
double y = x - x;
return x == x && y != y;
}当且仅当x为正无穷大或负无穷大时才返回true。如果只想检查正无穷大,则为x > 0添加一个测试。
发布于 2009-01-15 16:44:12
在大多数情况下,std::numeric_limits::max()可以有效地替代std::numeric_limits::infinity()。
然而,您在使用它时必须更加小心。对于溢出,我相信您必须手动检测溢出,并在检测到溢出时将结果显式设置为最大值。
https://stackoverflow.com/questions/447520
复制相似问题