1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

mal was richtig dämliches :-)

  • calvin
  • 6. Juni 2005 um 12:44
  • Unerledigt
  • calvin
    3
    calvin
    Mitglied
    Punkte
    95
    Beiträge
    13
    • 6. Juni 2005 um 12:44
    • #1

    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.

  • Bug
    4
    Bug
    Mitglied
    Reaktionen
    1
    Punkte
    121
    Beiträge
    23
    • 6. Juni 2005 um 13:08
    • #2
    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)

  • Wolfibolfi
    37
    Wolfibolfi
    Mitglied
    Reaktionen
    186
    Punkte
    14.936
    Beiträge
    2.942
    • 6. Juni 2005 um 14:24
    • #3

    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.

  • calvin
    3
    calvin
    Mitglied
    Punkte
    95
    Beiträge
    13
    • 6. Juni 2005 um 14:45
    • #4

    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.

  • Lynx
    7
    Lynx
    Mitglied
    Reaktionen
    3
    Punkte
    533
    Beiträge
    105
    • 6. Juni 2005 um 14:46
    • #5

    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.

  • Wolfibolfi
    37
    Wolfibolfi
    Mitglied
    Reaktionen
    186
    Punkte
    14.936
    Beiträge
    2.942
    • 6. Juni 2005 um 15:04
    • #6

    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.

  • calvin
    3
    calvin
    Mitglied
    Punkte
    95
    Beiträge
    13
    • 7. Juni 2005 um 12:59
    • #7

    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.

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung