Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Программа вычисления ряда sin(x)-cos(x)+1  (Прочитано 21962 раз)
0 Пользователей и 1 Гость смотрят эту тему.
KRP07
Гость
« : 09-02-2007 12:28 » 

Задача по прикладной математике. Нужно в C++ написать программу для расчета формулы sin(x)-cos(x)+1. Ряд: ((x(2+x))/2!)-((x^3(4+x))/4!)+((x^5(6+x))/6!)-...


ОЧЕНЬ НАДО. ЗАРАНЕЕ ОГРОМНОЕ СПАСИБО.
« Последнее редактирование: 16-02-2007 15:32 от Finch » Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #1 : 09-02-2007 14:43 » 

А в чем, собственно, проблема у автора задачи?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 09-02-2007 19:10 » 

А в чем, собственно, проблема у автора задачи?

Скорее всего в не знании предмета совсем Жаль

Код:
inline double abs(double a) 
{return a>=0? a: -a;}

#define delta 0.000001    //Tochnost vichesleniy
// ((x(2+x))/2!)-((x^3(4+x))/4!)+((x^5(6+x))/6!)-...
// sin(x)-cos(x)+1
double sincos1(double x)
{
   double res=0;     
   double fac=2;         //Factorial
   double begfac=2;      //Begunok po factorialu
   int fl=1;             //Perevertish
   double oldres=3;      //Kontrolniy Res
   double NextX=x*x;     // Dobavlenie k stepeni
   double dX=x;          //Stepen
   while (abs(oldres-res) >delta)
   {
      oldres=res;
      res+=fl*((dX*(begfac+x))/fac);
      dX*=NextX;
      fl*=-1;
      fac=fac*(++begfac)*(++begfac);
   }
   return res;
}
« Последнее редактирование: 09-02-2007 19:16 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 12-02-2007 06:49 » 

а можно вот так Улыбаюсь) гораздо интересней

Код:
template<int nF>
struct factor;

template<>
struct factor<1>
{
enum {value = 1};
};

template<int nF>
struct factor
{
enum {value = factor<nF-1>::value*nF};
};

const int cDeep = 10;

template<int nD>
struct func;

template<>
struct func<0>
{
static double calc(double x){return 0.0;}
};

template<int nD> // тут мы задём колличество элеменов (x^n(n+1+x))/(n+1)!)
struct func
{
enum{mul = 1-(2*((nD+1)%2))};
static double calc(double x)
{
return mul * (pow(x,nD*2-1)*(nD*2+x)/factor<nD*2>::value) + func<nD-1>::calc(x);
};
};

int _tmain(int argc, _TCHAR* argv[])
{
//std::cout << factor<3>::value;
std::cout << func<3>::calc(1);
return 0;
}
Записан

Странно всё это....
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 12-02-2007 20:37 » 

LogRus, Я конечно все понимаю. Но нафига факториал и степень несколько раз пересчитывать. Это первое. Второе: Шаблоны: мне просто интересно, через какой период времени после начала изучения программирования ты начал изучать шаблоны?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #5 : 13-02-2007 08:17 » 

Finch, ну факториал считается допустим на этапе компиляции Улыбаюсь метапрограммирование называется Улыбаюсь
что касется степени то она считается один раз для каждой из степеней, но уверен(почти наверняка) можно переделать шаблоны, так что степени бут расчитыватся исходя из значения предыдущей
а о вопросе нафига, а затем, что бы простую(и даже противную в своей простоте) задачу превратить в разминку для ума Улыбаюсь

шаблоны начал старатся применять сравнительно не давно, как только о них узнал(пару лет назад)
но думаю их можно применять с первых дней изучения, крайне полезный инструмент
подробно описаны тут
C++ Templates: The Complete Guide
By David Vandevoorde, Nicolai M. Josuttis
есть русский перевод
книгу иногда назвают "книгой по шаблонам с кубиками на обложке" Улыбаюсь
Записан

Странно всё это....
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #6 : 13-02-2007 09:02 » new

вот новый экземпляр Улыбаюсь

шаблон func2 считает каждую из степеней только раз
Код:
template<int nF>
struct factor;

template<>
struct factor<1>
{
enum {value = 1};
};

template<int nF>
struct factor
{
enum {value = factor<nF-1>::value*nF};
};

const int cDeep = 10;

template<int nD>
struct func;

template<>
struct func<0>
{
static double calc(double x){return 0.0;}
};

template<int nD>
struct func
{
enum{mul = 1-(2*((nD+1)%2))};
static double calc(double x)
{
return mul * (pow(x,nD*2-1)*(nD*2+x)/factor<nD*2>::value) + func<nD-1>::calc(x);
};
};

template<int nD>
struct func2;

template<>
struct func2<0>
{
double xn_;
func2(double x):xn_(1.0){}
static double calc(){return 0.0;}
};

template<int nD>
struct func2
{
double xn_;
double x_;
func2<nD-1> func_;
func2(double x):func_(x),x_(x)
{
xn_ = func_.xn_ * x_ * x_;
}
enum{mul = 1-(2*((nD+1)%2))};
double calc()
{
return mul * (xn_*(nD*2+x_)/factor<nD*2>::value) + func_.calc();
};
};

int _tmain(int argc, _TCHAR* argv[])
{
//std::cout << factor<3>::value;
std::cout << func<3>::calc(1) << "\n";
std::cout << func2<3>(1).calc() << "\n";
return 0;
}
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines