![]() |
Genauigkeit bei Gleitkomma-Berechnungen erhöhen
Hallo zusammen,
ich habe fertige Berechnungen mit Gleitkommawerten (Typ Extended), und möchte nun schauen, ob ich deren Genauigkeit irgendwie noch erhöhen kann. Was kann ich tun, um die Genauigkeit von Gleitkomma-Berechnungen zu erhöhen? Im Speziellen handelt es sich um die Rechnung mit Dichte- und Verteilungsfunktionen (Wahrscheinlichkeitsrechnung), so dass einige Werte eben auch sehr sehr klein sind; z.B.: Φ ist die numerische Integration über die Standardnormalverteilung Φ⁻¹ ist eine "intelligente" Zielwertsuche (= Umkehrfunktion) Φ(-7) < 0.0000001 Φ⁻¹(Φ(-7)) = -15 |Φ(-7) - Φ(-15)| < 0.0000000000001 Das Problem hier ist etwa, dass die Funktionswerte von Φ(-7) und Φ(-15) nur sehr gering voneinander abweichen. Entsprechend schwer lässt sich mit der Umkehrfunktion Φ⁻¹ sagen, was das ursprüngliche Argument für Φ war. Wer den Teil mit Beispiel nicht versteht, hat vielleicht doch ganz allgemein eine Idee, was man tun kann, um die Genauigkeit solcher Berechnungen zu erhöhen, oder (bis zu einer bestimmten Signifikanz) zu garantieren? |
AW: Genauigkeit bei Gleitkomma-Berechnungen erhöhen
Da die Geanuigkeit HW bedingt ist ( FPU) kann man diese nur darin umgehen, indem man Fixed-Point-Typen verwendet
|
AW: Genauigkeit bei Gleitkomma-Berechnungen erhöhen
Eine andere mögliche Sache wäre Skalierung, so dass hach hinten raus mehr "Luft" ist. Dies geht aber nicht mit allen Verfahren so problemlos, und bei der zurück skalierten Anzeige ists auch schon wieder Essig.
Die Genauigkeit ist fix, und lässt sich in keinster Weise beeinflussen. Die einzigen Wege sind eben nicht-native Typen via irgendwelcher BigNum-Libs (oder Eigenbau), oder aber die Berechnungen auf skalierte Bereiche anzupassen. |
AW: Genauigkeit bei Gleitkomma-Berechnungen erhöhen
Skalieren tut die FPU-Arithmetik doch eh
|
AW: Genauigkeit bei Gleitkomma-Berechnungen erhöhen
Man sollte möglichst versuchen, zu vermeiden, dass die Größenordnungen sich zu oft verändern bzw. auseinandergehen. Eine Gleitkommazahl ist ja ein Koeffizient (Mantisse) multipliziert mit der Basis hoch einem Exponenten. D.h. ob du 0.00001 und 0.00001 miteinander addierst, oder 100000 und 100000, sollte von der Genauigkeit her keinen Unterschied machen, da sich lediglich der Exponent ändert (vorausgesetzt die Basis wäre 10, i.d.R. ist es bei Computern in der Praxis 2). Wenn du jetzt aber z.B. 100000 und 0.00001 addierst, lässt sich die Zahl nicht mehr über einen Exponenten skalieren und es müssen irgendwie 10 Stellen in die Mantisse gequetscht werden. Wenn die Anzahl an Stellen die der sogenannten "signifikanten Stellen" des Gleitkommatyps überschreitet, wird der Wert ungenau.
Der ![]() |
AW: Genauigkeit bei Gleitkomma-Berechnungen erhöhen
Okay. Ich sehe, es gibt nicht die wirklich einfachen Stellschrauben, wäre wohl auch zu einfach gewesen... In jedem Fall, danke!
|
AW: Genauigkeit bei Gleitkomma-Berechnungen erhöhen
Zitat:
![]() Φ(-15) = 3.67096619931275E-0051. Die Werte unterscheiden sich doch gewaltig (relative Abweichung). Und auch Φ^{-1}(Φ(-7)) ist kein Problem: -7.00000000000000000E+0000. Berechnet via
Delphi-Quellcode:
y := normstd_cdfx(-7);
x := normstd_invx(y); writeln(y:30); writeln(normstd_cdfx(-15):30); writeln(x:30); |
AW: Genauigkeit bei Gleitkomma-Berechnungen erhöhen
Ich denke, Frage und Antworten wichen bisher voneinander ab. Du hast den Wink in die richtige Richtung gegeben.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz