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

Vic*_*huk 6 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
Run Code Online (Sandbox Code Playgroud)

正如您从注释中看到的,$dist等于1在计算之后,但是在我应用acos()时返回NAN

如果我尝试手动复制它,则效果很好:

$x = 1;
$x = acos($x);
var_dump($x);  // returns 0 as expected
Run Code Online (Sandbox Code Playgroud)

这是怎么回事,我该如何解决?

是在线外壳程序的相同代码,因此您可以看到它实际上返回了这些值。

Vic*_*huk 7

找到了解决方案。看来问题与精度有关。如果我确定该$dist值在[-1,1]范围内,则可以正常工作:

$dist = acos(min(max($dist,-1.0),1.0)); 
Run Code Online (Sandbox Code Playgroud)

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