acos(1)在某些条件下返回NAN

时间:2016-05-12 10:29:27

标签: php math floating-point trigonometry nan

这是我的代码:

<?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

从评论中可以看出,$dist在计算后等于1,但当我应用acos()时,它会返回NAN

如果我尝试手动复制它,它可以正常工作:

$x = 1;
$x = acos($x);
var_dump($x);  // returns 0 as expected

这里发生了什么,我该如何解决?

Here's the same code在一个在线shell中,因此您可以看到它实际上返回了这些值。

2 个答案:

答案 0 :(得分:5)

找到解决方案。似乎问题与精度有关。如果我确保$dist[-1,1]范围内,则可以正常使用:

$dist = acos(min(max($dist,-1.0),1.0)); 

工作示例:https://3v4l.org/dlunK

答案 1 :(得分:1)

由于四舍五入,因为$dist略大于1。

var_export($dist);

给了我

1.0000000000000002