Hallo,
ich habe folgene Funktion zum Berechnen der Distanz zweier Punkte (zweidimensional):
Code:
double DistPointPoint (long x1, long y1, long x2, long y2)
{
return sqrt(pow(labs(x1 - x2),2) + pow(labs(y1 - y2),2));
}
Sprich, Pythagoras: a² + b² = c²; c = sqrt(a² + b²)
Leider ist das c² im WorstCase 36893488130239234050, denn
Code:
sqrt( labs(-2.147.483.648 - 2.147.483.647)^2 + labs(-2.147.483.648 - 2.147.483.647)^2 );
(Pseudocode)
ergibt ja innerhalb der Wurzel 36.893.488.130.239.234.050 (36 Trillionen).
Theoretisch müsste es mit "long double" erfassbar sein (2^80), die Funktion
Code:
// DistPointPoint( -2147483647, -2147483647, 2147483647, 2147483647);
double DistPointPoint (long x1, long y1, long x2, long y2)
{
double dx = x1 - x2;
double dy = y1 - y2;
long double extension = dx*dx + dy*dy; // huge extension
return (double)sqrt(extension);
}
liefert trotz Zwischenspeicherung ein falsches Ergebnis (2.8284..). Richtig müsste laut meiner Rechnung mit dem Windows Calculator aber 6074000997.1236722601565869624492 sein.
Sieht jemand nen Denk- und/oder Programmierfehler?!