为我糟糕的数学技能道歉,我试图理解这一点来回答我自己的问题,但我不相信。
我们都知道 PHP 不会以 10 为基数存储浮点数,而是以 2 为基数存储浮点数。
我有一系列使用 0.5 作为唯一浮点数的计算,并试图了解它们是否将存储为 0.500001 或 0.4999999(出于舍入目的,存在很大差异!!!)我开始明白 0.5 将精确存储在base2中。
我的查询是
A 我是否理解正确?
B 还有哪些浮点数精确存储在 base2 中?例如 0.25?
为我糟糕的数学技能道歉,我试图理解这一点来回答我自己的问题,但我不相信。
我们都知道 PHP 不会以 10 为基数存储浮点数,而是以 2 为基数存储浮点数。
我有一系列使用 0.5 作为唯一浮点数的计算,并试图了解它们是否将存储为 0.500001 或 0.4999999(出于舍入目的,存在很大差异!!!)我开始明白 0.5 将精确存储在base2中。
我的查询是
A 我是否理解正确?
B 还有哪些浮点数精确存储在 base2 中?例如 0.25?
1/pow(x, 2) 的任何倍数都可以精确地表示为浮点数。
这意味着 x/2、x/4、x/8、x/16 ...等。可以准确表示。
有关如何存储浮点数的更多信息,请参阅http://kipirvine.com/asm/workbook/floating_tut.htm
Gmp是一个很好的高精度数学库。
PHP 不需要使用二进制浮点。这取决于系统。
许多系统使用 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 也无法表示,因为无论您将它们按多少次方进行缩放,都不会产生整数。