PHP实际上是否使用IEEE-754浮点数?

时间:2014-05-28 02:05:54

标签: php floating-point ieee-754

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 < NaN为假,NaN > NaN为假,NaN == NaN为假。这是否证明PHP不使用IEEE-754浮点数?

1 个答案:

答案 0 :(得分:3)

分开两个想法很有用:

  1. 浮点数格式
  2. 数字行为的语言规则。
  3. 语言标准组织可以根据自己认为合适的方式指定或保留未指定的IEEE浮点行为。无论是否使用IEEE浮点格式,您都无法判断NaN比较的行为。

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

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