sin в C++

Аватара пользователя
un4-funeral
Сообщения: 58
Зарегистрирован: 18 апр 2008, 23:40
Контактная информация:

24 апр 2008, 23:31

ну получается, что так

проблему синуса я вобщем-то решил
если кому-нить надо, воть

Код: Выделить всё

/*
Вычисление синуса
На входе:  a - типа double(угол в градусах)
На выходе: синус угла 
*/
double sin_rad_grad(double x)
{
        double intpart;
        modf(x/360,&intpart);
        if (abs(intpart)>0)
                {
                if (x<0) x=x-360*intpart;
                else x=x+360*intpart;
                }
        if (x<0) x=x+360;
        if ((x>=0) && (x<180)) return sin(x*M_PI/180);
        if ((x>=180) && (x<360)) return -sin((x-180)*M_PI/180);
}
считает для любого угла...ну главное, чтоб double вместить мог (((:
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

25 апр 2008, 09:02

Это просто глупо, т.к. FPU сам следит за периодом и знаками и никаких тут проверок и кучи кода не надо. У меня такое чувство что вы в Microsoft'е работаете.

Код: Выделить всё

double sin_grad(double x)
{
  double y,c;
  c = 180;
  __asm
  {
     fldpi;
     fmul x;
     fdiv c;
     fsin;
     fstp y;
  }
  return y;
}
Значение X в градусах не должно быть больше 2^63 / PI * 180, что успешно отсеивается типом Double
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
un4-funeral
Сообщения: 58
Зарегистрирован: 18 апр 2008, 23:40
Контактная информация:

25 апр 2008, 15:09

somewhere писал(а):Это просто глупо, т.к. FPU сам следит за периодом и знаками и никаких тут проверок и кучи кода не надо. У меня такое чувство что вы в Microsoft'е работаете.

Код: Выделить всё

double sin_grad(double x)
{
  double y,c;
  c = 180;
  __asm
  {
     fldpi;
     fmul x;
     fdiv c;
     fsin;
     fstp y;
  }
  return y;
}
Значение X в градусах не должно быть больше 2^63 / P086I * 180, что успешно отсеивается типом Double



ну и ?
введя 180 градусов, он выводит ответ -5, 42101086242752E-20
а должно 0
у меня по крайне мере точно всё выводит, хотя и не рационально
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

25 апр 2008, 15:54

Я не знаю как у вас, у меня лично 0. Вы какой функцией результат смотрите?
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
un4-funeral
Сообщения: 58
Зарегистрирован: 18 апр 2008, 23:40
Контактная информация:

25 апр 2008, 16:46

somewhere, MessageDlg например
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

25 апр 2008, 21:45

MessageDlg функция вывода текстового сообщения, мне интересно знать функцию перевода из double в строку
It's a long way to the top if you wanna rock'n'roll
olympian
Сообщения: 8
Зарегистрирован: 23 апр 2008, 01:51

25 апр 2008, 21:48

somewhere писал(а):MessageDlg функция вывода текстового сообщения, мне интересно знать функцию перевода из double в строку


хм, а что трудного?
Банально - 1)Приводим к INT - отсекая дробную часть, выводим INT.Это не сложно.
2)Дробная часть - делаем так 0.xyz... * 10 = x.yz приводим к инту, получаем x. - выводим.Так делаем несколько раз
olympian
Сообщения: 8
Зарегистрирован: 23 апр 2008, 01:51

25 апр 2008, 21:51

upd

чтото я ступил конечно=)
простой sprintf(Buf, "%lf", x);
Где Buf - строка, х - наша переменная
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

26 апр 2008, 15:00

Я не спрашиваю как, я спросил у un4-funeral как он смотрит результат
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
un4-funeral
Сообщения: 58
Зарегистрирован: 18 апр 2008, 23:40
Контактная информация:

26 апр 2008, 20:40

somewhere,
MessageDlg((AnsiString)sin_grad(180),mtInformation,TMsgDlgButtons()<<mbOK,NULL);
Ответить