我对浮点数的表示方式有所了解,但恐怕还不够。

一般问题是:

对于给定的精度(就我的目的而言,以 10 为基数的精确小数位数),16 位、32 位和 64 位 IEEE-754 系统可以表示什么范围的数字?

具体来说,我只对精确到 +/-0.5(个位)或 +/- 0.0005(千分位)的 16 位和 32 位数字范围感兴趣。

有帮助吗?

解决方案

对于给定的 IEEE-754 浮点数 X, , 如果

2^E <= abs(X) < 2^(E+1)

那么距离 X 到下一个最大的可表示浮点数(厄普西隆) 是:

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。任何大于此值且浮点数之间的距离大于 0.5。

    如果您想要 +/-0.0005(大约 2^-11)的精度,则数字的最大大小为 1。任何大于此值且浮点数之间的距离大于 0.0005。

  • 为了 单精度...

    如果您想要 +/-0.5(或 2^-1)的精度,则数字的最大大小为 2^23。任何大于此值且浮点数之间的距离大于 0.5。

    如果您想要 +/-0.0005(大约 2^-11)的精度,则数字的最大大小为 2^13。任何大于此值且浮点数之间的距离大于 0.0005。

  • 为了 双精度...

    如果您想要 +/-0.5(或 2^-1)的精度,则数字的最大大小为 2^52。任何大于此值且浮点数之间的距离大于 0.5。

    如果您想要 +/-0.0005(大约 2^-11)的精度,则数字的最大大小为 2^42。任何大于此值且浮点数之间的距离大于 0.0005。

其他提示

对于浮点整数(我将根据 IEEE 双精度给出答案),1 到 2^53 之间的每个整数都可以精确表示。超过 2^53 时,可精确表示的整数之间的间隔为 2 的递增幂。例如:

  • 2^53 + 2 和 2^54 之间的每个第二个整数都可以精确表示。
  • 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。

引号形式彼得的r链接到MSDN裁判的精度可能是一个很好的经验法则,当然,现实更为复杂。

事实上,“点”的“浮点”是的二进制的点,而不是小数点具有战胜我们的直觉的方式。典型的例子是0.1,其中只需要一个数字的精度在小数但不以二进制精确表示的。

如果你有一个周末杀,看看什么每台计算机科学家应该知道关于浮点运算。你可能会在精密和特别感兴趣二进制到十进制的转换

首先,IEEE-754-2008 和 -1985 都没有 16 位浮点数;但它是一个提议的加法,具有 5 位指数和 10 位分数。IEE-754使用专用符号位,因此正负范围相同。此外,分数前面有一个隐含的 1,因此您会得到一个额外的位。

如果您想要精确到个位,就像您可以表示每个整数一样,答案相当简单:指数将小数点移至分数的右端。所以,10 位分数可以得到 ±211.

如果你想要小数点后一位,你就放弃小数点前一位,所以你有±210.

单精度有 23 位小数,所以你有 ±224 整数。

小数点后需要多少位精度完全取决于您正在执行的计算以及您正在执行的位数。

  • 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(四精度)

也可以看看

请参阅 IEEE 754-1985

“V

注(1个+馏分)。由于 @bendin 指出,使用二进制浮点,你不能表达简单的十进制值,例如0.1。言下之意是,你可以通过做简单的加法很多很多次或电话之类的东西截断引入舍入误差。如果感兴趣的任何种类的任何精确,唯一的方法来实现它是使用定点小数,这基本上是成比例的整数。

如果我正确地理解你的问题,它取决于你的语言。结果 对于C#,请的MSDN REF 。浮子具有7位精度和双15-16位精度。

我花了相当长的一段弄清楚,在Java中使用时,双打,我并没有在计算损失显著精度。浮点实际上有来表示数字,以比较合理的精度非常好的能力。我是失去精度为后立即转换的小数的用户输入到被本地支持在二进制的浮点表示数字。我最近开始我的所有数字转换为BigDecimal。 BigDecimal为更多的工作在代码比浮点或双精度来处理,因为它不是原始类型之一。但在另一方面,我能准确地表示用户在键入数字。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top