php - acos(1) 在某些情况下返回 NAN

标签 php math floating-point trigonometry 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 中,因此您可以看到它实际上返回了这些值。

最佳答案

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

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

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

关于php - acos(1) 在某些情况下返回 NAN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37184259/

相关文章:

java - 如何在java中使用高斯分布计算靶心上的随机点

ios - 计算正确的冲力或力以将 Box2D 主体移动到特定位置 - Box2D

PHP - float 精度

haskell - 分数类型比较

php - 随机化具有不合格条件的数字数组

php在设置准备语句的try block 中执行 undefined variable

math - float 学有问题吗?

python - 浮点到 IEEE-754,分为两个 16 位字

php - 如何通过PHP获取image/png内容

php - laravel 5.3 ORM中如何调用mysql存储过程带参数说明