Bir sayıyı bir kuvvete yükseltmek için C ++ işlevi nedir?


132

Bir sayıyı bir kuvvete nasıl yükseltebilirim?

2^1

2^2

2^3

vb...


Başlık yanıltıcıydı. Bu genel olarak güçlerle ilgili, sadece karesel değil. Düzenledim ve düzelttim.
Zifre

31
Genel olarak 2'nin katlarıyla ilgiliyse, << kullanın.
Thomas L Holaday

1
Evet, bu tamsayılar için işe yarar . . .
imallett

3
Özellikle, sınırlı bir alanın tam sayıları . Hatta sadece 2 ^ 70 bir tamsayı taşması (ancak bir şamandıra bunu temsil edebilir doğrusu )
Ponkadoodle

Yanıtlar:


147

pow () cmath kitaplığında. Daha fazla bilgi burada . #include<cmath>Dosyanın en üstüne koymayı unutmayın .


96

std::powiçerisinde <cmath>başlığın bu aşırı yükleme var

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

Şimdi sadece yapamazsın

pow(2, N)

o hangi bilmediği için N, bir int olmak float, doubleya long doubleda almalı versiyonu ve bir belirsizlik hatası tanınacak. Üçünün de int'ten kayan noktaya bir dönüşüme ihtiyacı vardır ve üçü de eşit derecede maliyetlidir!

Bu nedenle, ilk argümanı bu üçünden biriyle tam olarak eşleşecek şekilde yazdığınızdan emin olun. Genellikle kullanırımdouble

pow(2.0, N)

Yine benden bir avukat saçmalığı. Ben de sık sık bu tuzağa düştüm, bu yüzden sizi bu konuda uyaracağım.


int N; pow(2.0, N)hala belirsiz olabilir could be 'pow(double,int)' or 'pow(double,double)':: - / → oyuncular
Marvin

3
Yorum eklemeden önce yorumumu okumanızı tavsiye ederim. ;-) Bir belirsizlik verdiğini açıkladım. (VS2008 Derleyicisi)
Marvin

1
@Marvin: Visual C ++ 2010 Express ile bir problemi yok std::pow(2.0, 3).
Keith Thompson

5
Sen mi i daha kibirli üzerinde zaman büyüdüm beri @Marvin, ben bir kez daha cevap gidiyorum değil belirsiz olması hala ... "olur "... ... derleyici tarafından belirsiz olarak reddedilir" demek ama söylediğiniz : ... ", bunun için yedekleme sağlamadınız. Derleyici davranışına işaret etmek bir yedek olabilir, ancak derleyicilerden bağımsız olarak birinci ilkelerden (spesifikasyonun kendisi) bunun belirsiz olmadığını gösterirsem, daha yüksek bir zemine sahibim. Ne yazık ki, C ++ derleyicilerinde hatalar olabilir.
Johannes Schaub -

1
Bunun da pow(2, N)C ++ 11'den beri açık olduğunu düşünüyorum , çünkü herhangi bir aritmetik türü parametre olarak alan bir şablon işlevi var.
Ale

28

C ++ 'da "^" operatörü bitsel OR'dir. Bir güce yükseltmek için çalışmaz. X << n, ikili sayının sola kaymasıdır ve x ile 2 n sayısını çarpmakla aynıdır ve yalnızca 2'yi bir kuvvete yükseltirken kullanılabilir. POW işlevi, genel olarak çalışacak bir matematik işlevidir.


2
Spesifik olarak, 1 << n2'yi n kuvvetine yükseltmekle aynıdır, veya 2^n.
Ashish Ahuja

1
1 << n@AshishAhuja'daki "1" yorumunun nedenini anlamayanlar için, çünkü dizi o 1 << 0 = 1zamandan beri böyle devam ediyor 2^0 = 1; 1 << 1 = 2beri 2^1 = 2; 1 << 2 = 4o zamandan beri 2^2 = 4 ...
JS5

16

Matematikte normal C yöntemlerini kullanabilmelisiniz.

#include <cmath>

pow(2,3)

Unix benzeri bir sistemdeyseniz, man cmath

Sorduğun bu mu?

Sujal



13

pow( base, exp )Harika bir öneri olsa da, tipik olarak kayan noktada çalıştığını unutmayın.

