Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无限而非常数_C++_C++17 - Fatal编程技术网

C++ 无限而非常数

C++ 无限而非常数,c++,c++17,C++,C++17,我想测试接近无穷大的浮动的行为。 为此,我天真地编写了以下代码: #include <limits> #include <iostream> int main() { constexpr float foo = std::numeric_limits<float>::infinity() - std::numeric_limits<float>::epsilon(); std::cout << foo <<

我想测试接近无穷大的浮动的行为。 为此,我天真地编写了以下代码:

#include <limits>
#include <iostream>

int main() {
    constexpr float foo = std::numeric_limits<float>::infinity() - std::numeric_limits<float>::epsilon();
    std::cout << foo << std::endl;
    return foo;
}

我对浮点规则不是特别熟悉,但我怀疑我们可能会遇到以下问题:

如果在表达式求值期间,结果未在数学上定义或不在其类型的可表示值范围内,则行为未定义

这反过来又意味着我们与以下方面发生冲突:

表达式e是一个核心常量表达式,除非按照抽象机器的规则对e进行求值,将对以下表达式之一求值:[…]一个操作,该操作将具有本文档[intro]至[cpp]中指定的未定义行为

这意味着
foo
的初始值设定项不是常量表达式,因此我们不能用它初始化
constepr
对象



如果
infinity()。如果它没有为
float
定义好,那么这是一个gcc错误

发布准确的错误消息将是一个良好的第一步。请注意,这是在gcc上。
静态断言
失败。与Visual C++类似,还请注意,clang的问题在于
-
;这是有效的:@abergmeier的可能副本进一步阅读后,我不认为这是一个副本,但它肯定是相关的。或者它可以很好地定义一个,但不能定义另一个:D肯定是将所有无限或NaN产生的表达式视为UB。对于浮点,C++标准没有什么可说的。
constexpr float foo = std::numeric_limits<float>::infinity() - 100.0f;