Pow() auf int gecastet - falscher Wert?

Hallo!

Ich habe gerade nach mehrstündigen debuggen scheinbar einen Fehler gefunden, den ich bisher nicht kannte.

Für eine Baumstruktur habe ich mehrfach Integers benötigt, die aus mehren aufaddierten Potenzen bestehen.

Beispiel (kein reeler Code):

int count = 0;
int levels = 5;
int branchfactor = 5;
for (int i = 0; i 

Soweit so gut, Compiler meckert nicht weil double (vom pow()) auf int gecastet wird.
Aber scheinbar werden dort werde verschluckt.
5^2 = 25 - als double wert wird dies auch korrekt ausgegeben. Wenn ich es aber auf int caste, erhalte ich 24.

Ich habe mir einmal ein kleines Testprogramm gebaut:



    
    #include 
    #include 
    using namespace std;
    int main() {
     cout 
    
    Beim Lauf des Programms kommt es dann zu folgender Konsolenausgabe:
    
    
        
        5
        25
        125
        Drücken Sie eine beliebige Taste . . .
        5
        24
        124
        ---
        153
        Drücken Sie eine beliebige Taste . . .
    
    
    
    
    
    Jetzt bin ich doch etwas arg verwirrt - kennt jemand dieses "Pänomen" ebenfalls?
    Falls ja, was kann man tun um diese Fehler zu beseitigen? Ein einfach "addiere bei jedem Exponenten \> 1 noch 1 zum ergebnis" empfinde ich als nicht sonderlich sauber...
    
    Oder benutze ich einfach die Falsche Funktion?
    
    Grüße
    
    Björn

Hallo Björn

for (int i = 0; i

Soweit so gut, Compiler meckert nicht weil double (vom pow())
auf int gecastet wird.
Aber scheinbar werden dort werde verschluckt.
5^2 = 25 - als double wert wird dies auch korrekt ausgegeben.
Wenn ich es aber auf int caste, erhalte ich 24.

(int)
Ist so definiert, dass einfach der Ganzzahlanteil genommen wird. Also 24.0 und 24.99999999 ergeben 24.

Bei deiner Ausgabe mit cout wird der Wert aber auf eine bestimmte Stellenzahl gerundet, deshalb stimmen die ausgegeben Werte.

Das Problem liegt darin, dass sich Integerzahlen, nicht fehlerlos in Floatingpoint-Werte umwandeln lassen, das hat mit der begrenzten Stellenzahl der Mantisse zu tun. Weitere Fehler kommen dann durch durch die Berechnugen hinzu.

In deinem Fall wäre es das einfachste eine eigene Funktion für pow() zu schreiben, welche mit Interger rechnet.

MfG Peter(TOO)

Hallo

Ich habe mir einmal ein kleines Testprogramm gebaut:


cout

Hier bei mir:

 5
 25
 125
 Drücken Sie eine beliebige Taste . . .
 5
 25
 125
 ---
 155
 Drücken Sie eine beliebige Taste . . .

Hast Du vielleicht irgendwas an den
Gleitkommaeinstellungen verändert?

Jetzt bin ich doch etwas arg verwirrt - kennt jemand dieses
„Pänomen“ ebenfalls?
Falls ja, was kann man tun um diese Fehler zu beseitigen? Ein
einfach „addiere bei jedem Exponenten > 1 noch 1 zum
ergebnis“ empfinde ich als nicht sonderlich sauber…
Oder benutze ich einfach die Falsche Funktion?

Generell wird eine „int -> gleitkomma“ Konvertierung
so durchgeführt:

int val = (int)( dval + 0.5 );

In Deinem Falle wäre vielleicht eine Int-Pow-Funktion
nötig, wie Peter schon andeutete:

#include 
#include 
using namespace std;

int integer(double darg) { return int(0.5 + darg); }
int integer(float farg) { return int(0.5f + farg); }

unsigned int ipow(int arg, int p) { return p ? arg\*ipow(arg, p-1) : 1; }

 int main() 
{
 char key;

 cout Grüße

CMБ