2010-12-10 2 views
0

J'ai ce code pour trouver la distance entre deux ensembles de coordonnées GPS, j'ai obtenu le code d'ailleurs sur le net.Latitude/longitude vecteur à la distance, étrange problème avec la sortie

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; 
     } 
} 

Le ouput retourné ressemble à ceci: 25,44049 mais si je

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

il délivre en sortie comme ceci:

15.12345 
1.23639038e10 

Ceux-ci sont tout simplement composées de chiffres, mais vous pouvez voir la La sortie de distance() ressemble à un nombre, mais quand j'en soustrais le même nombre, elle crache un nombre exponentiel wierd. Des idées?

Merci beaucoup

+0

Je soupçonne que la deuxième nombre a le format 'e-10' (notez le signe moins), qui est une très petite valeur. Si oui, alors ce que vous voyez n'a rien à voir avec le calcul de la distance, et tout à voir avec la façon dont les ordinateurs traitent les nombres à virgule flottante. – Anon

+0

Et à l'avenir, s'il vous plaît copiez la sortie exacte de vos scripts dans les questions. Les numéros «composés» mènent à des réponses inventées qui peuvent ou non répondre à votre question. – Anon

Répondre

0

J'ai essayé votre code (vous venez de manquer une simple citation), et la sortie est 1042,1216629565 et 1026,9982129565, me semble ok pour.

Si je soustrais 1042.1216629565 à 1042.1216629565, la sortie devient 3.092281986028E-11: notez le moins le caractère après le e.

Ce nombre est égal à 0,00000000003092281986028, pas zéro. Cette différence est courante avec le calcul en virgule flottante. Cela peut s'expliquer par des erreurs d'arrondi dans le codage binaire de valeur.

Voir wikipedia: http://en.wikipedia.org/wiki/Floating_point et en particulier la section sur l'arrondissement.

Si vous voulez afficher le résultat, utilisez number_format()

Si vous voulez comparer deux valeurs à virgule flottante, vous aurez à faire utiliser quelque chose comme ça:

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