Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 13.10.2022
Сообщений: 16

Возведение экспоненты в степень без Math.Exp

19.10.2022, 20:26. Показов 1274. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день,

Очень прошу о помощи. Нужно возвести экспоненту в степень БЕЗ применения Math.exp() и каких-либо других методов Math.


Формулу прикладываю.


Застопорилась в решении, прикладываю и свой код:

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
using System;
 
namespace Exponenta
{
 
    public class Program
    {
 
        public static int fact(int a)
        {
 
            int b = 1;
            int c;
            for (c = 1; c <= a; b *= c++) ;
            return b;
        }
 
 
        public static int ЭкспонентВСтепени(int cislo){
            int result;
            int k;
            int m = fact(k);
            for(k = 1, m = 1; k <= 100; k++) {
                result += число/ fact(k);  // думаю, здесь косячу
                число = число ^ m;
            }
            return result;
        }
 
 
        static void Main(string[] args)
        {
            int экспонента = ЭкспонентВСтепени(5);
            Console.Write(экспонента);
        }
    }
}
Изображения
 
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.10.2022, 20:26
Ответы с готовыми решениями:

Возведение экспоненты в степень
Пытаюсь вычислить выражение 100*j*sqrt(2)*exp^(-j*pi/4) Выдает ошибку: Error using exp Not enough input arguments. ...

Возведение числа в степень подключите Math
чтобы не мучить мозг экспонентами и прочими премудростями в раздел uses напишите имя модуля Math и тогда с помощью функции Power ...

Возведение в степень с использованием Math.pow(number, var)
Здравствуйте уважаемые форумчане. Я только изучаю JS и скорее всего не дошел до этого, при работе с цыклами и методом Math.pow() столкнулся...

16
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
19.10.2022, 20:38
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public static int ЭкспонентВСтепени(int n)
{
var step = 1d;
var result =  step;
var k = 1;
while(k<=100)
{
step = step*n/k;
result += step;
k++
}
return result;
}
2
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38179 / 21114 / 4307
Регистрация: 12.02.2012
Сообщений: 34,722
Записей в блоге: 14
19.10.2022, 21:49
Не "экспоненты в степень" а числа e в степень! Выучил новое слово - научись его применять к месту.

Diamante, и что ты написал? У тебя сумма дробей - целая (int)! И что за число 100?


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public static double exp(double x, double eps)
{
        double s=1.0;
        double n=1;
        double a=x;
        while (a>=eps)
        {
              s=s+a;
              n++;
              a=a*x/n;
         }
         return s;
}
А... Понял, откуда 100. Из дурацкой постановки.
1
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
19.10.2022, 22:26
Catstail, да возвращаемый тип - д.б. double, очепятался, набирал прям тут
да и
C#
1
k++;
1
1 / 1 / 0
Регистрация: 13.10.2022
Сообщений: 16
19.10.2022, 23:22  [ТС]
Diamante,
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
using System;
 
namespace Exponenta
{
 
    public class Program
    {
 
        public static int fact(int a)
        {
 
            int b = 1;
            int c;
            for (c = 1; c <= a; b *= c++) ;
            return b;
        }
 
 
public static int ЭкспонентВСтепени(int n)
{
var step = 1d;
var result =  step;
var k = 1;
while(k<=100)
{
step = step*n/k;
result += step;
k++
}
return result;
}
 
 
        static void Main(string[] args)
        {
            int экспонента = ЭкспонентВСтепени(5);
            Console.Write(экспонента);
        }
    }
}
А мы мызываем функцию fact для подсчёта факториала?

У меня вот какую ошибку выдаёт на return :

/tmp/XgBorilHGC.cs(47,8): error CS0266: Cannot implicitly convert type 'double' to 'int'. An explicit conversion exists (are you missing a cast?)

