在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命令。
答案 0 :(得分:1)
感谢您的帮助。我接受了Zéychin的建议,并从java库中克隆了ulp函数。我已经用这个函数启动了一个Math库。随着时间的推移会增加更多。
答案 1 :(得分:0)
看Single precision floating-point format,我们看到浮点数的尾数有23位。 2 ^ 23 = 8,388,608。您可以使用它来测试一个小差异
abs($a-$b) < abs($a)/8388608
这可能过于敏感,因为它只是允许一点点差异。使用2 ^ 20 = 1048576将给予更多余地。这些数字必须同意6个重要数字。