epsilon unsichtbar?



  • franz schrieb:

    Da er aber mit Gleitkommazahlen arbeiten will, hilft ein BigInt wenig.
    Eher trifft es hier gmp:
    http://www.gmplib.org
    Library for arithmetic on arbitrary precision integers, rational numbers, and floating-point numbers

    Jop. Ich wusste nicht mehr, welche Bibliothek es genau ist,welche auch immer empfohlen wird darum habe ich einfach mal das erste bei google als Beispiel genommen.



  • Decimad schrieb:

    Die meisten CPUs rechnen intern so genau, dass der Rechenfehler kleiner ist, als was durch float oder double unterscheidbar wäre. Wobei sich die Fehler in dem Fall natürlich aufsummieren. Darf ich Fragen, was du berechnest und wo diese Ungenauigkeiten zu katastrophalen Veränderungen des Ergebnisses führen?

    Es kann durchaus sein, dass die Ungenaugkeit sich schnell aufstaut und dann zu unverantwortlichen Fehlern führen. Das ist natürlich vom Kontext abhängig und manchmal auch nicht durch einen anderen Datentypen lösbar. (z.B Matrizenberechnungen) Da müssen dann anderen Wege gefunden werden, um die Ungenaugkeit auszugleichen..



  • drakon schrieb:

    Decimad schrieb:

    Die meisten CPUs rechnen intern so genau, dass der Rechenfehler kleiner ist, als was durch float oder double unterscheidbar wäre. Wobei sich die Fehler in dem Fall natürlich aufsummieren. Darf ich Fragen, was du berechnest und wo diese Ungenauigkeiten zu katastrophalen Veränderungen des Ergebnisses führen?

    Es kann durchaus sein, dass die Ungenaugkeit sich schnell aufstaut und dann zu unverantwortlichen Fehlern führen. Das ist natürlich vom Kontext abhängig und manchmal auch nicht durch einen anderen Datentypen lösbar. (z.B Matrizenberechnungen) Da müssen dann anderen Wege gefunden werden, um die Ungenaugkeit auszugleichen..

    Ja genau und wie ich versucht habe zu verdeutlichen sind die Rechnungen die zu den Punkten führen sehr sehr lang ... das erklärt auch warum das grundsätzlich immer auftritt, wenn das Programm schon ne weile läuft.

    Ich hab jetzt testweise meine Zwischenergbnisse in dateien geschrieben und sofort wieder eingelesen, weil: Es macht keinen Sinn dass das Programm andere Ergebnisse liefert wenn man abspeichert und später weitermacht...
    Wie wäre es eleganter (und vor allem schneller/sicherer) als in dateien zu schreiben? Etwa in std::string zwischenspeichern 😕 😕
    Und was noch wichtiger ist: Ist die Genauigkeitsverlust bei der Konvertierung in binäre Dateiformate identisch?
    🤡



  • Also solange es vertretbar ist, würde ich so einen Typen nehmen, der dir das ganze ganz exakt machen kann (natürlich auch nur auf eine beschränkte Anzahl Stellen,aber die sollten besser sein, als bei float). Ich kenne die Lib jetzt nicht genau,aber ich denke, dass die sicher auch richtig speichern/laden können,ohne irgendwelche Verluste.



  • So ich hab nun einen Test mit gmp und long double gemacht und ne Weile im Kreis gerechnet. So, dass ich nach etwas sinnloser Rechnerei wieder meine Ausgangswerte habe, usw.
    Ergebnis: Mit double und gmp tritt irgendwann ein Fehler auf (Also die Ausgangswerte weichen doch sichtbar ab)! Zwar mit gmp deutlich später, zudem dauert damit alles spürbar länger...
    Wie kann das denn sein?! Gibt es nicht Lektüre die dieses Thema behandelt?? 😕 😮



  • eps schrieb:

    Gibt es nicht Lektüre die dieses Thema behandelt?? 😕 😮

    Nein 🙄 Solche dämlichen Probleme haben professionelle Programmierer nicht. :p



  • hör mal her schrieb:

    eps schrieb:

    Gibt es nicht Lektüre die dieses Thema behandelt?? 😕 😮

    Nein 🙄 Solche dämlichen Probleme haben professionelle Programmierer nicht. :p

    Gratulation, der Produktivste Beitrag des Tages!!! 🙄



  • Junge, wenn du 1:1 vergleichst, wirst du irgendwann immer Quantisierungsfehler haben, egal ob diese gleitend oder konstant stattfindet. Verbessere deine Algorithmen.



  • Decimad schrieb:

    Junge, wenn du 1:1 vergleichst, wirst du irgendwann immer Quantisierungsfehler haben, egal ob diese gleitend oder konstant stattfindet. Verbessere deine Algorithmen.

    Joa ich wüsst nur gern wie



  • Wenn du dazu eine abschließende Antwort brauchst, lege ich dir nahe, ein Grundlagenbuch zur Numerik zu lesen. Da kannst du dir sachen wie Fehlerfortpflanzung anschauen, stabile Algorithmen finden und Anregungen um deine eigenen bestmöglich umzusetzen.



  • Decimad schrieb:

    Wenn du dazu eine abschließende Antwort brauchst, lege ich dir nahe, ein Grundlagenbuch zur Numerik zu lesen. Da kannst du dir sachen wie Fehlerfortpflanzung anschauen, stabile Algorithmen finden und Anregungen um deine eigenen bestmöglich umzusetzen.

    Vielleicht glaubst dus nicht aber auf sowas habe ich gewartet. Dankesehr!! 🙂 🙂 🙂



  • Freut mich, dass jemand vor Lektüre nicht zurückschreckt 😉



  • Hallo! 🤡
    Wenn ich auch meinen Senf dazu abgeben darf ... 😃

    #include <iostream>
    #include <limits>
    using namespace std;
    
    int main()
    {
        float a,b;
    
        cout << "Bei relativ großen Zahlen... " << endl;
    
        a = 1+3*numeric_limits<float>::epsilon();
        b = 1-4*numeric_limits<float>::epsilon();
    
        cout << a << '\n' << b << endl;
    
        cout << "...kann der unterschied bis zu 5faches epsilon sein..." << endl;
        b = 1-5*numeric_limits<float>::epsilon();
        cout << b << endl;
        cout << "...ab dann sieht man den Unterschied!\n" << endl;
    
        cout << "Umso kleiner die Zahl, desto größer darf man Epsilon wählen!" << endl;
        a = 0.12345678-10*numeric_limits<float>::epsilon();
        b = 0.12345678-6*numeric_limits<float>::epsilon();
    
        cout << a << '\n' << b << endl;
        cout << "Bis zum 10fachen numeric_limits<float>::epsilon() ..." << endl;
        b = 0.12345678-11*numeric_limits<float>::epsilon();
        cout << b << endl;
    }
    

    Aber warum wird im Terminal denn überhaupt gerundet?? :p



  • Heldin schrieb:

    Hallo! 🤡
    Wenn ich auch meinen Senf dazu abgeben darf ... 😃

    #include <iostream>
    #include <limits>
    using namespace std;
    
    int main()
    {
        float a,b;
    
        cout << "Bei relativ großen Zahlen... " << endl;
    
        a = 1+3*numeric_limits<float>::epsilon();
        b = 1-4*numeric_limits<float>::epsilon();
    
        cout << a << '\n' << b << endl;
    
        cout << "...kann der unterschied bis zu 5faches epsilon sein..." << endl;
        b = 1-5*numeric_limits<float>::epsilon();
        cout << b << endl;
        cout << "...ab dann sieht man den Unterschied!\n" << endl;
    
        cout << "Umso kleiner die Zahl, desto größer darf man Epsilon wählen!" << endl;
        a = 0.12345678-10*numeric_limits<float>::epsilon();
        b = 0.12345678-6*numeric_limits<float>::epsilon();
    
        cout << a << '\n' << b << endl;
        cout << "Bis zum 10fachen numeric_limits<float>::epsilon() ..." << endl;
        b = 0.12345678-11*numeric_limits<float>::epsilon();
        cout << b << endl;
    }
    

    Aber warum wird im Terminal denn überhaupt gerundet?? :p

    Weil mit 0.12345678 das Genauigkeitslimit von float erreicht ist bzw. weil ab 5 ab/aufgerundet wird?


Anmelden zum Antworten