std::isfinite(IntegralType) 会 return 错误吗?

Can std::isfinite(IntegralType) ever return false?

根据 std::isfinite 的文档,重载 bool isfinite( IntegralType arg ) 总是将 arg 转换为 double 并调用 bool isfinite( double arg ).

这与说 "bool isfinite( IntegralType arg ) 总是 return 为真" 有何不同?也就是说,在什么情况下 bool isfinite( IntegralType arg ) return false?

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

理论上它可以 return false 如果转换为 double 溢出,但实际上我们没有足够大的整数类型。事实上,带有 -O3(目标 x86-64)的 GCC 和 Clang 似乎用 true 替换了调用(即使使用 [unsigned]long long 参数)。

如果整数类型为 128 位宽且 floating-point 类型为 single-precision(32 位宽),则可能会发生这种溢出,例如 std::isfinite(float(__uint128_t(-1))) 计算为 false,但由于 double 不允许为 32 位 (),因此这无关紧要。