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

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

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

Студворк — интернет-сервис помощи студентам
В библиотеке <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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.07.2013, 14:13
Ответы с готовыми решениями:

Возведение из числа степень
Прошу помочь. Вводим любое число n и надо возвести её степень. (притом, должно быть или 2 в степени x, или 3) Например: n=81 &gt;&gt;...

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

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

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

Насчет формулы, зачем она мне нужна я не понимаю? не понимаю в принципе, тут у меня 2 переменных, число и степень, в итоге 30 строк кода, а в формуле куда больше, в чем смысл? может ты ошибся темой?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
25.07.2013, 17:29
Цитата Сообщение от VLK Посмотреть сообщение
Ну какие могут быть обиды если по делу, я же не быдло что бы обижаться за дело, только тогда просьба предоставить код, который будет работать лучше моего (по всем или почти по всем параметрам), а то сказать что плохо, но не сказать как лучше, не мудрено..
- что подразумевает да ты лучше не напишешь. Друг я напишу любой алгоритм, зачем мне что то кому то доказывать? Я привёл формулы, которые математически обоснованы и предельно корректны, это уже дело третье будешь брать их в работу или использовать алгоритм который так никогда и не возведёт дробное в дробное.
Коды разложений здесь https://www.cyberforum.ru/faq/... ost2452211
Цитата Сообщение от VLK Посмотреть сообщение
может ты ошибся темой?
- поверь я написал как никогда по адресу.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
25.07.2013, 17:35
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
VLK, есть отличная формула, которая выводится на основании свойств логАрифма
- формула действительно хорошая. Но она не позволяет возводить в степень отрицательные числа (т.к. логарифм отрицательного числа не существует). Поэтому отрицательные числа в целую степень следует возводить умножением, а в нецелую - только в комплексной области...
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
25.07.2013, 17:49
Цитата Сообщение от Catstail Посмотреть сообщение
- формула действительно хорошая. Но она не позволяет возводить в степень отрицательные числа (т.к. логарифм отрицательного числа не существует). Поэтому отрицательные числа в целую степень следует возводить умножением, а в нецелую - только в комплексной области...
- зачем?
Catstail, модуль комплексного числа - есть число вещественное, вот мы его и находим...
Миниатюры
Возведение в степень, отрицательные числа  
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
25.07.2013, 17:57
Мне тоже интересно увидеть функцию, которая будет возводить отрицательное число в вещественную степень.
0
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
25.07.2013, 18:08  [ТС]
-=ЮрА=-, это.. я не насмехался, и у меня не было ни какого сарказма, и я не просил что то доказывать, когда я просил написать, мне это нужно было исключительно для того, что бы сравнить с моими каракулями и сделать выводы, способствующие улучшению производительности моей программы, ну и для самосовершенствования.
Насчет формулы, я действительно не понимаю как она относится к возведению в степень (видимо из-за моей тупости).
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
25.07.2013, 18:09
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- зачем?
- что "зачем"??? Модуль любого числа можно возвести в любую степень без проблем (как раз по формуле, на которую Вы ссылаетесь). А вот отрицательное число в вещественной степени будет, вообще говоря, комплексным. Формула работать будет (только вместо вещественного натурального логарифма нужно использовать его аналитическое расширение - Ln).
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
26.07.2013, 09:38
Цитата Сообщение от Catstail Посмотреть сообщение
что "зачем"??? Модуль любого числа можно возвести в любую степень без проблем (как раз по формуле, на которую Вы ссылаетесь). А вот отрицательное число в вещественной степени будет, вообще говоря, комплексным. Формула работать будет (только вместо вещественного натурального логарифма нужно использовать его аналитическое расширение - Ln).
-
Ещё раз, не надо переводить в комплексую форму, не надо мучаться с классом комплексное число, а тем более с методом xpow. Есть одно замечательное свойство комплекса, который получается в результате, я привёл его на рисунке.

Не по теме:

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


Следует заметить что тэйлор по логорифму натуральному и экспоненте реализовать в разы легче чем городить тучу кода для функции комплексного переменного. Так что вот это
Цитата Сообщение от Catstail Посмотреть сообщение
Поэтому отрицательные числа в целую степень следует возводить умножением, а в нецелую - только в комплексной области...
ни есть догма если использовать не стандартные подходы широко расписанные в учебниках.
mcd в аттаче.
Миниатюры
Возведение в степень, отрицательные числа  
Вложения
Тип файла: rar exp.mcd.rar (2.6 Кб, 4 просмотров)
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
26.07.2013, 09:43
-=ЮрА=-, но отрицательное число в вещественной степени есть, вообще говоря, число комплексное? Или нет? Как его рационально вычислить - вопрос другой.
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
26.07.2013, 10:01
Цитата Сообщение от 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
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
26.07.2013, 10:23
Цитата Сообщение от 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
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
26.07.2013, 10:28
Цитата Сообщение от 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
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
26.07.2013, 10:52
-=ЮрА=-, полностью с вами согласен. Но я ведь не зря привел цитату вопроса на который давал ответ. По теме: данный класс позволяет возводить любое число в любую степень, а значит дает ответ на вопрос автора:
Решил написать свой pow с положительными числами работает, а вот с отрицательными я не могу понять как правильно,
Сама суть задания предполагала отказ от любых функций math.h
Я не гордый ткните меня мордой где автор об этом написал? Мне кажется у него были проблеммы только с возведением в степень отрицательных чисел.

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

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

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

Не по теме:

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


А твой алгоритм плох тем, что его можно было сделать короче - у тебя дублируются некоторые блоки кода. А во вторых, алгоритм будет работать медленно. Лучше реализовать алгоритм бинарного возведения в степень, либо вообще его обобщение, основанное на поиске кратчайшей аддитивной цепочки. (Это все применимо только для целых степеней)
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
26.07.2013, 11:49
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
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
26.07.2013, 11:58
И все же я так и не услышал что именно в моем коде не так, при том, что он создан исключительно для того, что бы возводить в степень.
Вот именно. Код работает только для целых степеней.
Такой код не лучше?
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.07.2013, 11:58
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru