mehrere if-anweisungen
-
OK. Das kommt mir bekannt vor un leuchtet ein
(auch einem SQL-verwöhnten User wie mir, der sich bei Vergleichen seltenst Gedanken um die Genauigkeit machen muß).Frage:
0,333 mit Genauigkeit 3 == 0,333 mit Genauigkeit 3 sollte true ergeben ?also z.B. RoundTo(0.1,-1)==RoundTo(0.1,-1)
-
caspar_louis schrieb:
Frage:
0,333 mit Genauigkeit 3 == 0,333 mit Genauigkeit 3 sollte true ergeben ?also z.B. RoundTo(0.1,-1)==RoundTo(0.1,-1)
RoundTo arbeitet mit multiplikationen mit zehnerpotenzen, welche wieder fließkommazahlen sind
ERGO hast du wieder minimale Abweichungen vom gerundeten Ergebnis, wodurch zwei Zahlen, die gerundet gleich sind, immernoch als != eingestuft werden könnenwenn du RoundTo(0.1,-1) == RoundTo(0.1,-1) vergleichst, wird das true ergeben, da der Algo die gleichen Eingabedaten hat, also die gleiche minimale abweichung ergibt, aber bei RoundTo(0.101,-1) == RoundTo(0.099,-1) kann das schon ganz anders aussehen
btw. Studierst du Informatik in Düsseldorf?
-
Wenn Du Informatik studierst dann gibt es dazu noch eine ganze Vorlesung die erschöpfend auf diese ganze Problematik eingeht. Numerische Verfahren.
Die gab es wenigstens zu meiner Zeit, ist aber schon ein paar Jährchen her.
-
also z.B. RoundTo(0.1,-1)==RoundTo(0.1,-1)[/quote]
Wenn RoundTo als Ergebnis wieder eine Fließkommazahl hat, dann bring Dir das gar nichts. Dann vergleichst Du wieder zwei Fließkommazahlen und das Ergebnis kann wieder unerwarteter Weise false sein, obwohl Du denkst es müßte true sein.
Das gemeine an der Geschichte ist, daß es bei Deinen Testfällen immer "richtig" funktioniert und wenn Dein Programm dann im Einsatz ist 100%ig innerhalb kürzester Zeit nicht mehr richtig funktioniert. Deswegen grundsätzlich NIE Fließkommazahlen auf Gleichheit überprüfen.
-
-
-
evtl sollte man den Thread hier umbenennen oder spalten @ Mods
mfg
BigNeal
-
Nein ich studiere nicht mehr. Mein Studium liegt schon 10 Jahre zurück.
Haupsächlich arbeite ich mit SQL in verschiedenen Dialekten und komme studientechnisch von der Pascal-Seite. Sowohl in SQL als auch in Pascal sind Vergleiche anders gelöst als in C++, so daß solche Abweichungen, die Fließkommas ja immanent sind, keine Rolle spielen.
C++ mache ich nur als Frontend für eine SQL-Server-DB, weil unser ERP mit seiner eigenen Sprache zwar Events aber keine eigenen Masken zuläßt.Zu C++ habe ich mal einen Abendkurs besucht, um mir nicht alles in selbst aneignen zu müssen.
-
Das ist falsch, für SQL mag das vielleicht stimmen. Bei Pascal gilt genau das Gleiche wie für C++. Die Problematik hat nichts mit der Programmiersprache zu tun sondern mit der Implementierung der Fließkommazahlen in Fließkommarecheneinheit des Rechners.
-
Wenn Du aber Datentypen hast, die eben nicht Fließkomma sondern fest sind, wie Decimal in SQL ... und für Vergleiche implizit umgewandelt wird ...
Ich dachte (Turbo)Pascal hätte auch über Datentypen mit festen Dezimalstellen verfügt. Aber ich kann mich irren. Das ist zu lange her.
