【问题标题】:Does PHP actually use IEEE-754 floating point numbers?PHP 是否真的使用 IEEE-754 浮点数?
【发布时间】:2014-07-17 02:14:42
【问题描述】:

IEEE-754 浮点标准说:

可能有四种互斥关系:小于、等于、大于和无序。最后一种情况出现在至少一个操作数是 NaN 时。每个 NaN 都应与包括自身在内的所有内容进行无序比较。

然而 (codepad here):

<?php

echo phpversion() . " " . zend_version() . " " . php_uname() . "\n";
// 5.2.5 2.2.0 Linux 2cf38fbc9b9e 3.11.0-15-generic #25-Ubuntu SMP
// Thu Jan 30 17:22:01 UTC 2014 x86_64

NAN < NAN; // true
NAN > NAN; // true
INF < INF; // true
INF > INF; // true

很明显,NAN 和 NAN(以及 INF 和 INF 之间)之间存在不止一种关系,而实际上应该只有一种关系。在具有 IEEE-754 浮点数的许多(大多数?全部?)语言中,“无序”意味着 NaN &lt; NaN 为假,NaN &gt; NaN 为假,NaN == NaN 为假。这是否表明 PHP 不使用 IEEE-754 浮点数?

【问题讨论】:

  • 来自documentation:“浮点数的精度有限。尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式。"
  • 我编辑了我的问题以添加一些平台/版本信息(以及我观察到此行为的键盘链接)。
  • 这无疑表明 PHP 不符合 IEEE 语义。它是否以 IEEE 指定的格式在内部表示它们是另一个问题。

标签: php floating-point ieee-754


【解决方案1】:

把两个想法分开是有用的:

  1. 浮点数格式
  2. 数字行为的语言规则。

语言标准机构可以指定或不指定它们认为合适的 IEEE 浮点行为。您无法从 NaN 比较的行为中判断是否使用了 IEEE 浮点格式。

例如,Java 为 float 和 double 指定行为,如果不使用 IEEE 754 32 位和 64 位二进制格式,将很难实现。另一方面,Float 和 Double 都有比较方法,认为 NaN 等于它自己并且大于所有其他浮点数。

根据PHP语言参考Floating point numbers“虽然取决于系统,但PHP通常使用IEEE 754双精度格式...”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-06
    • 2014-10-18
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    相关资源
    最近更新 更多