使用自定义epsilon来避免浮点数操作的错误有什么意义?

时间:2018-04-09 17:52:26

标签: java floating-point

CTCI本书解决以下问题:

  

给定一个带有点的二维图,找到一条通过最多点的线。

我遇到了这个solution。它基本上计算所有可能段的斜率和y截距,对结果进行散列并确定相同值的最大值。如果我们使用double类型来存储坐标,则会出现问题,因为为了计算我们需要计算(y2-y1)/(x2-x1)的斜率。因此,为了避免不正确的结果,解决方案将epsilon引入为0.0001,并使用下面的函数转换double数字。

public static double floorToNearestEpsilon(double d) {
        int r = (int) (d / epsilon);
        double tmp = ((double) r) * epsilon;
        return tmp;
}

最终,该算法将密钥与他们的" epsilonized"进行比较。为了使用here中的isEquivalent函数确定等效行。

我想知道:如果浮动类型除法一般会出现问题而且floorToNearestEpsilon仍然使用双打除法,那么为什么这种方法会以某种方式解决可能的浮点型问题?

这种做法有多常见?

注意:在GitHub代码epsilon = 0.5但是在原始书epsilon = 0.0001中。

0 个答案:

没有答案