1 / 1 / 0
Регистрация: 22.11.2009
Сообщений: 37
1

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

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

Author24 — интернет-сервис помощи студентам
Добрый вечер!
Помогите пожалуйста с вопросом: как запрограммировать функцию exp(x). Это стандартная функция, мне нужно сделать аналог своей функции.
exp(x) = 1 + x + (x^2)/2!+(x^3)/3!....+(x^n)/n!+.....
Нужно использовать несколько циклов?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.08.2010, 17:50
Ответы с готовыми решениями:

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

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

Как запрограммировать математические многочлены, формулы?
Каким образом запрограммировать математические вычисления вида: (a1+a2+… + an)/n ( a1+(a2+a3)/2+(a4+a5+a6)/3+… +(a'n-k'+...+an)/k ) / p...

26
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
01.08.2010, 18:11 2
Rooney, exp=1 изначально. написать функцию факториала дополнительно. цикл начинать с 1:
exp+=(pow(x,i)/fact(i))
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
01.08.2010, 18:14 3
ряд, который вы привели не совсем экспонента. функция эскпоненты должна возвращать число e в степени x. у вас просто какая-то прогрессия, описать ее можно вот так.
если я все правильно понял
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
#include <iostream>
 
long factorial(long x) { 
    if( x == 0 ) return 1;
    return x * factorial (x - 1);
}
 
double power(double x, long n) {
    if(n == 0) return 1;
    if(n < 0) return power ( 1.0 / x, --n);
    return x * power(x, n - 1);
}
 
double exp(double x, long n) {
    ++x;
    for(long i = 1; i <= n; ++i)
        x += power(x, i) / factorial(i);
    return x;
}
 
int main()
{
    std::cout << exp(3.1, 3) << std::endl;
}
0
1 / 1 / 0
Регистрация: 22.11.2009
Сообщений: 37
01.08.2010, 18:22  [ТС] 4
Спасибо всем!! Щас попробую разобраться))
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
01.08.2010, 18:32 5
Цитата Сообщение от Lavroff Посмотреть сообщение
fasked, Единственный вопрос. Зачем в функции экспоненты:
++x;
Тем более 3.1+1=4.1...
А по прогрессии в начале таки идет exp(x) = 1
ну я говорю, я не экспоненту писал, а вычисления ряда.
а там было так: exp(x) = 1 + x + (x^2)/2!+(x^3)/3!....+(x^n)/n!+.....
1 + х, x - стартовое значение должно увеличиться на единицу, вот и все.
но ошибка все таки есть =) цикл надо было с двойки начинать

Не по теме:

честно говоря, я не пробовал запускать, то что написал :-[

0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
01.08.2010, 18:32 6
fasked, Имхо так будет более похоже на данную последовательность

C++
1
2
3
4
5
6
double exp(double x, long n) {
    double e=1;
    for(long i = 1; i <= n; ++i)
        e += power(x, i) / factorial(i);
    return e;
}
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
01.08.2010, 18:34 7
Цитата Сообщение от Lavroff Посмотреть сообщение
Имхо так будет более похоже на данную последовательность
да, похоже ты прав. я не учел что x не должен изменяться
0
01.08.2010, 18:35 8

Не по теме:

fasked, =) Я просто посмотрел на результат того что выдает твоя функция и надолго впал в ступор) 3 3 дает 10706 и какие-то копейки)

0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
01.08.2010, 18:59 9
эфеективность плачет горькими слезами...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <cstdio>
 
using std::printf;
 
#define PRECISION 1e-6
 
//exp(x) = 1 + x + (x^2)/2!+(x^3)/3!....+(x^n)/n!+.....
 
double exp( const double x ){
  double dVal, dTemp;
  int nStep = 1;
  for( dVal = 1.0, dTemp = 1.0; dTemp >= PRECISION ; ++nStep ){
    dTemp *= x/nStep;
    dVal += dTemp;
  }
  return dVal;
}
 
