对于我糟糕的数学技能道歉,我试图理解这一点来回答我自己的疑问,但我并不相信。
我们都知道PHP不会将Floats存储在基数10但基数为2。
我有一系列的计算使用0.5作为唯一的浮点数,并试图了解它们是否会被存储为0.500001或0.4999999(为了舍入目的,存在很大的差异!!!)我已经明白了0.5将精确存储在base2中。
我的疑问是
A我是否理解正确?
B在base2中精确存储了哪些其他浮点数?例如0.25?
答案 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 ,这样:
例如,½等于1•2 -1 。 1是整数限制下的整数,-1是指数限制内的指数。所以½是可以表示的。
2 53 +1无法表示。实际上,它是整数限制之外的整数。如果您尝试使用2的幂来缩放它以使其在限制范围内,则会得到一个不是整数的数字。因此,无法在IEEE-754 64位二进制浮点中准确表示此值。
1/3和1/10也是无法表示的,因为无论你用哪两个幂来缩放它们,你都不会产生整数。