Apa fungsi C ++ untuk menaikkan angka menjadi daya?

132

Bagaimana cara meningkatkan angka menjadi kekuatan?

2^1

2^2

2^3

dll ...

Benoît
sumber
Judul itu menyesatkan. Ini tentang kekuatan secara umum, bukan hanya kuadrat. Saya mengeditnya dan memperbaikinya.
Zifre
30
Jika ini tentang kekuatan 2 secara umum, gunakan <<.
Thomas L Holaday
1
Ya, itu akan bekerja untuk bilangan bulat . . .
imallett
3
Secara khusus, bilangan bulat dari domain terbatas . Bahkan hanya 2 ^ 70 akan meluap bilangan bulat (tapi pelampung dapat mewakilinya dengan tepat )
Ponkadoodle

Jawaban:

147

pow () di perpustakaan cmath. Info lebih lanjut di sini . Jangan lupa letakkan #include<cmath>di bagian atas file.

Joey Robert
sumber
96

std::powdi <cmath>header memiliki kelebihan ini:

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);

Sekarang Anda tidak bisa begitu saja melakukannya

pow(2, N)

dengan N menjadi int, karena tidak tahu mana float, doubleatau long doubleversi harus mengambil, dan Anda akan mendapatkan error ambiguitas. Ketiganya akan membutuhkan konversi dari int ke floating point, dan ketiganya sama-sama mahal!

Oleh karena itu, pastikan untuk mengetik argumen pertama sehingga cocok dengan salah satu dari ketiga argumen tersebut dengan sempurna. Saya biasanya menggunakandouble

pow(2.0, N)

Beberapa pengacara mengerjai saya lagi. Saya sendiri sering jatuh dalam perangkap ini, jadi saya akan memperingatkan Anda tentang hal itu.

Johannes Schaub - litb
sumber
int N; pow(2.0, N)masih akan ambigu:: could be 'pow(double,int)' or 'pow(double,double)'- / → pemeran
Marvin
3
Saya merekomendasikan untuk membaca komentar saya sebelum menambahkan komentar. ;-) Saya menjelaskan bahwa TIDAK memberikan ambiguitas. (Kompiler VS2008)
Marvin
1
@Marvin: Visual C ++ 2010 Express tidak memiliki masalah dengan std::pow(2.0, 3).
Keith Thompson
5
@Marvin karena saya telah tumbuh lebih arogan dari waktu ke waktu, saya akan menjawab sekali lagi: Anda tidak mengatakan "... ditolak sebagai ambigu oleh kompiler ..." tetapi Anda berkata "... masih akan ambigu : ... ", yang untuknya Anda tidak mencadangkan. Memberi petunjuk pada perilaku kompiler mungkin cadangan, tetapi jika saya telah menunjukkan secara independen dari kompiler dari prinsip pertama (spesifikasi itu sendiri) bahwa ini tidak ambigu, saya punya tempat yang lebih tinggi. Sayangnya, kompiler C ++ mungkin memiliki bug.
Johannes Schaub - litb
1
Saya pikir itu juga pow(2, N)tidak ambigu sejak C ++ 11, karena ada fungsi templat yang menerima tipe aritmatika sebagai parameter.
Ale
28

Dalam C ++ operator "^" adalah bitwise OR. Itu tidak bekerja untuk meningkatkan kekuatan. X << n adalah pergeseran kiri dari angka biner yang sama dengan mengalikan x dengan 2 n beberapa kali dan itu hanya dapat digunakan saat menaikkan 2 menjadi daya. Fungsi POW adalah fungsi matematika yang akan bekerja secara umum.

Cindy
sumber
2
Secara khusus, 1 << nsama dengan menaikkan 2 pangkat n, atau 2^n.
Ashish Ahuja
1
Bagi mereka yang tidak mengerti mengapa "1" di 1 << ndalam @AshishAhuja berkomentar, itu karena seri seperti ini 1 << 0 = 1sejak itu 2^0 = 1; 1 << 1 = 2sejak 2^1 = 2; 1 << 2 = 4sejak 2^2 = 4 dan seterusnya ...
JS5
16

Anda harus dapat menggunakan metode C normal dalam matematika.

#include <cmath>

pow(2,3)

jika Anda menggunakan sistem seperti unix, man cmath

Itukah yang kamu tanyakan?

Sujal

sujal
sumber
16

Gunakan fungsi pow (x, y): Lihat Di Sini

Cukup sertakan math.h dan Anda sudah siap.

Adam Haile
sumber
13

Meskipun pow( base, exp )merupakan saran yang bagus, perlu diketahui bahwa ini biasanya bekerja di floating-point.

Ini mungkin atau mungkin bukan yang Anda inginkan: pada beberapa sistem pengulangan loop sederhana pada akumulator akan lebih cepat untuk tipe integer.

Dan untuk bujur sangkar secara khusus, Anda bisa juga mengalikan angka-angka itu sendiri, floating-point atau integer; itu tidak benar-benar penurunan keterbacaan (IMHO) dan Anda menghindari kinerja overhead panggilan fungsi.

