Archiv verlassen und diese Seite im Standarddesign anzeigen : Fragen zu FP-Formaten (bzw. aths' Artikel darüber)
eXistence
2005-04-14, 22:18:11
hi,
ich beschäftige mich gerade mit FloatingPoint-Formaten und hab natürlich gleich den Artikel von aths gelesen ("Das FloatingPoint-Format im Detail").
Leider hab ich an der ein oder anderen Stelle noch ein Verständnis-Problem. Da ich nicht alles auf einmal posten will, hier mal meine zwei ersten Probleme:
1. Null ohne Denorm-Unterstützung (Seite 6.)
Aber auch, wenn keine Denorms unterstützt werden, gibt es eine Null. In diesem Falle wird zunächst anhand des Exponenten geprüft, ob eigentlich ein Denorm vorliegt.
es wird geprüft ob ein Denorm vorliegt? ich denke Denorms werden nicht unterstützt, wie kann dann auf sie geprüft werden?
Falls ja, wird die Zahl gleich auf Null abgeschnitten, so dass Exponent und Mantisse durchweg auf 0 gesetzt sind.
Wenn Exponent und Mantisse auf 0 gesetzt sind, habe ich doch immer noch die (nicht mit-gespeicherte) "1" vor der (packed) Mantisse!? wie komm ich dann auf Null?
2. Denorms im allg.
Was wird denn jetzt wo verwendet? Wie sieht es z.B. bei "normalen" Gleitkomma-Formaten auf der CPU (float/single, double) aus? ich vermute die haben eine denormalisierte Mantisse?
wäre nett, wenn mir jemand da auf die Sprünge helfen könnte :)
P.S.
ich hatte erst überlegt, den entsprechenden Thread über den Artikel wieder auszugraben. Allerdings dachte ich mir, dass das dann etwas unübersichtlich wird...
sollte ein Mod meinen, der Thread sei im falschen Forum, bitte verschieben :)
Neomi
2005-04-15, 00:46:11
1. Null ohne Denorm-Unterstützung (Seite 6.)
es wird geprüft ob ein Denorm vorliegt? ich denke Denorms werden nicht unterstützt, wie kann dann auf sie geprüft werden?
Wenn Exponent und Mantisse auf 0 gesetzt sind, habe ich doch immer noch die (nicht mit-gespeicherte) "1" vor der (packed) Mantisse!? wie komm ich dann auf Null?
Als Beispiel nehme ich mal fp32 in der Form s8e23.
Wenn der Exponent 0 ist (von der Bitbelegung her, entspricht -127 dank Bias), dann gibt es keine implizite 1. Mit der Mantisse kann man dann einige noch kleinere Zahlen darstellen. Die Zahl wird nicht mehr als 1.x * 2^-127 interpretiert, sondern als 0.x * 2^-126 (dadurch entsteht kein Loch zur 1.x * 2^-126). Diese speziellen Zahlen sind die Denorms. Eine davon, und zwar 0.0 * 2^-126 (also alle Bits der Mantisse auf 0), ist die tatsächliche Null. Ohne Unterstützung von Denorms kann man auf die Null kommen, indem beim Exponent -127 ohne weitere Interpretation der Mantisse einfach von Null ausgegangen wird.
2. Denorms im allg.
Was wird denn jetzt wo verwendet? Wie sieht es z.B. bei "normalen" Gleitkomma-Formaten auf der CPU (float/single, double) aus? ich vermute die haben eine denormalisierte Mantisse?
Die haben keine denormalisierte Mantisse in dem Sinne, sondern unterstützen bei passendem Exponent eine solche. Denorms werden von allen IEEE-konformen Floats unterstützt, bei der CPU ist das der Fall.
hi,
ich beschäftige mich gerade mit FloatingPoint-Formaten und hab natürlich gleich den Artikel von aths gelesen ("Das FloatingPoint-Format im Detail").
Leider hab ich an der ein oder anderen Stelle noch ein Verständnis-Problem. Da ich nicht alles auf einmal posten will, hier mal meine zwei ersten Probleme:
1. Null ohne Denorm-Unterstützung (Seite 6.)
es wird geprüft ob ein Denorm vorliegt? ich denke Denorms werden nicht unterstützt, wie kann dann auf sie geprüft werden?Auch wenn Denorms nicht unterstützt werden, muss ein FP-Format die Null einwandfrei darstellen können. Anhand des Exponentes wird geprüft, ob die Mantisse eigentlich eine denormalisierte Mantisse wäre. Ist das der Fall, gilt der gesamte Ausdruck als Null. Bei Denorm-Support hingegen wird die Mantisse dann korrekt (als Denorm) ausgewertet.
Wenn Exponent und Mantisse auf 0 gesetzt sind, habe ich doch immer noch die (nicht mit-gespeicherte) "1" vor der (packed) Mantisse!? wie komm ich dann auf Null?Zum Rechnen muss normalerweise die 1 eingefügt werden. Das lässt man dann weg, und die ganze Mantisse ist null.
2. Denorms im allg.
Was wird denn jetzt wo verwendet? Wie sieht es z.B. bei "normalen" Gleitkomma-Formaten auf der CPU (float/single, double) aus? ich vermute die haben eine denormalisierte Mantisse? CPUs unterstützen Denorms in jedem Fall. Im Pixelshader unterstützt CineFX bei FP16 noch Denorms, bei FP32 jedoch nicht.
zeckensack
2005-04-16, 01:25:20
Du musst unterscheiden zwischen Berechnung und Speicherung von Zahlen und auf der anderen Seite Interpretation von gespeicherten Zahlen :)
es wird geprüft ob ein Denorm vorliegt? ich denke Denorms werden nicht unterstützt, wie kann dann auf sie geprüft werden?Speicherung.
1*2^-130 zB ist in IEEE754 "single precision" nur durch den Denorm-Support darstellbar. Aber auch auf Hardware ohne Denorm-Support kann es passieren, dass 1*2^-65 (darstellbar ohne Denorms) quadriert werden soll, was dann zu eben dieser nicht mehr darstellbaren Zahl führt. Das Ergebnis kann nicht exakt gespeichert werden.
Die "Prüfung" besteht nun schlicht darin, zu erkennen dass das Ergebnis nicht darstellbar ist. Die bestmögliche Reaktion ist dann das Abrunden auf 0.
Wenn Exponent und Mantisse auf 0 gesetzt sind, habe ich doch immer noch die (nicht mit-gespeicherte) "1" vor der (packed) Mantisse!? wie komm ich dann auf Null?Interpretation.
Fast alle FP-Formate (uA IEEE754) kennen einige Sonderfälle, die aus der üblichen Kodierung herausfallen. Die Null ist einer dieser Sonderfälle, denn sie verträgt sich wie du richtig erkannt hast nicht mit dem "hidden bit".
IEEE754 definiert die Null über Exponent:=0 und Mantisse:=0 -- über das Vorzeichenbit können dann noch "positive Nullen" und "negative Nullen" unterschieden werden, was zB für die Division einer Zahl durch +/-unendlich (noch ein Sonderfall ...) sinnvoll ist.
eXistence
2005-04-17, 11:25:54
erstmal danke für die Antworten, das hat mich schon mal ein ganzes Stück weitergebracht :)
Was ich noch nicht verstehe, was wird denn nun wo tatsächlich verwendet?
Auf der einen Seite schreibt aths
CPUs unterstützen Denorms in jedem Fall.
Auf der anderen schreibt zeckensack
IEEE754 definiert die Null über Exponent:=0 und Mantisse:=0
Mal ein konkretes Beispiel: Wenn ich hier auf nem normalen Rechner (x86) nen C-Programm schreibe und laufen lasse und den Datentyp double verwende, wird dieser dann mit einer denormalisierten Mantisse interpretiert?
und wo (auf welchen Systemen) läuft es evtl. anders?
noch ne Frage:
Nachkomma-Stellen mit Zweierkomplement (bei FX12).
00,10'0000'0000 entspricht 0.5
01,00'0000'0000 entspricht 1.0
01,11'1111'1111 entspricht 1.9995
beim negativen Bereich bin ich mir aber nicht sicher:
10,00'0000'0000 entspricht -2.0?
10,01'1111'1111 entspricht -1.5?
11,00'0000'0000 entspricht -1.0?
11,01'1111'1111 entspricht -0.5?
Mal ein konkretes Beispiel: Wenn ich hier auf nem normalen Rechner (x86) nen C-Programm schreibe und laufen lasse und den Datentyp double verwende, wird dieser dann mit einer denormalisierten Mantisse interpretiert?
und wo (auf welchen Systemen) läuft es evtl. anders?
Bei x87 gibt es die FPU-Exceptions Underflow und Denorm_Operand. Diese werden ausgelöst, wenn eine Operation ein Denorm ergibt bzw. wenn die Eingabedaten Denorms sind — allerdings auch nur wenn die beiden Exceptions nicht maskiert sind, dann nämlich rechnet die FPU einfach mit den Denorms weiter.
Eine Null als Ergebnis löst natürlich nur dann eine Exception aus, wenn sie durch Underflow entsteht.
Nachkomma-Stellen mit Zweierkomplement (bei FX12).
00,10'0000'0000 entspricht 0.5
01,00'0000'0000 entspricht 1.0
01,11'1111'1111 entspricht 1.9995
beim negativen Bereich bin ich mir aber nicht sicher:
10,00'0000'0000 entspricht -2.0?
10,01'1111'1111 entspricht -1.5?
11,00'0000'0000 entspricht -1.0?
11,01'1111'1111 entspricht -0.5?
10,10'0000'0000 entspricht -1.5
11,00'0000'0000 entspricht -1.0
11,10'0000'0000 entspricht -0.5
Einfach die Bits als 1 bis 1024 und -2048 betrachten, und die Summe durch 1024 teilen. FX12 geht von -2048/1024 bis 2047/1024.
vBulletin®, Copyright ©2000-2025, Jelsoft Enterprises Ltd.