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>
中的大多数(全部?)其他函数也接受整数并自动将它们转换为 double
。 std::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 位 (),因此这无关紧要。
根据 std::isfinite
的文档,重载 bool isfinite( IntegralType arg )
总是将 arg
转换为 double
并调用 bool isfinite( double arg )
.
这与说 "bool isfinite( IntegralType arg )
总是 return 为真" 有何不同?也就是说,在什么情况下 bool isfinite( IntegralType arg )
return false?
<cmath>
中的大多数(全部?)其他函数也接受整数并自动将它们转换为 double
。 std::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 位 (