2017-01-13 3 views
1

ich drei Stücke von Code nur versucht:über die Funktion pow in C++

#include<cstdio> 
#include<cmath> 
#include<cstring> 
int main() 
{ 
    int a = 3; 
    int b = pow(10,a); 
    printf("%d",b); 
    return 0; 
} 
//Output:1000 

#include<cstdio> 
#include<cmath> 
#include<cstring> 
int main() 
{ 
    int a = 3; 
    int b = pow(10,a-1); 
    printf("%d",b); 
    return 0; 
} 
//Output:99 

#include<cstdio> 
#include<cmath> 
#include<cstring> 
int main() 
{ 
    int a = 3; 
    int b = pow(10,a-2); 
    printf("%d",b); 
    return 0; 
} 
//Output:10 

Ich mag würde wissen, warum der zweite Block des Codes ausgegeben 99, es Präzision wegen Gleitkomma ist? Oder ist es weil ich Float-Nummern in der POW-Funktion verwenden sollte? (Wie 10,0) Ich bin in der Regel verwirrt über die Genauigkeit von C++, ich werde für Ihre Hilfe dankbar sein.

+3

Lange Rede, kurzer Sinn: 'pow' ist nicht für ganzzahlige Mathematik. –

+0

Sie * verwenden * Fließkommazahlen mit 'pow', Sie konvertieren sie einfach von ganzen Zahlen und zurück. –

+1

Es ist nicht die "10" vs "10.0", die ein Problem ist. Das Problem ist das "int b ...", was bedeutet, dass jede Ungenauigkeit in der Rückkehr von "pow (10, 2)" einfach abgeschnitten wird. So wird '99.9999999 + etwas epsilon' zu' 99'. (Obwohl ich etwas überrascht bin, dass 'pow (10,2)' nicht genau das Ergebnis '100' liefert. Das hat wahrscheinlich etwas mit dem Fließkomma-Standard zu tun.) –

Antwort

0

Die Umwandlung eines Gleitkommawerts in eine Ganzzahl erfolgt durch Abschneiden - Sie erhalten die nächste Ganzzahl, die am nächsten bei Null liegt. Wenn pow ungenau und zu niedrig ist, wird die Trunkierung es verschlimmern.

lround(pow(10,2)) könnte geeigneter sein.

0

Für ganzzahlige Exponenten der folgende Vorlage sehr praktisch sein kann:

template <typename T> inline constexpr T pow(T base, int exponent) 
{ 
    return (exponent == 0) ? static_cast<T>(1.0) : ((exponent>0) ? base*pow(base, exponent-1) : pow(static_cast<T>(1.0)/base, -exponent)); 
} 

Wenn Sie es mit einem C++ Standard vor C 11 ++, nur das constexpr Stichwort entfernen.

+0

könnten Sie etwas über das, was es tut, erklären .. –

+0

In C++ 14 vorwärts, kann der Körper einfach sein "T ret = 1; für (Exponent -) ret * = Basis; return ret; ' – Potatoswatter

+0

Sprechen Sie von einer einfachen Methode der Potenzierung? Wie effizient ist das? –