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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.85
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,222
#1

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

25.07.2013, 14:13. Просмотров 4440. Ответов 52
Метки нет (Все метки)

В библиотеке <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, да, мне стыдно что я не помню школьную математику.. с каждым может случится..
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,222
25.07.2013, 16:44  [ТС]     Возведение в степень, отрицательные числа #21
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- гнилой код (прошу без обид)
Ну какие могут быть обиды если по делу, я же не быдло что бы обижаться за дело, только тогда просьба предоставить код, который будет работать лучше моего (по всем или почти по всем параметрам), а то сказать что плохо, но не сказать как лучше, не мудрено..

Насчет формулы, зачем она мне нужна я не понимаю? не понимаю в принципе, тут у меня 2 переменных, число и степень, в итоге 30 строк кода, а в формуле куда больше, в чем смысл? может ты ошибся темой?
-=ЮрА=-
Заблокирован
Автор FAQ
25.07.2013, 17:29     Возведение в степень, отрицательные числа #22
Цитата Сообщение от VLK Посмотреть сообщение
Ну какие могут быть обиды если по делу, я же не быдло что бы обижаться за дело, только тогда просьба предоставить код, который будет работать лучше моего (по всем или почти по всем параметрам), а то сказать что плохо, но не сказать как лучше, не мудрено..
- что подразумевает да ты лучше не напишешь. Друг я напишу любой алгоритм, зачем мне что то кому то доказывать? Я привёл формулы, которые математически обоснованы и предельно корректны, это уже дело третье будешь брать их в работу или использовать алгоритм который так никогда и не возведёт дробное в дробное.
Коды разложений здесь http://www.cyberforum.ru/faq/thread4...ml#post2452211
Цитата Сообщение от VLK Посмотреть сообщение
может ты ошибся темой?
- поверь я написал как никогда по адресу.
Catstail
Модератор
22158 / 10632 / 1732
Регистрация: 12.02.2012
Сообщений: 17,680
25.07.2013, 17:35     Возведение в степень, отрицательные числа #23
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
VLK, есть отличная формула, которая выводится на основании свойств логАрифма
- формула действительно хорошая. Но она не позволяет возводить в степень отрицательные числа (т.к. логарифм отрицательного числа не существует). Поэтому отрицательные числа в целую степень следует возводить умножением, а в нецелую - только в комплексной области...
-=ЮрА=-
Заблокирован
Автор FAQ
25.07.2013, 17:49     Возведение в степень, отрицательные числа #24
Цитата Сообщение от Catstail Посмотреть сообщение
- формула действительно хорошая. Но она не позволяет возводить в степень отрицательные числа (т.к. логарифм отрицательного числа не существует). Поэтому отрицательные числа в целую степень следует возводить умножением, а в нецелую - только в комплексной области...
- зачем?
Catstail, модуль комплексного числа - есть число вещественное, вот мы его и находим...
Миниатюры
Возведение в степень, отрицательные числа  
castaway
Эксперт С++
4873 / 3012 / 370
Регистрация: 10.11.2010
Сообщений: 11,061
Записей в блоге: 10
Завершенные тесты: 1
25.07.2013, 17:57     Возведение в степень, отрицательные числа #25
Мне тоже интересно увидеть функцию, которая будет возводить отрицательное число в вещественную степень.
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,222
25.07.2013, 18:08  [ТС]     Возведение в степень, отрицательные числа #26
-=ЮрА=-, это.. я не насмехался, и у меня не было ни какого сарказма, и я не просил что то доказывать, когда я просил написать, мне это нужно было исключительно для того, что бы сравнить с моими каракулями и сделать выводы, способствующие улучшению производительности моей программы, ну и для самосовершенствования.
Насчет формулы, я действительно не понимаю как она относится к возведению в степень (видимо из-за моей тупости).
Catstail
Модератор
22158 / 10632 / 1732
Регистрация: 12.02.2012
Сообщений: 17,680
25.07.2013, 18:09     Возведение в степень, отрицательные числа #27
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- зачем?
- что "зачем"??? Модуль любого числа можно возвести в любую степень без проблем (как раз по формуле, на которую Вы ссылаетесь). А вот отрицательное число в вещественной степени будет, вообще говоря, комплексным. Формула работать будет (только вместо вещественного натурального логарифма нужно использовать его аналитическое расширение - Ln).
-=ЮрА=-
Заблокирован
Автор FAQ
26.07.2013, 09:38     Возведение в степень, отрицательные числа #28
Цитата Сообщение от Catstail Посмотреть сообщение
что "зачем"??? Модуль любого числа можно возвести в любую степень без проблем (как раз по формуле, на которую Вы ссылаетесь). А вот отрицательное число в вещественной степени будет, вообще говоря, комплексным. Формула работать будет (только вместо вещественного натурального логарифма нужно использовать его аналитическое расширение - Ln).
-
Ещё раз, не надо переводить в комплексую форму, не надо мучаться с классом комплексное число, а тем более с методом xpow. Есть одно замечательное свойство комплекса, который получается в результате, я привёл его на рисунке.

