Here's my code:
<?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
As you can see from the comments, $dist
is equal to 1
after the calculation, but when I apply acos()
it returns NAN
.
If I try to replicate it manually, it works just fine:
$x = 1;
$x = acos($x);
var_dump($x); // returns 0 as expected
What's going on here and how can I fix it?
Here's the same code in an online shell, so you can see that it actually returns those values.
Found the solution. It seems that the problem is related to precision. If I make sure that $dist
is within [-1,1]
range, it works fine:
$dist = acos(min(max($dist,-1.0),1.0));
Working example: https://3v4l.org/dlunK
It is because $dist
is a little greater than 1, due to rounding.
var_export($dist);
gives me
1.0000000000000002
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With