Was ist die C ++ - Funktion, um eine Zahl auf eine Potenz zu bringen?


132

Wie erhebe ich eine Zahl zu einer Potenz?

2^1

2^2

2^3

etc...


Der Titel war irreführend. Hier geht es um Kräfte im Allgemeinen, nicht nur um Quadratur. Ich habe es bearbeitet und behoben.
Zifre

30
Wenn es im Allgemeinen um Zweierpotenzen geht, verwenden Sie <<.
Thomas L Holaday

1
Ja, das funktioniert für ganze Zahlen . . .
Imallett

3
Insbesondere Ganzzahlen einer begrenzten Domäne . Sogar nur 2 ^ 70 werden eine ganze Zahl überlaufen (aber ein Float kann sie genau darstellen )
Ponkadoodle

Antworten:


146

pow () in der cmath-Bibliothek. Mehr Infos hier . Vergessen Sie nicht, #include<cmath>oben in die Datei zu setzen.


96

std::powim <cmath>Header hat diese Überladungen:

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

Jetzt können Sie nicht einfach tun

pow(2, N)

mit N ein int zu sein, weil es nicht dem von nicht kennt float, doubleoder long doubleVersion es dauern soll, und Sie würden einen Zweideutigkeit Fehler. Alle drei würden eine Konvertierung von int in Gleitkomma benötigen, und alle drei sind gleich teuer!

Stellen Sie daher sicher, dass das erste Argument so eingegeben wird, dass es perfekt zu einem dieser drei Argumente passt. Ich benutze normalerweisedouble

pow(2.0, N)

Wieder ein Anwalt von mir. Ich bin selbst oft in diese Falle geraten, deshalb werde ich Sie davor warnen.


int N; pow(2.0, N)wäre immer noch mehrdeutig :: could be 'pow(double,int)' or 'pow(double,double)'- / → Besetzung
Marvin

3
Ich empfehle, meinen Kommentar zu lesen, bevor Sie einen Kommentar hinzufügen. ;-) Ich erklärte, dass es eine Mehrdeutigkeit gibt. (Compiler von VS2008)
Marvin

1
@ Marvin: Visual C ++ 2010 Express hat kein Problem mit std::pow(2.0, 3).
Keith Thompson

5
@Marvin Da ich im Laufe der Zeit arroganter geworden bin, werde ich noch einmal antworten: Sie haben nicht gesagt "... wird vom Compiler als mehrdeutig abgelehnt ...", aber Sie sagten "... wäre immer noch mehrdeutig : ... ", für die Sie keine Sicherung bereitgestellt haben. Hinweise auf das Verhalten des Compilers mögen eine Sicherung sein, aber wenn ich unabhängig von Compilern anhand der ersten Prinzipien (der Spezifikation selbst) gezeigt habe, dass dies nicht mehrdeutig ist, habe ich die höhere Ebene. Leider können C ++ - Compiler Fehler aufweisen.
Johannes Schaub - litb

1
Ich denke, das ist auch pow(2, N)seit C ++ 11 eindeutig, da es eine Vorlagenfunktion gibt, die einen beliebigen arithmetischen Typ als Parameter empfängt.
Ale

28

In C ++ ist der Operator "^" ein bitweises ODER. Es funktioniert nicht, um sich zu einer Macht zu erheben. Das x << n ist eine Linksverschiebung der Binärzahl, die der Multiplikation von x mit 2 n entspricht und nur verwendet werden kann, wenn 2 auf eine Potenz angehoben wird. Die POW-Funktion ist eine mathematische Funktion, die generisch funktioniert.


2
Insbesondere 1 << nist das gleiche wie das Erhöhen von 2 auf die Potenz n oder 2^n.
Ashish Ahuja

1
Für diejenigen, die nicht verstanden haben, warum die "1" in 1 << n@AshishAhuja Kommentar ist, ist es, weil die Serie 1 << 0 = 1seitdem so läuft 2^0 = 1; 1 << 1 = 2seit 2^1 = 2; 1 << 2 = 4seit 2^2 = 4 und so weiter ...
JS5

16

Sie sollten in der Lage sein, normale C-Methoden in der Mathematik zu verwenden.

#include <cmath>

pow(2,3)

Wenn Sie sich auf einem Unix-ähnlichen System befinden, man cmath

Fragen Sie das?

Sujal



13

Dies pow( base, exp )ist zwar ein guter Vorschlag, aber beachten Sie, dass er normalerweise im Gleitkomma funktioniert.

Dies kann oder kann nicht das sein, was Sie wollen: Auf einigen Systemen ist eine einfache Schleife, die auf einem Akkumulator multipliziert wird, für ganzzahlige Typen schneller.

Und für Quadrate können Sie die Zahlen genauso gut selbst multiplizieren, Gleitkomma oder Ganzzahl. Es ist nicht wirklich eine Abnahme der Lesbarkeit (IMHO) und Sie vermeiden den Leistungsaufwand eines Funktionsaufrufs.


Und ja, dies mag in die Kategorie "vorzeitige Optimierung" fallen, aber ich finde es immer gut, sich solcher Dinge bewusst zu sein - insbesondere, wenn Sie in Umgebungen mit begrenzten Ressourcen programmieren müssen.
Leander

11

Ich habe nicht genug Ruf, um Kommentare abzugeben, aber wenn Sie gerne mit QT arbeiten, haben sie eine eigene Version.

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

Oder wenn Sie QT nicht verwenden, hat cmath im Grunde das Gleiche.

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

// Definition der Funktion liftToPower

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
Ihre Antwort sollte eine Erklärung Ihres Codes und eine Beschreibung enthalten, wie das Problem gelöst wird.
AbcAeffchen

conio.h ist veraltet, nicht standardmäßige Header-Datei nicht verwenden.
HaseeB Mir

7

Wenn Sie sich nur mit base_2 befassen möchten, empfehle ich die Verwendung des Linksverschiebungsoperators << anstelle der Mathematikbibliothek .

Beispielcode :

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

Beispielausgabe:

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

6

Es ist pow oder powf in <math.h>

Es gibt keinen speziellen Infix-Operator wie in Visual Basic oder Python


2
powf () ist eine C99-Funktion, die nicht in C ++ enthalten ist.
Newacct

6

Viele Antworten haben pow()oder ähnliche Alternativen oder ihre eigenen Implementierungen vorgeschlagen. Um jedoch die Beispiele gegeben ( 2^1, 2^2und 2^3) in Frage, würde ich raten , ob Sie nur erhöhen müssen , 2um eine ganzzahlige Potenz. Wenn dies der Fall ist, würde ich Ihnen empfehlen, 1 << nfür zu verwenden 2^n.


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

Ihr ursprünglicher Fragentitel ist irreführend. Verwenden Sie, um nur zu quadratisieren2*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

Ich benutze die Bibliothek cmathoder math.hum die Bibliotheksfunktionen zu nutzen pow(), die sich um die Befugnisse kümmern

#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

Zuerst hinzufügen, #include <cmath>dann können Sie die powMethode in Ihrem Code verwenden, zum Beispiel:

pow(3.5, 3);

Welches 3.5 ist Basis und 3 ist exp


1

Verwenden Sie die Funktion pow () in der Bibliothek cmath, tgmath oder 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;
}

Beachten Sie, dass die Antwort auf die von double hochgestuft wird, wenn Sie die Leistung als einen anderen Datentyp als long double eingeben. Das heißt, es wird Eingabe genommen und Ausgabe als doppelt ausgegeben. Für lange Doppeleingänge ist der Rückgabetyp Long Double. zum Ändern der Antwort in int use ist int c = (int) pow (a, b)

Beachten Sie jedoch, dass dies bei einigen Zahlen zu einer Zahl führen kann, die unter der richtigen Antwort liegt. Wenn Sie beispielsweise 5 ^ 2 berechnen müssen, kann die Antwort auf einigen Compilern als 24.99999999999 zurückgegeben werden. Wenn Sie den Datentyp in int ändern, lautet die Antwort 24 statt 25 die richtige Antwort. Also mach das

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

Jetzt ist Ihre Antwort richtig. Bei sehr großen Zahlen gehen Daten verloren, wenn der Datentyp double in long long int geändert wird. Zum Beispiel schreibst du

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

und geben Sie Eingabe a = 3 und b = 38 ein, dann wird das Ergebnis 1350851717672992000 sein, während die richtige Antwort 1350851717672992089 lautet. Dies geschieht, weil die Funktion pow () 1.35085e + 18 zurückgibt, die als 1350851717672992000 auf int heraufgestuft wird. Ich schlage vor, a zu schreiben benutzerdefinierte Power-Funktion für solche Szenarien, wie: -

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

und dann rufen Sie es an, wann immer Sie möchten,

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

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

return 0;
}

Verwenden Sie für Zahlen, die größer als der Bereich von long long int sind, entweder die Boost-Bibliothek oder Zeichenfolgen.


1
Namen, die enthalten __sind , sind reserviert, Sie sollten wahrscheinlich etwas anderes auswählen.
HolyBlackCat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.