负无穷大

Set*_*r22 34 c++ numeric-limits

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

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

Sam*_*Sam 30

至少如果std :: numeric_limits :: is_iec559(IEEE 754)为真(这保证了std :: numeric_limits :: has_infinity也为真),你可以按照你已经陈述的方式表达正负无穷大值.

维基百科对IEEE 754-1985无穷大值的简短解释:

......喀嚓......

偏置指数字段用全1位填充以指示无穷大或无效的计算结果.

正负无穷大

因此表示正负无穷大:

 sign = 0 for positive infinity, 1 for negative infinity.
 biased exponent = all 1 bits.
 fraction = all 0 bits.
Run Code Online (Sandbox Code Playgroud)

......喀嚓......

断言

以下示例将按预期工作,或者在目标平台不支持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;
}
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,在C ++中不需要int main(void)代替int main()和return EXIT_SUCCESS;。 (2认同)

Ian*_*ook 8

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

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

(IEC559是ISO754的ISO等效物)

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


ken*_*nba 6

我不知道您使用的是什么编译器,但是您可以-std::numeric_limits<double>::infinity()在gcc和MinGw上使用,请参见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;
Run Code Online (Sandbox Code Playgroud)

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