Синус π равен 0,0.
Синус M_PI
составляет около 1,224647e-16.
M_PI
не π.
программа выдает ... 1.224647e-16, когда правильный ответ, конечно, 0.
Код дал правильный ответ на 7 мест.
Следующее не печатает синус π . Он печатает синус числа, близкого к π. Смотрите ниже рис.
π // 3.1415926535897932384626433832795...
printf("%.21\n", M_PI); // 3.141592653589793115998
printf("%.21f\n", sin(M_PI));// 0.000000000000000122465
Примечание. С помощью математической функции sine (x) наклон кривой равен -1,0 при x = π . Разница π и M_PI
составляет примерно sin(M_PI)
- , как и ожидалось .
У меня проблемы с округлением
Проблема округления возникает при использовании M_PI
для представления π. M_PI
- это double
, ближайший к π, но поскольку π иррационально и все конечные double
рациональны, они должны различаться - даже на небольшое количество. Так что не проблема прямого округления с sin(), cos(), tan()
. sin(M_PI)
просто разоблачил проблему, начавшуюся с использования неточного π.
Эта проблема с другими ненулевыми результатами, равными sin(M_PI)
, возникает, если код использует другой тип FP, такой как float
, long double
или double
с чем-то отличным от 53 двоичных битов точности. Это вопрос не столько точности, сколько иррационального / рационального.