genauigkeit von Fließkomma



  • Hätte ein paar wichtige Fragen zu Fließkommazahlen

    Auf wieviel stellen genau sind Fließkommazahlen?
    Können Fließkommazahlen überlaufen wie z.B. int?
    Wie kann man Fließkommazahlen auf eine bestimmte Stelle nach dem komma runden?
    Stimmt es, dass man Fließkommazahlen nicht vergleichen sollte?



  • Der Klassiker zur Repräsentation von Floating-Point-Zahlen: http://docs.sun.com/source/806-3568/ncg_goldberg.html



  • > Auf wieviel stellen genau sind Fließkommazahlen?
    in der wikipedia findest du die bitlaengen der gelaeufigen gleitkommazahlen.
    float (32 bit) hat 23 bit mantisse, das macht 6-7 stellen
    double (64 bit) hat 52 bit mantisse, das macht 15-16 stellen

    > Können Fließkommazahlen überlaufen wie z.B. int?
    nein. stattdessen werden sie zu "infinity" mit vorzeichen.

    > Wie kann man Fließkommazahlen auf eine bestimmte Stelle nach dem komma runden?
    garnicht, weil basis 2 und 10 nicht verlustfrei konvertiert werden koennen.
    du kannst die ausgabe auf eine stellenzahl begrenzen (printf).

    > Stimmt es, dass man Fließkommazahlen nicht vergleichen sollte?
    man kann sie vergleichen.
    nur sollte man sie nicht auf gleichheit vergleichen, weil man vielleicht 2.0 mit 2.0000000000001 vergleicht und das ist eben nicht gleich. fuer sowas solltest du dir eine vergleichsfunktion mit toleranz schreiben: return (abs(a-b) < epsilon);



  • Vielen Dank für die Antworten

    Heißt das, dass wenn ich die Stellen der Fließkommazahlen beachte, ich mir keine Sorgen um Rundungsfehler machen muss?

    Kann ich "infinity" irgendwie abfangen oder auf "infinity" prüfen?

    Falls ich gar nicht weiterkomme: Gibt es eine Bibliothek mit einem Festkommadatentyp?



  • > Heißt das, dass wenn ich die Stellen der Fließkommazahlen beachte, ich mir keine Sorgen um Rundungsfehler machen muss?
    sorry, versteh ich nicht. fliesskommazahlen haben binaerstellen und rundungsfehler kommen logischerweise immer mit rein.

    > Kann ich "infinity" irgendwie abfangen oder auf "infinity" prüfen?
    ja, es gibt glaub ich ein signal(), dass SIGFPE heisst.

    > Falls ich gar nicht weiterkomme: Gibt es eine Bibliothek mit einem Festkommadatentyp?
    GMP hat viel zu bieten



  • hab mich schlecht ausgedrückt.Ich meinte , dass dann bei einem Literal kein Nachkommaanteil abgeschnitten wird,der über die stelle hinausgeht... aber egal.

    ???GMP???
    WO,WAS,WIE



  • zu deiner frage: probiers mal aus.
    GMP



  • DANKE



  • Doch noch ne kleine Frage:

    Das mit SIGFPE funktioniert gut.Reagiert es auf alle Fehler (over/underflow, div durch 0,wenn zahl zu NaN wird...)?
    Denn bei pow(x,x) bekomme ich eine Fehlermeldung als MessageBox beim overflow und nicht das signal.



  • waerst du so nett, uns die fehlermeldung zu sagen, damit wir dir helfen koennen?
    der konkrete (edit: und aufs minimum reduzierte) code waere auch noch von noeten, um dir zu helfen.



  • Fehlermeldung: pow: OVERFLOW error

    #include <math.h>
    #include <iostream.h>
    #include <signal.h>
    #include <windows.h>
    
    void S(int a){cout<<"!!!!!!!!!!!!!!!";}
    
    int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow )
    {
      signal(SIGFPE,S);
    
    long double a=9999999999,b=9999999999; // beispielsweise
    cout<<pow(a,b);
    
      }
    

    S wird nicht ausgeführt



  • Naja, Signale sind so eine Sache. Normalerweise hilft die örtliche Compilerhilfe, wie man was spezifiziert. Seit C99 kannst Du dich auch mal bei fesetenv&Freunden umsehen.

    [Übrigens darfst Du aus einem Signalhandler eh nur abort, _Exit und sowas aufrufen, alles andere endet in extrem seltsamen Verhalten {so lange der Handler nicht mit raise aufgerufen wurde}.]



  • da musst du compilerschalter setzen, um die meldung wegzubekommen.
    ausserdem ist cout kein ansi c.
    im uebrigen kann windows mit apifunktionen scheinbar keine long doubles anzeigen. d.h. du musst entweder doubles benutzen oder die ausgabe selber besorgen.


Anmelden zum Antworten