Добавлено через 3 минуты
Catstail,

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public static double exp(double x, double eps)
{
        double s=1.0;
        double n=1;
        double a=x;
        while (a>=eps)
        {
              s=s+a;
              n++;
              a=a*x/n;
         }
         return s;
}
А откуда у нас eps?

Мне нужно, чтобы в аргументе было только число, которе будет степенью числа e.

То есть:

double x = exp(3) // должно вернуть 20.08554
0
 Аватар для Doomov
1056 / 335 / 119
Регистрация: 28.11.2020
Сообщений: 1,066
20.10.2022, 04:46
Цитата Сообщение от avokado111 Посмотреть сообщение
double x = exp(3) // должно вернуть 20.08554
Вообще-то Ответ 19,08554...

Теперь само решение:
1 вводим методы...
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
//Сумма
public static double Сумма (double cislo)
{
    double result = 0;
    for (int i = 1; i <= 100; i++)
    {
        result += Composition (cislo, i) / Factorial (i);
    }
    return result;
}
 
 
//рекурсивно значение n^k
 
public static double Composition (double n, double k)
{
    if (k == 0)
        return 1;
    else
        return Composition (n, k - 1) * n;
}
 
//факториал
public static double Factorial (double k)
{
    double result;
    if (k <= 1) return 1;
    result = Factorial (k - 1) * k;
    return result;
}
2. Вызов самой функции:
C#
1
2
3
    double n = 3;
    var res = Сумма (n);
    Console.WriteLine($"n = {n} => Ответ: {res}");
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38179 / 21114 / 4307
Регистрация: 12.02.2012
Сообщений: 34,722
Записей в блоге: 14
20.10.2022, 05:58
Цитата Сообщение от avokado111 Посмотреть сообщение
Мне нужно, чтобы в аргументе было только число, которе будет степенью числа e.
- с какой точностью, дружок? Не забывай, что e - иррациональное число. Поэтому ex можно вычислить лишь с определенной точностью. Мое решение более корректное, и гораздо более рациональное, чем приведенные выше. Особенно повеселило решение Doomov с рекурсивным вычислением факториала и степени... Я бы это не зачёл вообще.

avokado111, если "раздражает" eps, сделай так:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
public static double exp(double x)
{
        double s=1.0;
        double n=1;
        double a=x;
        while (a>=1.0e-14)
        {
              s=s+a;
              n++;
              a=a*x/n;
         }
         return s;
}
и будет тебе счастье.

Цитата Сообщение от Doomov Посмотреть сообщение
Вообще-то Ответ 19,08554.
- нет, ответ, все-таки = 20.0855369231877
1
 Аватар для Doomov
1056 / 335 / 119
Регистрация: 28.11.2020
Сообщений: 1,066
20.10.2022, 06:37
Цитата Сообщение от Catstail Посмотреть сообщение
- нет, ответ, все-таки = 20.0855369231877
А ответ всё таки = 19.0855369231877, при округлении 19.08554. Проверять надо!
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38179 / 21114 / 4307
Регистрация: 12.02.2012
Сообщений: 34,722
Записей в блоге: 14
20.10.2022, 06:38
Doomov, exp(3)=20.0855369231877
Смотри на картинку:
Миниатюры
Возведение экспоненты в степень без Math.Exp  
0
20.10.2022, 07:27

Не по теме:

Цитата Сообщение от Doomov Посмотреть сообщение
А ответ всё таки = 19.0855369231877, при округлении 19.08554

0
 Аватар для Doomov
