xuh*_*dev 2 c++ floating-point precision
根据 的文档std::isfinite,重载bool isfinite( IntegralType arg )始终强制转换arg为double并调用bool isfinite( double arg )。
这与说“bool isfinite( IntegralType arg )总是返回真”有什么不同?换句话说,在什么情况下会bool isfinite( IntegralType arg )返回false?
大多数(全部?)其他函数<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 位(请参阅注释),这没关系。