pow() scheint nicht richtig zu funktionieren



  • Hi leute

    Ich stehe gerade total auf dem Schlauch und zweifle schon langsam an meinem Verstand:

    Ich versuche ein kleines Verschlüsselungsprogramm zu schreiben,das bisher nicht das tut was ich will. Nach langem Fehlersuchen konnte ich den Fehler auf die Pow()-Funktion eingrenzen.

    100^1 scheint hier 99 zu geben, 100^2 9999 usw... was ist bei mir nur los..?

    Hier ein extrahierter Fehlercode:

    #include <iostream>
    #include <stdlib.h>
    #include <math.h>
    
    using namespace std;
    
    int main()
    {
        double a=100;
        double b=1;
        int c=pow(a, b);
        cout<<c<<endl;
    
    return 0;
    }
    

    Als Resultat kommt bei mir wie gesagt 99 raus, bin am verzweifeln, was mache ich nur falsch..?

    Ich nutze überigens CodeBlocks.

    Besten Dank im Voraus
    mfg



  • Sicher das du das Ergebniss in einem int speichern möchtest? Vielleicht kommt es bei der Rechnung mit double zu Rundungsfehlern und der Wert ist minimal kleiner als das erwartete Ergebnis und wird bei der Konvertierung zu int dann abgerundet.



  • Bei der Konvertierung von double nach int wird der Nachkommaanteil abgeschnitten (nicht gerundet), daher verwende besser als Rückgabewert auch double:

    double c = pow(a, b);
    

    Deine Ausgabe liegt an der Ungenauigkeit von Fließkommazahlen, intern verwendet pow den natürlichen Logarithmus:

    pow(a, b) = exp(b * ln(a))
    

    Dadurch kann es dann zu internen Darstellungen wie 99,99999xxxxxx kommen, so daß dann bei der Konvertierung zu int 99 rauskommt.



  • Hi Leute,

    Herzlichen Dank für die schnellen und hilfreichen Antworten!!
    Problem gelöst 🙂 🙂 🙂 👍



  • Wenn du int verwenden willst, kannst du es auch so machen:

    int c = pow(a, b) + 0.1;
    


  • Bitmapper schrieb:

    Wenn du int verwenden willst, kannst du es auch so machen:

    int c = pow(a, b) + 0.1;
    

    Oder besser sein eigenes pow für Integer schreiben (wenn a und b Integer sind).


  • Mod

    Bitmapper schrieb:

    Wenn du int verwenden willst, kannst du es auch so machen:

    int c = pow(a, b) + 0.1;
    

    Bitmapper, bitte denk über deine Codes nach, bevor du sie postest. Man muss hier andauernd deine Beiträge korrigieren. Erklär mal, wie du auf den Wert 0.1 kommst und wieso dieser optimal sein soll!



  • SeppJ schrieb:

    Bitmapper schrieb:

    Wenn du int verwenden willst, kannst du es auch so machen:

    int c = pow(a, b) + 0.1;
    

    Bitmapper, bitte denk über deine Codes nach, bevor du sie postest. Man muss hier andauernd deine Beiträge korrigieren. Erklär mal, wie du auf den Wert 0.1 kommst und wieso dieser optimal sein soll!

    Ich hab nicht gesagt das dieser optimal ist, man kann auch 0,9 nehmen oder 0,8 oder 0,7...
    Wenn 99,999 zu 99 abgerundet wird, dann wird 99,999 + 0,1 zu 100 abgerundet.

    Übertreibe mal nicht, du hast bis jetzt 2 meiner Beiträge insgesamt korrigiert.



  • Da muß ich SeppJ zustimmen, das wollte ich gestern fast auch schon dir schreiben!

    @Bitmapper: Was passiert dann bei negativen Werten?



  • Th69 schrieb:

    Da muß ich SeppJ zustimmen, das wollte ich gestern fast auch schon dir schreiben!

    @Bitmapper: Was passiert dann bei negativen Werten?

    Dann funktioniert es natürlich nicht.
    Das ist aber nur ein Problem wenn man auch mit negativen Werten arbeitet.
    Und ich sehe keinen Grund dies im Zusammenhang mit Verschlüsselung zu tun.
    Wenn doch hat sich das Problem durch eine einfache if-abfrage erledigt.



  • Es gibt seit C++11 in <cmath> auch eine Überladung von pow , die einen int -Wert als Exponenten haben will. Da das "spezieller" ist, wäre das wahrscheinlich vorzuziehen, sofern möglich, also wenn der Exponent eben immer ganzzahlig ist. Ich wäre trotzdem vorsichtig bei der Konvertierung von double nach int , also ggf ordentlich runden u.s.w.


Anmelden zum Antworten