如何确定给定的 int64_t 是否可以无损存储在 double 中?

2024-03-11

我想确定给定的 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(使用前将#替换为@)

如何确定给定的 int64_t 是否可以无损存储在 double 中? 的相关文章

随机推荐