Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/91: Рейтинг темы: голосов - 91, средняя оценка - 4.92
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
1

Возведение в степень, отрицательные числа

25.07.2013, 14:13. Показов 17289. Ответов 53
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В библиотеке <cmath> есть такая функция pow(A,B) - получаешь результат возведения A в степень B
Решил написать свой pow с положительными числами работает, а вот с отрицательными я не могу понять как правильно,
1. -2 в 2 степени, на яндексе показывает что должно быть -4, обычный калькулятор показывает -4, pow(A,B) из <cmath> показывает 4, мой pow тоже показывает 4
2. -2 в 3 степени, везде показывает -8 (в том числе и у меня)

по поводу первого варианта, так как все же правильно, -2 в 2 степени, 4 или -4?

PS, да, мне стыдно что я не помню школьную математику.. с каждым может случится..
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.07.2013, 14:13
Ответы с готовыми решениями:

Возведение из числа степень
Прошу помочь. Вводим любое число n и надо возвести её степень. (притом, должно быть или 2 в...

Возведение числа а в степень n
Возведение числа а в степень n ,задача не проста чем , 1&lt;=а&lt;=10 | 1&lt;=n&lt;=7000 Степень может быть...

Возведение числа в степень!
Хай всем кто на форуме! Помогите с задачей! Надо возвести число в степень #include &lt;iostream&gt; ...

Возведение числа в степень n-1
Есть формула {(-1)}^{n-1}*{3}^{n-1} , n увеличивается циклом на 1. Как записать числа в степень n-1...

53
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
25.07.2013, 16:44  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- гнилой код (прошу без обид)
Ну какие могут быть обиды если по делу, я же не быдло что бы обижаться за дело, только тогда просьба предоставить код, который будет работать лучше моего (по всем или почти по всем параметрам), а то сказать что плохо, но не сказать как лучше, не мудрено..

Насчет формулы, зачем она мне нужна я не понимаю? не понимаю в принципе, тут у меня 2 переменных, число и степень, в итоге 30 строк кода, а в формуле куда больше, в чем смысл? может ты ошибся темой?
0
Заблокирован
Автор FAQ
25.07.2013, 17:29 22
Цитата Сообщение от VLK Посмотреть сообщение
Ну какие могут быть обиды если по делу, я же не быдло что бы обижаться за дело, только тогда просьба предоставить код, который будет работать лучше моего (по всем или почти по всем параметрам), а то сказать что плохо, но не сказать как лучше, не мудрено..
- что подразумевает да ты лучше не напишешь. Друг я напишу любой алгоритм, зачем мне что то кому то доказывать? Я привёл формулы, которые математически обоснованы и предельно корректны, это уже дело третье будешь брать их в работу или использовать алгоритм который так никогда и не возведёт дробное в дробное.
Коды разложений здесь https://www.cyberforum.ru/faq/... ost2452211
Цитата Сообщение от VLK Посмотреть сообщение
может ты ошибся темой?
- поверь я написал как никогда по адресу.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
25.07.2013, 17:35 23
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
VLK, есть отличная формула, которая выводится на основании свойств логАрифма
- формула действительно хорошая. Но она не позволяет возводить в степень отрицательные числа (т.к. логарифм отрицательного числа не существует). Поэтому отрицательные числа в целую степень следует возводить умножением, а в нецелую - только в комплексной области...
0
Заблокирован
Автор FAQ
25.07.2013, 17:49 24
Цитата Сообщение от Catstail Посмотреть сообщение
- формула действительно хорошая. Но она не позволяет возводить в степень отрицательные числа (т.к. логарифм отрицательного числа не существует). Поэтому отрицательные числа в целую степень следует возводить умножением, а в нецелую - только в комплексной области...
- зачем?
Catstail, модуль комплексного числа - есть число вещественное, вот мы его и находим...
Миниатюры
Возведение в степень, отрицательные числа  
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
25.07.2013, 17:57 25
Мне тоже интересно увидеть функцию, которая будет возводить отрицательное число в вещественную степень.
0
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
25.07.2013, 18:08  [ТС] 26
-=ЮрА=-, это.. я не насмехался, и у меня не было ни какого сарказма, и я не просил что то доказывать, когда я просил написать, мне это нужно было исключительно для того, что бы сравнить с моими каракулями и сделать выводы, способствующие улучшению производительности моей программы, ну и для самосовершенствования.
Насчет формулы, я действительно не понимаю как она относится к возведению в степень (видимо из-за моей тупости).
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
25.07.2013, 18:09 27
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- зачем?
- что "зачем"??? Модуль любого числа можно возвести в любую степень без проблем (как раз по формуле, на которую Вы ссылаетесь). А вот отрицательное число в вещественной степени будет, вообще говоря, комплексным. Формула работать будет (только вместо вещественного натурального логарифма нужно использовать его аналитическое расширение - Ln).
0
Заблокирован
Автор FAQ
26.07.2013, 09:38 28
Цитата Сообщение от Catstail Посмотреть сообщение
что "зачем"??? Модуль любого числа можно возвести в любую степень без проблем (как раз по формуле, на которую Вы ссылаетесь). А вот отрицательное число в вещественной степени будет, вообще говоря, комплексным. Формула работать будет (только вместо вещественного натурального логарифма нужно использовать его аналитическое расширение - Ln).
-
Ещё раз, не надо переводить в комплексую форму, не надо мучаться с классом комплексное число, а тем более с методом xpow. Есть одно замечательное свойство комплекса, который получается в результате, я привёл его на рисунке.

Не по теме:

(кто понимает в чём речь - то да для всех комплексов такая фаза).
Вот над доказательством я работаю. а так берём в работу да не парим мозг.


Следует заметить что тэйлор по логорифму натуральному и экспоненте реализовать в разы легче чем городить тучу кода для функции комплексного переменного. Так что вот это
Цитата Сообщение от Catstail Посмотреть сообщение
Поэтому отрицательные числа в целую степень следует возводить умножением, а в нецелую - только в комплексной области...
ни есть догма если использовать не стандартные подходы широко расписанные в учебниках.
mcd в аттаче.
Миниатюры
Возведение в степень, отрицательные числа  
Вложения
Тип файла: rar exp.mcd.rar (2.6 Кб, 4 просмотров)
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
26.07.2013, 09:43 29
-=ЮрА=-, но отрицательное число в вещественной степени есть, вообще говоря, число комплексное? Или нет? Как его рационально вычислить - вопрос другой.
1
Заблокирован
Автор FAQ
26.07.2013, 10:01 30
Цитата Сообщение от Catstail Посмотреть сообщение
-=ЮрА=-, но отрицательное число в вещественной степени есть, вообще говоря, число комплексное? Или нет? Как его рационально вычислить - вопрос другой.
- я и не говорил что отрицательное число не даст комплекса я сказал лишь о том что достаточно найти модуль комплекса с использованием логорифма и экспонеты, а затем привести к алгебраической форме записи используя фазу https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{\pi }{10}
https://www.cyberforum.ru/cgi-bin/latex.cgi?\hat{c} = |c|*cos(\frac{\pi }{10}) + j*|c|*sin(\frac{\pi }{10})
И будет на много быстрее чем использовать функцию комплексного переменного, вот и всё. Стояла задача максимально быстрого алгоритма - ну вот он и есть максимально быстрый алгоритм.
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
26.07.2013, 10:23 31
Цитата Сообщение от castaway Посмотреть сообщение
Мне тоже интересно увидеть функцию, которая будет возводить отрицательное число в вещественную степень.
Класс комплексных чисел.
Кликните здесь для просмотра всего текста
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include<cstdlib>
#include<iomanip>
#include<iostream>
#include<cmath>
using namespace std;
class CoplexNumber
{
private:
    float x;    //Действительная часть
    float y;    //Мнимая часть
public:
    CoplexNumber(): x(0), y(0)
    {}
    CoplexNumber(float _x): x(_x), y(0)
    {}
    CoplexNumber(float _x, float _y): x(_x), y(_y)
    {}
    friend CoplexNumber operator+ (CoplexNumber , CoplexNumber );
    friend CoplexNumber operator- (CoplexNumber , CoplexNumber );    
    friend CoplexNumber operator* (CoplexNumber , CoplexNumber );        
    friend CoplexNumber operator/ (CoplexNumber , CoplexNumber );  
    friend CoplexNumber ln (CoplexNumber );
    friend CoplexNumber exp (CoplexNumber ); 
    friend CoplexNumber pow (CoplexNumber , CoplexNumber ); 
    void ShowCoplexNumber()
    {
        cout << x << setiosflags(ios::showpos) << y << resetiosflags(ios::showpos) << "i" << endl;   
    }         
};
CoplexNumber operator+ (CoplexNumber z1, CoplexNumber z2)
{
   return   CoplexNumber(z1.x + z2.x, z1.y + z2.y);  
}
CoplexNumber operator- (CoplexNumber z1, CoplexNumber z2)
{
   return   CoplexNumber(z1.x - z2.x, z1.y - z2.y);  
} 
CoplexNumber operator* (CoplexNumber z1, CoplexNumber z2)
{
   return   CoplexNumber(z1.x * z2.x - z1.y * z2.y, z1.x * z2.y + z1.y * z2.x);  
}
CoplexNumber operator/ (CoplexNumber z1, CoplexNumber z2)
{
   CoplexNumber temp;
   temp.x =  (z1.x * z2.x - z1.y * z2.y)/((z2.x * z2.x + z2.y * z2.y));
   temp.y =  (z1.y * z1.x - z2.y * z2.y)/((z2.x * z2.x + z2.y * z2.y));
   return   temp;  
}  
CoplexNumber ln (CoplexNumber z)
{
    CoplexNumber temp;
    temp.x =  0.5 * log(z.x * z.x + z.y * z.y);
    temp.y =  atan(z.y / z.x);
    return temp;    
}   
CoplexNumber exp (CoplexNumber z)
{
    CoplexNumber temp;
    temp.x =  exp(z.x) * cos(z.y);
    temp.y =  exp(z.x) * sin(z.y);
    return temp;    
}
CoplexNumber pow (CoplexNumber z1, CoplexNumber z2)
{
    return exp(z2 * ln(z1));         
}  
int main(int argc, char *argv[])
{
    system("chcp 1251>0");
    CoplexNumber w1(3.7, 2.5),w2(4.3, 2.2), w3;
    cout << "Исходные комплексные числа: " << endl;
    w1.ShowCoplexNumber();
    w2.ShowCoplexNumber();
    cout << "Сложение комплексных чисел: " << endl;
    w3 = w1 + w2;
    w3.ShowCoplexNumber();
    cout << "Вычитание комплексных чисел: " << endl;
    w3 = w1 - w2;
    w3.ShowCoplexNumber(); 
    cout << "Умножение комплексных чисел: " << endl;
    w3 = w1 * w2;
    w3.ShowCoplexNumber(); 
    cout << "Деление комплексных чисел: " << endl;
    w3 = w1 / w2;
    w3.ShowCoplexNumber();
    cout << "Возведение в степень комплексных чисел: " << endl;
    w3 = pow(w1 ,w2);
    w3.ShowCoplexNumber();   
    system("PAUSE");
    return EXIT_SUCCESS;
}

Не думаю, что ряды дадут хорошую точность. За этим придется отдельно следить, что превратит код в подобие анархии.
P.S. на чистоту кода не претендую.
1
Заблокирован
Автор FAQ
26.07.2013, 10:28 32
Цитата Сообщение от Ilot Посмотреть сообщение
Не думаю, что ряды дадут хорошую точность. За этим придется отдельно следить, что превратит код в подобие анархии.
P.S. на чистоту кода не претендую.
- ряды дают любую точность, в отличие от стандартных функций, в которых теже разложения обрубываются на при погрешности
1E-6...1E-8

Добавлено через 51 секунду

Не по теме:


Сама суть задания предполагала отказ от любых функций math.h

Цитата Сообщение от Ilot Посмотреть сообщение
C++
49
50
51
52
53
54
55
56
57
58
59
60
61
62
CoplexNumber ln (CoplexNumber z)
{
    CoplexNumber temp;
    temp.x =  0.5 * log(z.x * z.x + z.y * z.y);
    temp.y =  atan(z.y / z.x);
    return temp;    
}   
CoplexNumber exp (CoplexNumber z)
{
    CoplexNumber temp;
    temp.x =  exp(z.x) * cos(z.y);
    temp.y =  exp(z.x) * sin(z.y);
    return temp;    
}
- а если маташа не будет?

0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
26.07.2013, 10:52 33
-=ЮрА=-, полностью с вами согласен. Но я ведь не зря привел цитату вопроса на который давал ответ. По теме: данный класс позволяет возводить любое число в любую степень, а значит дает ответ на вопрос автора:
Решил написать свой pow с положительными числами работает, а вот с отрицательными я не могу понять как правильно,
Сама суть задания предполагала отказ от любых функций math.h
Я не гордый ткните меня мордой где автор об этом написал? Мне кажется у него были проблеммы только с возведением в степень отрицательных чисел.

Добавлено через 17 минут
Нашел ошибку в коде из-за которого класс не правильно работал с чисто отрицательными числами. Нужно заменить:
C++
1
    temp.y =  atan2(z.y , z.x);
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
26.07.2013, 11:21 34
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
я и не говорил что отрицательное число не даст комплекса я сказал лишь о том что достаточно найти модуль комплекса с использованием логорифма и экспонеты, а затем привести к алгебраической форме записи используя фазу
- OK, согласен. Пардон...
0
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
26.07.2013, 11:28  [ТС] 35
Цитата Сообщение от Ilot Посмотреть сообщение
Я не гордый ткните меня мордой где автор об этом написал? Мне кажется у него были проблеммы только с возведением в степень отрицательных чисел.
У меня была проблема с тем, что я забыл школьную математику и используя интернет и не смог для себя уяснить как считать возведение в степень отрицательных чисел (в одном месте считало что в итоге получалось со знаком "+", в другом месте, тоже самое уже со знаком "-").

А вот если допустим отрицательная степень, то я нашел ответ. Там сначала надо просто возвести в степень, а потом 1 разделить на полученное значение.

И все же я так и не услышал что именно в моем коде не так, при том, что он создан исключительно для того, что бы возводить в степень.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.07.2013, 11:40 36
Цитата Сообщение от VLK Посмотреть сообщение
И все же я так и не услышал что именно в моем коде не так, при том, что он создан исключительно для того, что бы возводить в степень.
Код ужасен, но работает.
0
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
26.07.2013, 11:42  [ТС] 37
Цитата Сообщение от castaway Посмотреть сообщение
Код ужасен, но работает.
Так что именно ужасного, зачем говорить А, при этом не говорить Б.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
26.07.2013, 11:48 38

Не по теме:

Цитата Сообщение от VLK Посмотреть сообщение
в одном месте считало что в итоге получалось со знаком "+", в другом месте, тоже самое уже со знаком "-"
Не верю! Скорее ты неправильно вводил формулы.


А твой алгоритм плох тем, что его можно было сделать короче - у тебя дублируются некоторые блоки кода. А во вторых, алгоритм будет работать медленно. Лучше реализовать алгоритм бинарного возведения в степень, либо вообще его обобщение, основанное на поиске кратчайшей аддитивной цепочки. (Это все применимо только для целых степеней)
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.07.2013, 11:49 39
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
long double my_pow(long double number, short int _pow)
 
{
long double temp = 0; // временное значение
unsigned short int counter = 1; // счетчик
temp = number;
    
if (_pow > 0)
{
for ( ; counter < _pow; counter++)
{ temp = temp * number; }
return temp;
}
 
else if (_pow < 0)
{
_pow = 0 - _pow;
 
for ( ; counter < _pow; counter++)
{ temp = temp * number; }
temp = 1 / temp;
return temp;
}
 
else if (_pow == 0)
{ return 1; }
}
Неужели ты сам не видишь? Ужасный стиль написания: нет отступов (скопы вообще не читаемы), какие-то лишние пустые строки, последние условие вообще не нужно (_pow == 0 вытекает из обстоятельств), лишняя переменная temp.
1
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
26.07.2013, 11:58 40
И все же я так и не услышал что именно в моем коде не так, при том, что он создан исключительно для того, что бы возводить в степень.
Вот именно. Код работает только для целых степеней.
Такой код не лучше?
C++
1
2
3
4
5
6
7
long double my_pow(long double number, short int _pow)
{
    long double temp = 1; // временное значение
    for (int count = 0; count < abs(_pow); count++)
       temp *= number;
    return (_pow > 0) ? temp: 1/temp;
}
А во вторых, алгоритм будет работать медленно. Лучше реализовать алгоритм бинарного возведения в степень, либо вообще его обобщение, основанное на поиске кратчайшей аддитивной цепочки. (Это все применимо только для целых степеней)
nonedark2008, не сочтите за труд указать рабу божьему где можно почитать о такого рода алгоритмах?
2
26.07.2013, 11:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.07.2013, 11:58
Помогаю со студенческими работами здесь

Возведение числа n в степень m.
Написать программу - возведение числа n в m-ю степень. Входные данные поступают с клавиатуры....

Возведение числа в степень
Помогите написать программу, возводящщую число M в степень N (-10&lt;M&lt;10, 0&lt;N&lt;10 - проверить...

Рекурсивное возведение в степень числа
Рекурсивная функция,которая принимает 2 параметра:первый-число,второй-степень в которую нужно...

Возведение числа в степень через for
Нужна программа для возведения числа в степень через for


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru