1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

mal was richtig dämliches :-)

  • calvin
  • 6. Juni 2005 um 12:44
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • calvin
    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

  • Bug
    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.

  • Wolfibolfi
    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.

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

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

  • Lynx
    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?

  • Wolfibolfi
    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.

  • calvin
    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

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

  1. Datenschutzerklärung
  2. Impressum