mal was richtig dämliches :-)

  • Hi leute,
    ich hab eigentlich gemeint, dass ich c++ kann (hab jetzt aber unibedingt soo viel java gemacht, dass ich jetzt fast verzweifle).

    mein triviales problem:

    Code
    1: double x = 0.015;
    2: for (int i=0; i<20; i++)
    3: x *= 2.0;
     
    4: printf( "%.15lf", x );



    wenn ich in zeile 2 einen breakpoint setze, ist x = 0.01499999999,
    in zeile 4: x= 15728.639999999999

    wenn das ganze anstelle von double mit float gemacht wird, wirds noch viiieeeellll extremer (also der fehler ist dann riesig).

    ich habs mit

    Code
    dobule x = (double)0.015;
    und
    double x = (double)0.015f;
    und 
    doube x = (double)0.0150;
    etc.



    probiert.
    bei x = 0.0150 liefert wenigstens der debugger richtige ergebnisse in zeile 2, aber die rechnung wird trotzdem falsch.

    hab ich zuviel java gemacht oder bin ich einfach blöd?
    HIIIIIIILLLLLLLFFFFFFFFFFEEEEEEEEE!!!!!!!

    danke


    edit: ach ja... der compiler war MS Visual Studio 2003 - VC.NET compiler

    Arithmetik heißt, bis zwanzig zählen zu können,
    ohne die Schuhe auszuziehen.
    Mickey Mouse.

  • Zitat von calvin


    wenn ich in zeile 2 einen breakpoint setze, ist x = 0.01499999999,
    in zeile 4: x= 15728.639999999999

    Und wo liegt das Problem?
    Das Ergebnis ist doch richtig. (0.015 * 2^20 = 15728.64)
    Die geringe Ungenauigkeit kommt doch von der internen Darstellung der Zahlen.

    Viele Menschen sind zu gut erzogen, um mit vollem Mund zu sprechen,
    aber sie haben keine Scheu, es mit leerem Kopf zu tun.
    (Orson Welles)

  • Versuch mal, die Zahl in Binär umzuwandeln, das geht nicht genau. Und bei Double wird wohl die Zahl länger, aber nicht der Fehler größer. Sollte zumindest so sein.

    In einen FBO rendern ist wie eine Schachtel Pralinen - man weiß nie, was man kriegt.

  • ja aber warum wirds so ungenau bei float?
    das gibts ja nicht

    Arithmetik heißt, bis zwanzig zählen zu können,
    ohne die Schuhe auszuziehen.
    Mickey Mouse.

  • Hier liegts wirklich nur daran, dass die Zahl binär nicht genau darstellbar ist (hint: vermeide Gleichheitsabfragen). Soll nix schlimmeres passieren.

    Denen, die das Thema weiter interessiert, kann ich die VU "Numerische Aspekte der Datenanalyse" von Prof. Überhuber (LVA Nr. 106.047, Pflicht für Data Engineering & Statistics) nur ans Herz legen.

    edit: wie "riesig" ist der fehler bei Float denn?

    Man kann sich das auch einfach als 11-dimensionale Zigarre vorstellen.

  • Tjo, wie riesig soll er sonst sein? Sind eh nur 9er hintn.

    Um das zu vermeiden, kannst du z.B. die Einheit ändern, und int verwenden.
    Also angenommen, das sind Sekunden bei dir, dann nimmst int Millisekunden, und der Wert wär dann 15. Das wär genau. Wenn nicht vorhersehbar ist, wieviele Stellen nach dem Komma du brauchst, bist mit Gleitkomma besser dran, da bleiben die Rechenfehler klein.

    In einen FBO rendern ist wie eine Schachtel Pralinen - man weiß nie, was man kriegt.

  • naja... warum der fehler auftritt ist mir jetzt schon klar.
    ich glaub damit muss ich einfach leben

    danke

    Arithmetik heißt, bis zwanzig zählen zu können,
    ohne die Schuhe auszuziehen.
    Mickey Mouse.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!