1. Мегаконкурс в апреле "Приведи друзей на codeby". Дарим деньги, подписку на журнал хакер и выдаем статус "Paid Access". Подробнее ...

    Скрыть объявление

Экспонента

Тема в разделе "C/C++/C#", создана пользователем Rooney, 1 авг 2010.

Наш партнер Genesis Hackspace
  1. Rooney

    Rooney Гость

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

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Нет, всего один.
    для удобства вынеси функцию факториала
    Код (C++):
    double Sum = 0;

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

    DarkKnight Well-Known Member
    C\C++ Team

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

    Angelique Гость

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

    DarkKnight Well-Known Member
    C\C++ Team

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

Поделиться этой страницей