为什么PHP不为浮点比较提供Epsilon常数?

Sam*_*tch 3 php floating-point epsilon

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

麻烦的是,小量一般比人们通常会选择[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);
Run Code Online (Sandbox Code Playgroud)

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

Luk*_*ins 5

我知道这是一个老问题,但是自PHP 7.2起提供。

PHP_FLOAT_EPSILON (浮动)

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

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


Pas*_*uoq 3

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

\n\n

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

\n