Неточность Math.cos - PullRequest
       1

Неточность Math.cos

4 голосов
/ 14 апреля 2011

alert(Math.cos(Math.PI/2));

Почему результат не является точным нулем?Это неточность или какая-то ошибка в реализации?

Ответы [ 3 ]

11 голосов
/ 14 апреля 2011

Math.PI/2 является приблизительным значением реальной величины pi/2.Взятие точного косинуса этого приблизительного значения не даст ноль.Полученное вами значение является приближенным значением этого точного значения с точностью до базового типа данных с плавающей запятой.

Используя некоторую библиотеку произвольной точности, вы можете оценить разницу между pi/2 в двойной точности и точным значениемдо

 0.0000000000000000612323399573676588613032966137500529104874722961...

Поскольку наклон косинуса, близкого к его нулям, равен 1, можно ожидать, что косинус приближения pi/2 будет приблизительно равен этой разности, и это действительно так.

2 голосов
/ 14 апреля 2011

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

Фракции, такие как 1/3, не могут быть записаны в виде двоичного числа и поэтому не имеют точного представления с плавающей точкой. Даже некоторые числа, которые могут быть записаны точно в десятичном виде, такие как 0.1, не могут быть точно представлены в двоичном виде и поэтому не будут корректно представлены в плавающей запятой.

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

0 голосов
/ 15 апреля 2011

Сравнение вычисленных чисел с плавающей точкой на равенство почти всегда плохая идея, поскольку (как уже говорили другие) они являются приблизительными значениями, и появляются ошибки.

Вместо проверки на a == b, проверьте на равенствос точностью до порогового значения, которое имеет смысл для вашего приложения, как в случае Math.abs (ab) <.00001.Это хорошая практика для любого языка программирования, который представляет числа в виде значений с плавающей запятой. </p>

Если вы храните целые числа в переменных с плавающей запятой и просто складываете, вычитаете и умножаете, они останутся целыми (по крайней мере доони выходят за пределы).Но деление с использованием функций триггера и т. Д. Приведет к ошибкам, которые необходимо учитывать.

-m @

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...