Le problème est indiqué par le mot "bien conditionné". C'est une question d'arithmétique informatique, pas de mathématiques.
Voici les faits de base à considérer:
Un radian sur la terre couvre près de 10 ^ 7 mètres.
La fonction cosinus pour les arguments x proches de 0 est approximativement égale à 1 - x ^ 2/2.
La virgule flottante double précision a environ 15 chiffres décimaux de précision.
Les points (2) et (3) impliquent que lorsque x mesure environ un mètre ou 10 ^ -7 radians (point 1), la quasi-totalité de la précision est perdue: 1 - (10 ^ -7) ^ 2 = 1 - 10 ^ - 14 est un calcul dans lequel les 14 premiers des 15 chiffres significatifs sont tous annulés, ne laissant qu'un chiffre pour représenter le résultat. En inversant la situation (ce que fait le cosinus inverse, "acos") signifie que le calcul des acos pour des angles correspondant à des distances d'un mètre ne peut pas être effectué avec une précision significative. (Dans certains mauvais cas, la perte de précision donne une valeur où acos n'est même pas défini, ainsi le code s'effondrera sans donner de réponse, une réponse absurde ou un crash de la machine.) Des considérations similaires suggèrent que vous évitiez l'utilisation du cosinus inverse. si des distances inférieures à quelques centaines de mètres sont impliquées, cela dépend de la précision que vous êtes prêt à perdre.
Le rôle joué par acos dans la formule naïve du droit des cosinus est de convertir un angle en distance. Ce rôle est joué par atan2 dans la formule de haversine. La tangente d'un petit angle x est approximativement égale à x elle-même. Par conséquent, la tangente inverse d'un nombre, qui est approximativement ce nombre, est calculée essentiellement sans perte de précision. C'est pourquoi la formule haversine, bien que mathématiquement équivalente à la formule de la loi des cosinus, est de loin supérieure pour les petites distances (de l'ordre de 1 mètre ou moins).
Voici une comparaison des deux formules utilisant 100 paires de points aléatoires sur le globe (en utilisant les calculs à double précision de Mathematica).
Vous pouvez voir que pour des distances inférieures à environ 0,5 mètre, les deux formules divergent. Au-dessus de 0,5 mètre, ils ont tendance à être d'accord. Pour montrer à quel point ils sont d’accord, le graphique suivant présente les ratios de la loi des cosinus: résultats de la régression rapide pour 100 autres paires de points aléatoires, avec leurs latitudes et longitudes différant de manière aléatoire jusqu’à 5 mètres.
Cela montre que la formule de la loi des cosinus est bonne à 3 ou 4 décimales une fois que la distance dépasse 5 à 10 mètres. Le nombre de décimales de précision augmente de façon quadratique; ainsi, à 50-100 mètres (un ordre de grandeur), vous obtenez une précision de 5 à 6 dp (deux ordres de grandeur); à 500-1000 mètres, vous obtenez 7-8 dp, etc.