提问人:Nate Parsons 提问时间:5/16/2009 最后编辑:nbroNate Parsons 更新时间:10/1/2022 访问量:101770
在 16 位、32 位和 64 位 IEEE-754 系统中可以表示哪些范围的数字?
What range of numbers can be represented in a 16-, 32- and 64-bit IEEE-754 systems?
问:
我对浮点数的表示方式略知一二,但恐怕还不够。
一般问题是:
对于给定的精度(就我而言,以 10 为基数的精确小数位数),16 位、32 位和 64 位 IEEE-754 系统可以表示多大范围的数字?
具体来说,我只对精确到 +/-0.5(位)或 +/- 0.0005(千分之一位)的 16 位和 32 位数字范围感兴趣。
答:
如果我正确理解了你的问题,这取决于你的语言。
对于 C#,请查看 MSDN 参考。Float 具有 7 位精度和双精度 15-16 位精度。
评论
首先,IEEE-754-2008 和 -1985 都没有 16 位浮点数;但它是具有 5 位指数和 10 位分数的建议添加。IEE-754 使用专用符号位,因此正负范围相同。此外,分数前面有一个隐含的 1,所以你会得到一个额外的位。
如果你想要精确到位,比如你可以表示每个整数,答案相当简单:指数将小数点移动到分数的右端。因此,10 位分数得到 ±211。
如果你想要小数点后的一位,你就放弃它前面的一位,所以你有±210。
单精度有一个 23 位小数,因此您将有 ±2个 24 个整数。
小数点后需要多少位精度完全取决于您正在执行的计算以及正在执行的计算数。
- 210 = 1,024
- 211 = 2,048
- 223 = 8,388,608
- 224 = 16,777,216
- 253 = 9,007,199,254,740,992(双精度)
- 2113 = 10,384,593,717,069,655,257,060,992,658,440,192(四精度)
另请参阅
Peter R 链接到 MSDN 参考文献的精确引用可能是一个很好的经验法则,但当然现实情况要复杂得多。
事实上,“浮点数”中的“点”是二进制点而不是小数点,这有一种方法可以打败我们的直觉。典型的例子是 0.1,它只需要十进制的一位精度,但根本无法用二进制表示。
如果你有一个周末可以消磨时间,看看每个计算机科学家都应该知道的关于浮点运算的知识。您可能会对精度和二进制到十进制转换部分特别感兴趣。
对于给定的 IEEE-754 浮点数 X,如果
2^E <= abs(X) < 2^(E+1)
则从 X 到下一个最大可表示浮点数 (epsilon) 的距离为:
epsilon = 2^(E-52) % For a 64-bit float (double precision)
epsilon = 2^(E-23) % For a 32-bit float (single precision)
epsilon = 2^(E-10) % For a 16-bit float (half precision)
上面的方程允许我们计算以下内容:
对于半精度...
如果您希望精度为 +/-0.5(或 2^-1),则该数字的最大大小为 2^10。任何大于此限制的 X 都会导致浮点数之间的距离大于 0.5。
如果您希望精度为 +/-0.0005(大约 2^-11),则该数字的最大大小为 1。任何大于此最大限制的 X 都会导致浮点数之间的距离大于 0.0005。
对于单精度...
如果您希望精度为 +/-0.5(或 2^-1),则该数字的最大大小为 2^23。任何大于此限制的 X 都会导致浮点数之间的距离大于 0.5。
如果您希望精度为 +/-0.0005(大约 2^-11),则该数字的最大大小为 2^13。任何大于此 lmit 的 X 都会导致浮点数之间的距离大于 0.0005。
对于双精度...
如果您希望精度为 +/-0.5(或 2^-1),则该数字的最大大小为 2^52。任何大于此限制的 X 都会导致浮点数之间的距离大于 0.5。
如果您希望精度为 +/-0.0005(大约 2^-11),则该数字的最大大小为 2^42。任何大于此限制的 X 都会导致浮点数之间的距离大于 0.0005。
评论
请参阅 IEEE 754-1985:
注意(1 + 分数)。正如@bendin指出的,使用二进制浮点数,您不能表示简单的十进制值,例如 0.1。这意味着,您可以通过多次执行简单的加法或调用截断等操作来引入舍入错误。如果你对任何类型的精度感兴趣,实现它的唯一方法是使用定点小数,它基本上是一个缩放整数。
我花了相当长的时间才弄清楚,在 Java 中使用双精度时,我的计算精度并没有显着降低。浮点实际上具有非常好的能力,可以将数字表示为相当合理的精度。在将用户键入的十进制数转换为本机支持的二进制浮点表示形式时,我立即失去了精度。我最近开始将我所有的数字转换为 BigDecimal。BigDecimal 在代码中处理的工作比浮点数或双精度值要多得多,因为它不是基元类型之一。但另一方面,我将能够准确地表示用户输入的数字。
对于浮点整数(我将用 IEEE 双精度给出我的答案),1 到 2^53 之间的每个整数都是完全可表示的。超过 2^53 时,完全可表示的整数将通过递增 2 的幂间隔。例如:
- 可以精确表示 2^53 + 2 和 2^54 之间的每 2 个整数。
- 2^54 + 4 和 2^55 之间的每 4 个整数都可以精确表示。
- 可以精确表示 2^55 + 8 和 2^56 之间的每 8 个整数。
- 可以精确表示 2^56 + 16 和 2^57 之间的每 16 个整数。
- 2^57 + 32 和 2^58 之间的每 32 个整数都可以精确表示。
- 可以精确表示 2^58 + 64 和 2^59 之间的每 64 个整数。
- 2^59 + 128 和 2^60 之间的每 128 个整数都可以精确表示。
- 可以精确表示 2^60 + 256 和 2^61 之间的每 256 个整数。
- 可以精确表示 2^61 + 512 和 2^62 之间的每 512 个整数。 . . .
不完全表示的整数四舍五入到最接近的可表示整数,因此最坏的情况舍入是可表示整数之间间距的 1/2。
评论