php - PHP 实际上使用 IEEE-754 float 吗?

标签 php floating-point ieee-754

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 ?

最佳答案

将两个想法分开是很有用的:

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

语言标准机构可以指定或不指定他们认为合适的尽可能多或尽可能少的 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/

相关文章:

ruby-on-rails - 奇怪的 Heroku 浮点位精度错误(ruby on rails)

python - 如何创建具有给定有效数字位数的decimal.Decimal对象?

php - 如何编写和显示特定产品的评论?

php - 在 wp-login.php 页面的页脚中包含自定义 JavaScript

php - 如何在 PHP 中使用 XMLReader?

c - 将 float 除以 int 并存储为 float - 除以零

PHP 打印发送到 MSSQL 的所有查询

c - C 中的 printf 行为

c# - 浮点加法 : loss-of-precision issues

java - Java 浮点基元是否有任何 IEEE 754 标准实现?