PHP&基地2.哪些花车具有精确的价值?

时间:2013-07-31 08:47:12

标签: php floating-point

对于我糟糕的数学技能道歉,我试图理解这一点来回答我自己的疑问,但我并不相信。

我们都知道PHP不会将Floats存储在基数10但基数为2。

我有一系列的计算使用0.5作为唯一的浮点数,并试图了解它们是否会被存储为0.500001或0.4999999(为了舍入目的,存在很大的差异!!!)我已经明白了0.5将精确存储在base2中。

我的疑问是

A我是否理解正确?

B在base2中精确存储了哪些其他浮点数?例如0.25?

2 个答案:

答案 0 :(得分:2)

1 / pow(x,2)的任何倍数都可以精确地表示为浮点数。

这意味着x / 2,x / 4,x / 8,x / 16 ......等。可以准确地表现出来。

有关如何存储浮点数的详细信息,请参阅http://kipirvine.com/asm/workbook/floating_tut.htm

Gmp是一个很好的高精度数学库。

答案 1 :(得分:1)

PHP不需要使用二进制浮点数。 It depends on the system.

许多系统使用IEEE-754二进制浮点(有时不完整或有修改,例如将次正规数刷新为零)。

在IEEE-754 64位二进制浮点中,当且仅当它可以表示为整数 F 乘以2的幂时才能准确表示数字,2 E ,这样:

  • F 的幅度小于2 53
  • -1074≤ E < 972。

例如,½等于1•2 -1 。 1是整数限制下的整数,-1是指数限制内的指数。所以½是可以表示的。

2 53 +1无法表示。实际上,它是整数限制之外的整数。如果您尝试使用2的幂来缩放它以使其在限制范围内,则会得到一个不是整数的数字。因此,无法在IEEE-754 64位二进制浮点中准确表示此值。

1/3和1/10也是无法表示的,因为无论你用哪两个幂来缩放它们,你都不会产生整数。