İstediğiniz şey bu olabilir veya olmayabilir: bazı sistemlerde bir akümülatörde basit bir döngü çarpımı tamsayı türleri için daha hızlı olacaktır.

Ve özellikle kare için, sayıları kendiniz, kayan nokta veya tamsayı olarak çarpabilirsiniz; okunabilirlikte gerçekten bir azalma (IMHO) değildir ve bir işlev çağrısının performans ek yükünden kaçınırsınız.


Ve evet, bu "erken optimizasyon" kategorisine girebilir, ancak bunun gibi şeylerin farkında olmayı her zaman iyi buluyorum - özellikle sınırlı kaynaklara sahip ortamlarda programlamanız gerekiyorsa.
leander

11

Yorum yapacak kadar itibarım yok, ancak QT ile çalışmayı seviyorsanız, kendi sürümleri var.

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

Veya QT kullanmıyorsanız, cmath temelde aynı şeye sahiptir.

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

// yükseltmekToPower işlevinin tanımı

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
Cevabınız, kodunuzun bir açıklamasını ve sorunu nasıl çözdüğünün bir açıklamasını içermelidir.
AbcAeffchen

conio.h kullanımdan kaldırılmıştır, standart olmayan başlık dosyası onu kullanmayın.
HaseeB Mir

7

sadece base_2 ile uğraşmak istiyorsanız , matematik kitaplığı yerine sola kaydırma operatörünü << kullanmanızı öneririm .

basit kod :

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

örnek çıktı:

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

6

Pow veya powf içinde <math.h>

Visual Basic veya Python'daki gibi özel bir infix operatörü yoktur


2
powf (), C ++ 'da olmayan bir C99 işlevidir.
newacct

6

Birçok yanıtın önerdiği pow()veya benzer alternatifleri veya kendi uygulamaları vardır. Ancak, örnekler (verilmiş 2^1, 2^2ve 2^3sorunuzu), ben sadece zam gerekip gerekmediğini tahmin ediyorum 2bir tamsayı güç. Bu durumda, ben kullanmak öneririm 1 << niçin 2^n.


5
pow(2.0,1.0)
pow(2.0,2.0)
pow(2.0,3.0)

Orijinal soru başlığınız yanıltıcı. Sadece kare yapmak için kullanın 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

Kütüphaneyi cmathya da yetkilerle ilgilenen kütüphane işlevlerinden math.hyararlanmak için kullanıyorumpow()

#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

Önce ekleyin, #include <cmath>ardından powkodunuzda method kullanabilirsiniz , örneğin:

pow(3.5, 3);

Hangi 3.5 olan baz ve 3 olan exp


1

cmath, tgmath veya math.h kitaplığında pow () işlevini kullanın.

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

Eğer güce long double dışında herhangi bir veri türü olarak girdi verirseniz, cevabın double'a yükseltileceğini unutmayın. yani girdi alacak ve çift olarak çıktı verecektir. uzun çift girişler için dönüş tipi uzun çifttir. yanıtı int use olarak değiştirmek için, int c = (int) pow (a, b)

Ancak, bazı sayılar için bunun doğru cevaptan daha az bir sayı ile sonuçlanabileceğini unutmayın. yani örneğin 5 ^ 2'yi hesaplamanız gerekir, bu durumda cevap bazı derleyicilerde 24.99999999999 olarak döndürülebilir. veri türünün int olarak değiştirilmesiyle yanıt, doğru yanıt 25 yerine 24 olacaktır. Öyleyse yap bunu

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

Şimdi cevabınız doğru olacak. ayrıca, çok büyük sayılar için veri tipinin çift uzun uzun int'e değiştirilmesinde veri kaybolur. örneğin yazarsın

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

ve girdiye a = 3 ve b = 38 verirseniz, sonuç 1350851717672992000 olurken doğru cevap 1350851717672992089 olur, bunun nedeni pow () fonksiyonunun 1.35085e + 18 döndürmesi ve int olarak 1350851717672992000 olarak yükselmesidir. bu tür senaryolar için özel güç işlevi, örneğin: -

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

ve sonra istediğin zaman çağırmak

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

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

return 0;
}

Uzun uzun int aralığından daha büyük sayılar için, destek kitaplığı veya dizeleri kullanın.


1
İçeren __isimler saklıdır, muhtemelen başka bir şey seçmelisiniz.
HolyBlackCat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.