std::isfinite(IntegralType) 可以返回 false 吗?

xuh*_*dev 2 c++ floating-point precision

根据 的文档std::isfinite,重载bool isfinite( IntegralType arg )始终强制转换argdouble并调用bool isfinite( double arg )

这与说bool isfinite( IntegralType arg )总是返回真”有什么不同?换句话说,在什么情况下会bool isfinite( IntegralType arg )返回false?

Hol*_*Cat 5

大多数(全部?)其他函数<cmath>也接受整数并自动将它们转换为doubles。std::isfinite可能是为了一致性。

理论上,false如果转换为double溢出,它可以返回,但实际上我们没有足够大的整数类型。事实上,GCC & Clang with -O3(targeting x86-64) 似乎用true(甚至用 [ unsigned]long long参数)替换了调用。

如果整数类型为 128 位宽且浮点类型为单精度(32 位宽),则可能会发生这种溢出,例如std::isfinite(float(__uint128_t(-1)))计算结果为false,但由于double不允许为 32 位(请参阅注释),这没关系。

  • `std::isfinite(double((unsigned _ExtInt(1024)) -1))` 在 clang 上是 `false` (但强制转换是必要的) (3认同)
  • 所有 - `abs`:https://timsong-cpp.github.io/cppwp/c.math#cmath.syn-2 (2认同)