8

在看到许多关于比较浮点相等性的 PHP 问题后,答案是简单地为 Epsilon 选择一个任意值,然后执行if( abs($a-$b) < 0.000001 ).

问题是 Epsilon 通常比人们倾向于选择的值要小得多 [我的机器上的 2.22e-16] 并且实际上计算起来非常简单

$macheps = (float) 1.0;  
do {
    $macheps /= (float) 2.0;
} while( (float) (1.0 + ($macheps/2.0)) != 1.0 );
printf("Epsilon: %0.25f\n", $macheps);

C++ 有std::numeric_limits<double>::epsilon(),Python 有sys.float_info.epsilon,那么为什么 PHP 会悬而未决呢?

4

2 回答 2

16

我知道这是一个老问题,但从 PHP 7.2 开始提供。

PHP_FLOAT_EPSILON(漂浮)

最小的可表示正数 x,因此 x + 1.0 != 1.0。自 PHP 7.2.0 起可用。

http://php.net/manual/en/reserved.constants.php

于 2018-05-14T08:30:27.607 回答
3

C++std::numeric_limits<double>::epsilon()从来没有打算用来代替0.000001style 的公式abs($a-$b) < 0.000001。例如,对于大多数 C++ 编译平台,fabs(x - 2.5) < std::numeric_limits<double>::epsilon()等价于x == 2.5,因为它是near 定义std::numeric_limits<double>::epsilon()的表示形式。double1

一些程序员可能需要将浮点数与某个值进行比较,但该值几乎没有理由与接近 1 的浮点格式的定义相关,因此这不是在语言中提供该常量的好理由。相反,该值应该来自需求(“尽可能小”)或推断(“浮点结果可以是真实结果的 0.003,所以fabs(x - 2.5) < 0.003如果真实结果可以是 2.5,则永远不会是假的”)。

于 2014-05-23T21:53:44.803 回答