我想确定给定的 64 位整数是否可以无损存储在双精度数中。现在我有这个代码:
static_cast<int64_t>(static_cast<double>(value)) == value
然而,我相信这并不总是准确的,因为超额精度 https://stackoverflow.com/questions/503436/how-to-deal-with-excess-precision-in-floating-point-computations在某些平台上。
请注意,我并不是要求最大整数,使得所有较小整数都可以无损存储 https://stackoverflow.com/questions/1848700/biggest-integer-that-can-be-stored-in-a-double,即 2^53。我需要知道给定的整数 N 是否可以无损存储,即使 N+1 和 N-1 不是。
标准库中有什么东西,也许类似于std::numeric_limits
,那会告诉我这个吗?
只要低位为 0,就可以设置更多的高位(因为可以增加双精度数的指数)。我将要求降低为无符号,以使位移位不必担心符号位,但我相信它应该具有适应性。
bool fits_in_double_losslessly (uint64_t v)
{
const uint64_t largest_int = 1ULL << 53;
while ((v > largest_int) && !(v & 1))
{
v >>= 1;
}
return v <= largest_int;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)