C++标准(或IEEE 754浮点标准)中有什么保证1./std::numeric_limits<double>::infinity()零(或至少是一个小数字)?
我正在阅读Infinity而不是constexpr,这似乎表明创建Infinity是未定义的行为:
如果在表达式的求值过程中,未在数学上定义结果或该类型的结果不在可表示值的范围内,则行为不确定。
但是,如果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?(答案可以同时使用C ++ 17和即将推出的C ++ 20,请清楚说明使用的是哪种)
例如,使用Visual Studio 2017,我得到了以下结果
inf + inf评估为inf
inf +( - inf)评估为-nan(ind)
浮点计算的结果是否涉及IEEE 754中规定的无穷大和NaN,还是编译器依赖的?