Не по теме:

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


Следует заметить что тэйлор по логорифму натуральному и экспоненте реализовать в разы легче чем городить тучу кода для функции комплексного переменного. Так что вот это
Цитата Сообщение от Catstail Посмотреть сообщение
Поэтому отрицательные числа в целую степень следует возводить умножением, а в нецелую - только в комплексной области...
ни есть догма если использовать не стандартные подходы широко расписанные в учебниках.
mcd в аттаче.
Миниатюры
Возведение в степень, отрицательные числа  
Вложения
Тип файла: rar exp.mcd.rar (2.6 Кб, 3 просмотров)
Catstail
Модератор
22158 / 10632 / 1732
Регистрация: 12.02.2012
Сообщений: 17,680
26.07.2013, 09:43     Возведение в степень, отрицательные числа #29
-=ЮрА=-, но отрицательное число в вещественной степени есть, вообще говоря, число комплексное? Или нет? Как его рационально вычислить - вопрос другой.
-=ЮрА=-
Заблокирован
Автор FAQ
26.07.2013, 10:01     Возведение в степень, отрицательные числа #30
Цитата Сообщение от Catstail Посмотреть сообщение
-=ЮрА=-, но отрицательное число в вещественной степени есть, вообще говоря, число комплексное? Или нет? Как его рационально вычислить - вопрос другой.
- я и не говорил что отрицательное число не даст комплекса я сказал лишь о том что достаточно найти модуль комплекса с использованием логорифма и экспонеты, а затем привести к алгебраической форме записи используя фазу http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{\pi }{10}
http://www.cyberforum.ru/cgi-bin/latex.cgi?\hat{c} = |c|*cos(\frac{\pi }{10}) + j*|c|*sin(\frac{\pi }{10})
И будет на много быстрее чем использовать функцию комплексного переменного, вот и всё. Стояла задача максимально быстрого алгоритма - ну вот он и есть максимально быстрый алгоритм.
Ilot
Модератор
Эксперт С++
1784 / 1159 / 224
Регистрация: 16.05.2013
Сообщений: 3,048
Записей в блоге: 5
Завершенные тесты: 1
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. на чистоту кода не претендую.
-=ЮрА=-
Заблокирован
Автор FAQ
26.07.2013, 10:28     Возведение в степень, отрицательные числа #32
Цитата Сообщение от Ilot Посмотреть сообщение
Не думаю, что ряды дадут хорошую точность. За этим придется отдельно следить, что превратит код в подобие анархии.
P.S. на чистоту кода не претендую.
- ряды дают любую точность, в отличие от стандартных функций, в которых теже разложения обрубываются на при погрешности
1E-6...1E-8

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

Не по теме:

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

Цитата Сообщение от Ilot Посмотреть сообщение
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);
- а если маташа не будет?

Ilot
Модератор
Эксперт С++
1784 / 1159 / 224
Регистрация: 16.05.2013
Сообщений: 3,048
Записей в блоге: 5
Завершенные тесты: 1
26.07.2013, 10:52     Возведение в степень, отрицательные числа #33
-=ЮрА=-, полностью с вами согласен. Но я ведь не зря привел цитату вопроса на который давал ответ. По теме: данный класс позволяет возводить любое число в любую степень, а значит дает ответ на вопрос автора:
Решил написать свой pow с положительными числами работает, а вот с отрицательными я не могу понять как правильно,
Сама суть задания предполагала отказ от любых функций math.h
Я не гордый ткните меня мордой где автор об этом написал? Мне кажется у него были проблеммы только с возведением в степень отрицательных чисел.

Добавлено через 17 минут
Нашел ошибку в коде из-за которого класс не правильно работал с чисто отрицательными числами. Нужно заменить:
C++
1
    temp.y =  atan2(z.y , z.x);
Catstail
Модератор
22158 / 10632 / 1732
Регистрация: 12.02.2012
Сообщений: 17,680
26.07.2013, 11:21     Возведение в степень, отрицательные числа #34
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
я и не говорил что отрицательное число не даст комплекса я сказал лишь о том что достаточно найти модуль комплекса с использованием логорифма и экспонеты, а затем привести к алгебраической форме записи используя фазу
- OK, согласен. Пардон...
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,222
26.07.2013, 11:28  [ТС]     Возведение в степень, отрицательные числа #35
Цитата Сообщение от Ilot Посмотреть сообщение
Я не гордый ткните меня мордой где автор об этом написал? Мне кажется у него были проблеммы только с возведением в степень отрицательных чисел.
У меня была проблема с тем, что я забыл школьную математику и используя интернет и не смог для себя уяснить как считать возведение в степень отрицательных чисел (в одном месте считало что в итоге получалось со знаком "+", в другом месте, тоже самое уже со знаком "-").

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

И все же я так и не услышал что именно в моем коде не так, при том, что он создан исключительно для того, что бы возводить в степень.
castaway
Эксперт С++
4873 / 3012 / 370
Регистрация: 10.11.2010
Сообщений: 11,061
Записей в блоге: 10
Завершенные тесты: 1
26.07.2013, 11:40     Возведение в степень, отрицательные числа #36
Цитата Сообщение от VLK Посмотреть сообщение
И все же я так и не услышал что именно в моем коде не так, при том, что он создан исключительно для того, что бы возводить в степень.
Код ужасен, но работает.
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,222
26.07.2013, 11:42  [ТС]     Возведение в степень, отрицательные числа #37
Цитата Сообщение от castaway Посмотреть сообщение
Код ужасен, но работает.
Так что именно ужасного, зачем говорить А, при этом не говорить Б.
nonedark2008
820 / 578 / 111
Регистрация: 28.07.2012
Сообщений: 1,543
26.07.2013, 11:48     Возведение в степень, отрицательные числа #38

Не по теме:

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


А твой алгоритм плох тем, что его можно было сделать короче - у тебя дублируются некоторые блоки кода. А во вторых, алгоритм будет работать медленно. Лучше реализовать алгоритм бинарного возведения в степень, либо вообще его обобщение, основанное на поиске кратчайшей аддитивной цепочки. (Это все применимо только для целых степеней)
castaway
Эксперт С++
4873 / 3012 / 370
Регистрация: 10.11.2010
Сообщений: 11,061
Записей в блоге: 10
Завершенные тесты: 1
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.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2013, 11:58     Возведение в степень, отрицательные числа
Еще ссылки по теме:

C++ Возведение из числа степень
C++ Возведение числа а в степень n
C++ Возведение числа в степень n-1
Возведение числа в целую степень C++
Возведение в степень вводимого числа C++

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

Или воспользуйтесь поиском по форуму:
Ilot
Модератор
Эксперт С++
1784 / 1159 / 224
Регистрация: 16.05.2013
Сообщений: 3,048
Записей в блоге: 5
Завершенные тесты: 1
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, не сочтите за труд указать рабу божьему где можно почитать о такого рода алгоритмах?
Yandex
Объявления
26.07.2013, 11:58     Возведение в степень, отрицательные числа
Ответ Создать тему
Опции темы

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