1056 / 335 / 119
Регистрация: 28.11.2020
Сообщений: 1,066
20.10.2022, 08:01
I can, тогда получается
в принципе верным решение первоначальное
C#
1
2
3
4
//Сумма
public static double Сумма (double cislo)
{
    double result = 1;
Добавлено через 27 минут
Возведение в степень без рекурсии
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static double Pow(double num, int pow)
{
    double result = 1;
 
    if (pow > 0)
    {
        for (int i = 1; i <= pow; ++i)
        {
            result *= num;
        }
    }
    else if (pow < 0)
    {
        for (int i = -1; i >= pow; --i)
        {
            result /= num;
        }
    }
 
    return result;
}
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38179 / 21114 / 4307
Регистрация: 12.02.2012
Сообщений: 34,722
Записей в блоге: 14
20.10.2022, 08:12
Цитата Сообщение от Doomov Посмотреть сообщение
А ошибка у меня только в одном:
- честно говоря, принципиально не хочу копаться в твоем коде. Но если уж решать задачу тупо, "в лоб", то вот:

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
using System;
class HelloWorld {
  
 // Рациональное решение (без факториалов и возведений в степень):
  
 public static double exp(double x)
 {
        double s=1.0;
        double n=1;
        double a=x;
        while (a>=1.0e-14)
        {
              s=s+a;
              n++;
              a=a*x/n;
         }
         return s;
 }  
 
 // Тупое студенческое:
 
 public static double factorial(double n)
 {
     double p=1;
     for (double i=2; i<=n; i++) p*=i;
     return p;
 }
 
 public static double exp_1(double x)
 {
        double s=0.0;
        double n=0;
        double a;
        
        while (true)
        {
            a=Math.Pow(x,n)/factorial(n);
            if (a > 1.0e-15)
            {
                s+=a;
                n++;
            }
            else
                break;
        }
        
        return s;
 }  
  
 static void Main() 
 {
    Console.WriteLine(Math.Exp(3.0));  // Библиотечная функция
    Console.WriteLine(exp(3.0));          // Рациональное
    Console.WriteLine(exp_1(3.0));      // Нерациональное
  }
}
Можно убедиться, что результат всех трех решений идентичен:

20.0855369231877
20.0855369231877
20.0855369231877

А теперь - небольшое дополнение для тех, кто хочет научиться решать подобные задачи (нарциссам c зашкаливающим ЧСВ - не читать).

Как известно из курса математического анализа,

https://www.cyberforum.ru/cgi-bin/latex.cgi?{e}^{x} = \sum_{n=0}^{\infty}{x}^{n}/n!

Этот ряд сходится абсолютно при любом вещественном x. Следовательно, его можно суммировать член за членом, до тех пор, пока очередной член не станет меньше какого-либо маленького числа (точность суммирования). В моем первом коде это параметр eps (который так не понравился avokado111).

Суммирование этого ряда "в лоб" требует вычисления факториала и степени. Такой подход крайне нерационален. И вот почему. Предположим, на k-м шаге уже вычислено xk и k!. На следующем шаге нам нужно вычислить xk+1 и (k+1)! И код снова возведет x в степень k+1 (потратив соотв. количество операций умножения) и вычислит (k+1)! (произведя ~ k умножений). Новедь xk+1=xk*x и (k+1)!=k!*(k+1). Поэтому, если сохранить ранее вычисленные степень и факториал, то следующие значения можно получить всего за два умножения. Выигрыш в производительности совершенно очевиден (для нормальных людей, разумеется!)

Теперь выведем рекуррентную формулу, которая сильно облегчит вычисления:

https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{k}=\frac{{x}^{k}}{k!}

соответственно:

https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{k+1}=\frac{{x}^{k+1}}{(k+1)!}

Вычислим отношение:

https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{k+1}}{{a}_{k}} = \frac{{x}^{k+1}}{(k+1)!} * \frac{k!}{{x}^{k}}=\frac{x}{k+1}

Это значит, что для получения (k+1)-го члена из k-го, достаточно умножить последний на x/(k+1). Что и делается в моем коде.

И последнее. Если кого-то раздражает параметр eps, то его можно сделать необязательным:

C#
1
 public static double exp(double x, double eps=1.0e-14)
Тогда при вызове его можно не задавать.
2
 Аватар для Doomov
