相关疑难解决方法(0)

std :: numeric_limits :: infinity()的倒数是零吗?

C++标准(或IEEE 754浮点标准)中有什么保证1./std::numeric_limits<double>::infinity()零(或至少是一个小数字)?

c++ floating-point infinity

21
推荐指数
2
解决办法
1108
查看次数

浮点运算是否导致IEC 559 / IEEE 754浮点类型的无限不确定行为

我正在阅读Infinity而不是constexpr,这似乎表明创建Infinity是未定义的行为:

[expr] / 4

如果在表达式的求值过程中,未在数学上定义结果或该类型的结果不在可表示值的范围内,则行为不确定。

但是,如果std::numeric_limits::is_iec559 等于true,则似乎为我们提供了更多保证。

下面的代码利用此保证来创建无限数。在constexpr上下文中执行时,会导致编译器失败,因为undefined behavior如果情况为is_iec559假,则失败。

// clang++ -std=c++17 -O3
#include <limits>

constexpr double createInfinity()
{
    static_assert(std::numeric_limits<double>::is_iec559, "asdf");
    double d = 999999999999;
    while (d != std::numeric_limits<double>::infinity())
    {
        d *= d;
    }
    return -1*d;
}

static_assert(createInfinity() == std::numeric_limits<double>::infinity(), "inf");
Run Code Online (Sandbox Code Playgroud)

编译器资源管理器中的代码

由于此函数总是导致无限,因此永远不能在有效的C ++程序中调用它。但是,正如我们对所断言的那样is_iec559,我们获得了额外的保证。该程序仍然无效吗?

  • 如果无效?有什么意义is_iec559
  • 是否有效?为什么在运行时有效,而不在constexpr上下文中有效?

(答案可以同时使用C ++ 17和即将推出的C ++ 20,请清楚说明使用的是哪种)

c++ floating-point language-lawyer c++17 c++20

10
推荐指数
1
解决办法
231
查看次数

IEEE 754中规定的浮点计算结果是否包含无穷大和NaN?

例如,使用Visual Studio 2017,我得到了以下结果

inf + inf评估为inf

inf +( - inf)评估为-nan(ind)

浮点计算的结果是否涉及IEEE 754中规定的无穷大和NaN,还是编译器依赖的?

floating-point ieee-754

1
推荐指数
1
解决办法
299
查看次数