Просто чтобы прояснить, ваша программа равна , давая вам правильный ответ .То есть, он делает именно то, что вы сказали в коде.
180*M_PI
правильно округляется (согласно IEEE-754) и дает значение:
565.4866776461627750904881395399570465087890625
деление этого на 180 также правильно округляется и дает результат:
3.141592653589793115997963468544185161590576171875
, который не является точно математическим значением π.Фактически, это:
π - 0.0000000000000001224646799147...
член первого порядка ряда Тейлора для sin(x)
вокруг π равен (π-x), поэтому sin(π - x)
для малых x
почти точно-x
.Фактически, вы получите правильно округленный результат .Библиотека не может дать более точный ответ.
Как и Бен Фойгт , если это действительно проблема для вас, вы можете обойти ее, сократив аргумент до диапазона[-90, 90) перед преобразованием из градусов в радианы.Еще лучше предложить njuffa для использования функции sinpi
, которая сделает эту работу за вас.В iOS нет такой функции, но в ней есть vvsinpi
, которая реализует sin (π * x) для векторов и может быть выполнена для того, что вы хотите:
double result;
int vectorLength = 1;
vvsinpi(&result, &operand, &vectorLength);
Пожалуйста, также отправьтеошибка, требующая добавления sinpi
в математическую библиотеку в качестве расширения.