负无穷大

时间:2013-11-16 08:56:13

标签: c++ numeric-limits

我试图弄清楚如何将负无穷大的值赋给float或double变量。似乎包括标准库限制,我可以获得无穷大表示,并且我知道(非常肯定)在前面添加一个减号(-infinity)可能会导致我在IEEE754浮点中寻找的值标准(因为0x7FFFFFFF可能会导致0xFFFFFFFF),但我甚至不确定,更不用说可能存在的其他标准(如果有的话)。我发现它真的,非常不专业和依赖于实现。

当然,有一种很好的方法可以独立获得负无限平台和实现的价值,否则我也可以使用#define,每个人都喜欢预处理。

3 个答案:

答案 0 :(得分:29)

至少std::numeric_limits::is_iec559(IEEE 754)是真的(保证std::numeric_limits::has_infinity也是如此),你可以用你已经说过的方式表达正负无穷大值。

来自Wikipedia的IEEE 754-1985无穷大值的简短说明:

  

...... ......剪断

     

偏置指数字段用全1位填充以指示其中任何一个   无穷大或无效的计算结果。

     

正负无效

     

因此表示正负无穷大:

 sign = 0 for positive infinity, 1 for negative infinity.
 biased exponent = all 1 bits.
 fraction = all 0 bits.
     

...... ......剪断

<强>断言

以下示例将按预期工作,或者在目标平台不支持IEEE 754浮点数时导致编译时错误。

#include <cstdlib>
#include <cmath>
#include <cassert>
#include <limits>

int main(void)
{
    //Asserts floating point compatibility at compile time
    static_assert(std::numeric_limits<float>::is_iec559, "IEEE 754 required");

    //C99
    float negative_infinity1 = -INFINITY;
    float negative_infinity2 = -1 * INFINITY;

    float negative_infinity3 = -std::numeric_limits<float>::infinity();
    float negative_infinity4 = -1 * std::numeric_limits<float>::infinity();

    assert(std::isinf(negative_infinity1) && negative_infinity1 < std::numeric_limits<float>::lowest());
    assert(std::isinf(negative_infinity2) && negative_infinity2 < std::numeric_limits<float>::lowest());
    assert(std::isinf(negative_infinity3) && negative_infinity3 < std::numeric_limits<float>::lowest());
    assert(std::isinf(negative_infinity4) && negative_infinity4 < std::numeric_limits<float>::lowest());

    return EXIT_SUCCESS;
}

答案 1 :(得分:7)

如果std::numeric_limits<double>::is_iec559true,那么使用它应该是安全的 -

double negative_infinity = - std::numeric_limits<double>::infinity();

(IEC559是ISO754的ISO等效物)

如果它是false那么还有很多工作要做,因为我认为C ++标准不会给你任何帮助。

答案 2 :(得分:5)

我不知道您使用的是什么编译器,但您可以在gcc和MinGw上使用-std::numeric_limits<double>::infinity(),请参阅Infinity-and-NaN。我还在MSVC上运行了以下代码,它返回true:

double infinity(std::numeric_limits<double>::infinity());
double neg_infinity(-std::numeric_limits<double>::infinity());
double lowest(std::numeric_limits<double>::lowest());

bool lower_than_lowest(neg_infinity < lowest);
std::cout << "lower_than_lowest: " << lower_than_lowest << std::endl;

但是,考虑使用应用程序中的最低值而不是负无穷大,这可能是值得的,因为它可能会产生更便携的解决方案。