2016-05-12 5 views
3

Hier ist mein Code:acos (1) gibt NAN in einigen Bedingungen

<?php 

$lat1 = 35.697959; 
$lat2 = 35.697959; 
$lon1 = 139.707085; 
$lon2 = 139.707085; 
$theta = $lon1 - $lon2; 
$dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); 
var_dump($dist); // returns 1 

$dist = acos($dist); 
var_dump($dist); // returns NAN 

Wie Sie aus den Kommentaren sehen kann, $dist gleich 1 nach der Berechnung, aber wenn ich acos() anwenden es gibt NAN.

Wenn ich versuche, es manuell zu replizieren, funktioniert es ganz gut:

$x = 1; 
$x = acos($x); 
var_dump($x); // returns 0 as expected 

Was hier vor sich geht und wie kann ich es beheben?

Here's the same code in einer Online-Shell, so können Sie sehen, dass es tatsächlich diese Werte zurückgibt.

Antwort

3

Die Lösung gefunden. Es scheint, dass das Problem mit Präzision verbunden ist. Wenn ich sicherstellen, dass $dist innerhalb [-1,1] Bereich ist, es funktioniert gut:

$dist = acos(min(max($dist,-1.0),1.0)); 

Arbeitsbeispiel: https://3v4l.org/dlunK

1

Es ist, weil $dist ein wenig größer als 1 ist durch Runden der Zahlen.

var_export($dist); 

gibt mir

1.0000000000000002 
+0

Interessant. Gibt es einen Grund, warum 'var_export()' den Wert genauer anzeigt als 'var_dump()'? –