Cos градусов, не соответствующих Cos эквивалентных радианов

StackOverflow https://stackoverflow.com/questions/3745757

  •  04-10-2019
  •  | 
  •  

Вопрос

Все математические функции в JavaScript используют радианы вместо градусов. Тем не менее, они либо неравны, либо я ухожу на базе.

Преобразование от градусов на радиан:

var rad = angle * Math.PI / 180

Угол 90 градусов равняться 1,57079633 Радиан

Косинус угла 90 градусов равняться 0.
Косинус Radian 1.57079633 равняться -3.20510345 × 10-9.

Обратите внимание, что в JavaScript все сделано за один шаг, чтобы избежать ошибок округления:

var cos = Math.cos(angle * Math.PI / 180);

Я, очевидно, не хватает чего-то очевидного здесь, но мальчик это прикручивает код.

Это было полезно?

Решение

Все сделано за один шаг, чтобы избежать ошибок округления

Как это позволяет избежать ошибок округления? Это просто означает, что ошибки округления не доступны в отдельной переменной, вот и все.

То истинный Значение PI не может быть точно представлено как номер с плавающей запятой, поэтому истинное значение PI / 2 не может. Так что вы не можете дать Math.cos Точное значение, необходимое для получения 0. Но эй - 10-9 это Очень очень маленький количество. Это означает, что если вы рисуете строку в 10000 километрах долго, вы попадаете в 1 см от соответствующей оси.

Это именно то, что вы должны ожидать при работе с номерами плавающих точек. Не сравнивайте с равенством - сравните в пределах какой-то толерантности.

Другие советы

Всегда будут ошибки округления. И плавающая точка в любом случае не математически точна, это только точна для определенного количества значительных цифр.

Измените свой код, чтобы он не «испортил», когда у вас есть ошибки в порядке 1/1000000000.

Для большинства из нас делают серьезные суммы на компьютерах 0 ЯВЛЯЕТСЯ равный -3,20510345 × 10 ^-9 в любую разумную степень точности, которую вы имеете право ожидать при работе с номерами с плавающей точкой. Это тема, которая регулярно покрыта так.

Да, вы просто теряете данные о преобразованиях типа здесь.

90 дежин в радианах не равен ровно 1,5079633. Если бы было более десятичных знаков, что бы преобразовать прямо назад, как ожидалось.

Вы всегда должны быть осторожны с такими вещами. Как упомянуто выше, 10 ^ -9 достаточно близко к нулю.

Также взята из MSDN:

Кроме того, результат операций арифметики и присваивания с двойными значениями могут незначительно отличаться платформой из-за потери точности двойного типа. Например, результат присвоения буквального двойного значения может отличаться в 32-разрядных и 64-битных версиях .NET Framework. Следующий пример иллюстрирует эту разницу при буквальном значении -4.42330604244772Э-305 и переменную, значение которой составляет -4.42330604244772E-305 назначается двойной переменной. Обратите внимание, что результат метода анализа (строки) в этом случае не страдает от потери точности.

В компьютерах, π / 2 радианов не можем Точно равна 90 градусов, потому что π - бесконечно длительное число. Следовательно, нельзя ожидать совершенного решения с π, если компьютер не является ∞-битом.

Я только что понял:

-3.20510345 × 10-9 - это то же самое, что -0.00000000320510345, что очень близко к нулю.

Конверсия Google в Radian округлоще, и это округление вызывает ошибку.

Я предполагаю, что JavaScript, который печально известно его отсутствию точности с числами, также создает неверный радиан, и поэтому его CoSign выходит.

Не уверен, как я решил это, хотя - округление не приемлемо, как это не будет работать на других углах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top