• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Экспонента

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

Rooney

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

DarkKnight

Нет, всего один.
для удобства вынеси функцию факториала
C++:
double Sum = 0;

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

DarkKnight

Не, сорь... Чет на функцию глянул, последовательность сразу выразил..
Не верно вообщем воспринял...
Там же для точности итераций 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

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

Объясните, пожалуйста, каких именно проблем помогает избежать данная реализация.
 
D

DarkKnight

Переполнения...
Факториал J - это число намного большее, чем степень X^i, и что бы оттянуть переполнение лучше отталкиваться от частного элементов произведения факториала, чем сначало находить сам факториал (который намного быстрее переполнится)...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!