acos(1) 在某些情况下返回 NAN
Posted
技术标签:
【中文标题】acos(1) 在某些情况下返回 NAN【英文标题】:acos(1) returns NAN in some conditions 【发布时间】:2016-09-08 03:08:49 【问题描述】:这是我的代码:
<?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
从 cmets 中可以看出,$dist
计算后等于 1
,但是当我应用 acos()
时,它返回 NAN
。
如果我尝试手动复制它,它工作得很好:
$x = 1;
$x = acos($x);
var_dump($x); // returns 0 as expected
这是怎么回事,我该如何解决?
Here's the same code 在在线 shell 中,因此您可以看到它实际上返回了这些值。
【问题讨论】:
【参考方案1】:找到了解决办法。似乎问题与精度有关。如果我确保$dist
在[-1,1]
范围内,它可以正常工作:
$dist = acos(min(max($dist,-1.0),1.0));
工作示例:https://3v4l.org/dlunK
【讨论】:
你这个天才!一旦我找到了 NAN 的来源,这为我省去了很多烦恼。【参考方案2】:这是因为$dist
比 1 稍大,因为四舍五入。
var_export($dist);
给我
1.0000000000000002
【讨论】:
有趣。var_export()
显示值比 var_dump()
更精确的原因是什么?以上是关于acos(1) 在某些情况下返回 NAN的主要内容,如果未能解决你的问题,请参考以下文章