IEEE-754 浮点标准说:
Four mutually exclusive relations are possible: less than, equal, greater than, and unordered. The last case arises when at least one operand is NaN. Every NaN shall compare unordered with everything, including itself.
然而 ( 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 float 的语言中,“无序”意味着 NaN < NaN
是假的,NaN > NaN
是假的,NaN == NaN
是假的。这是否表明 PHP 不使用 IEEE-754 float ?
最佳答案
将两个想法分开是很有用的:
- float 格式
- 数字行为的语言规则。
语言标准机构可以指定或不指定他们认为合适的尽可能多或尽可能少的 IEEE 浮点行为。您无法从 NaN 比较的行为方式判断是否使用了 IEEE 浮点格式。
例如,Java 指定了 float 和 double 的行为,如果不使用 IEEE 754 32 位和 64 位二进制格式将很难实现这些行为。另一方面,Float 和 Double 都有比较方法,将 NaN 视为等于自身并大于所有其他 float 。
根据 PHP 语言引用 Floating point numbers “虽然这取决于系统,但 PHP 通常使用 IEEE 754 double 格式......”
关于php - PHP 实际上使用 IEEE-754 float 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23901740/