2016-05-12 77 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()'更精確地顯示值是否有原因? –

相關問題