я пробовал
$x = cos(deg2rad($angle));
но он возвращает 6.12323399574E-17, когда угол составляет 90 градусов вместо 0. Я читал, что это проблема с плавающей точкой, но есть ли обходной путь?
6.1E-17 почти равно нулю [*]. Если вам нужно фактически сравнить результат с нолем, в математике с плавающей запятой вы должны проверить, что он находится в пределах определенного допуска желаемого значения, так как большинство чисел невозможно представить правильно.
$x = cos(deg2rad($angle)); $is_zero = (abs($x) < 1e-10);
Строго говоря, конечно, нуль на самом деле является числом, которое может быть правильно отображено в плавающей точке. Реальная проблема заключается в том, что pi / 2.0
не может быть, поэтому вход в вашу функцию cos
не является «правильным».
[*] Чтобы сделать это в контексте, взятом в пропорции 1 AU (среднее расстояние от Солнца до Земли), это эквивалентно 0,0092 миллиметрам , или примерно на десятую от средней ширины человеческого волоса …
6.12323399574E-17 – чрезвычайно маленькое число с плавающей запятой (17 нулей после десятичной точки, за которым следует 6), почти неотличимое от 0. Если вы имеете дело с плавающими точками (как и любая функция косинуса), вы не можете избежать проблем как это. Если вам нужно сравнить число с плавающей точкой до нуля, вы должны сделать это с ошибками (т. Е. Это число в пределах определенного диапазона значений около нуля), а не абсолютное сравнение, даже с более простыми функциями, чем косинус. Если вам просто нужно сделать некоторую математику с результатом (добавьте ее, умножьте ее, что угодно), она будет вести себя почти точно так же, как ноль, поэтому вам не придется беспокоиться.
Попробуй это
$x = round(cos(deg2rad($angle)), 3);