Bei Subtraktion von float kommt es zu Fehlern



  • Hallo. Ich habe folgendes Problem.

    Wenn ich 2 floats miteinander Subtrahiere tritt folgendes auf.

    variable a beinhaltet 50.7820
    variable b beinhaltet 50.7716

    wenn ich jetzt a - b rechne kommt das hier raus: 0.0104027
    anstatt einfach 0.0104

    Woran liegt das? Wie kann ich das verhindern?



  • Shuriken2643 schrieb:

    Woran liegt das?

    An der Ungenauigkeit, die das Rechnen mit Fliesskommatypen mit sich bringt. Viele Zahlen können durch die binäre Repräsentation nicht exakt dargestellt werden, deshalb kommt es zu Rundungsfehlern. Du kannst dir das so vorstellen, wie wenn du 1/3 im Dezimalsystem nicht vollständig aufschreiben kannst. Bei double oder long double kannst du zwar genauer rechnen, aber der Fehler tritt dann eben später auf.

    Shuriken2643 schrieb:

    Wie kann ich das verhindern?

    Muss der Wert wirklich sehr exakt sein? Oft braucht man das nämlich gar nicht. Falls ja, entweder mit genaueren Typen arbeiten (zum Beispiel sich Nachkommastellen durch Ganzzahlen darstellen lassen und erst bei Bedarf konvertieren; oder eine Bruchklasse nutzen) oder je nach Anwendung eben Toleranzen einführen, die zum Beispiel bei Prüfung auf Gleichheit berücksichtigt werden.



  • Okay. Danke. Ich benutz dann einfach Integer. In meinem Fall dürfte das aufs gleiche rauskommen.



  • Schlägt die Ungenauigkeit denn schon bei 4 Stellen nach dem Komma zu? Auf http://www.hs-augsburg.de/~sandman/c_von_a_bis_z/c_007_005.htm#RxxobKap0070050400263A1F01218C steht was von 6 Stellen bei float. Oder ist damit nur gemeint man kann eine Zahl mit maximal 6 Stellen genau darstellen aber für die Operationen gilt es nicht?



  • 0.99999999999
    1.0

    ist erst an der x. stelle ungenau aber so gar schon vorm komma zu sehen...





  • unskilled schrieb:

    Keiner kann besser Nix als ich - Tagedieb mit Lächelm im Gesicht

    Tüte Deutsch gefällig?
    🙂



  • die art rechnung die du machst ist die, die man möglichst vermeiden sollte. fließkommazahlen sind nicht dafür gemacht, dass man sie voneinander abzieht. in der Multiplikation sind sie genauer. Wenn das ergebnis die Differenz zweier großer vom wert her sehr ähnlicher fließkommazahlen ist, dann ist der fehler sehr groß. Oft kann man das Problem dadurch beheben, dass man die gleichung umstellt, oder wie du den Datentyp ändert. wobei meißtens erstes vorzuziehen ist.



  • rechtschreib0r schrieb:

    unskilled schrieb:

    Keiner kann besser Nix als ich - Tagedieb mit Lächelm im Gesicht

    Tüte Deutsch gefällig?
    🙂

    Jopp - war natürlich kein Tippfehler sondern ein, meiner Unwissenheit über die deutsche Sprache und deren Grammatik geschuldeter, Fehler...



  • unskilled schrieb:

    Jopp - war natürlich kein Tippfehler sondern ein, meiner Unwissenheit über die deutsche Sprache und deren Grammatik geschuldeter, Fehler...

    Wie kann man sich bei n und m nur vertippen? 🙂
    (Hatten ja mal jemand, der gemeint hat, dass er sich bei w und m, oder so vertippt hat.. :p)



  • unskilled schrieb:

    rechtschreib0r schrieb:

    unskilled schrieb:

    Keiner kann besser Nix als ich - Tagedieb mit Lächelm im Gesicht

    Tüte Deutsch gefällig?
    🙂

    Jopp - war natürlich kein Tippfehler sondern ein, meiner Unwissenheit über die deutsche Sprache und deren Grammatik geschuldeter, Fehler...

    Du schuldest deiner Unwissenheit Fehler? 😮
    😃 Interessant.



  • Gib ihr am besten gleich alle, dann kannst du keine mehr machen 😉 :p



  • Tobiking2 schrieb:

    Schlägt die Ungenauigkeit denn schon bei 4 Stellen nach dem Komma zu? Auf http://www.hs-augsburg.de/~sandman/c_von_a_bis_z/c_007_005.htm#RxxobKap0070050400263A1F01218C steht was von 6 Stellen bei float. Oder ist damit nur gemeint man kann eine Zahl mit maximal 6 Stellen genau darstellen aber für die Operationen gilt es nicht?

    Sind doch eh 7 Stellen 😕
    2 vor dem Komma und 5 dahinter -> in Summe: 7

    Dass das Ergebnis der Subtraktion nichtmehr auf 6 bzw. 7 Stellen genau ist, sollte logisch sein.
    Das Ergebnis kann schliesslich nicht genauer sein als die Operanden.



  • hustbaer schrieb:

    Sind doch eh 7 Stellen 😕
    2 vor dem Komma und 5 dahinter -> in Summe: 7

    Dass das Ergebnis der Subtraktion nichtmehr auf 6 bzw. 7 Stellen genau ist, sollte logisch sein.
    Das Ergebnis kann schliesslich nicht genauer sein als die Operanden.

    Also ich zähle bei 50.7820 und 50.7716 nur 2 Stellen vor und 4 nach dem Komma, also insgesamt 6. Ich habe allerdings gerade mal die Zahlen einem float zugewiesen die Werte werden direkt verfälscht: 50,782001 und 50,771599. Damit ist klar das nicht das genaue Ergebnis rauskommt. Die Frage ist nun, ob die Werte immer stimmen wenn man nach 6 Stellen rundet, oder ob das mit den 6 Stellen einfach nur Unsinn ist.



  • Shuriken2643 schrieb:

    variable a beinhaltet 50.7820
    variable b beinhaltet 50.7716

    wenn ich jetzt a - b rechne kommt das hier raus: 0.0104027
    anstatt einfach 0.0104

    Der Fehler bei 0.0104027 ist in der 6. Kommastelle, d.h. wenn man auf die Ausgangswerte zurückschliesst, dann scheinen die 7 "gute" Stellen zu haben.

    Ich habe allerdings gerade mal die Zahlen einem float zugewiesen die Werte werden direkt verfälscht: 50,782001 und 50,771599.

    Hier haste auch 7 "gute" Stellen wenn ich mich nicht verzählt habe. Wobei allerdings nur 6 "garantiert" werden.

    Die Frage ist nun, ob die Werte immer stimmen wenn man nach 6 Stellen rundet, oder ob das mit den 6 Stellen einfach nur Unsinn ist.

    Nein, natürlich nicht, denn je mehr man rechnet, desto grösser wird der Fehler natürlich. Kommt natürlich auch drauf an wie die Berechnungen und deren Zwischenergebnisse aussehen.


Anmelden zum Antworten