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

tom*_*ski 7 php floating-point ieee-754

IEEE-754浮点标准说:

四种相互排斥的关系是可能的:小于,等于,大于和无序.当至少一个操作数是NaN时,出现最后一种情况.每个NaN都应该将无序与包括其自身在内的所有东西进行比较.

然而(这里的键盘):

<?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
Run Code Online (Sandbox Code Playgroud)

很明显,NAN和NAN之间以及INF和INF之间存在多个关系,而应该只有一个.在使用IEEE-754浮点数的许多(大多数?全部?)语言中,"无序"意味着它NaN < NaN是错误的,并且NaN > NaN是错误的,并且NaN == NaN是错误的.这是否证明PHP不使用IEEE-754浮点数?

Pat*_*han 3

区分两个想法很有用:

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

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

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

根据 PHP 语言参考浮点数“尽管这取决于系统,但 PHP 通常使用 IEEE 754 双精度格式......”