sin в C++
- un4-funeral
- Сообщения: 60
- Зарегистрирован: 18 апр 2008, 23:40
- Контактная информация:
вот интересное дело...
если угол принадлежит от 0 до 90 градусов, то норм считает
если вводить 180 градусов, то выдаёт 1,22460635382238E-16
ну да...степень -16..то есть, если округлить, то 0
но по сути, при 180 градусах ровно 0 получится должен
От чего эта погрешность получается ?
если угол принадлежит от 0 до 90 градусов, то норм считает
если вводить 180 градусов, то выдаёт 1,22460635382238E-16
ну да...степень -16..то есть, если округлить, то 0
но по сути, при 180 градусах ровно 0 получится должен
От чего эта погрешность получается ?
un4-funeral,
вообще-то, любопытно, как это вы считаете синут от 180 градусов, когда значение параметра этой функции должно указываться в радианах.
Если же вы делаете (как и должно быть) преобразование 180 градусов -> радианы, то вот вам, пожалуйста, и погрешность появляется. При умножении на иррациональное число "пи".
вообще-то, любопытно, как это вы считаете синут от 180 градусов, когда значение параметра этой функции должно указываться в радианах.
Если же вы делаете (как и должно быть) преобразование 180 градусов -> радианы, то вот вам, пожалуйста, и погрешность появляется. При умножении на иррациональное число "пи".
мм..Возможно то, что sin() в С++ (стандартный из math.h) - считает не от градусов, а от радиан.
И для того требуется делить на 180 и умножить на PI.
Но ведь PI - бесконечная десят. дробя=> целиком ее ввести нельзя.
sin(PI) = 0;
но у нас sin(a) : a->PI. оно близко по значению, но всеже не равно..
Возможен такой вариант.
И для того требуется делить на 180 и умножить на PI.
Но ведь PI - бесконечная десят. дробя=> целиком ее ввести нельзя.
sin(PI) = 0;
но у нас sin(a) : a->PI. оно близко по значению, но всеже не равно..
Возможен такой вариант.
Во многих библиотеках очень любят задавать число Пи фиксированной константой, несмотря на то, что более точное значение храниться в самом FPU.
Пи = 3.1415926535898
При таком раскладе sin(Pi) не равен 0, но близок к нему.
Пи = 3.1415926535898
При таком раскладе sin(Pi) не равен 0, но близок к нему.
It's a long way to the top if you wanna rock'n'roll
- un4-funeral
- Сообщения: 60
- Зарегистрирован: 18 апр 2008, 23:40
- Контактная информация:
да знаю, что в радианах
sin(a/180*M_PI)
a ввожу в градусах
в функцию синус уже радианы отправляет
но ,есил ввести угол 30 градусов, то он роавно 0.5 ответ выдаёт..то есть дело не в погрешности
и не только в C++ такое
пытался заюзать ассембелровскую вставку
считает для 0<=x<180 тоже
sin(a/180*M_PI)
a ввожу в градусах
в функцию синус уже радианы отправляет
но ,есил ввести угол 30 градусов, то он роавно 0.5 ответ выдаёт..то есть дело не в погрешности
и не только в C++ такое
пытался заюзать ассембелровскую вставку
Код: Выделить всё
double sin_asm(double x)
{
double y;
__asm
{
fld x;
fsin;
fstp y;
}
return y;
}
Из последнего поста так и не понял - проблема решена или нет?
It's a long way to the top if you wanna rock'n'roll
- un4-funeral
- Сообщения: 60
- Зарегистрирован: 18 апр 2008, 23:40
- Контактная информация:
somewhere писал(а):Из последнего поста так и не понял - проблема решена или нет?
нет =/
то есть, как сделать, чтоб решал для всех углов, я могу сделать
Просто хочу разобраться, в чём конкретно загвостка...не гоже так бросать
чему точно равно M_PI можно посмотреть?
It's a long way to the top if you wanna rock'n'roll
- un4-funeral
- Сообщения: 60
- Зарегистрирован: 18 апр 2008, 23:40
- Контактная информация:
на экран вывести ) M_PI типа double
3,14159265358979
3,14159265358979
Сейчас пробовал сам, константа типа double может хранить число Пи лишь с точностью до 15 знака, остальные что идут после числу Пи не пренадлежат либо равны 0. Соответственно Sin(Pi) дает результат с "погрешностью" до 15-16 знаков, т.к. при вычислении синуса задействуется FPU, а он как известно работает с 10-байтовыми числами, а значит вычисляет точнее, т.к. M_PI все же меньше чем Пи, не так ли?
It's a long way to the top if you wanna rock'n'roll