2016-05-12 141 views
3

这里是我的代码:ACOS(1)返回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中,所以你可以看到它实际上返回了这些值。

回答

3

找到解决方案。看来问题与精确性有关。如果我要确保$dist[-1,1]范围内,它工作正常:

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

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

1

这是因为$dist是大于1的小,由于四舍五入的原因。

var_export($dist); 

给我

1.0000000000000002 
+0

有趣。 var_export()'比var_dump()'更精确地显示值是否有原因? –

相关问题