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悬而未决呢?
我知道这是一个老问题,但是自PHP 7.2起提供。
PHP_FLOAT_EPSILON
(浮动)
最小可表示的正数x,因此x + 1.0!= 1.0。自PHP 7.2.0起可用。
参见http://php.net/manual/en/reserved.constants.php
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()
的表示。double
1
一些程序员可能需要将浮点数与某个值进行比较,但该值几乎没有理由与接近 1 的浮点格式的定义相关,因此这不是在语言中提供该常量的好理由。相反,该值应该来自要求(\xe2\x80\x9cas 根据需要小\xe2\x80\x9d)或推断(\xe2\x80\x9c浮点结果可能是实际结果的 0.003,因此fabs(x - 2.5) < 0.003
将如果真实结果可以是 2.5\xe2\x80\x9d,则永远不会为 false)。
归档时间: |
|
查看次数: |
1698 次 |
最近记录: |