acos(1) returns NAN in some conditions

Deadly 提交于 2019-12-10 13:09:50

问题


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


来源:https://stackoverflow.com/questions/37184259/acos1-returns-nan-in-some-conditions

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!