Problem mit Float und Double
-
Leerzeichen -> Leerzeilen
-
Ja sry. Hab ddie Posting Regeln zu spät gesehen.
Ok ich kann Manuell sagen er soll 15 Zeichen nehmen aber warum macht er dass nicht Automatisch wenn ich eine double Anzeigen lassen will?
Und war vor allem noch viel wichtiger ist bei
if(d1==d2)
da sagt er "Ja"...obwohl das wenn man sich die Zahl mit 15 Nachkommastellen ausgeben lässt nicht die selbs ist. Wie kommt das?
-
Odatas schrieb:
Ok ich kann Manuell sagen er soll 15 Zeichen nehmen aber warum macht er dass nicht Automatisch wenn ich eine double Anzeigen lassen will?
Er soll also automatisch immer 15 Stellen anzeigen, wenn er einen double-Wert ausgibt? Und was ist mit den vielen, vielen Menschen, die lieber nur die relevanten Stellen angezeigt bekommen würden?
Odatas schrieb:
Und war vorlamen noch viel wichtiger ist bei
if(d1==d2)
da sagt er ja...obwohl das wenn man sich die Zahl mit 15 Nachkommastellen ausgeben lässt nicht die selbs ist. Wie kommt das?
Bei Fließkommavergleichen musst du immer mit einer Toleranz arbeiten! Nimm die Differenz der Werte, davon den Betrag (
fabs(d1-d2)
), und den vergleichst du mit einem Toleranzwert, den du selbst festlegst (z.B. 0.0001). Liegt die Differenz unter deinem Toleranzwert, ist Gleichheit gegeben.
-
Ok ich dachte er nimmt bei der Ausgabe immer die Ausgabe dass die Komplette Zahl reinpasst.
Weil wenn ich float einer double zuweiße dann dann wird ja auch nur das mitgenommen was in den float passt.
Problem das ich jetzt habe bei der Betrags Rechnung ist dass er ja 0,10000 und 0,10000534654631313 als gleich sieht....wie stell ich das an das er das nicht macht?
-
Bei mir sagt er, dass d1 != d2 ist.
Welchen Compiler nimmst du?
-
Bin unter Ubunt in Kate und nut ze das Terminal mit.
gcc -std=89 -pedantic -wall -wextra
Diese Compiler einstellungen sind eine Vorgabe für unsere Programme
-
Odatas schrieb:
Problem das ich jetzt habe bei der Betrags Rechnung ist dass er ja 0,10000 und 0,10000534654631313 als gleich sieht....wie stell ich das an das er das nicht macht?
Erhöhe den Toleranzwert (Epsilon).
-
_matze schrieb:
Odatas schrieb:
Problem das ich jetzt habe bei der Betrags Rechnung ist dass er ja 0,10000 und 0,10000534654631313 als gleich sieht....wie stell ich das an das er das nicht macht?
Erhöhe den Toleranzwert (Epsilon).
Das hatte ich noch nicht. Wie macht man das?
-
Odatas schrieb:
Bei der Ausgabe zeigt er mir double aber immer nur mit 7 Nachkommmastellen an. Obwohl double doch 15 hat...was mach ich falsch?
double hat 15 signifikant Stellen. Das sind keine Nachkommastellen.
Wenn du z.B die Zahl 9.876543210123456e17 nimmst, bleibt da kein Platz mehr für Nachkommstellen.
Bei 9.876543210123456e-17 hättest du dagegen mehr als 30 Nachkommastellen.
-
Odatas schrieb:
_matze schrieb:
Odatas schrieb:
Problem das ich jetzt habe bei der Betrags Rechnung ist dass er ja 0,10000 und 0,10000534654631313 als gleich sieht....wie stell ich das an das er das nicht macht?
Erhöhe den Toleranzwert (Epsilon).
Das hatte ich noch nicht. Wie macht man das?
Wie hast du das mit dem Betrag und der Toleranz denn umgesetzt? Zeig mal her.
-
Wer verweist oder schreibt ein kleines Tutorial für den Umgang mit Gleitkommazahlen float, double, long double und wie man mit Epsilon und Absolutwerten auf Gleichheit abfragt? Und die Unterscheidung zwischen signifikanten Stellen und Nachkommastellen gehört auch erklärt und verstanden
Die Frage taucht hier sehr häufig auf!
-
DirkB schrieb:
Odatas schrieb:
Bei der Ausgabe zeigt er mir double aber immer nur mit 7 Nachkommmastellen an. Obwohl double doch 15 hat...was mach ich falsch?
double hat 15 signifikant Stellen.
double hat genau DBL_SIG signifikante Stellen, gemäß ANSI mind. 10.
-
berniebutt schrieb:
Wer verweist oder schreibt ein kleines Tutorial für den Umgang mit Gleitkommazahlen float, double, long double und wie man mit Epsilon und Absolutwerten auf Gleichheit abfragt?
Immer der, der fragt.
-
_matze schrieb:
Immer der, der fragt.
Oder vielleicht besser du?
Habe kurz gegoogelt, finde da aber wenig brauchbares als möglichen Verweis weil meist zu akademisch. In den Zeiten von FORTRAN war das jedem Programmierer klar, wieso nicht in C?
-
Weil es mehr C-Programmierer gibt: Da ist die Wahrscheinlichkeit auch hoeher, dass es nicht allen klar ist.
-
Das kann es nicht sein, FORTRAN und C haben dieselben Grundlagen für floating-point Datentypen und deren Arithmetik. Nur die interne Darstellung hat sich evtl. mit neueren Standards geändert. Juckt aber niemand zum Verstehen!
-
berniebutt schrieb:
Wer verweist oder schreibt ein kleines Tutorial für den Umgang mit Gleitkommazahlen float, double, long double und wie man mit Epsilon und Absolutwerten auf Gleichheit abfragt? Und die Unterscheidung zwischen signifikanten Stellen und Nachkommastellen gehört auch erklärt und verstanden
Die Frage taucht hier sehr häufig auf!
Naja, so etwas gibt es doch
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.htmlIch poste beide Links hier regelmäßig. Aber offenbar werden die immer ignoriert :(.
Wer hat Lust einen kleinen FAQ-Eintrag zu schreiben?
btw. GCC hat ein -Wfloat-equal. Das warnt, wenn man == auf Fließkommazahlen anwendet.
edit:
auch ganz gut scheint:
http://hal.archives-ouvertes.fr/hal-00128124/en/
und auf der Homepage vom Kahan (der Typ hinter dem Standard) findet man auch ein paar gute Informationen (auch wenn sie teilweise mit ein bisschen Verbitterung gemischt sind) http://www.cs.berkeley.edu/~wkahan/
-
rüdiger schrieb:
Naja, so etwas gibt es doch
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.htmlIch poste beide Links hier regelmäßig. Aber offenbar werden die immer ignoriert :(.
Wer hat Lust einen kleinen FAQ-Eintrag zu schreiben?
http://hal.archives-ouvertes.fr/hal-00128124/en/
http://www.cs.berkeley.edu/~wkahan/Es gibt eigentlich alles zu lesen, wenn man im web sucht. Viel einfacher ist aber, hier im Forum zu fragen. Die FAQs zu lesen ist schon etwas aufwendiger. Wer tut das?
Erscheint mir eine notwendige Sache in Deutsch für die Moderation dieses Forums zu sein, um nicht wieder antworten zu nüssen.
-
berniebutt schrieb:
Das kann es nicht sein, FORTRAN und C haben dieselben Grundlagen für floating-point Datentypen und deren Arithmetik. Nur die interne Darstellung hat sich evtl. mit neueren Standards geändert. Juckt aber niemand zum Verstehen!
Das habe ich damit nicht gemeint.