2009-04-03 7 views
1

Also merke ich, dass #include notwendig ist, und dass es ein pow (x, y) gibt, wo x^y funktioniert ... aber als ich versuchte, pow (2, (num-1)) zu benutzen, kickte es zurück ein Fehler ...Wie verwenden Sie einen Exponenten in C++ mit einer Variablen?

errorC2668: 'pow': mehrdeutig Aufruf überladene Funktion

die Codezeile ich für sie ist als

perfect = (pow(2,(num-1))) * (pow(2,num)-1); 

Alle Empfehlungen folgt?

Vielen Dank im Voraus

EDIT:

num ist in der Tat als int deklariert.

num hat einen Wert haben, bei 1 beginnt und

Hinzugefügt einen Stern UINT_MAX

+0

Merkwürdigerweise funktioniert dies als Service-Leistung mit g ++. Vielleicht ist es eine Erweiterung. – paxdiablo

+0

Ich habe einen Freund, mit dem ich im Moment rede, der g ++ und Linux benutzt, funktioniert auch gut für ihn ... ja, ja! Ich kenne! Linux ist besser, aber ich kann nicht so stark auf Linux spielen, also bin ich mit Windows festgefahren. – Jeff

Antwort

8

Der Compiler weiß nicht, welche pow() -Funktion aufgerufen werden soll. Die Überlastungen here aufgeführt gibt die folgende Liste:

 float pow (  float base,  float exponent); 
    double pow (  double base,  double exponent); 
long double pow (long double base, long double exponent); 
     float pow (  float base,   int exponent); 
    double pow (  double base,   int exponent); 
long double pow (long double base,   int exponent); 

Der Compiler wird nicht erraten, welche zu benutzen. Mach es explizit mit einem Guss.

perfect = (pow(2.,(double)(num-1))) < (pow(2.,(double)num)-1); 

Möglicherweise gibt es ein paar Extrastatuen, aber sie werden nichts verletzen.

+0

Ich glaube nicht, dass es die num ist, da dies dazu führen wird, dass es eine der letzten zwei wählen. Ich denke, es ist die 2, die explizit auf einen der Datentypen in den letzten beiden geworfen werden sollte. – paxdiablo

+0

wird die Umwandlung von einem int zu einem double nichts schaden? – Jeff

+0

Ja, Sie können ohne Nummer num wegkommen. –

1

In der Gleichung Multiplikation fehlt (oder was Sie wollen) und auch dort sollte am Ende des Semikolons werden Zeile:

perfect = (pow(2,(num-1))) * (pow(2,num)-1) ; 
+0

komplett vergessen das benötigte Sternchen ... aber haben ein Semikolon in der tatsächlichen Code ... hat nicht geholfen, obwohl – Jeff

2

Dies sind die zulässigen pow() Funktionen in C++. Das Problem ist, dass Ihr Code ein int als erstes Argument hat und C++ nicht weiß, ob es zu einem doppelten oder langen double hochgestuft werden soll.

 double pow (  double base,  double exponent); 
long double pow (long double base, long double exponent); 
     float pow (  float base,  float exponent); 
    double pow (  double base,   int exponent); 
long double pow (long double base,   int exponent); 

Versuchen in (double)2 statt nur 2 setzen.

perfect = (pow((double)2,(num-1))) * (pow((double)2,num)-1) 
1

Von error C2668: 'pow' : ambiguous call to overloaded function in VC++ 2005 only, alex.m schrieb

"POW" (jede Überlast) hat ein schwebendes Punkttyp-Nummer (Einfach-, Doppel- oder long double precision) als erstes Argument , keine ganze Zahl. Dies ist , woher der Fehler kommt, da der Compiler kann nicht erraten, wie Sie wollen Ihre lange Ganzzahl konvertiert werden soll.

Versuchen Sie einfach einen gegossenen Ausdruck zu schreiben, wie folgt aus:

Codeblock

c = pow ((double) numberOfScansCompleted, 2);

Also, wenn Sie versuchen pow((double)2,(num-1)), sollte es funktionieren.


Amüsante Randnotiz, als ich den Anfang davon in Google eingegeben haben, „pow mehrdeutig Aufruf überladene Funktion“ kam auf, als der Top-Such vorgeschlagen.

+0

oder nur pow (2.0, ... – derobert

+0

ja, das funktioniert auch –

0

Denken Sie daran, auch ganzzahlige Potenzen von 2 mit einem Shift-Operator schreiben:

int perfect = (1<<(num-1)) * ((1<<num) - 1); 

Oder mit ldexp (ebenfalls enthalten von <cmath>):

double perfect = ldexp(1.0, num-1) * (ldexp(1.0, num) - 1); 
Verwandte Themen