【问题标题】:acos(1) returns NAN in some conditionsacos(1) 在某些情况下返回 NAN
【发布时间】: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 中,因此您可以看到它实际上返回了这些值。

【问题讨论】:

    标签: php math floating-point trigonometry nan


    【解决方案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() 更精确的原因是什么?
    猜你喜欢
    • 2012-12-11
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 2019-12-27
    • 2010-12-31
    • 2019-02-16
    相关资源
    最近更新 更多