【问题标题】:64-bit unsigned integers which cannot map onto a double [duplicate]不能映射到双精度的 64 位无符号整数 [重复]
【发布时间】:2013-07-20 21:12:55
【问题描述】:

是否存在不能用双精度浮点类型表示的 64 位无符号整数值? (因为双精度也是 64 位宽,所以肯定有一些。)如果是这样,我如何计算它们的 all? (也许不是蛮力的方式?)

【问题讨论】:

    标签: 64-bit double numeric unsigned-integer


    【解决方案1】:

    如果一个 64 位数字表示如下:

    52 个 A 位,后跟至少 1 个 B 位,后跟一个“1”位。

    其中 A 是任意位,并且 B 位中的一个必须非零,则它不能表示为双精度。 (我是依赖位用于double的方式,如http://en.wikipedia.org/wiki/Double-precision_floating-point_format所示)

    【讨论】:

      【解决方案2】:

      从 0 到 2^52(含)的每个整数都可以精确表示,从 2^52 到 2^53 只有每个偶数(0 的最低有效位),然后是每个第四个整数,最多 2^64-2^12 .

      我们可以用一些代码来概括,

      取 m=52:

          for (i=0; i<(64-m+1); i++) {
                  start = i ? 1ULL << (i+m) : 0;
                  end = ((1ULL << m+1)-1) << i;
                  step = 1ULL << i;
          }
      

      产生:

      0000000000000000 to 001fffffffffffff step 1
      0020000000000000 to 003ffffffffffffe step 2
      0040000000000000 to 007ffffffffffffc step 4
      0080000000000000 to 00fffffffffffff8 step 8
      0100000000000000 to 01fffffffffffff0 step 16
      0200000000000000 to 03ffffffffffffe0 step 32
      0400000000000000 to 07ffffffffffffc0 step 64
      0800000000000000 to 0fffffffffffff80 step 128
      1000000000000000 to 1fffffffffffff00 step 256
      2000000000000000 to 3ffffffffffffe00 step 512
      4000000000000000 to 7ffffffffffffc00 step 1024
      8000000000000000 to fffffffffffff800 step 2048
      

      例子:

      将 0x0020000000000000 分配给双精度会得到 9007199254740992.0(IEEE754 中的 0x0x4340000000000000)

      将 0x0020000000000001 分配给双精度数会得到 9007199254740992.0(相同的值)

      将 0x0020000000000002 分配给双精度数得到 9007199254740994.0(0x0x4340000000000001,这是下一个可表示的值)

      【讨论】:

      • 由于指数是偏置在 1023 的偏移量,这不会移动可表示整数的阈值吗?喜欢从偶数和奇数切换?
      • 指数偏差只对 1.0 以上和以下的范围有影响,但经过我自己的测试后,我发现我的答案有点偏,所以我已经纠正了。
      【解决方案3】:

      一个 IEEE754 双精度值有 53 位有效位,因此任何具有超过 53 个连续有效位的 64 位无符号整数(即前 1 位到最后 1 位之间的距离长度超过 53 位) ) 不能无损转换为双精度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-05
        • 2017-10-17
        • 2015-03-25
        • 2011-06-18
        • 1970-01-01
        • 2014-02-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多