Apa fungsi C ++ untuk menaikkan angka menjadi daya?


132

Bagaimana cara meningkatkan angka menjadi kekuatan?

2^1

2^2

2^3

dll ...


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.


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.


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.


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



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.


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

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

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

6

Ada pow atau powf di <math.h>

Tidak ada operator infiks khusus seperti di Visual Basic atau Python


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.


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.



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

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

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


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.


1
Nama yang mengandung __disediakan, Anda mungkin harus memilih sesuatu yang lain.
HolyBlackCat
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.