首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果numeric_limits<double>::has_infinity为false,建议的解决方法是什么?

问如果numeric_limits<double>::has_infinity为false,建议的解决方法是什么?
EN

Stack Overflow用户
提问于 2009-01-15 16:40:54
回答 3查看 3.2K关注 0票数 2

我需要在Linux上的C++应用程序中检查无穷大的双精度值。在大多数平台上,这是通过与std::numeric_limits<double>::infinity()进行比较来实现的。然而,在一些旧的平台上(例如RedHat 9,带有gcc 3.2.2),这是不可用的,并且std::numeric_limits<double>::has_infinity在那里是假的。

对于这些平台,您有什么建议的解决方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-01-19 10:13:51

好的,我现在已经求助于在那台特定的机器上使用INFINITY和NAN宏-似乎工作得很好。它们来自math.h。

票数 1
EN

Stack Overflow用户

发布于 2009-01-15 17:06:05

如果您使用的是IEEE754算术,那么无穷大是定义良好的值,并且对所有算术运算都有定义的结果。特别地,

代码语言:javascript
复制
infinity - infinity = NaN

对于正负无穷大值和NaN值,只有正负无穷大值为真。NaN是特殊的“非数字”值,用于指示函数的域错误,例如sqrt(-1)。另外:

代码语言:javascript
复制
NaN != NaN

NaNs是唯一对其为真的值。

因此:

代码语言:javascript
复制
bool is_infinite(double x) {
    double y = x - x;
    return x == x && y != y;
}

当且仅当x为正无穷大或负无穷大时才返回true。如果只想检查正无穷大,则为x > 0添加一个测试。

票数 3
EN

Stack Overflow用户

发布于 2009-01-15 16:44:12

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

然而,您在使用它时必须更加小心。对于溢出,我相信您必须手动检测溢出,并在检测到溢出时将结果显式设置为最大值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/447520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档