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

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Экспонента

  • Автор темы 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, и что бы оттянуть переполнение лучше отталкиваться от частного элементов произведения факториала, чем сначало находить сам факториал (который намного быстрее переполнится)...
 
Мы в соцсетях:

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