【问题标题】:Representing integers in doubles用双精度表示整数
【发布时间】:2010-10-20 00:58:53
【问题描述】:

double(给定字节数,具有合理的尾数/指数平衡)能否始终完全精确地保持该字节数一半的无符号整数的范围?

例如一个 8 字节的 double 能否完全精确地保存一个 4 字节的 unsigned int 的数字范围?

这将归结为如果一个两字节浮点数可以容纳一字节无符号整数的范围。

一个字节的无符号整数当然是 0 -> 255。

【问题讨论】:

    标签: c math floating-point precision ieee-754


    【解决方案1】:

    IEEE754 64 位双精度可以表示任何 32 位整数,因为它有 53 位可用于精度的奇数(a) 位,而 32 位整数只需要 32 :-)

    (非 IEEE754 双精度)64 位浮点数的精度可能低于 32 位。这将允许真正巨大的数字(由于指数),但以精度为代价。

    底线是,如果浮点数的尾数中的精度位比整数中的位多(并且指数中有足够的位来缩放它),那么它可以在不损失的情况下表示精度。


    (a) 从技术上讲,第 53 位精度是序列开头隐含的1,因此“可变性”的数量可能只有 52 位。无论是 52 还是 53,仍然足够位来表示每个 32 位整数。

    【讨论】:

    • 看起来它实际上有 52 位的精度,对吧?由于结构的“分数”部分中仅存在 52 位:en.wikipedia.org/wiki/Double-precision_floating-point_format
    • @BT,这就是为什么我说“53-odd”,意思是大约 53,我会澄清一下。编码中只存储了 52 位,但开头有一个隐含的 1 位。您认为它是 52 还是 53 取决于您的观点,但底线是有足够的位可以很容易地表示任何 32 位值。
    【解决方案2】:

    在谈论浮点数时,我不会使用“完全精确”这个词。但是是的,double 可以表示一个 32 位整数。

    我不知道还有哪些其他的浮点数和整数组合也是如此。

    实际上,您不想费心使用高于机器支持的浮点数,因此只需切换到使用 bignums 的有理算术即可。这样,您就可以保证精度。

    【讨论】:

    • 一个浮点数可以精确地表示一些数字,其中包括所有符合其精度的整数。一旦开始进行可能导致溢出的除法或乘法运算,您可能已经失去了精度。也不是每个人都有一个方便的系统来处理大数和/或有理数。
    【解决方案3】:

    是的。保证浮点数(或双精度数)准确表示不需要截断的任何整数。对于双精度数,有 53 位精度,因此足以准确表示任何 32 位整数,以及 64 位整数的一小部分(从统计上讲)。

    【讨论】:

      【解决方案4】:

      您可以准确表示的范围取决于您的实现中的许多因素,但是您可以通过以下方式来降低它的下限:如果指数字段设置为 0,您可以准确表示最多为整数尾数字段的宽度(假设有符号位)。对于 IEEE 754 双精度,这意味着您可以精确地表示 52 位数字。一般来说,您的尾数将超过整个结构宽度的一半。

      【讨论】:

      • 由于二进制点左侧的隐含位,难道不能用 52 位尾数精确地表示 53 位(不是 52 位)整数吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 2017-05-03
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      相关资源
      最近更新 更多