从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
中。