Signifikamte stellen C Programmieren?
Guten Tag,
mir ist folgendes beim Programmieren aufgefallen.
Ich habe a=0,2^2 - 4*1*0,01 gesetzt. a als double. Das Ergebnis sollte 0 sein. Nun habe ich gelernt, dass der Rechner eine endliche Genauigkeit hat und zwar 15 signifikante Dezimalstellen.
Wenn ich nun eine If Abfrage mit If(a>0) schreibe wird diese ausgeführt, weil a hinter den 15 signifikanten Stellen nicht mehr nur Nullen aufweist sondern 0361... .
Nun zu meiner Frage. Kann ich die If Abfrage auf einen bestimmten Nachkommabereich beschränken?
Mit freundlichen Grüßen,
Fabian
2 Antworten
Das sind die Freuden der Verwendung von floating point. Mit floats hast du nur eingeschränkte, endliche Präzision, und bei deren Verwendung wirst du dies immer berücksichtigen wollen. Insbesondere bei Operationen, die vollständige Präzision erfordern, wie z.B. Vergleiche - wie du ja selbst schon festgestellt hast.
Ein Weg der Vermeidung ist, soweit möglich, Zahlen, die vollständige Präzision erfordern, als Integers darzustellen. Kannst du floats nicht vermeiden, kannst du dafür den Wertebereich des Vergleichswert verschieben, also z.B. nicht gegen 0 zu vergleichen, sondern gegen einen Wert, der die zulässige Abweichung kompensiert, z.b. gegen 0.00005 - eine Möglichkeit für größer/kleiner als Vergleiche. Für Test auf Identität geht dies aber auch nicht - Vergleichswerte voneinander subtrahieren, und den Absolutwert der Differenz gegen den maximal zulässigen Fehler vergleichen gänge da, genauso wie Skalieren beider Operanden und dann deren Integer-Wert auf Identität testen.
Auch fixed point statt floats (essentially Integers mit einem Komma an selbst eingesetzter Stelle) sind oft eine Möglichkeit, um floats zu vermeiden. Floats sind zwar bequem in der Verwendung, erfordern allerdings, dass du dir deren Unzulänglichkeiten bewusst bist, und diese, so nötig, auffängst.
Nein, das geht in C so nicht. In c++ könntesz du den Operator entsprechend überladen, das ist aber was anderes.
Im Grunde brauchst du das aber auch gar nicht, du könntest das Double einfach in einen int casten und darübrr deine If Abfrage legen.