为什么EPSILON用于比较两个浮点数

时间:2017-09-11 00:01:07

标签: java math floating-point epsilon

我正在使用Google搜索如何查找某个y号码是x的强大功能并遇到此link

  

爪哇

public class Solution {
public boolean isPowerOfThree(int n) {
    return (Math.log10(n) / Math.log10(3)) % 1 == 0;
} } 
     

常见陷阱

     

这个解决方案存在问题,因为我们开始使用双打   意味着我们受精确错误的影响。这意味着,我们永远不应该   比较双打时使用==。那是因为结果   Math.log10(n) / Math.log10(3)可以是5.00000014.9999999。这个   使用函数Math.log()而不是函数可以观察到效果   Math.log10()

     

为了解决这个问题,我们需要将结果与a进行比较   epsilon

     

爪哇

     

return (Math.log(n) / Math.log(3) + epsilon) % 1 <= 2 * epsilon;

我不理解return (Math.log(n) / Math.log(3) + epsilon) % 1 <= 2 * epsilon;

该行的含义是什么?

为什么在比较浮点时使用 EPSILON

2 个答案:

答案 0 :(得分:1)

正如引用的部分所说,由于浮点不精确,你可以有两个数字应该完全相等(如果创建它们的计算是用数学精确性进行的),但是它们稍有不同。

当你比较它们时,你想要考虑那个微小的差异,并且如果它们之间只有少量差异,称为epsilon仍然可以将数字视为相等。

如何选择合适的epsilon是一个棘手的问题,并且高度依赖于计算的性质。我想由于这个原因,Java不包含“标准”epsilon常量(其他一些语言)。

答案 1 :(得分:0)

因为自然对数使用简单序列计算。 https://en.wikipedia.org/wiki/Natural_logarithm 这样的系列可以在CPU中的数学协处理器中实现。您可以使用简单的比例从自然表达任何对数,而无需大的计算时间。