【问题标题】:What's the recommended workaround if numeric_limits<double>::has_infinity is false?如果 numeric_limits<double>::has_infinity 为假,推荐的解决方法是什么?
【发布时间】:2010-10-01 15:26:00
【问题描述】:

我需要在 Linux 上的 C++ 应用程序中检查一个双精度值是否为无穷大。在大多数平台上,这通过与std::numeric_limits&lt;double&gt;::infinity() 进行比较来工作。但是,在一些旧平台上(例如 RedHat 9,使用 gcc 3.2.2),这是不可用的,std::numeric_limits&lt;double&gt;::has_infinity 在那里是假的。

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

【问题讨论】:

    标签: c++ linux double limit infinity


    【解决方案1】:

    如果您使用的是 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 为正无穷或负无穷时才会返回true。如果您只想检查正无穷大,请添加对 x &gt; 0 的测试。

    【讨论】:

    • std::numeric_limits::has_infinity==false 建议您没有 IEEE 754
    • 这可能是真的,但在 OP 的情况下,这可能意味着他有一个不完整的 C++ 标准库实现,具有 IEEE 754 但没有“意识到”。为什么?因为 IEEE 754 通常是在硬件中完成的,升级到更新的编译器解决了这个问题。
    • 但我同意,在一般情况下,如果您不知道其他情况,那么您应该假设 std::numeric_limits::has_infinity==false 意味着没有 IEEE 754。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-19
        • 1970-01-01
        • 2014-12-09
        • 1970-01-01
        相关资源
        最近更新 更多