Как я могу заставить функцию php cos возвращать правильное значение?

#php #floating-point #trigonometry

#php #с плавающей запятой #тригонометрия

Вопрос:

Я пытался

 $x = cos(deg2rad($angle));
  

но она возвращает 6.12323399574E-17, когда угол равен 90 градусам вместо 0.
Я читал, что это проблема с плавающей запятой, но есть ли обходной путь?

Ответ №1:

6.1E-17 в любом случае почти равен нулю[*]. Если вам действительно нужно сравнить результат с нулем, в математике с плавающей запятой вы должны проверить, что он находится в пределах определенного допуска к желаемому значению, поскольку большинство чисел не могут быть представлены правильно.

 $x = cos(deg2rad($angle));
$is_zero = (abs($x) < 1e-10);
  

Строго говоря, конечно, ноль на самом деле является числом, которое может быть правильно представлено с плавающей запятой. Реальная проблема в том, что этого pi / 2.0 не может быть, поэтому входные данные в вашу cos функцию не «правильные».

[*] Чтобы поместить это в контекст, взятый в пропорции к 1 а.е. (среднее расстояние от Солнца до Земли), это эквивалентно 0,0092 миллиметра, или примерно десятой части средней ширины человеческого волоса…

Ответ №2:

6.12323399574E-17 — это чрезвычайно маленькое число с плавающей запятой (17 нулей после запятой, за которыми следует 6), почти неотличимое от 0. Если вы имеете дело с плавающими точками (как и любая функция косинуса), вы не сможете избежать подобных проблем. Если вам нужно сравнить число с плавающей запятой с нулем, вы должны сделать это с помощью полос ошибок (т. Е. Находится ли это число в определенном диапазоне значений около нуля), а не абсолютного сравнения, даже с более простыми функциями, чем косинус. Если вам просто нужно произвести некоторые вычисления с результатом (сложить его, умножить, что угодно), он будет вести себя почти точно как ноль, так что вам не нужно будет беспокоиться.

Ответ №3:

Попробуйте это

 $x = round(cos(deg2rad($angle)), 3);