#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);