Экспонента

  • Автор темы Rooney
  • Дата начала
R

Rooney

#1
Добрый вечер!
Помогите пожалуйста с вопросом: как запрограммировать функцию exp(x). Это стандартная функция, мне нужно сделать аналог своей функции.
exp(x) = 1 + x + (x^2)/2!+(x^3)/3!....+(x^n)/n!+.....
Нужно использовать несколько циклов?
 

DarkKnight

Well-known member
01.08.2010
653
0
#2
Нет, всего один.
для удобства вынеси функцию факториала
C++:
double Sum = 0;

for (int i=0;i <= N; i++)
{
//i у тебя тут будет отвечать только за степень и за часное
Sum += pow(x,i)/factorial(i)
}
 

DarkKnight

Well-known member
01.08.2010
653
0
#3
Не, сорь... Чет на функцию глянул, последовательность сразу выразил..
Не верно вообщем воспринял...
Там же для точности итераций 20+ нужно, а это числейшее переполнение в факториале, так что все же лучше цикл в цикле сделать что бы переполнения не было

C++:
	for (int i = 0; i < 100;i++)
{
double Value = pow(x,i);
for (int j = 1; j<=i; j++)
{
Value = Value/j; //вот тут наш факториал в частном как раз только реализацию безопасная, стремление числа к нулю
}
Sum+= Value;
cout<<endl<<Sum; //Вывод посмотришь по итерациям (хватает в принципи 18-25)
}
Ну а вообще если хочешь получить точные значение с заданой тобою точностью то нужно отталкиваться не от N а от проверки промежуточого элемента суммы и твоей точности (в даном случае ПОКА X^i/i! > ТВОЯ_ТОЧНОСТЬ)
C++:
	double Value=1; //Промежуточное значение
double Tochnost = 0.0000000000000001; //Точность
int Iter = 0; //Переменная кол-ва итераций

for (int i = 0; Value > Tochnost;i++) //Перебираем пока не удовлеворит точности
{
Value = pow(x,i); // **Или здесь Value = 1;
for (int j = 1; j<=i; j++)
{
Value = Value/j; //**А здесь Value = Value*x/j но вообще разницы нет как таковой
}										//переполнение все равно рано или поздно наступит стандартная например уже затыкается на exp(900.0)
Sum+= Value;
Iter ++;

}
return Sum;
 
A

Angelique

#4
DarkKnight125
for (int j = 1; j<=i; j++) { Value = Value/j; //вот тут наш факториал в частном как раз только реализацию безопасная, стремление числа к нулю }
Объясните, пожалуйста, каких именно проблем помогает избежать данная реализация.
 

DarkKnight

Well-known member
01.08.2010
653
0
#5
Переполнения...
Факториал J - это число намного большее, чем степень X^i, и что бы оттянуть переполнение лучше отталкиваться от частного элементов произведения факториала, чем сначало находить сам факториал (который намного быстрее переполнится)...