0

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

我们都知道 PHP 不会以 10 为基数存储浮点数,而是以 2 为基数存储浮点数。

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

我的查询是

A 我是否理解正确?

B 还有哪些浮点数精确存储在 base2 中?例如 0.25?

4

2 回答 2

2

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

这意味着 x/2、x/4、x/8、x/16 ...等。可以准确表示。

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

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

于 2013-07-31T09:20:11.473 回答
1

PHP 不需要使用二进制浮点。这取决于系统。

许多系统使用 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 也无法表示,因为无论您将它们按多少次方进行缩放,都不会产生整数。

于 2013-07-31T12:24:08.587 回答