【问题标题】:PHP & Base 2. Which Floats give a precise Value?PHP & Base 2. 哪些浮点数给出了精确的值?
【发布时间】:2013-07-31 16:46:27
【问题描述】:

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

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

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

我的查询是

A 我是否理解正确?

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

【问题讨论】:

  • 意味着您必须在数据库中存储 0.4999999 之类的数据?
  • @liyakat,和我的数据库无关,是php存储变量的问题
  • 任何1/2的倍数都可以准确表示。所以 .25 很好,因为它是一半的一半。
  • gmp 是一个很好的库,用于更高的精度数
  • @orangepill,谢谢,把它放在答案中,我会接受,如果你可以扩展并说出 n/8、n/16 等是否会给出精确的浮点数?

标签: php floating-point


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢!可爱的链接也!我看到自己在所有项目中总是提倡这样的分数!!哈哈... 12.625 美元这样的定价对我来说似乎很合理!
  • 我认为“2 的幂的任何整数倍”会更准确一些。 1/8 可表示,1/10 不可表示。有什么区别?要么都是 1/2 的倍数,要么都不是,这取决于您如何定义“倍数”。
【解决方案2】:

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

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

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

  • F的大小小于253
  • –1074 ≤ E

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

253+1 不可表示。事实上,它是整数限制之外的整数。如果您尝试将其缩放为 2 的幂以使其在限制范围内,您会得到一个不是整数的数字。所以没有办法在 IEEE-754 64 位二进制浮点中准确地表示这个值。

1/3 和 1/10 也是不可表示的,因为无论您将它们按什么幂进行缩放,都不会产生整数。

【讨论】:

    猜你喜欢
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 2012-11-05
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多