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的主要内容,如果未能解决你的问题,请参考以下文章

js和jQuery

如何在输出中不包含 NaN 的情况下计算一个非常大的数组?

Recyclerview - OnCreateViewholder - 在某些情况下如何返回“null”

深入了解parseInt

在某些情况下,我该怎么做才能使这个 SQL 返回结果?

为啥 NaN = !NaN 返回真?