text: Teil 3 von 3 / 15. März 2004 / von aths / Seite 11 von 13
  Double - Die Genauigkeit der 64 Bit
  Single und Double (sprich: "Dabbel") sind die gebräuchlichsten FP-Formate auf CPUs und plattformübergreifend gleich. Es gibt auch Half, nämlich FP16, aber dafür ist Spezialhardware erforderlich (Half und FP16 sind Bit-kompatibel). Wozu braucht man mehr Genauigkeit, als FP32 bietet? Beispielsweise, wenn man mit sehr, sehr kleinen Zahlen hantiert. Oder wenn 8'388'608 Abstufungen pro Bereich nicht mehr ausreichen. Dann kommt "Double" zum Zuge, es hat den Aufbau s52e11. Dank der 52 Bit breiten Mantisse stehen pro Bereich 4'503'599'627'370'496 Abstufungen zur Verfügung.
  Der jetzt 11-bittige Exponent erlaubt gleichermaßen extrem große und extrem kleine Zahlen - jedes zusätzliche Bit im Exponenten bietet bezüglich des darstellbaren Zahlenbereiches ja weitaus mehr als nur eine Verdopplung. Um den darstellbaren Zahlenbereich doppelt so groß zu machen, reichte es aus, das binäre Komma um eine Stelle weiter nach rechts schieben zu können. Bei FP24 kann man es von der "Startposition" ausgehend um 63 Stellen verschieben, bei FP32 um 127 Stellen, bei FP64 um 1023 Stellen! Um das in ein für uns fassbareres System zu übertragen: Mit Single hat die größte noch darstellbare Zahl 38 Dezimalstellen vor dem Komma. Mit Double sind es 308 Dezimalstellen.
  Bekanntlich nimmt die absolute Genauigkeit ab, je größere Zahlen man verwendet. Irgendwann wird FP so ungenau, dass man nicht einmal mehr Integer-Werte noch exakt darstellen kann. Uns interessiert die größte Integer-Zahl, deren Vorgänger noch darstellbar ist. Bei FP16 zum Beispiel ist das die 2048. Bis dahin löst man noch in 1er Schritten auf. 2049 ist mit FP16 nicht mehr darstellbar, nur noch die 2050.
  Bei Single ist die größte Ganzzahl mit Vorgänger 16'777'216. Addiert man auf diese Zahl 1, bekommt man das falsche Ergebnis von 16777216, statt 16777217. Die nächstgrößere darstellbare Zahl wäre 16777218. Double ist da wesentlich generöser: Man kann bishin zur 9'007'199'254'740'992 zählen, ehe eine "+1" nichts mehr ausmacht.
  Single hat eine Genauigkeit von 7,2 signifikanten Dezimalstellen. Double bietet fast 16 sichere Dezimalstellen. Das ist noch etwas mehr als nur "double precision". Da die Bit-Stellen für den Exponent nicht verdoppelt werden (11 Bit statt 8 Bit bei Single), können die hier gesparten Bits der Mantisse zugeschlagen werde (52 statt 23). Wie schon gezeigt, sind beim Exponenten schon einige wenige zusätzliche Bits hilfreich, um sowohl den Zahlenbereich nach oben extrem zu steigern, als auch sehr viel kleinere Zahlen zu erlauben.
  Auf GeForceFX-Grafikkarten wird die Verwendung eines "Mixed Modes" empfohlen: Obwohl dort intern meistens mit FP32 gerechnet wird, sollte man Werten, für die FP16-Genauigkeit reicht, auch nur FP16-Register gönnen. Ganz ähnlich ist es im CPU-Bereich: Auch hier wird für Rechnungen oft eine Art "Mixed Mode" genutzt: Alles, was mit Single auskommt, muss sich damit zufrieden geben, ansonsten nimmt man Double. Ständige Konvertierungen verlangsamen die Rechnungen aber auch. Doch bis heute ist Double im PC-Bereich klar das "Genauigkeits-Format" und ein Performance-Killer. Spezielle CPUs rechnen grundsätzlich mit Double und ziehen aus Single keine Vorteil mehr.
  Intern wird auf auch PCs eigentlich mit Zahlen gearbeitet, die sogar noch genauer als Double sind, dazu später mehr. Am Anfang dieses Kapitels schrieben wir, Double sei plattformübergreifend gleich. Das stimmt allerdings nur eingeschränkt. Auf CRAY-Prozessoren rechnet Double mit einer kleineren Mantisse und einem größeren Exponenten. CRAY, eine legendäre Firma, stellt seit jeher Supercomputer her und entwickelt dafür eigene Prozessoren. Lediglich CRAYs "Real" entspricht dem IEEE-Standard "Single". In unserem Artikel können wir natürlich nicht auf jede Ausnahme eingehen, wir orientieren uns erstens an den IEEE-Definitionen, die ja von der großen Mehrheit der Chipentwickler befolgt werden, und zweitens an Intel-kompatiblen FPUs.
  Bei der ganzen Herumrechnerei plagen wir uns mit Umwandlungen ins Binärsystem ab. Einige FPUs unterstützen auch BCD-Formate als Floating-Point-Zahl. BCD heißt Binär-Codierte Dezimalzahlen. Jede Dezimalziffer von 0 bis 9 ist direkt als Binärzahl kodiert. Dafür sind 4 Bits notwendig. Mit 4 Bits könnte man sogar Werte von 0 bis 15 darstellen, aber der Bereich von 10 bis 15 wird bei BCD eben nicht genutzt.
  Das ist natürlich Platzverschwendung, Packed BCD hat sich denn auch nicht durchgesetzt. Immerhin bietet es 18 signifikante Dezimalstellen (die bei BCD ja direkt als Dezimalziffer kodiert sind) und einen Exponenten von 7 Bit. Dieser Exponent gilt hier natürlich für die Basis von 10, da jede Komma-Verschiebung bei BCD den Wert verzehnfacht bzw. zehntelt. Packed BCD ist 80 Bit lang. Diese 80 Bits kann man aberauch besser nutzen!
  Extended - Maximale Genauigkeit mit 80 Bit
  Wir erwähnten bereits, dass Intel mit der 8087er FPU Funktionalität vor Performance setzte. So wird Extended schon vom 8087 unterstützt. Intern wird sowieso mit FP80 gerechnet, egal ob man Single- oder Double-Rechnungen macht. Das Extended-Format unterstützt Denorms, der Aufbau ist s64e15. Allerdings wird die Mantisse nicht gepackt gespeichert, die führende "1," steht explizit da. Das heißt, von der 64-Bit-Mantisse sind nur 63 Bit tatsächlich nutzbar.
  Bei einem Denorm ist das erste Bit der Extended-Mantisse 0, sonst immer 1. Das hat seinen Grund: Beim Expandieren von Single- oder Double-Zahlenwerten in das Extended-Format wird die implizite "1," am Anfang der Mantisse explizit gesetzt, beim Denorm bleibt die Stelle leer (wird 0). Man könnte nun auf die Idee kommen, einem FP80-Wert die Mantisse zu denormalisieren (also die führende "1," auf "0," zu setzen) obwohl der physische Exponent größer Null ist. Solche Zahlen sind allerdings ungültig.
  Extended bietet extrem hohe Genauigkeit: Gut 19,2 signifikante Dezimalstellen - in vielen wissenschaftlichen Berechnungen werden Naturkonstanten mit geringerer Genauigkeit verwendet. Im PC-Bereich ist Extended das genaueste, was die Hardware hergibt. Das Format wird allerdings nur selten angewendet, denn 80 Bit entsprechen zehn Byte, und zehn ist aus Binär-Sicht eine krumme Zahl. Wenn die Maschine Daten umschaufelt, tut sie das lieber in 4-, 8- oder 16-Byte-Häppchen. Außerdem ist Extended nur auf der PC-Schiene verfügbar, plattformübergreifend nutzbare Programme begnügen sich deshalb mit Double. Wird auf dem PC mit Extended gerechnet, allokieren einige Compiler gleich 12 Byte Speicher für eine Zahl (obwohl 10 Byte ausreichen, aber 12 entsprechen eben drei Häppchen à 4 Byte).
  Da der PC intern mit FP80 rechnet, werden FP64-Ergebnisse praktisch so genau, wie überhaupt möglich. Man kann die FPU auch anweisen, nur so lange zu rechnen, bis die gewünschte Genauigkeit erreicht ist. Damit schindet man gerade für FP32 einige Takte Performance, was bei Echtzeit-Anwendungen gerne genutzt wird.
  Double Extended - Die Kraft der 128 Bit
  Dieses Format hate viele Namen: Quad, Long Double, oder Double Extended - gemeint ist ein FP128-Format. Es hat den Aufbau s112e15. Nun gibt es Maschinen, die zwar mit solchen Zahlen umgehen, intern aber nur mit Extended rechnen. Das heißt, sie werten die letzten 49 Bits der Mantisse nicht aus. Letztlich umgeht man das Problem der "krummen" Zahl von 10 Byte und lebt lieber mit einem Speicherverbrauch von +60%. Denn 16 Byte sind zwei 8-Byte-Häppchen und leichter zu "bursten" als 10 Byte. Auch im Grafik-Bereich ist Speicherverschwendung im Tausch für Performance nicht selten: Der Windows-Deskop arbeitet oft mit 32 Bit, obwohl die Farb-Information auch in 24 Bit Platz hätte.
  Unter anderem vom Hersteller Sun gibt es nun Rechner (Sparcs und Power-PCs), die mit echtem Double Extended auch richtig rechnen können. Ansonsten stehen für einige Programmiersprachen Software-Emulationsbibliotheken zur Verfügung. Man sollte sich hier jedoch nicht in die Irre führen lassen, wenn Hardware als 128-Bit-Hardware bezeichnet wird. Die T&L-Einheit von GeForce256 beispielsweise arbeitet mit vier FP32-Werten, ergo 4*32 = 128 Bit. Ebenso kann ein GeForceFX-Pixelshader mit 4x FP32 rechnen. Spiele-Konsolen, die zumindest Geometrie-Berechnungen mit 4x FP32 durchführen, werden ebenfalls manchmal als 128-bittige Hardware beworben. Wir reden hier aber davon, eine einzige Zahl mit 128 Bit Breite darzustellen und davon jedes einzelne Bit zu nutzen!
  Die Parameter von "FP128" sind schlichtweg beeindruckend. Man hat 34 signifkante Dezimalstellen. Man kann bis zur 10'384'593'717'069'655'257'060'992'658'440'192 zählen, ehe die Schrittweite der darstellbaren Zahlen größer als 1 wird (um diese Zahl exakt auszurechnen, mussten wir eine eigene spezielle String-Arithmetik schreiben, da selbst der Windows Taschenrechner versagte). Außerdem speichert FP128 eine packed Mantissa und unterstützt Denorms. Sun Sparc Stations beziehungsweise Power PCs sind nicht gerade billig, aber immerhin Computer, die man "einfach so" kaufen kann.
  xF - Software-FP mit 224 Bit
  Für bestimmte Probleme sind auch die genauesten hardware-unstützten FP-Formate schlicht unzureichend. Zum Beispiel, wenn man fraktale Mengen berechnen möchte. Das bekannteste Fraktal, das Mandelbrot-Set, liegt um den Koordinaten-Ursprung in einem Kreis mit dem Radius 2. Die schiere Rechenleistung heutiger PCs erlaubt es, richtig tief zu "zoomen", also extrem zu vergrößern. Je höher die Vergrößerung, desto kleiner der tatsächliche Bildbereich. Irgendwann gelangt man zu einem Punkt, wo zwei benachbarte Pixel die gleichen Koordinaten-Werte zugewiesen bekommen, weil die Zahlen-Genauigkeit von hardwareunterstützten Gleitkomma-Formaten für eine Unterscheidung nicht mehr ausreicht.
  Deshalb hat zeckensack eine Klasse namens xF geschrieben, was für "extreme Float" steht. Die Zahl umfasst eine ungepackte Mantisse von 192 Bit, und einen Exponenten von 32 Bit Breite. Die Genauigkeit ist wirklich extrem: 57,8 signifikante Dezimalstellen werden geboten. Und erst wenn man bis zur 6'277'101'735'386'680'763'835'789'423'207'666'416'102'355'444'464'034'512'896 gezählt hat, lässt sich der Nachfolger aufgrund zu großer Schrittweite nicht mehr darstellen. Die Zahl in Worten: Über 6 Billiarden Trilliarden Trilliarden.
  Die xF-Klasse kann zwar nicht dividieren und braucht daher auch weder Inf noch NaN, aber die Problemstellung erforderte auch keinen DIV-Operator. Das Thema ist also "The right tool for the right job". xF ist wegen der Software-Umsetzung natürlich sehr viel langsamer, als ein Hardware-unterstütztes FP-Format. Aber Mandelbrot-Rendering ist ja keine zeitkritische Aufgabe, mit der Software-Emulation ultragenauer FP-Formate kann man durchaus leben. Ebenso damit, dass nur die benötigten Rechenoperation implementiert wurden.
  Um ultragenau zu rechnen, gibt es eine Vielzahl von Ansätzen. Für bestimmte Rechnungen benötigt man zwar keine Nachkommastellen, aber extrem große Integer-Formate, diese bildet man dann manchmal in Strings ab. Computer unterstützen von sich aus nur Darstellungen, die man wirklich öfters braucht, Numerik für Spezialaufgaben muss in Software umgesetzt werden. Es lohnt nicht, einem Allround-Chip, wie die CPU nunmal einer ist, mit Logik auszurüsten, die nur seltenst gebraucht wird. Manchmal werden spezielle Microcontroller oder Coprozessoren entwickelt, um bestimmten Anforderungen gerecht zu werden. Dazu zählt auch der 3D-Kern einer Grafikkarte.