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

Возведение в вещественную степень - C++

Восстановить пароль Регистрация
 
Banddk
37 / 37 / 1
Регистрация: 08.12.2012
Сообщений: 157
Записей в блоге: 1
17.06.2014, 18:16     Возведение в вещественную степень #1
Здравствуйте, требуется ваша помощь.
У меня дано float a,x,n, вычислить a^x с точностью eps=10^(-n) и можно пользоваться только +,-,*,/.
Подскажите пожалуйста)
Заранее спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
17.06.2014, 19:05     Возведение в вещественную степень #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Banddk, ятп нужно раскладывать в ряд, а потом суммировать до определенного члена.

Добавлено через 8 минут
http://www.wolframalpha.com/input/?i=x%5Ea+taylor

Добавлено через 1 минуту
из первой формулы по ссылке сможете написать цикл, который суммирует значения. Остается только написать вспомогательную функцию вычисления биноминального коэффициента (он обощначен в скобочках, это Сkn = n!/k!(n-k)!)
Banddk
37 / 37 / 1
Регистрация: 08.12.2012
Сообщений: 157
Записей в блоге: 1
17.06.2014, 20:53  [ТС]     Возведение в вещественную степень #3
Спасибо))

Добавлено через 5 минут
У меня ведь вещественная степень, как мне брать факториал этого числа ?
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
18.06.2014, 11:05     Возведение в вещественную степень #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Banddk, можно попробовать через гамма-функцию. Хотя как-то сложно получается

Добавлено через 20 минут
Banddk, хотя, может, проще будет посчитать
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}^{b} = {a}^{n}{a}^{f}, n \in Z, f \in (0..1)
после этого можно воспользоваться формулой .
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}^{f} = {e}^{f*ln(a)}
при этом ряды тейлора для логарифма и экспоненты довольно простые.

Добавлено через 18 минут
Хотя не, логарифм нормально считается только для a in (-1..1)

Добавлено через 2 минуты
Блин, точно. Логарифм можно посчитать через интеграл же.

Добавлено через 20 минут
Короче, держи
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
59
60
#include <iostream>
#include <cmath>
 
using namespace std;
 
 
double simpson(double(*f)(double), double a, double b)
{
    double result = (b - a) / 6;
    result *= f(a) + 4 * f((a + b) / 2) + f(b);
    return result;
}
 
double f(double x)
{
    return 1 / x;
}
 
double my_ln(double x)
{
    if (x == 1)
        return 0;
    if (x <= 0)
        return NAN;
    double result = 0;
    double step = (x - 1) / 100;
    for (double a = 1; a < x; a += step)
        result += simpson(f, a, a + step);
    return result;
}
 
double my_exp(double x, double epsilon)
{
    double result = 1;
    double m = x;
    for (int i = 2; abs(m) >= epsilon; i++)
    {
        result += m;
        m *= x / i;
    }
    return result;
}
 
double my_pow(double a, double b, double epsilon)
{
    if (b < 0)
        return my_pow(1 / a, -b, epsilon);
    int div = (int)b;
    double integerPart = 1;
    for (int i = 0; i < div; i++)
        integerPart *= a;
    return integerPart * my_exp((b - div) * my_ln(a), epsilon);
}
 
int main()
{   
    cout << my_ln(15) << endl;
    cout << my_exp(3, 0.001) << endl;
    cout << my_pow(2, 3, 0.001) << endl;
}
если нужны пояснения - обращайся.
Banddk
37 / 37 / 1
Регистрация: 08.12.2012
Сообщений: 157
Записей в блоге: 1
19.06.2014, 01:29  [ТС]     Возведение в вещественную степень #5
Огромное спасибо))) Но если честно у меня ощущение, что преподаватель просто ошибся с заданием как-то тяжело ) хотя должно было быть простым
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
19.06.2014, 13:03     Возведение в вещественную степень #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Banddk, у меня тоже такое ощущение. Но что поделать... Зато если разберешься, он прифигеет слегка

Добавлено через 5 минут
к тому же можнт у меня с математикой не лады и можно было сделать в 2 присеста через какой-нибудь хитрый ряд

Добавлено через 9 часов 9 минут
Есть чуть более простой вариант, основанный на том же разложении:
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
#include <iostream>
#include <cmath>
 
using namespace std;
 
 
double simpson(double(*f)(double), double a, double b)
{
    double result = (b - a) / 6;
    result *= f(a) + 4 * f((a + b) / 2) + f(b);
    return result;
}
 
double f(double x)
{
    return 1 / x;
}
 
double my_ln(double x)
{
    if (x == 1)
        return 0;
    if (x <= 0)
        return NAN;
    double result = 0;
    double step = (x - 1) / 100;
    for (double a = 1; a < x; a += step)
        result += simpson(f, a, a + step);
    return result;
}
 
double my_pow(double a, double b, double epsilon)
{
    double result = 1, tmp = 1;
    double m = b * my_ln(a);
    for (int i = 1; abs(tmp) >= epsilon; i++)
    {
        tmp *= m / i;
        result += tmp;
    }
    return result;
}
 
int main()
{
    cout << my_ln(15) << endl;
    cout << my_pow(2, 3, 0.001) << endl;
}
просто убираем экспоненту. По формуле http://www.cyberforum.ru/cgi-bin/latex.cgi?a^x = \sum  \frac{x^n log^n(a)}{n!}.
Соответственно, чуть покороче и попроще. Логарифм тут тоже считается с помощью определенного интеграла через формулу Симпсона (мы помним, что интеграл от 1/x это ln|x|, поэтому интегрируя 1/x можно получить значение логарифма). Другого способа найти логарифм от произвольного числа я не нашел (ряд разлагается только для x от 0 (не включая) до двух. Дальше он расходится.
Yandex
Объявления
19.06.2014, 13:03     Возведение в вещественную степень
Ответ Создать тему
Опции темы

Текущее время: 03:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru