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

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

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

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

25.07.2013, 14:13. Просмотров 4786. Ответов 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, да, мне стыдно что я не помню школьную математику.. с каждым может случится..
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2013, 14:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возведение в степень, отрицательные числа (C++):

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

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

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

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

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

Возведение числа в отрицательную степень - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;Rus&quot;); double a, b , pow(1),...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 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. на чистоту кода не претендую.
1
-=ЮрА=-
Заблокирован
Автор 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);
- а если маташа не будет?

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

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

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

И все же я так и не услышал что именно в моем коде не так, при том, что он создан исключительно для того, что бы возводить в степень.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
26.07.2013, 11:40 #36
Цитата Сообщение от VLK Посмотреть сообщение
И все же я так и не услышал что именно в моем коде не так, при том, что он создан исключительно для того, что бы возводить в степень.
Код ужасен, но работает.
0
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
26.07.2013, 11:42  [ТС] #37
Цитата Сообщение от castaway Посмотреть сообщение
Код ужасен, но работает.
Так что именно ужасного, зачем говорить А, при этом не говорить Б.
0
nonedark2008
908 / 647 / 134
Регистрация: 28.07.2012
Сообщений: 1,760
26.07.2013, 11:48 #38

Не по теме:

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


А твой алгоритм плох тем, что его можно было сделать короче - у тебя дублируются некоторые блоки кода. А во вторых, алгоритм будет работать медленно. Лучше реализовать алгоритм бинарного возведения в степень, либо вообще его обобщение, основанное на поиске кратчайшей аддитивной цепочки. (Это все применимо только для целых степеней)
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 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.
1
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 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, не сочтите за труд указать рабу божьему где можно почитать о такого рода алгоритмах?
1
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
26.07.2013, 11:59  [ТС] #41
то, что не отступов, мне так удобнее, и удобнее что бы между некоторыми "блоками" были пустые строки.

насчет лишней переменной, я попозже посмотрю, как усовершенствовать, насчет _pow == 0 может и зря написал, но по мне лучше просчитать все варианты, я вот когда решил написать этот код, я и не думал о возведении в отрицательную степень.

Вообще спасибо, еще на досуге подумаю.
0
nonedark2008
908 / 647 / 134
Регистрация: 28.07.2012
Сообщений: 1,760
26.07.2013, 12:09 #42
Цитата Сообщение от Ilot Посмотреть сообщение
nonedark2008, не сочтите за труд указать рабу божьему где можно почитать о такого рода алгоритмах?
Первый алгоритм можно легко нагуглить - он используется повсеместно.
Про второй - можно почитать во втором томе Кнута.
1
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
26.07.2013, 14:11  [ТС] #43
Цитата Сообщение от Ilot Посмотреть сообщение
Вот именно. Код работает только для целых степеней.
Такой код не лучше?
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, не сочтите за труд указать рабу божьему где можно почитать о такого рода алгоритмах?
а можно разъяснить что значит:

1. в 4-й строчке abs, не знаю что за функция, по этому ее у меня нет.
2. знаки "?", "?:" что он делает в С++, я пока с ними не сталкивался
3. строчка 6 более подробно расписать, т.к. я ее не понимаю, . я сталкивался пока что только с выражениями типа return a; , а не то, что там написано.
0
nonedark2008
908 / 647 / 134
Регистрация: 28.07.2012
Сообщений: 1,760
26.07.2013, 14:17 #44
VLK, ты бы хоть в документацию заглянул, А?
abs - функция модуля.
a ? b: c - если a - истина, то b, иначе c.
Цитата Сообщение от VLK Посмотреть сообщение
return (_pow > 0) ? temp: 1/temp;
Если _pow больше нуля, то вернуть temp, иначе вернуть 1/temp
1
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
26.07.2013, 14:17 #45
1. открой для себя http://www.cplusplus.com/ (сверху поиск)
2. тернарный оператор
3. возвращение значения результата тернарного оператора
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2013, 14:17
Привет! Вот еще темы с ответами:

Возведение числа в целую степень - C++
Задачка из методички моего вуза. Даны действительные числа a1,…,a10. Вычислить a1+(a2)^2+…+(a10)^2, используя подпрограмму возведения числа...

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

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

Возведение в степень вводимого числа - C++
int _tmain() {float t, A; cin&gt;&gt;t&gt;&gt;A; float b=t+A; float a=pow(b,1.0/3.0); cout&lt;&lt;a; getch (); return 0; } Пытаюсь...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.07.2013, 14:17
Ответ Создать тему
Опции темы

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