cos градусов не совпадает с cos эквивалентных радианов - PullRequest
5 голосов
/ 19 сентября 2010

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

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

var rad = angle * Math.PI / 180

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

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

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

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

Я, очевидно, здесь упускаю что-то очевидное, но, чёрт побери, это не всё в порядке.

Ответы [ 6 ]

11 голосов
/ 19 сентября 2010

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

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

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

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

1 голос
/ 19 сентября 2010

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

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

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

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

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

1 голос
/ 19 сентября 2010

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

1 голос
/ 19 сентября 2010

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

Измените свой код, чтобы он не "испортился", если у вас есть ошибки порядка 11000000000.

0 голосов
/ 07 марта 2014

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

0 голосов
/ 19 сентября 2010

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

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

Преобразование Google в радиан округлено, и это округление вызывает ошибку.

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

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

...