2010-12-10 10 views
0

Ich habe diesen Code, um den Abstand zwischen zwei Gruppen von GPS-Koordinaten zu finden, habe ich den Code von anderswo im Netz.Breite/Länge Vektor zu Entfernung, seltsames Problem mit der Ausgabe

function distance($lat1, $lon1, $lat2, $lon2, $unit) { 

    $theta = $lon1 - $lon2; 
    $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); 
    $dist = acos($dist); 
    $dist = rad2deg($dist); 
    $miles = $dist * 60 * 1.1515; 
    $unit = strtoupper($unit); 

    if ($unit == "K") { 
    return ($miles * 1.609344); 
    } else if ($unit == "N") { 
     return ($miles * 0.8684); 
    } else { 
     return $miles; 
     } 
} 

Der Ausgang zurück sieht wie folgt aus: 25,44049 aber wenn ich

tun
$distance_output = distance(-50.12345, 100.1235,-60.12345,120.12345,'km'); 
echo $distance_output . '<br />; 
echo $distance_output - 15.12345; 

gibt sie wie folgt aus:

15.12345 
1.23639038e10 

Diese sind nur Zahlen aus, aber man kann das sehen Die Ausgabe von distance() sieht wie eine Zahl aus, aber wenn ich dieselbe Zahl von ihr subtrahiere, spuckt sie eine seltsame Exponentialzahl aus. Irgendwelche Ideen?

Vielen Dank

+0

Ich vermute, dass der zweite:

Wenn Sie das Ergebnis angezeigt werden soll, verwenden Sie number_format()

Wenn Sie zwei Gleitkomma-Werte vergleichen wollen, müssen Sie den Einsatz so etwas zu tun haben, Nummer hat das Format "e-10" (beachten Sie das Minuszeichen), was ein sehr kleiner Wert ist. Wenn ja, dann hat das, was Sie sehen, nichts mit der Entfernungsberechnung und allem zu tun, was mit dem Umgang von Computern mit Fließkommazahlen zu tun hat. – Anon

+0

Und in Zukunft kopieren Sie bitte die genaue Ausgabe von Ihren Skripten in die Fragen. "Made-up" -Nummern führen zu erfundenen Antworten, die Ihre eigentliche Frage beantworten können oder auch nicht. – Anon

Antwort

0

ich Ihren Code versucht (Sie verpasst nur ein einfaches Anführungszeichen), und der Ausgang ist 1042,1216629565 und 1026,9982129565, mir scheint ok.

Wenn ich 1042,1216629565 bis 1042,1216629565 subtrahieren, wird der Ausgang 3.092281986028E-11: beachten Sie die minus Zeichen nach dem e.

Diese Zahl entspricht 0,0000000000003092281986028, nicht null. Dieser Unterschied ist bei der Gleitkommaberechnung üblich. Es kann durch Rundungsfehler in der Wert-Binärcodierung erklärt werden.

Siehe wikipedia: http://en.wikipedia.org/wiki/Floating_point und besonders Abschnitt über Rundung.

$epsilon = 1e-6; 
if (abs($value1-$value2) <= $epsilon){ 
}