У меня есть эта проблема из книги «Crack the Coding Interview».Будут ли две линии пересекаться в декартовой плоскости
Учитывая две линии на декартовой плоскости, определить, будут ли эти две линии intersect.`
Вот решение:
public class Line {
static double epsilon = 0.000001;
public double slope;
public double yintercept;
public Line(double s, double y) {
slope = s;
yintercept = y;
}
public boolean intersect(Line line2) {
return Math.abs(slope - line2.slope) > epsilon ||
Math.abs(yintercept - line2.yintercept) < epsilon;
}
}
Почему оленья кожа это есть простое решение, если склоны не одинаковы, то они пересекаются. Почему эпсилон и y перехватывают.
В Suggestions он говорит, что
Не думайте, что наклон и у-перехватывать целые числа. Понять ограничения в представлениях с плавающей запятой. Никогда не проверяйте равенство с
==
.
Вы понимаете проблему тестирования двух чисел с плавающей запятой для равенства? – Beta
@Beta я тоже мог бы помочь. Спасибо – Kraken
Именно поэтому я ненавижу типы данных с плавающей точкой в большинстве случаев. Если бы я должен был прочитать этот вопрос, я бы предположил, что наклон и перехват являются действительными числами, а не представлениями с плавающей запятой. В java есть тип «BigDecimal», который не имеет проблемы с плавающей запятой. Я уверен, что он значительно медленнее, чем «double», чтобы запускать вычисления, но по крайней мере у вас не было бы эпсилонской чепухи. –