Tytuł był mylący. Chodzi ogólnie o moce, a nie tylko o kwadraturę. Edytowałem to i poprawiłem.
Zifre
34
Jeśli chodzi ogólnie o potęgi 2, użyj <<.
Thomas L Holaday
1
Tak, to zadziała dla liczb całkowitych . . .
imallett
3
W szczególności liczby całkowite z ograniczonej domeny . Nawet tylko 2 ^ 70 przepełni liczbę całkowitą (ale liczba zmiennoprzecinkowa może ją dokładnie przedstawić )
Ponkadoodle
Odpowiedzi:
150
pow () w bibliotece cmath. Więcej informacji tutaj . Nie zapomnij umieścić #include<cmath>na początku pliku.
std::poww <cmath>nagłówku ma następujące przeciążenia:
pow(float, float);
pow(float, int);
pow(double, double); // taken over from Cpow(double, int);
pow(longdouble, longdouble);
pow(longdouble, int);
Teraz nie możesz tak po prostu zrobić
pow(2, N)
z N jest int, ponieważ nie wie, który z float, doublelub long doublewersja powinna zająć, i pojawi się błąd dwuznaczności. Wszystkie trzy wymagałyby konwersji z int na zmiennoprzecinkowe, a wszystkie trzy są równie kosztowne!
Dlatego upewnij się, że wpisano pierwszy argument, aby idealnie pasował do jednego z tych trzech. Zwykle używamdouble
pow(2.0, N)
Znowu jakiś prawnik mnie bzdura. Często sam wpadałem w tę pułapkę, więc ostrzegam cię przed tym.
int N; pow(2.0, N)nadal byłoby niejednoznaczne:: could be 'pow(double,int)' or 'pow(double,double)'- / → obsada
Marvin
3
Polecam przeczytać mój komentarz przed dodaniem komentarza. ;-) Wyjaśniłem, że to daje niejednoznaczność. (Kompilator VS2008)
Marvin
1
@Marvin: Visual C ++ 2010 Express nie ma problemu z std::pow(2.0, 3).
Keith Thompson
5
@Marvin odkąd urosły bardziej arogancki czas skończy, zamierzam odpowiadać raz jeszcze: Ty nie nie powiedzieć „... zostaje odrzucona jako niejednoznaczne przez kompilator ...”, ale powiedział:”... nadal będzie niejednoznaczna : ... ”, dla którego nie dostarczyłeś kopii zapasowej. Wskazówka dotycząca zachowania kompilatora może być kopią zapasową, ale jeśli pokazałem niezależnie od kompilatorów z pierwszych zasad (samej specyfikacji), że nie jest to niejednoznaczne, mam wyższy poziom. Niestety, kompilatory C ++ mogą mieć błędy.
Johannes Schaub - litb
1
Myślę, że pow(2, N)jest to również jednoznaczne od czasu C ++ 11, ponieważ istnieje funkcja szablonu, która jako parametry przyjmuje dowolny typ arytmetyczny.
Ale
33
W C ++ operatorem „^” jest bitowe OR. Nie działa na podniesienie do potęgi. X << n jest przesunięciem liczby binarnej w lewo, które jest tym samym, co pomnożenie x przez 2 n razy i może być użyte tylko wtedy, gdy podniesie się 2 do potęgi. Funkcja POW to funkcja matematyczna, która działa ogólnie.
Dokładniej, 1 << nto to samo, co podniesienie 2 do potęgi n lub 2^n.
Ashish Ahuja
2
Dla tych, którzy nie 1 << nrozumieli, dlaczego „1” w komentarzu @AshishAhuja, dzieje się tak dlatego, że 1 << 0 = 1od tego czasu serial wygląda tak 2^0 = 1: 1 << 1 = 2od 2^1 = 2; 1 << 2 = 4od tego czasu 2^2 = 4 i tak dalej ...
JS5
16
Powinieneś umieć używać normalnych metod języka C.
#include <cmath>
pow(2,3)
jeśli używasz systemu podobnego do uniksowego, man cmath
Chociaż pow( base, exp )jest to świetna sugestia, należy pamiętać, że zazwyczaj działa ona w trybie zmiennoprzecinkowym.
Może to być to, czego chcesz, ale nie musi: w niektórych systemach prosta pętla mnożenia na akumulatorze będzie szybsza dla typów całkowitych.
A zwłaszcza w przypadku kwadratu, równie dobrze możesz po prostu pomnożyć liczby razem, zmiennoprzecinkowe lub całkowite; tak naprawdę nie jest to spadek czytelności (IMHO) i unikasz narzutu wydajności wywołania funkcji.
I tak, może to należeć do kategorii „przedwczesna optymalizacja”, ale zawsze uważam, że dobrze jest być świadomym takich rzeczy - zwłaszcza jeśli trzeba programować w środowiskach o ograniczonych zasobach.
leander
11
Nie mam wystarczającej reputacji, aby komentować, ale jeśli lubisz pracować z QT, mają swoją własną wersję.
#include<QtCore/qmath.h>
qPow(x, y); // returns x raised to the y power.
Lub jeśli nie używasz QT, cmath ma w zasadzie to samo.
#include<cmath>double x = 5, y = 7; //As an example, 5 ^ 7 = 78125pow(x, y); //Should return this: 78125
#include<iostream>#include<conio.h>usingnamespacestd;
doubleraiseToPow(double ,int)//raiseToPow variable of type double which takes arguments (double, int)voidmain(){
double x; //initializing the variable x and i int i;
cout<<"please enter the number";
cin>>x;
cout<<"plese enter the integer power that you want this number raised to";
cin>>i;
cout<<x<<"raise to power"<<i<<"is equal to"<<raiseToPow(x,i);
}
// definicja funkcji raiseToPower
doubleraiseToPow(double x, int power){
double result;
int i;
result =1.0;
for (i=1, i<=power;i++)
{
result = result*x;
}
return(result);
}
Wiele odpowiedzi sugerowało pow()lub podobne alternatywy lub własne implementacje. Jednakże, biorąc pod uwagę przykłady ( 2^1, 2^2i 2^3) w swoim pytaniu, to myślę, czy wystarczy, aby podnieść 2do potęgi całkowitej. Jeśli tak jest, proponuję użyć 1 << ndo 2^n.
intpower(int i, int ow)// works only for ow >= 1{ // but does not require <cmath> library!=)if (ow > 1)
{
i = i * power (i, ow - 1);
}
return i;
}
cout << power(6,7); //you can enter variables here
Korzystam z biblioteki cmathlub math.hw celu korzystania z pow()funkcji biblioteki, która dba o uprawnienia
#include<iostream>#include<cmath>intmain(){
double number,power, result;
cout<<"\nEnter the number to raise to power: ";
cin>>number;
cout<<"\nEnter the power to raise to: ";
cin>>power;
result = pow(number,power);
cout<<"\n"<< number <<"^"<< power<<" = "<< result;
return0;
}
użyj funkcji pow () w bibliotece cmath, tgmath lub math.h.
#include<iostream>#include<cmath>usingnamespacestd;
intmain(){
int a,b;
cin >> a >> b;
cout << pow(a,b) << endl; // this calculates a^breturn0;
}
zwróć uwagę, że jeśli podasz dane wejściowe do potęgi jako dowolny typ danych inny niż long double, wówczas odpowiedź zostanie podwyższona do typu double. to znaczy, że będzie pobierał dane wejściowe i dawał wynik jako podwójny. dla długich podwójnych wejść typem zwracanym jest long double. za zmianę odpowiedzi na int use, int c = (int) pow (a, b)
Pamiętaj jednak, że w przypadku niektórych liczb może to skutkować liczbą mniejszą niż prawidłowa odpowiedź. więc na przykład musisz obliczyć 5 ^ 2, wtedy odpowiedź może zostać zwrócona jako 24,99999999999 na niektórych kompilatorach. po zmianie typu danych na int odpowiedź będzie wynosić 24 zamiast 25 poprawna odpowiedź. Więc zrób to
int c=(int)(pow(a,b)+0.5)
Teraz twoja odpowiedź będzie poprawna. również w przypadku bardzo dużych liczb dane są tracone przy zmianie typu danych double do long int. na przykład piszesz
longlongint c=(longlongint)(pow(a,b)+0.5);
i podaj dane wejściowe a = 3 i b = 38, to wynikiem będzie 1350851717672992000, podczas gdy poprawna odpowiedź to 1350851717672992089, dzieje się tak, ponieważ funkcja pow () zwraca 1.35085e + 18, która jest promowana do int jako 1350851717672992000. Sugeruję napisanie a niestandardowa funkcja zasilania dla takich scenariuszy, jak: -
longlongint __pow (longlongint a, longlongint b)
{
longlongint q=1;
for (longlongint i=0;i<=b-1;i++)
{
q=q*a;
}
return q;
}
a potem dzwoniąc do niego, kiedy chcesz,
intmain(){
longlongint a,b;
cin >> a >> b;
longlongint c=__pow(a,b);
cout << c << endl;
return0;
}
W przypadku liczb większych niż zakres long long int, użyj biblioteki boost lub łańcuchów.
Odpowiedzi:
pow () w bibliotece cmath. Więcej informacji tutaj . Nie zapomnij umieścić
#include<cmath>
na początku pliku.źródło
std::pow
w<cmath>
nagłówku ma następujące przeciążenia:pow(float, float); pow(float, int); pow(double, double); // taken over from C pow(double, int); pow(long double, long double); pow(long double, int);
Teraz nie możesz tak po prostu zrobić
pow(2, N)
z N jest int, ponieważ nie wie, który z
float
,double
lublong double
wersja powinna zająć, i pojawi się błąd dwuznaczności. Wszystkie trzy wymagałyby konwersji z int na zmiennoprzecinkowe, a wszystkie trzy są równie kosztowne!Dlatego upewnij się, że wpisano pierwszy argument, aby idealnie pasował do jednego z tych trzech. Zwykle używam
double
pow(2.0, N)
Znowu jakiś prawnik mnie bzdura. Często sam wpadałem w tę pułapkę, więc ostrzegam cię przed tym.
źródło
int N; pow(2.0, N)
nadal byłoby niejednoznaczne::could be 'pow(double,int)' or 'pow(double,double)'
- / → obsadastd::pow(2.0, 3)
.pow(2, N)
jest to również jednoznaczne od czasu C ++ 11, ponieważ istnieje funkcja szablonu, która jako parametry przyjmuje dowolny typ arytmetyczny.W C ++ operatorem „^” jest bitowe OR. Nie działa na podniesienie do potęgi. X << n jest przesunięciem liczby binarnej w lewo, które jest tym samym, co pomnożenie x przez 2 n razy i może być użyte tylko wtedy, gdy podniesie się 2 do potęgi. Funkcja POW to funkcja matematyczna, która działa ogólnie.
źródło
1 << n
to to samo, co podniesienie 2 do potęgi n lub2^n
.1 << n
rozumieli, dlaczego „1” w komentarzu @AshishAhuja, dzieje się tak dlatego, że1 << 0 = 1
od tego czasu serial wygląda tak2^0 = 1
:1 << 1 = 2
od2^1 = 2
;1 << 2 = 4
od tego czasu2^2 = 4
i tak dalej ...Powinieneś umieć używać normalnych metod języka C.
#include <cmath>
pow(2,3)
jeśli używasz systemu podobnego do uniksowego,
man cmath
Czy o to pytasz?
Sujal
źródło
Użyj funkcji pow (x, y): Zobacz tutaj
Po prostu dołącz math.h i gotowe.
źródło
Chociaż
pow( base, exp )
jest to świetna sugestia, należy pamiętać, że zazwyczaj działa ona w trybie zmiennoprzecinkowym.Może to być to, czego chcesz, ale nie musi: w niektórych systemach prosta pętla mnożenia na akumulatorze będzie szybsza dla typów całkowitych.
A zwłaszcza w przypadku kwadratu, równie dobrze możesz po prostu pomnożyć liczby razem, zmiennoprzecinkowe lub całkowite; tak naprawdę nie jest to spadek czytelności (IMHO) i unikasz narzutu wydajności wywołania funkcji.
źródło
Nie mam wystarczającej reputacji, aby komentować, ale jeśli lubisz pracować z QT, mają swoją własną wersję.
#include <QtCore/qmath.h> qPow(x, y); // returns x raised to the y power.
Lub jeśli nie używasz QT, cmath ma w zasadzie to samo.
#include <cmath> double x = 5, y = 7; //As an example, 5 ^ 7 = 78125 pow(x, y); //Should return this: 78125
źródło
jeśli chcesz zajmować się tylko base_2, zalecam użycie operatora przesunięcia w lewo << zamiast biblioteki matematycznej .
przykładowy kod :
int exp = 16; for(int base_2 = 1; base_2 < (1 << exp); (base_2 <<= 1)){ std::cout << base_2 << std::endl; }
przykładowe wyjście:
1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768
źródło
#include <iostream> #include <conio.h> using namespace std; double raiseToPow(double ,int) //raiseToPow variable of type double which takes arguments (double, int) void main() { double x; //initializing the variable x and i int i; cout<<"please enter the number"; cin>>x; cout<<"plese enter the integer power that you want this number raised to"; cin>>i; cout<<x<<"raise to power"<<i<<"is equal to"<<raiseToPow(x,i); }
// definicja funkcji raiseToPower
double raiseToPow(double x, int power) { double result; int i; result =1.0; for (i=1, i<=power;i++) { result = result*x; } return(result); }
źródło
To jest pow lub powf in
<math.h>
Nie ma specjalnego operatora infix, takiego jak w Visual Basic czy Pythonie
źródło
Wiele odpowiedzi sugerowało
pow()
lub podobne alternatywy lub własne implementacje. Jednakże, biorąc pod uwagę przykłady (2^1
,2^2
i2^3
) w swoim pytaniu, to myślę, czy wystarczy, aby podnieść2
do potęgi całkowitej. Jeśli tak jest, proponuję użyć1 << n
do2^n
.źródło
pow(2.0,1.0) pow(2.0,2.0) pow(2.0,3.0)
Tytuł Twojego pytania jest mylący. Aby po prostu wyrównać , użyj
2*2
.źródło
Zwróć uwagę, że użycie
pow(x,y)
jest mniej wydajne niżx*x*x
y razy, jak pokazano i odpowiedział tutaj https://stackoverflow.com/a/2940800/319728 .Więc jeśli masz zamiar używać wydajności
x*x*x
.źródło
int power (int i, int ow) // works only for ow >= 1 { // but does not require <cmath> library!=) if (ow > 1) { i = i * power (i, ow - 1); } return i; } cout << power(6,7); //you can enter variables here
źródło
Korzystam z biblioteki
cmath
lubmath.h
w celu korzystania zpow()
funkcji biblioteki, która dba o uprawnienia#include<iostream> #include<cmath> int main() { double number,power, result; cout<<"\nEnter the number to raise to power: "; cin>>number; cout<<"\nEnter the power to raise to: "; cin>>power; result = pow(number,power); cout<<"\n"<< number <<"^"<< power<<" = "<< result; return 0; }
źródło
Najpierw dodaj,
#include <cmath>
a następnie możesz użyćpow
metody w swoim kodzie, na przykład:pow(3.5, 3);
Które 3.5 to podstawa, a 3 to exp
źródło
użyj funkcji pow () w bibliotece cmath, tgmath lub math.h.
#include <iostream> #include <cmath> using namespace std; int main() { int a,b; cin >> a >> b; cout << pow(a,b) << endl; // this calculates a^b return 0; }
zwróć uwagę, że jeśli podasz dane wejściowe do potęgi jako dowolny typ danych inny niż long double, wówczas odpowiedź zostanie podwyższona do typu double. to znaczy, że będzie pobierał dane wejściowe i dawał wynik jako podwójny. dla długich podwójnych wejść typem zwracanym jest long double. za zmianę odpowiedzi na int use, int c = (int) pow (a, b)
Pamiętaj jednak, że w przypadku niektórych liczb może to skutkować liczbą mniejszą niż prawidłowa odpowiedź. więc na przykład musisz obliczyć 5 ^ 2, wtedy odpowiedź może zostać zwrócona jako 24,99999999999 na niektórych kompilatorach. po zmianie typu danych na int odpowiedź będzie wynosić 24 zamiast 25 poprawna odpowiedź. Więc zrób to
int c=(int)(pow(a,b)+0.5)
Teraz twoja odpowiedź będzie poprawna. również w przypadku bardzo dużych liczb dane są tracone przy zmianie typu danych double do long int. na przykład piszesz
long long int c=(long long int)(pow(a,b)+0.5);
i podaj dane wejściowe a = 3 i b = 38, to wynikiem będzie 1350851717672992000, podczas gdy poprawna odpowiedź to 1350851717672992089, dzieje się tak, ponieważ funkcja pow () zwraca 1.35085e + 18, która jest promowana do int jako 1350851717672992000. Sugeruję napisanie a niestandardowa funkcja zasilania dla takich scenariuszy, jak: -
long long int __pow (long long int a, long long int b) { long long int q=1; for (long long int i=0;i<=b-1;i++) { q=q*a; } return q; }
a potem dzwoniąc do niego, kiedy chcesz,
int main() { long long int a,b; cin >> a >> b; long long int c=__pow(a,b); cout << c << endl; return 0; }
W przypadku liczb większych niż zakres long long int, użyj biblioteki boost lub łańcuchów.
źródło
__
są zastrzeżone, prawdopodobnie powinieneś wybrać coś innego.