acos(1) returns NAN in some conditions

2019-06-25 10:31发布

问题:

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.

回答1:

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



回答2:

It is because $dist is a little greater than 1, due to rounding.

var_export($dist);

gives me

1.0000000000000002