acos (1) возвращает 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

Что здесь происходит и как я могу это исправить?

Вот тот же код в онлайн-оболочке, так что вы можете видеть, что она на самом деле возвращает эти значения.

3

Решение

Нашел решение. Кажется, что проблема связана с точностью. Если я удостоверился, что $dist внутри [-1,1] дальность, отлично работает

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

Рабочий пример: https://3v4l.org/dlunK

4

Другие решения

Это потому что $dist немного больше 1, из-за округления.

var_export($dist);

дает мне

1.0000000000000002
1

По вопросам рекламы [email protected]