int main(){
  printf( "%f\n", exp( 5.0 ) );
  return 0;
}
Добавлено через 4 минуты
Цитата Сообщение от fasked Посмотреть сообщение
ряд, который вы привели не совсем экспонента. функция эскпоненты должна возвращать число e в степени x. у вас просто какая-то прогрессия, описать ее можно вот так.
это ряд экспоненты, все правильно
2
1 / 1 / 0
Регистрация: 22.11.2009
Сообщений: 37
01.08.2010, 19:59  [ТС] 10
Как известно, есть в C встроенная функция (при подключении пакета #include<math.h>) вызывается exp(x)
Мне надо создать функцию с двумя аргументами, exp1(x,eps),
где eps -- эпсилон.
В сумме нужно учитывать все слогаемые больше этого эпсилон.
Тогда значение своей функции будет очень близким к значению стандартной функции.

C++
1
2
3
  for(long i = 1; i <= n; ++i){
        e += power(x, i) / factorial(i);
    }
Мне в функцию можно передать только Х и Эпсилон, как мне получить значение N? Или тогда по-другому строить цикл?

Добавлено через 57 секунд
Пожалуйста, если вам не сложно не используйте С++ вариант..я ещё пока на стадии изучения языка С
0
 Аватар для genius5
115 / 36 / 3
Регистрация: 13.12.2009
Сообщений: 223
01.08.2010, 20:16 11
тогда сделай цикл while(sagaemoe>epsilon){.....}
как сслогаемое меньше выходит из цикла
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
01.08.2010, 21:48 12
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h> 
 
//exp(x) = 1 + x + (x^2)/2!+(x^3)/3!....+(x^n)/n!+.....
double _exp( const double x, const double precision, int* step ){
  double dVal, dTemp;
  int nStep = 1;
  for( dVal = 1.0, dTemp = 1.0; dTemp >= precision ; ++nStep ){
    dTemp *= x/nStep;
    dVal += dTemp;
  }
  *step = nStep;
  return dVal;
}
 
int main(){
  int nStep = 0;
  printf( "%f ", _exp( 5.0, 1e-6, &nStep ) );
  printf( "with %d steps\n", nStep );
  return 0;
}
вот вам на це
1
1 / 1 / 0
Регистрация: 22.11.2009
Сообщений: 37
01.08.2010, 22:13  [ТС] 13
Постарался оформить по-своему. При вводе 2 и Эпсилон = 0.000001 результат отличается на несколько тысячных.. Чем дальше тем больше неточность... при вводе 8 и Эпсилон 0.00001 результат получается отрицательным, тогда как системное значение увеличивается
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
#include<windows.h>
#include<iostream>
#include<math.h>
long factorial(int x);
double power(double x, int n);
double exp1(double x, double eps);
using namespace std;
int main(){
        SetConsoleCP(1251);
        SetConsoleOutputCP(1251);
        double x;
        int eps;
        cout << "Введите x" << endl;
        cin >>  x;
        cout << "Введите Эпсилон" << endl;
        cin >> eps;    
        cout <<"Своё значение экспоненты  " << exp1(x,eps)<< endl; 
        cout << exp(x)<< endl;
        system("pause");
        return 0;
}
 
long factorial(int d) {    // вычисление факториала, работает
    int faktor = 1;            // факториал
    int i = d;            // столько раз выполним цикл   
    if( d == 0 ) return 1; // если факториал 0 то возвращаем результат 1
    while (i ){      // пока i больше 0 
          faktor *= i ;
           i--;
    }
    return faktor;
} 
 
double power(double x, int n) { // возведение в степень
    if(n == 0) return 1;         // любое число в степени 0 равно 1
    int i = n;
    double stepen = 1;
    while (i){
        stepen *= x;
        i--;
    }      
    return stepen;
}
double exp1(double x, double eps){  // вычисление экспоненты
     int i=0;
     double e,sum =0;
     do{
        e = power(x, i) / factorial(i);
        sum += e;
        i++;
        } while  (e > eps);  
    return sum;
}
Добавлено через 11 минут
Вот корректные условия задачи :
Описать функцию Exp1(x,eps) вещественного типа (параметры x, eps -- вещественныеб eps >0), находящую приближённое значение функции exp(x):
exp(x) = 1+x+(x^2)/(2!)+(x^3)/(3!)+...+(x^n)+...
В сумме учитывать все слагаемые, большие epsilon.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
01.08.2010, 22:14 14
Rooney, обратите внимание на мой пример - пересчитывать степень и факториал постоянно совершенно не надо

алгоритм странный, но вроде правильный, возможно факториал изза алгоритма получается очень большим и не помещается в int
учитывайте, что точность результата должна быть порядка задаваемого eps
0
1 / 1 / 0
Регистрация: 22.11.2009
Сообщений: 37
01.08.2010, 22:45  [ТС] 15
Да, действительно Ваш способ лучше, но пожалуйста не могли бы вы прокомментировать этот кусок:
C
1
2
3
4
5
6
7
double _exp( const double x, const double precision, int* step ){
  double dVal, dTemp;
  int nStep = 1;
  for( dVal = 1.0, dTemp = 1.0; dTemp >= precision ; ++nStep ){
    dTemp *= x/nStep;
    dVal += dTemp;
  }
Особенно где условие цикла.

Но в условии задачи к сожалению функция вызывается только двумя параметрами: x и epsilon.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 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)
насчет шага сами решите как его возвращать, вы его никак не возвращаете
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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 для большей точности вывода
0
1 / 1 / 0
Регистрация: 22.11.2009
Сообщений: 37
02.08.2010, 11:45  [ТС] 18
alex_x_x,
Скажите пожалуйста можно ли обойтись без указателя, и если не сложно объясните как он работает в этой программе. Ваш Вариант самый точный! (переменная int* step);
И где мы задаём значение для этой константы : const double precision.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
02.08.2010, 14:07 19
Rooney, вы сказали, что вам на си надо, на си по-другому нельзя изменять значения параметров, можно использовать ссылку как в первом варианте, можно вообще забить на шаг, просто уберите его из заголовка функции
0
 Аватар для kazak
3576 / 2721 / 350
Регистрация: 11.03.2009
Сообщений: 6,264
02.08.2010, 14:17 20
Цитата Сообщение от Rooney Посмотреть сообщение
Скажите пожалуйста можно ли обойтись без указателя, и если не сложно объясните как он работает в этой программе.
Можно обойтись без указателя, просто убери его объявление в прототипе и удали строку
C
1
*step = nStep;
Одно из применений указателя в функции (как в этой) - это возврат в вызывающую функцию дополнительных значений, здесь указатель используется для возврата количества слагаемых.

Добавлено через 3 минуты
Lavroff, настоятельно рекомендую ознакомиться с терминами "аналитическая форма записи" и "рекурентная форма записи"
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.08.2010, 14:17
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Циклы for в Python
py-thonny 17.03.2025
Существует множество ситуаций, когда нам нужно выполнить одно и то же действие несколько раз. Цикл for в Python — настоящий рабочий конь для большинства программистов. Если вам нужно пройтись по всем. . .
Предсказание ветвлений - путь к высокопроизводи­тельному C++
NullReferenced 17.03.2025
В высокопроизводительном программировании на C++ каждый такт процессора на счету. Когда речь заходит о разработке систем с низкой задержкой — будь то высокочастотная торговля, обработка потоковых. . .
Паттерн CQRS в C#
UnmanagedCoder 17.03.2025
Создание сложных корпоративных приложений часто требует нестандартных подходов к архитектуре. Один из таких подходов — паттерн CQRS (Command Query Responsibility Segregation), предлагающий простую,. . .
Паттерн Цепочка ответственности в C#
UnmanagedCoder 17.03.2025
Цепочка ответственности — это поведенческий паттерн проектирования, который позволяет передавать запросы последовательно по цепочке потенциальных обработчиков, пока один из них не обработает запрос. . . .
Создаем микросервисы с NestJS, TCP и Typescript
run.dev 17.03.2025
NestJS — фреймворк, который значительно упрощает создание серверных приложений на Node. js. Его прелесть в том, что он комбинирует концепции ООП, функционального программирования и предлагает. . .
Гексагональная архитектура со Spring Boot
Javaican 17.03.2025
Если вы когда-нибудь сталкивались с ситуацией, когда внесение простых изменений в базу данных или пользовательский интерфейс заставляло вас переписывать весь код, то вы точно оцените элегантность. . .
Позиционировани­е Kafka Consumer и Seek-операции
Javaican 17.03.2025
Что же такое Consumer Seek в Kafka? По сути, это API-метод, который позволяет программно указать, с какой позиции (offset) Consumer должен начать или продолжить чтение данных из партиции. Без этого. . .
Python NumPy: Лучшие практики и примеры
py-thonny 17.03.2025
NumPy (Numerical Python) — одна из ключевых библиотек для научных вычислений в Python. Она превращает Python из просто удобного языка общего назначения в среду для проведения сложных математических. . .
Java Micronaut в Docker: контейнеризация с Maven и Jib
Javaican 16.03.2025
Когда речь заходит о микросервисной архитектуре на Java, фреймворк Micronaut выделяется среди конкурентов. Он создан с учётом особенностей облачных сред и контейнеров, что делает его идеальным. . .
Управление зависимостями в Java: Сравнение Spring, Guice и Dagger 2
Javaican 16.03.2025
Инъекция зависимостей (Dependency Injection, DI) — один из фундаментальных паттернов проектирования, который радикально меняет подход к созданию гибких и тестируемых Java-приложений. Суть этого. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru