Preisrundung: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Root (Diskussion | Beiträge) (Die Seite wurde neu angelegt: M.MMggGGGG# cRauschen = 0.000000001; M = Monetäre Stellen g = geforderte Genauigkeit der IEEE Finanzdatentypen G = Bessere Genauigkeit des...) |
Root (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
Zeile 1: | Zeile 1: | ||
M.MMggGGGG# | M.MMggGGGG# |
Version vom 27. Februar 2008, 11:02 Uhr
M.MMggGGGG# cRauschen = 0.000000001;
M = Monetäre Stellen g = geforderte Genauigkeit der IEEE Finanzdatentypen G = Bessere Genauigkeit des OrgaMon # = injiziertes Rauschen Geforderte Genauigkeit laut IEEE, 4 Stellen NACH den Monitären Stellen Hintergrund: "Double" stellt zwar eine sehr hohe Rechen-Genauigkeit zur Verfügung, es kann aber 0,075 NICHT darstellen. Es kann nur 0,07499999... darstellen, was bei der direkten Betrachtung der Zahl sofort auffällt. Würde man jedoch mit dieser Zahl weiterrechen käme man dennoch auf ein richtiges Endergebnis, Da zum Beispiel 0,0749999*2 wiederum eine gut darstellbare Zahl (0,16) ergibt. ABER: Beim einem direkten Runden der (0,075 * 100.0) passiert der Fehler, dass nach 7 als Ergebnis herauskommt, was falsch ist! Lösung: Durch ein künstliches Rauschen, das ausserhalb des geforderten Genauigkeits-Bereiches liegt, und somit vernachlässigt werden kann, wird sichergestellt, dass die Rundung gesichert so gelingt wie es erwartet wird: Im Prinzip verhilft man den zahlen, die hoffnungslos in der Perioden darstellung gefangen sind durch einen leichten Schups über den Zaun. Bei Zahlen die eigentlich den Schups nicht benötigt hätten und gerne nicht gesprungen wären machen wir einen Fehler, OK, aber dieser liegt ausserhalb der geforderten Genauigkeit, so dass dass ungerechtfertigte Springen über den Zaun mit der geforderten Ungenauigkeit gerechtfertigt werden kann. Beispiel: 1.0 + 0.0000001 = 1.0000001 immer noch 1 1.5 + 0.0000001 = 1.5000001 immer noch 2 1.49993 + 0.0000001 = 1.4999301 immer noch 1 Wir verhelfen praktisch der Zahl 0,4Periode9 die mathematisch eigentlich nach runden 0 ist über die Grenze zu 0,5 die nach runden 1 ist! entstehender Fehler: Wir rechnen ja Zwischenschritte (vor einer Rundung) mit dem mehr als ausreichenden double Typ. Hier passiert also kein Fehler, wird jedoch gerundet schleussen wir einen konstanten Offset ein, der nur einem 100stel der geforderten Genauigkeit entspricht. Also akzeptabel und inerhalb eines gegebenen Toleranzbandes.
*)