[C/C++] ungenauer float - stellenanzahl

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von SimpsonsJunky, 27. Februar 2010 .

Schlagworte:
  1. 27. Februar 2010
    ungenauer float - stellenanzahl

    Hallo,
    Tut mir Leid, dass ich euch mit solchen Anfängerfragen stören muss, aber ich hab da ein Problem.
    Wenn ich 2 float-Variablen miteinander multipliziere, und das Produkt dann ausgebe, dann steht plötzlich nur mehr eine int-Variable da, unten in einer Rechtecksflächenberechnung dargestellt:

    Code:
    #include <iostream>
    using namespace std;
    
    main()
    {
     float laenge;
     float breite;
     float flaeche;
     
     cout << "Laenge: ";
     cin >> laenge;
     cout << "Breite: ";
     cin >> breite;
     flaeche = laenge*breite;
     cout << "Flaeche: " << flaeche << endl;
     cin >> laenge;
     
    }
    
    Bsp: Wenn ich als Länge 100.1 und als Breite auch 100.1 eingebe, erhalte ich 10020, obwohl der Wert eigentlich 10020.01 sein müsste.
    Benutze Dev-C++.
    Vielen Dank, wenn ihr mir helfen könnt und sorry, wenn ich euch nerve

    Gruß
    Jack

    PS: Google hat nix ausgespuckt und FoSu auch nicht...
    PPS: Bin schon halb am verzweifeln, dass ich an so einer Sache hängen bleibe
     
  2. 27. Februar 2010
    AW: Problem mit float

    das problem liegt an cout. dem anschein nach rundet diese funktion komma-zahlen.

    wenn du die fläche mit "printf" (c-funktion) ausgibst is sie richtig.

    Code:
    #include <iostream>
    /* cstdio fuer "printf" */
    #include <stdio.h>
    
    using namespace std;
    
    int main()
    {
     float a = 100.1;
     float b = 100.1;
     float c = a * b;
     
     cout << "Flaeche (cout): " << c << endl; /* 10020 */
     printf("Flaeche (printf): %f\n", c); /* 10020.009 ... */
     
     return 0;
    }
    
     
  3. 27. Februar 2010
    AW: Problem mit float

    Ah, OK.
    Vielen Dank!
    Dass da etwas anderes rauskommt als beim Taschenrechner ist dieses eine (unlösbare?) Problem, oder?
     
  4. 27. Februar 2010
    AW: Problem mit float

    Das Problem habe ich nicht, cout rundet nicht.

    Dev-Cpp ist veraltet, ebenso wie der mitgelieferte Compiler, verwende doch stattdessen eine
    der Visual-C++-Express Versionen; die sind kostenlos und aktuell.

    Grüße.
     
  5. 28. Februar 2010
    AW: Problem mit float

    da stellt dein taschenrechner die zahlen wohl intern anders da - die beiden sollten sich aber nur maginal unterscheiden, so dass das nur in ausnahmefällen zum problem wird. kannst es ja mal mit double versuchen.
     
  6. 28. Februar 2010
    AW: Problem mit float

    visual c++ == .NET bzw. msvc++ runtime
    dev-c++ verwendet gcc (g++) == natives c++

    ich hab gcc version 4.4.1 (2009) installiert und bekomme das ergebnis.

    @threadstarter: dev-c++ wird zwar nicht mehr weiterentwickelt, aber gcc kannst du selbst updaten.

    falls du später unter windows gui anwendungen programmieren willst, würde ich dir auch zu visual-studio raten. damit bekommst du für windows sehr gut optimierte binarys und kannst mit .NET arbeiten.
     
  7. 2. März 2010
    AW: Problem mit float

    Ja aber für Anfanger rate ich auch Dev cpp zu benutzen.?ch hatte am Anfang auch Visual Studio und war unübersichtlicher.bei dev cpp sind es nur ein paar klicks
     
  8. 2. März 2010
    AW: Problem mit float

    Naja Float sind nunmal Gleitkommazahlen. Von daher kommen sehr schnell unterschiedliche Ergebnisse zu Stande, wenn man keine 2er Potenzen(auch negative Potenzen) als Zahlen benutzt. Zwar nur in den hinteren Komma Bereichen allerdings kommt dadurch schnell mal vor, dass beispielseweise ein Ergebnis als 9,99997 anstatt 10 dargestellt wird.

    Ich weiss nicht genau mit welcher Genauigkeit Taschenrechner rechnen, aber genauer als Float auf jeden Fall. Ich schätze mal auch genauer als Double.
     
  9. 2. März 2010
    AW: Problem mit float

    Einfache Taschenrechner rechnen mit Sicherheit fixed-point. Schulrechner würde ich single zutrauen, double evtl. auch, jedenfalls liegt die Genauigkeit bei ~10 sig. Ziffern (single: 7-8 sig. Ziffern, double: 15-16 sig. Ziffern, ist also scheinbar ein Zwischending)
     
  10. 2. März 2010
    AW: Problem mit float

    nach dem ieee 754 standard:
    01000001001000000000000000000000

    exakt 10 und keine 2er fruchtbarkeit - gratz
     
  11. 2. März 2010
    Zuletzt von einem Moderator bearbeitet: 15. April 2017
    AW: Problem mit float

    Ich denke mal du hast da nen Denkfehler, denn wir befinden uns im Binärsystem. Somit hat die Darstellung von Gleitkommazahlen nichts mit Zehnerpotenzen zu tun. Egal nach welchem Standard. IEEE754 eingeschlossen.
    Du kannst Gleitkommazahlen, mit vorhandenen Nachkommastellen nur dann exakt darstellen, wenn dies eine Superposition aus 2er Potenzen ist. Im Fall von Nachkommastellen logischerweise mit negativem Exponenten, beispielsweise 2^-1 für 0,5. Du kannst ja mal versuchen 0,1 -was ja 10^(-1) entspricht- im Gleitkommasystem genau darzustellen. Es wird dir vermutlich nicht gelingen . Oder setz einfach mal eine Float Variable gleich 0,1 und schau dir den genauen Wert im Debugger an. Dann wirst du sehen, dass dieser eben nicht exakt gleich 0,1 ist.

    Edit:
    Hab mir nochmal kurz die Mühe gemacht und letzteren Vorschlag umgesetzt:

    unbenannt80yk.png
    {img-src: //www.abload.de/img/unbenannt80yk.png}
     
  12. 2. März 2010
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    AW: Problem mit float

    wer hat was von zehnerpotenzen gesagt. 10 lässt sich trotzdem nicht als 2^x schreiben, dafür aber exakt als gleitpunktzahl darstellen.

    Bild
     
  13. 3. März 2010
    AW: Problem mit float

    Achso, ja das sich jede ganze Zahl darstellen lässt ist ja wohl logisch. Mir ging es um die Ziffern hinter dem Komma, daher steht oben ja auch 2er Potenzen mit negativem Exponenten (zumindest im zweiten Post).
    Wenn man keine Nachkommastellen benötigt, sollte man auch keine Float verwenden.
     
  14. 3. März 2010
    AW: Problem mit float

    eigentlich isses unlogisch und auch falsch. siehe n -> ∞ ...

    00111111010000000000000000000000
    exat 0.75

    2^x = 0.75

    für welches natürliche x?

    falsch. siehe n -> ∞ ...
     
  15. 4. März 2010
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    AW: Problem mit float

    Er redet von ungenauen Berechnungen aufgrund von Rundungsfehlern.

    z.B.: 5,3 + 4,7 ergibt als float nicht 10 sondern etwas mehr als 10.
    //EDiT: Lustigerweise gleichen sich die Ungenauigkeiten der Darstellung aus und es kommt wirklich exakt 10 raus.

    Du scheinst zu vergessen, dass eine float als Kombination von 2er-Potenzen dargestellt wird. Genauso wie im Dezimalsystem jede Zahl eine Kombination aus 10er-Potenzen ist. Beispiel: 0,125 = 10^x geht nicht, aber 1*10^-1 + 2*10^-2 + 5*10^-3

    10 = 1*2^3 + 1*2^1 = 0 10000010 01000000000000000000000 (single)

    Kurz: 1*2^-1 + 1*2^-2 = 1,5 * 2^-1 = 0.75...

    Lang:
    0 01111110 10000000000000000000000 (Vorzeichen - Exponent - Mantisse)

    Exponent = 126 - 127 (Bias) = -1
    Mantisse = 1,10000000000000000000000b (Hidden Bit, da normalisiert!)
    Ergebnis = 1 (Vorzeichen positiv) * Mantisse * 2^Exponent = 1 * 1,1b * 2^-1 = 0,11b = 1*2^-1 + 1*2^-2 = 0,75
     
  16. 5. März 2010
    AW: ungenauer float - stellenanzahl

    was du schreibst is alles logisch und sollte auch jedem bekannt sein, nur geht das aus seinen aussagen rein garnicht hervor - wie auch immer, sollte sinnlos sein noch weiter darüber zu diskutieren.

    btw kann man jede zahl so angeben, nur halt nicht immer finit (desshalb auch die ungenauigkeit). von berechnungen spricht er eigentlich genauso wenig, schließlich geht das aus seinem screenshot hervor.

    wie ich das sehe, fehlen ihm einfach noch die kenntnisse - punkt.
     
  17. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.