1056 / 335 / 119
Регистрация: 28.11.2020
Сообщений: 1,066
20.10.2022, 10:04
Вводим методы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Exp WithOut MathExp
public static double exp (double cislo, int l)
{
    double result = 1.0;
    return Enumerable.Range (1, l).Select (i => Pow (cislo, i) / Fact (i))
                        .Aggregate (result, (r, i) => r + i);
}
 
// Число num в степени pow
public static double Pow (double num, int pow)
{
    var sequence = Enumerable.Repeat (num, pow);
    return pow == 0 ? 1.0 : pow > 0 ?
                    sequence.Aggregate (1.0, (accumulate, current) => accumulate * current) :
                    sequence.Aggregate (1.0, (accumulate, current) => accumulate / current);
}
 
// Факториал n!
public static double Fact (int n)
{
    return n < 2 ? 1.0 : Enumerable.Range (2, n - 1).Aggregate (1.0, (r, i) => r * i);
}
Вызываем функцию:
C#
1
    Console.WriteLine(Exp(3, 100));
Для точного вызывайте библиотеку Math:
C#
1
    Console.WriteLine(Math.Exp(3));
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38179 / 21114 / 4307
Регистрация: 12.02.2012
Сообщений: 34,722
Записей в блоге: 14
20.10.2022, 11:11
Doomov, теперь этот код еще и по памяти будет O(n) (Хотя предыдущий, с рекурсией, тоже память расходовал).
0
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
20.10.2022, 12:34
Цитата Сообщение от Catstail Посмотреть сообщение
Следовательно, его можно суммировать член за членом, до тех пор, пока очередной член не станет меньше какого-либо маленького числа (точность суммирования)
это работает для знакопеременного ряда, а для знакопостоянных сходящихся рядов это не совсем так, вернее совсем не так. хотя для студенческого задания вполне годится. а правильно обратиться к матанализу и для конкретной функции разработать метод оценки точности сходимости по одному или нескольким остаточным членам
0
1 / 1 / 0
Регистрация: 13.10.2022
Сообщений: 16
20.10.2022, 12:43  [ТС]
Catstail, Огромное вам спасибо за помощь и столько вариантов решения!


Doomov, Спасибо огромное за предложенные решения! Вы мне очень помогли!



Diamante, Большущее спасибо за отклик и решение!! Мне очень приятно, что люди откликаются на просьбы о помощи!
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38179 / 21114 / 4307
Регистрация: 12.02.2012
Сообщений: 34,722
Записей в блоге: 14
20.10.2022, 12:56
Аватар, формула Тэйлора с остаточным членом в форме Лагранжа имеет вид:

https://www.cyberforum.ru/cgi-bin/latex.cgi?{R}_{n}(x)=\frac{{f}^{(n+1)}(c)}{(n+1)!}*{(x-{x}_{0})}^{(n+1)}

где c - некоторая точка, лежащая между x и x0. Но для экспоненты эта формула даёт оценку остаточного члена сверху, в точности совпадающую со следующим членом ряда. Так что не всё так печально.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.10.2022, 12:56
Помогаю со студенческими работами здесь

Возведение числа в степень, ошибка при подключении модуля Math
что не так? программа выводит ошибку на строке с подключением модуля Math uses SysUtils; Math; function power(i:integer):integer; ...

Возведение числа в степень за минимальное количество умножений, не используя возведение в степень (в чем ошибка?)
должно число подводиться в степень за минимальное кол умножения не используя возведение в степень. Помогите, что не так? И почему?...

Возведение в степень без умножения
// 30_square.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include...

Возведение в степень без pow
Привет, задача следующая: Вычислить приближенные значения функций с точностью до eps&gt;0. Считать, что требуемая точность достигнута, если...

Возведение в степень без pow
Привет, задача следующая: Вычислить приближенные значения функций с точностью до eps&gt;0. Считать, что требуемая точность достигнута, если...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru