Я пытаюсь вычислить площадь треугольника с вершинамиКак избежать ошибок округления в этом вычислении площади треугольника?
{{0,1000000000},{1,0},{0,-1000000000}}
Нетрудно видеть, что площадь этого треугольника должна быть 1000000000, но когда я пытаюсь вычислить площадь в Java с использованием либо формулы Герона или формулу Шойла, я получаю 0 для области.
Я уверен, что это связано с ошибкой округления при использовании double
, но я не уверен, как действовать. Любые указатели?
Программа:
private static double areaShoelace(int[][] v) {
return 0.5 * Math.abs(v[0][0]*v[1][1] + v[1][0]*v[2][1] + v[2][0]*v[0][1] +
v[1][0]*v[0][1] + v[2][0]*v[1][1] + v[0][0]*v[2][1]);
}
private static double areaHeron(double a, double b, double c) {
double p = (a + b + c)/2.0d;
return Math.sqrt(p * (p - a) * (p - b) * (p - c));
}
private static double length(int[] a, int [] b) {
return Math.hypot(a[0] - b[0], a[1] - b[1]);
}
public static void main(String[] args) {
int[][] tri = new int[][]{{0,1000000000},{1,0},{0,-1000000000}};
System.out.println(areaShoelace(tri));
System.out.println(areaHeron(length(tri[0], tri[1]), length(tri[1],tri[2]), length(tri[0],tri[2])));
}
Выход:
0.0
0.0
Вы посмотрели на этот вопрос: «Каков всеобъемлющий диапазон float и double в Java?» Это может пролить свет на вашу проблему. http://stackoverflow.com/questions/1650505/what-is-the-inclusive-range-of-float-and-double-in-java – Alos
Ваша 'areaShoelace()' все еще дает 0 даже с меньшими номерами. –