Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Genauigkeit bei Gleitkomma-Berechnungen erhöhen (https://www.delphipraxis.net/156115-genauigkeit-bei-gleitkomma-berechnungen-erhoehen.html)

Panthrax 20. Nov 2010 14:12

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?

mkinzler 20. Nov 2010 14:14

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

Medium 20. Nov 2010 14:54

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.

mkinzler 20. Nov 2010 15:00

AW: Genauigkeit bei Gleitkomma-Berechnungen erhöhen
 
Skalieren tut die FPU-Arithmetik doch eh

Namenloser 20. Nov 2010 17:09

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 Wikipedia-Artikel ist auch einen Blick wert.

Panthrax 23. Nov 2010 15:14

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!

gammatester 23. Nov 2010 15:38

AW: Genauigkeit bei Gleitkomma-Berechnungen erhöhen
 
Zitat:

Zitat von Panthrax (Beitrag 1062762)
Φ(-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.

Ich verstehe Deine Frage nicht ganz. Meine Statistikroutinen rechnen Φ(-7) = 1.27981254388583500E-0012 und
Φ(-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);

alzaimar 26. Nov 2010 07:29

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 23:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz