Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 58, средняя оценка - 4.78
Rooney
0 / 0 / 0
Регистрация: 22.11.2009
Сообщений: 37
#1

Как запрограммировать экспоненту - C++

01.08.2010, 17:50. Просмотров 7277. Ответов 26
Метки нет (Все метки)

Добрый вечер!
Помогите пожалуйста с вопросом: как запрограммировать функцию exp(x). Это стандартная функция, мне нужно сделать аналог своей функции.
exp(x) = 1 + x + (x^2)/2!+(x^3)/3!....+(x^n)/n!+.....
Нужно использовать несколько циклов?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2010, 17:50     Как запрограммировать экспоненту
Посмотрите здесь:

Помогите запрограммировать экспоненту за соотношением... - C++
Помогите пожалуйста запрограммировать экспоненту за соотношением (-целая,{x}-дробная часть x) Если можно, с комментариями.

Как запрограммировать тест-программу на C++? - C++
привет всем.у меня такая задача,я должна написать тестовую систему на C++,с помошью которого должно проверяться знание студента о какой то...

Как запрограммировать функцию со сменным количеством параметров - C++
Кто силен в теории, ответьте, пожалуйста: Как запрограммировать функцию со сменным количеством параметров? Как правильно работать...

Как запрограммировать в рекурсивной форме алгоритм бинарного поиска - C++
Помогите пожалуйста!!! Как запрограммировать в рекурсивной форме алгоритм бинарного поиска

C++ Threads или как запрограммировать кнопку Старт и Стоп - C++
Погуглил нечего не нашёл на эту тему..

Посчитать экспоненту в степени -х с заданной точностью - C++
Может кто помочь? Как по формуле Тейлора в с++ посчитать экспоненту в степени -х c высокой точностью для больших x? По идее чем больше...

Сколько в float выделяется под экспоненту ? - C++
Сколько в float выделяется под экспоненту ? в одном источнике читаю - 1 бит под знак и 7 под экспоненту, в другом - 8 бит под экспоненту%-)...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
01.08.2010, 22:50     Как запрограммировать экспоненту #16
Цитата Сообщение от Rooney Посмотреть сообщение
dTemp >= precision
последнее слагаемое больше эпсилон
dTemp - слагаемое x^n/n!
вместо того, чтобы заново считать слагаемое x^(n+1)/(n+1)! можно просто домножить dTemp*x/(n+1)
насчет шага сами решите как его возвращать, вы его никак не возвращаете
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
01.08.2010, 23:32     Как запрограммировать экспоненту #17
Четко. Сравните.
Хех. Для двух работало а дальше что-то стопорится. Сейчас попробую исправить. Ссори
ЗЫ для 8 и 0.00001 не могу понять что происходит. Факториал i увеличивается бесконечно. Следовательно факториал просто не влезает, ибо максимум факториал 20-21 память может в себя вместить. Даже если использовать самый большой целочисленный тип
До пяти - работает. Дальше факториал превышает возможное. Так что...
При точности 0.1 - до семи. При 0.01 - до шести. ЗЫ различия минимальные с результатом стандартной функции. При 0.001 до пяти и т.д.
При 1 и 0.0000001 выдает 2.71828, что есть правильное значение экспоненты
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <math.h>
#include <stdio.h>
 
typedef unsigned long long u_ll;
 
u_ll Factorial(int);
double Power(double, double);
double Exp(double, double);
 
int main()
{
    double Expon=Exp(2, 0.000001); 
    double expon=exp(2.0);
    printf("%g\n", Expon);
    printf("%g\n", expon);
    return 0;
}
 
u_ll Factorial(int n)
{
    if(n==1)
        return n;
    else
        return n*Factorial(n-1);
}
 
double Power(double n, double p)
{
    if(p==1)
        return n;
    else
        return n*Power(n, p-1);
}
 
double Exp(double n, double e)
{
    double exp=1;
    double sum=1;
    int i=1;
    do
    {
        exp=(Power(n, i)/Factorial(i));
        sum+=exp;
        i++;
    }while(exp>e);
    return sum;
}
Добавлено через 12 минут
%g можно заменить на %f для большей точности вывода
Rooney
0 / 0 / 0
Регистрация: 22.11.2009
Сообщений: 37
02.08.2010, 11:45  [ТС]     Как запрограммировать экспоненту #18
alex_x_x,
Скажите пожалуйста можно ли обойтись без указателя, и если не сложно объясните как он работает в этой программе. Ваш Вариант самый точный! (переменная int* step);
И где мы задаём значение для этой константы : const double precision.
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
02.08.2010, 14:07     Как запрограммировать экспоненту #19
Rooney, вы сказали, что вам на си надо, на си по-другому нельзя изменять значения параметров, можно использовать ссылку как в первом варианте, можно вообще забить на шаг, просто уберите его из заголовка функции
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
02.08.2010, 14:17     Как запрограммировать экспоненту #20
Цитата Сообщение от Rooney Посмотреть сообщение
Скажите пожалуйста можно ли обойтись без указателя, и если не сложно объясните как он работает в этой программе.
Можно обойтись без указателя, просто убери его объявление в прототипе и удали строку
C
1
*step = nStep;
Одно из применений указателя в функции (как в этой) - это возврат в вызывающую функцию дополнительных значений, здесь указатель используется для возврата количества слагаемых.

Добавлено через 3 минуты
Lavroff, настоятельно рекомендую ознакомиться с терминами "аналитическая форма записи" и "рекурентная форма записи"
Rooney
0 / 0 / 0
Регистрация: 22.11.2009
Сообщений: 37
02.08.2010, 18:28  [ТС]     Как запрограммировать экспоненту #21
kazak,
alex_x_x
Спасибо большое!!! Всё разобрался
Rooney
0 / 0 / 0
Регистрация: 22.11.2009
Сообщений: 37
03.08.2010, 22:05  [ТС]     Как запрограммировать экспоненту #22
Подредактировал, вот окончательный вариант. Компилятор Dev C++:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/*
Proc 40.
Описать функцию Exp1(x,eps) вещественного типа (параметры x, eps - вещественные,
eps > 0), находящую приближённое значение функции exp(x):
    exp(x) = 1 + x + (x^2)/(2!) + (x^3)/(3!) + ... + (x^n)/(n!) + ...
(n! = 1*2*3*...*n). В сумме учитывать все слагаемые, боольшие eps.
С помощью Exp1 найти приближённое значение экспоненты для данного
x при шести данных eps.
*/
#include<windows.h>
#include<iostream>
#include<math.h>
double exp1( const double x, const double precision );
using namespace std;
int main(){
      SetConsoleCP(1251);
      SetConsoleOutputCP(1251);  
      int nStep = 0;
      double x, eps;
      int i = 0;
      cout << "Введите X" << endl;
      cin >> x;
      cout << "Введите  eps"<< endl;
      cin >> eps;
      cout << "Значение функции exp1(x) = " << exp1(x, eps) << endl;
      cout << "Значение стандартной функции: "<< exp(x) << endl;
      system("pause");
      return 0;
}
 
double exp1( const double x, const double precision ){
       double dVal, dTemp;
       int nStep = 1;
       for( dVal = 1, dTemp = 1; dTemp >= precision ; nStep++ ){
            dTemp *= x/nStep;
            dVal += dTemp;
       }
       return dVal;
}
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
09.08.2010, 17:45     Как запрограммировать экспоненту #23
беременным женщинам и детям не показывать..

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <iterator>
#include <stdexcept>
#include <numeric>
 
class ExpIterator;
 
ExpIterator begin( const double );
ExpIterator end( const double );
 
class ExpIterator : public std::iterator<std::input_iterator_tag, double> {
public:
  friend ExpIterator begin( const double );
  friend ExpIterator end( const double );
  ExpIterator( const ExpIterator& it ){
    x = it.x;
    dPrecision = it.dPrecision;
    dTemp = it.dTemp;
    bEnd = it.bEnd;
    uStep = it.uStep;
  }
  ExpIterator& operator++() {
    if( bEnd ){
      throw std::out_of_range( "bad idea ++ end iterator" );
    }else{
      dTemp *= x/uStep;
      ++uStep;
    }
    return *this;
  }
  ExpIterator operator++(int){ ExpIterator tmp(*this); operator++(); return tmp; }
  bool operator==(const ExpIterator& rhs) {
    if( !rhs.bEnd && !bEnd ){
      return( uStep == rhs.uStep );
    }else{
      return( bEnd ? rhs.dTemp < dPrecision : dTemp < rhs.dPrecision );
    }
  }
  bool operator!=(const ExpIterator& rhs) {return !operator==(rhs);}
  double operator*() {return dTemp;}
private:
  ExpIterator( const double _x, const double _dPrecision = 0, const bool _bEnd = false ) : 
    x(_x), dPrecision(_dPrecision), uStep(1), bEnd(_bEnd)  {
    if( !bEnd ){ dTemp = 1.0; }
  }
  double x, dPrecision, dTemp;
  unsigned uStep;
  bool bEnd;
};
 
ExpIterator begin( const double x ){ return ExpIterator( x ); }
ExpIterator end( const double dPrecision ){ return ExpIterator( 0, dPrecision, true ); }
 
int main(){
  ExpIterator it = begin( 5.0 ), end_it = end( 1e-5 );
  std::cout << std::accumulate( it, end_it, .0 );
  return 0;
}
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
09.08.2010, 18:04     Как запрограммировать экспоненту #24
Цитата Сообщение от fasked Посмотреть сообщение
просто какая-то прогрессия
А разве это не разложение в ряд тейлора?
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
09.08.2010, 18:17     Как запрограммировать экспоненту #25
Цитата Сообщение от nikkka Посмотреть сообщение
А разве это не разложение в ряд тейлора?
относительно точки 0, или проще говоря в ряд маклорена
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
09.08.2010, 18:54     Как запрограммировать экспоненту #26
alex_x_x,
Цитата Сообщение от Rooney Посмотреть сообщение
exp(x) = 1 + x + (x^2)/2!+(x^3)/3!....+(x^n)/n!+.....
разве это по отношению к 0??
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2010, 19:05     Как запрограммировать экспоненту
Еще ссылки по теме:

Функция вычисляющая экспоненту разложением в ряд Тейлора - C++
Описать функцию Exp1(x,eps) вещественного типа (параметры x, eps — вещественные, eps &gt; 0), находящую приближенное значение функции exp(x):...

Найти матричную экспоненту, используя сумму ряда до слагаемого 10-4 - C++
Здравствуйте, мне нужно найти матричную экспоненту, используя сумму ряда, до слагаемого 10-4 . Я почти весь форум ваш излазил, и гуглил, но...

Запрограммировать на языке С - C++
1.Пользователь вводит два натуральных числа m; n. Заполнить поле m n звёздочками в шахматном порядке 2.Проверить является ли введённое...

Запрограммировать математическую сумму - C++
Помогите запрограммировать математическую суму, сказали что она лёгкая, но я не могу, там кода должно быть на строк 10-15 ...

Помогите запрограммировать задачи. - C++
1. Найти все делители натурального числа n. 2. Заданное натуральное число n представьте в виде суммы различных чисел Фибоначчи. Сколько...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
09.08.2010, 19:05     Как запрограммировать экспоненту #27
http://www.cyberforum.ru/cgi-bin/latex.cgi?f(x) = \sum_{i=0}^{\infty} f^{(i)}(x-x_0) \frac{(x-x_0)^i}{i!}

при x_0 = 0

http://www.cyberforum.ru/cgi-bin/latex.cgi?f(x) = \sum_{i=0}^{\infty} f^{(i)}(x) \frac{x^i}{i!}
Yandex
Объявления
09.08.2010, 19:05     Как запрограммировать экспоненту
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru