Ergebnis 1 bis 3 von 3

Thema: Int vs. double Potenz in C++

  1. #1

    Int vs. double Potenz in C++

    Ich möchte,um mich ein wenig in C++ einlaufen,einige meiner alten Numerikübungsaufgaben,auf welche ich immer volle Punktzahl hatte,statt in matlab jetzt auch in C++ implementieren (natürlich ohne Plots!).
    Als ich eben das erste Mal eine Potenz in einem Programm brauchte und ich "pow" benutzte stelle ich fest das mir das Programm zwei verschiedene Ergebisse ausgibt.
    Ich schrieb ein neues kleineres Programm,welches nur noch die Potenz a^b berechnet,um sicher zu gehene,dass dies keine Komplexitäts bedingten Gründe hat,aber auch hier tritt der Fehler auf.

    Gebe ich ein: int x = pow (a,b)

    erhalte für 5^3 den Wert 124 (!).

    Erst wenn ich eingebe: double x = pow(a,b) erhalte ich hier das korrekte Ergebniss 125.

    Auch wenn ich mir seit 30 Minuten alles was ich zum Unterschied von float und double finden konnte durchlese,erklärt dies sicher nicht den Effekt.

    Seltsamerweise tritt der Fehler nicht bei anderen 3er und 5er Potenzen auf.Was könnte hier falsch laufen bei der Verwendung ganzer Zahlen?

  2. #2
    pow() gibt dir eine Gleitkommazahl zurück, aber du möchtest eine Ganzzahl.
    Bei Gleitkommazahlen gibt es immer ungenauigkeiten. Das Ergebnis von pow(5,3) wird mit Sicherheit 124,999999999999999999999... heißen.
    Ein einfacher Cast auf einen Integer schneidet die Nachkommastellen einfach weg und du erhälst 124, anstatt den 125.
    Darum sollte man auch nie Gleitkommazahlen Gleichheit prüfen.
    Zum Thema kannst du dir dies durchlesen: http://de.wikipedia.org/wiki/Gleitkommazahl

    Also musst du den Wert runden. Ich weiß jetzt nicht aus dem Kopf, obs eine Rundungsfunktion gibt und Google konnte mir da auf die Schnelle auch nicht weiterhelfen, aber dies kann man auch mittels einer Addition lösen
    Code:
    int x = (int) (pow(a,b) + .5);

    Geändert von Whiz-zarD (29.12.2011 um 08:57 Uhr)

  3. #3
    Möglicherweise ist das ein Fehler deiner Laufzeitbibliothek. Also bei GCC (4.5.0) gibt es dieses Verhalten jedenfalls nicht.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •