2015-12-15 8 views
0

Я столкнулся с проблемой точности с плавающей запятой, кто-нибудь знает, почему это происходит? Почему это влияет на функцию косинуса, но не на функцию синуса.Ошибка точности с плавающей точкой JavaScript

Math.sin(90 * Math.PI/180); 
// returned: 1, expected: 1 

1 - Math.sin(90 * Math.PI/180); 
// returned: 0, expected: 0 


Math.cos(90 * Math.PI/180); 
// returned: 6.123233995736766e-17, expected: 0 

1 - Math.cos(90 * Math.PI/180); 
// returned: 0.9999999999999999, expected: 1 
+0

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

+0

Но почему это просто косинус, на который влияет, а не функция синуса? (обновил мой вопрос, чтобы отразить этот комментарий). – thephpdev

+0

0.9 периодический == 1 –

ответ

1

канонический ответ на этот является What Every Computer Scientist Should Know About Floating-Point Arithmetic

С немного больше пытаюсь вы найдете примеры «неожиданные» результаты с синусоидальной функцией.

E.g. Math.sin(180 * Math.PI/180);

+0

Я знаю, почему возникают ошибки точности с плавающей запятой, мой вопрос в том, почему это просто косинус, который возвращает неверное значение для продемонстрированного уравнения? – thephpdev