什么是推荐的解决办法,如果numeric_limits <双> :: has_infinity是假的?
题
我需要检查一个双值在Linux上的C ++程序无穷大。在大多数平台上这个工程用std::numeric_limits<double>::infinity()
比较。然而,在一些旧的平台(红帽9例如用gcc 3.2.2),这是不可用的,并且是std::numeric_limits<double>::has_infinity
假那里。
你会推荐什么解决办法为这些平台?
解决方案 3
好吧,我现在已转向使用该特定机器上的INFINITY
和NAN
宏 - 似乎很好地工作。他们来自math.h
。
其他提示
如果您正在使用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
正或负无穷大,将返回true。添加测试x > 0
如果只想检查正无穷大。
有关大多数情况下,标准:: numeric_limits :: MAX()可以是用于标准:: numeric_limits有效替换::无穷大()。
您将不得不更加谨慎地使用它,但是。随着溢出我相信你将不得不手动检测溢出,如果检测到溢出的结果明确设置为最大值。
不隶属于 StackOverflow