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

pto*_*ato 9 c++ precision

我想确定给定的64位整数是否可以无损地存储在double中.现在我有这个代码:

static_cast<int64_t>(static_cast<double>(value)) == value
Run Code Online (Sandbox Code Playgroud)

但是,我认为由于某些平台上的精度过高,这并不总是准确的.

请注意,我不是要求最大的整数,以便所有较小的整数可以无损存储,即2 ^ 53.我需要知道给定的整数N是否无损存储,即使N + 1和N-1不是.

标准库中有什么东西,可能类似std::numeric_limits,会告诉我这个吗?

Mar*_*k B 9

只要低位为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;
}
Run Code Online (Sandbox Code Playgroud)

  • 你需要首先删除符号位...而且我不知道任何与IEEE兼容的"轻松"可用的硬件(至少就位的布局而言 - 有一些实现"欺骗"舍入的细节,在某些计算中需要精度,等等) (2认同)