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;