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