Leander
sumber
Dan ya, ini mungkin termasuk dalam kategori "optimisasi prematur", tetapi saya selalu merasa senang mengetahui hal-hal seperti ini - terutama jika Anda harus memprogram di lingkungan sumber daya terbatas.
leander
11

Saya tidak memiliki reputasi yang cukup untuk berkomentar, tetapi jika Anda suka bekerja dengan QT, mereka memiliki versinya sendiri.

    #include <QtCore/qmath.h>
    qPow(x, y); // returns x raised to the y power.

Atau jika Anda tidak menggunakan QT, cmath pada dasarnya memiliki hal yang sama.

    #include <cmath>
    double x = 5, y = 7; //As an example, 5 ^ 7 = 78125
    pow(x, y); //Should return this: 78125
Agricola
sumber
7
#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);
}

// definisi fungsi raisToPower

double raiseToPow(double x, int power)
{
    double result;
    int i;
    result =1.0;
    for (i=1, i<=power;i++)
    {
        result = result*x;
    }
    return(result);
}
Filza Naser
sumber
2
Jawaban Anda harus berisi penjelasan tentang kode Anda dan deskripsi bagaimana memecahkan masalah.
AbcAeffchen
conio.h sudah usang, bukan file header standar yang tidak menggunakannya.
HaseeB Mir
7

jika Anda hanya ingin berurusan dengan base_2 maka saya sarankan menggunakan operator shift kiri << bukan perpustakaan matematika .

Kode sampel :

int exp = 16;
for(int base_2 = 1; base_2 < (1 << exp); (base_2 <<= 1)){
std::cout << base_2 << std::endl;
}

output sampel:

1   2   4   8   16  32  64  128  256  512  1024  2048  4096  8192  16384  32768
HaseeB Mir
sumber
6

Ada pow atau powf di <math.h>

Tidak ada operator infiks khusus seperti di Visual Basic atau Python

Dario
sumber
2
powf () adalah fungsi C99 yang tidak ada di C ++.
newacct
6

Banyak jawaban telah menyarankan pow()atau alternatif serupa atau implementasi mereka sendiri. Namun, dengan memberikan contoh ( 2^1, 2^2dan 2^3) dalam pertanyaan Anda, saya kira apakah Anda hanya perlu meningkatkan 2daya integer. Jika hal ini terjadi, saya akan menyarankan Anda untuk menggunakan 1 << nuntuk 2^n.

Jianchao Li
sumber
5
pow(2.0,1.0)
pow(2.0,2.0)
pow(2.0,3.0)

Judul pertanyaan awal Anda menyesatkan. Untuk hanya persegi , gunakan 2*2.

Zifre
sumber
2
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
Viktor
sumber
2

Saya menggunakan perpustakaan cmathatau math.huntuk memanfaatkan pow()fungsi perpustakaan yang mengurus kekuatan

#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;
}
pengguna8857051
sumber
2

Pertama tambahkan #include <cmath>maka Anda dapat menggunakan powmetode dalam kode Anda misalnya:

pow(3.5, 3);

Yang 3.5 adalah basis dan 3 adalah exp

Mohammad Ansari
sumber
1

gunakan fungsi pow () dalam pustaka cmath, tgmath atau 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;
}

harap dicatat bahwa jika Anda memberikan input ke kekuasaan karena semua tipe data selain panjang ganda, maka jawabannya akan naik menjadi ganda. itu akan mengambil input dan memberikan output dua kali lipat. untuk input ganda panjang, tipe pengembaliannya adalah ganda panjang. untuk mengubah jawaban untuk penggunaan int, int c = (int) pow (a, b)

Tetapi, perlu diingat untuk beberapa angka ini dapat menghasilkan angka kurang dari jawaban yang benar. jadi misalnya Anda harus menghitung 5 ^ 2, maka jawabannya dapat dikembalikan sebagai 24,99999999999 pada beberapa kompiler. pada mengubah tipe data ke int jawabannya adalah 24 daripada 25 jawaban yang benar. Jadi, lakukan ini

int c=(int)(pow(a,b)+0.5)

Sekarang, jawaban Anda benar. juga, untuk data angka yang sangat besar hilang dalam mengubah tipe data int ganda menjadi panjang. misalnya kamu menulis

long long int c=(long long int)(pow(a,b)+0.5);

dan beri input a = 3 dan b = 38 maka hasilnya akan keluar menjadi 1350851717672992000 sedangkan jawaban yang benar adalah 1350851717672992089, ini terjadi karena pow () mengembalikan fungsi 1.35085e + 18 yang dipromosikan ke int sebagai 1350851717672992000. Saya sarankan menulis sebuah fungsi daya khusus untuk skenario seperti itu, seperti: -

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;
}

dan kemudian menyebutnya kapan pun Anda mau,

int main()
{
long long int a,b;
cin >> a >> b;

long long int c=__pow(a,b);
cout << c << endl;

return 0;
}

Untuk angka yang lebih besar dari rentang int panjang, baik gunakan boost library atau string.

Kartikey Tewari
sumber
1
Nama yang mengandung __disediakan, Anda mungkin harus memilih sesuatu yang lain.
HolyBlackCat