Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

acos(1) returns NAN in some conditions

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.

like image 599
Victor Marchuk Avatar asked May 12 '16 10:05

Victor Marchuk


2 Answers

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

like image 107
Victor Marchuk Avatar answered Oct 22 '22 23:10

Victor Marchuk


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

var_export($dist);

gives me

1.0000000000000002
like image 44
v7d8dpo4 Avatar answered Oct 23 '22 00:10

v7d8dpo4