如何在PHP中获得最后一个单元(ULP)

时间:2015-09-24 02:20:47

标签: php math

在java中有Math.ulp(123.456f)我似乎无法在php中找到等价物。我正在寻找浮点精度而不是双倍。

令人惊讶的是,在寻找php答案时如何比较浮点数有很多不好的建议。我看到的最常见的是

function floatCompare($a,$b) {
   return (abs($a-$b)<0.001);
}

这是一个坏主意,因为如果您的值为0.000005会怎样。更好的方法是

function floatCompare($a,$b) {
   return (abs($a-$b)<ulp($a)*5);
}

但是php中不存在ulp命令。

2 个答案:

答案 0 :(得分:1)

感谢您的帮助。我接受了Zéychin的建议,并从java库中克隆了ulp函数。我已经用这个函数启动了一个Math库。随着时间的推移会增加更多。

https://github.com/OakbankTechnologyInc/Math

答案 1 :(得分:0)

Single precision floating-point format,我们看到浮点数的尾数有23位。 2 ^ 23 = 8,388,608。您可以使用它来测试一个小差异

abs($a-$b) < abs($a)/8388608

这可能过于敏感,因为它只是允许一点点差异。使用2 ^ 20 = 1048576将给予更多余地。这些数字必须同意6个重要数字。