Gleitkommaformat mit vierfacher Genauigkeit - Quadruple-precision floating-point format

In der Computertechnik ist Quadruple Precision (oder Quad Precision ) ein binäres Fließkomma- basiertes Computerzahlenformat , das 16 Byte (128 Bit) mit einer Genauigkeit von mindestens dem Doppelten der doppelten 53-Bit -Präzision belegt .

Diese 128-Bit-Vierfachpräzision wurde nicht nur für Anwendungen entwickelt, die Ergebnisse mit mehr als doppelter Genauigkeit erfordern, sondern ermöglicht als Hauptfunktion auch die zuverlässigere und genauere Berechnung von Ergebnissen mit doppelter Genauigkeit durch Minimierung von Überlauf- und Rundungsfehlern in Zwischenstufen Berechnungen und Scratch-Variablen. William Kahan , Hauptarchitekt des ursprünglichen IEEE-754-Gleitkomma-Standards, bemerkte: "Im Moment ist das 10-Byte-Extended-Format ein tolerierbarer Kompromiss zwischen dem Wert der extrapräzisen Arithmetik und dem Preis für die Implementierung, um schnell zu laufen; sehr bald zwei mehr Bytes an Präzision werden tolerierbar und letztendlich ein 16-Byte-Format ... Diese Art von schrittweiser Entwicklung hin zu größerer Präzision war bereits in Sicht, als der IEEE-Standard 754 für Gleitkomma-Arithmetik eingerahmt wurde."

In IEEE 754-2008 wird das 128-Bit-Basis-2-Format offiziell als binär128 bezeichnet .

IEEE 754 binäres Gleitkommaformat mit vierfacher Genauigkeit: binary128

Der IEEE 754-Standard spezifiziert eine binäre 128 mit:

Dies ergibt eine Genauigkeit von 33 bis 36 signifikanten Dezimalstellen. Wenn eine Dezimalzeichenfolge mit höchstens 33 signifikanten Stellen in eine IEEE 754-Darstellung mit vierfacher Genauigkeit umgewandelt und dann wieder in eine Dezimalzeichenfolge mit derselben Anzahl von Stellen umgewandelt wird, sollte das Endergebnis mit der ursprünglichen Zeichenfolge übereinstimmen. Wenn eine IEEE 754-Zahl mit vierfacher Genauigkeit in eine Dezimalzeichenfolge mit mindestens 36 signifikanten Stellen umgewandelt und dann wieder in eine Darstellung mit vierfacher Genauigkeit umgewandelt wird, muss das Endergebnis mit der ursprünglichen Zahl übereinstimmen.

Das Format wird mit einem impliziten Lead-Bit mit dem Wert 1 geschrieben, es sei denn, der Exponent wird mit Nullen gespeichert. Somit erscheinen nur 112 Bit des Signifikanten im Speicherformat, aber die Gesamtgenauigkeit beträgt 113 Bit (ungefähr 34 Dezimalstellen: log 10 (2 113 ) 34,016 ). Die Bits sind wie folgt ausgelegt:

Ein Vorzeichenbit, ein 15-Bit-Exponent und ein 112-Bit-Signifikand

Eine binäre 256 hätte eine signifikante Genauigkeit von 237 Bit (ungefähr 71 Dezimalstellen) und eine Exponentialabweichung von 262143.

Exponentencodierung

Der binäre Gleitkommaexponent mit vierfacher Genauigkeit wird unter Verwendung einer Offset-Binärdarstellung codiert , wobei der Null-Offset 16383 beträgt; dies wird im IEEE 754-Standard auch als Exponenten-Bias bezeichnet.

  • E min = 0001 16 - 3FFF 16 = -16.382
  • E max = 7FFE 16 − 3FFF 16 = 16383
  • Exponenten-Bias = 3FFF 16 = 16383

Somit muss, wie durch die Offset-Binärdarstellung definiert, der Offset von 16383 von dem gespeicherten Exponenten subtrahiert werden, um den wahren Exponenten zu erhalten.

Die gespeicherten Exponenten 0000 16 und 7FFF 16 werden speziell interpretiert.

Exponent Signifikant Null Signifikantund ungleich Null Gleichung
0000 16 0 , -0 subnormale Zahlen (−1) signbit × 2 −16382 × 0.significandbits 2
0001 16 , ..., 7FFE 16 normalisierter Wert (−1) Vorzeichenbit × 2 Exponentbits 2 − 16383 × 1.Signifikandbits 2
7FFF 16 ± NaN (ruhig, signalisierend)

Der minimale streng positive (subnormale) Wert ist 2 −16494 ≈ 10 −4965 und hat eine Genauigkeit von nur einem Bit. Der minimale positive Normalwert beträgt 2 −163823,3621 × 10 −4932 und hat eine Genauigkeit von 113 Bit, also ebenfalls ±2 −16494 . Der maximal darstellbare Wert beträgt 2 16384 − 2 162711,1897 × 10 4932 .

Beispiele mit vierfacher Präzision

Diese Beispiele sind in Bit gegebene Darstellung , in hexadezimal , der Gleitkommawert. Dazu gehören das Vorzeichen, der (verzerrte) Exponent und der Signifikand.

0000 0000 0000 0000 0000 0000 0000 000116 = 2−16382 × 2−112 = 2−16494
                                          ≈ 6.4751751194380251109244389582276465525 × 10−4966
                                            (smallest positive subnormal number)
0000 ffff ffff ffff ffff ffff ffff ffff16 = 2−16382 × (1 − 2−112)
                                          ≈ 3.3621031431120935062626778173217519551 × 10−4932
                                            (largest subnormal number)
0001 0000 0000 0000 0000 0000 0000 000016 = 2−16382
                                          ≈ 3.3621031431120935062626778173217526026 × 10−4932
                                            (smallest positive normal number)
7ffe ffff ffff ffff ffff ffff ffff ffff16 = 216383 × (2 − 2−112)
                                          ≈ 1.1897314953572317650857593266280070162 × 104932
                                            (largest normal number)
3ffe ffff ffff ffff ffff ffff ffff ffff16 = 1 − 2−113
                                          ≈ 0.9999999999999999999999999999999999037
                                            (largest number less than one)
3fff 0000 0000 0000 0000 0000 0000 000016 = 1 (one)
3fff 0000 0000 0000 0000 0000 0000 000116 = 1 + 2−112
                                          ≈ 1.0000000000000000000000000000000001926
                                            (smallest number larger than one)
c000 0000 0000 0000 0000 0000 0000 000016 = −2
0000 0000 0000 0000 0000 0000 0000 000016 = 0
8000 0000 0000 0000 0000 0000 0000 000016 = −0
7fff 0000 0000 0000 0000 0000 0000 000016 = infinity
ffff 0000 0000 0000 0000 0000 0000 000016 = −infinity
4000 921f b544 42d1 8469 898c c517 01b816 ≈ π
3ffd 5555 5555 5555 5555 5555 5555 555516 ≈ 1/3

Standardmäßig rundet 1/3 wegen der ungeraden Anzahl von Bits im Signifikanten wie doppelte Genauigkeit ab . Die Bits jenseits des Rundungspunktes sind 0101...also an letzter Stelle weniger als 1/2 einer Einheit .

Doppel-Doppel-Arithmetik

Eine gängige Softwaretechnik zum Implementieren von nahezu vierfacher Genauigkeit unter Verwendung von Paaren von Werten mit doppelter Genauigkeit wird manchmal als Doppel-Doppel-Arithmetik bezeichnet . Unter Verwendung von Paaren von IEEE-Werten mit doppelter Genauigkeit mit 53-Bit-Signifikanden bietet die Doppel-Doppel-Arithmetik Operationen an Zahlen mit Vorzeichen von mindestens 2 × 53 = 106 Bit (eigentlich 107 Bit mit Ausnahme einiger der größten Werte aufgrund des begrenzten Exponenten) Bereich), nur etwas weniger genau als der 113-Bit-Signifikand der IEEE-Binär-128-Vierfachpräzision. Der Bereich eines Double-Double bleibt im Wesentlichen der gleiche wie beim Double-Precision-Format, da der Exponent immer noch 11 Bit hat, deutlich niedriger als der 15-Bit-Exponent der IEEE Quadruple Precision (ein Bereich von 1,8 × 10 308 für Double-Double gegenüber 1,2 × 10 4932 für binär128).

Insbesondere wird ein Double-Double/Quadruple-Precision-Wert q in der Double-Double-Technik implizit als Summe q = x + y zweier Double-Precision-Werte x und y dargestellt , von denen jeder die Hälfte des Signifikanten von q liefert . Das heißt, das Paar ( x , y ) wird anstelle von q gespeichert und Operationen an q Werten (+, –, ×, ...) werden in äquivalente (aber kompliziertere) Operationen an den x- und y- Werten umgewandelt. Somit reduziert sich die Arithmetik in dieser Technik auf eine Folge von Operationen mit doppelter Genauigkeit; Da die Arithmetik mit doppelter Genauigkeit üblicherweise in Hardware implementiert ist, ist die Arithmetik mit doppelter Genauigkeit typischerweise wesentlich schneller als allgemeinere arithmetische Techniken mit beliebiger Genauigkeit .

Beachten Sie, dass die Doppel-Doppel-Arithmetik folgende Besonderheiten aufweist:

  • Wenn die Größe des Werts abnimmt, nimmt auch der Betrag der zusätzlichen Präzision ab. Daher ist die kleinste Zahl im normalisierten Bereich schmaler als die doppelte Genauigkeit. Die kleinste Zahl mit voller Genauigkeit ist 1000...0 2 (106 Nullen) × 2 −1074 oder 1.000...0 2 (106 Nullen) × 2 −968 . Zahlen, deren Betrag kleiner als 2 −1021 ist, haben keine zusätzliche Genauigkeit im Vergleich zur doppelten Genauigkeit.
  • Die tatsächliche Anzahl der Genauigkeitsbits kann variieren. Im Allgemeinen ist der Betrag des niederwertigen Teils der Zahl nicht größer als die Hälfte des ULP des höherwertigen Teils. Wenn der niederwertige Teil weniger als die Hälfte des ULP des höherwertigen Teils beträgt, werden signifikante Bits (entweder alle Nullen oder alle Einsen) zwischen dem signifikanten der höherwertigen und niederwertigen Zahlen impliziert. Bestimmte Algorithmen, die auf einer festen Anzahl von Bits im Signifikanten beruhen, können bei der Verwendung von 128-Bit langen Doppelzahlen fehlschlagen.
  • Aus dem oben genannten Grund ist es möglich, Werte wie 1 + 2 -1074 darzustellen , was die kleinste darstellbare Zahl größer als 1 ist.

Zusätzlich zur Doppel-Doppel-Arithmetik ist es auch möglich, Dreifach-Doppel- oder Vierfach-Doppel-Arithmetik zu erzeugen, wenn eine höhere Genauigkeit ohne eine höhergenaue Gleitkommabibliothek erforderlich ist. Sie werden als Summe von drei (bzw. vier) Werten mit doppelter Genauigkeit dargestellt. Sie können Operationen mit mindestens 159/161 bzw. 212/215 Bit darstellen.

Eine ähnliche Technik kann verwendet werden, um eine Doppelquad-Arithmetik zu erzeugen , die als Summe von zwei Werten mit vierfacher Genauigkeit dargestellt wird. Sie können Operationen mit mindestens 226 (oder 227) Bit darstellen.

Implementierungen

Vierfache Präzision wird oft in Software durch eine Vielzahl von Techniken implementiert (wie die obige Doppel-Doppel-Technik, obwohl diese Technik keine IEEE-Vierfach-Präzision implementiert), da die direkte Hardware-Unterstützung für vierfache Präzision ab 2016 weniger verbreitet ist (siehe " Hardware-Unterstützung " unten). Man kann allgemeine arithmetische Bibliotheken mit beliebiger Genauigkeit verwenden , um eine vierfache (oder höhere) Genauigkeit zu erhalten, aber spezialisierte Implementierungen mit vierfacher Genauigkeit können eine höhere Leistung erzielen.

Unterstützung von Computersprachen

Eine andere Frage ist, inwieweit Typen mit vierfacher Genauigkeit direkt in Computerprogrammiersprachen integriert werden .

Vierfache Genauigkeit wird in Fortran durch das real(real128)(Modul iso_fortran_envvon Fortran 2008 muss verwendet werden, die Konstante real128ist bei den meisten Prozessoren gleich 16) oder als angegeben real(selected_real_kind(33, 4931)), oder nicht standardmäßig als REAL*16. (Vierfach-Präzision REAL*16wird beispielsweise vom Intel Fortran Compiler und vom GNU Fortran Compiler auf x86- , x86-64- und Itanium- Architekturen unterstützt.)

Für die Programmiersprache C spezifiziert ISO/IEC TS 18661-3 (Gleitkomma-Erweiterungen für C, Austausch- und erweiterte Typen) _Float128als den Typ, der das Vierfachpräzisionsformat IEEE 754 (binär 128) implementiert. Alternativ kann in C / C++ mit einigen wenigen Systemen und Compilern eine vierfache Genauigkeit durch den Typ long double angegeben werden , dies ist jedoch weder von der Sprache erforderlich (die nur long doublemindestens so genau sein muss wie double) und ist auch nicht üblich.

Auf x86 und x86-64 implementieren die gängigsten C/C++-Compiler long doubleentweder als 80-Bit erweiterte Genauigkeit (zB der GNU C Compiler gcc und der Intel C++ Compiler mit einem /Qlong‑doubleSchalter) oder einfach als Synonym mit doppelter Genauigkeit (zB Microsoft Visual C++ ), anstatt mit vierfacher Genauigkeit. Der Prozeduraufrufstandard für die ARM-64-Bit-Architektur (AArch64) spezifiziert, dass dies long doubledem IEEE 754-Vierfachpräzisionsformat entspricht. Auf einigen anderen Architekturen implementieren einige C/C++-Compiler long doublemit vierfacher Genauigkeit, zB gcc auf PowerPC (als Double-Double) und SPARC oder die Sun Studio-Compiler auf SPARC. Auch wenn dies long doublekeine vierfache Genauigkeit ist, stellen einige C/C++-Compiler jedoch einen nicht standardmäßigen Typ mit vierfacher Genauigkeit als Erweiterung bereit. gcc bietet beispielsweise einen Typ mit vierfacher Genauigkeit __float128für x86-, x86-64- und Itanium- CPUs und auf PowerPC als IEEE 128-Bit-Gleitkomma mit den Optionen -mfloat128-hardware oder -mfloat128; und einige Versionen von Intels C/C++-Compiler für x86 und x86-64 bieten einen nicht standardmäßigen Typ mit vierfacher Genauigkeit namens _Quad.

Bibliotheken und Toolboxen

  • Die GCC- Quad-Precision-Mathematikbibliothek, libquadmath , bietet __float128und arbeitet __complex128.
  • Die Boost- Multiprecision-Bibliothek Boost.Multiprecision bietet eine einheitliche plattformübergreifende C++-Schnittstelle für __float128und _Quad-Typen und enthält eine benutzerdefinierte Implementierung der mathematischen Standardbibliothek.
  • Die Multiprecision Computing Toolbox for MATLAB ermöglicht Berechnungen mit vierfacher Genauigkeit in MATLAB . Es umfasst grundlegende arithmetische Funktionen sowie numerische Methoden, dichte und dünnbesetzte lineare Algebra.
  • Das DoubleFloats-Paket bietet Unterstützung für Double-Double-Berechnungen für die Programmiersprache Julia.
  • Die Bibliothek doubledouble.py ermöglicht Double-Double-Berechnungen in Python.
  • Mathematica unterstützt IEEE-Zahlen mit vierfacher Genauigkeit: 128-Bit-Gleitkommawerte (Real128) und 256-Bit-Komplexwerte (Complex256).

Hardware-Unterstützung

Die vierfache IEEE-Präzision wurde 1998 zum IBM S/390 G5 hinzugefügt und wird in den nachfolgenden z/Architecture- Prozessoren in Hardware unterstützt . Die IBM POWER9- CPU ( Power ISA 3.0 ) verfügt über eine native 128-Bit-Hardwareunterstützung.

Die native Unterstützung von IEEE 128-Bit-Floats ist in PA-RISC 1.0 und in SPARC V8- und V9-Architekturen definiert (z. B. gibt es 16 Quad-Precision-Register %q0, %q4, ...), aber keine SPARC-CPU implementiert Quad- Präzisionsoperationen in Hardware ab 2004.

Nicht-IEEE Extended-Precision (128 Bit Speicher, 1 Vorzeichenbit, 7 Exponentenbit, 112 Bruchbit, 8 Bit ungenutzt) wurde der IBM System/370- Serie (1970er–1980er Jahre) hinzugefügt und war auf einigen S/360 . verfügbar Modelle in den 1960er Jahren (S/360-85, -195 und andere auf besonderen Wunsch oder simuliert durch OS-Software).

Der VAX- Prozessor implementierte Nicht-IEEE-Gleitkomma mit vierfacher Genauigkeit als sein "H-Gleitkomma"-Format. Es hatte ein Vorzeichenbit, einen 15-Bit-Exponenten und 112-Fraktionsbits, jedoch unterschied sich das Layout im Speicher erheblich von der IEEE-Vierfachpräzision und auch der Exponenten-Bias unterschied sich. Nur einige der frühesten VAX-Prozessoren implementierten H-Gleitkomma-Befehle in Hardware, alle anderen emulierten H-Gleitkomma in Software.

Die RISC-V- Architektur spezifiziert eine "Q" (Quad-Precision)-Erweiterung für 128-Bit-Binär-IEEE 754-2008-Gleitkomma-Arithmetik. Die Erweiterung "L" (noch nicht zertifiziert) gibt 64-Bit- und 128-Bit-Dezimal-Gleitkommazahlen an.

Quadruple Genauigkeit (128 Bit) Hardware - Implementierung sollte nicht mit "128-bit FPUs" verwechselt werden, die Umsetzung SIMD Anweisungen, wie beispielsweise Streaming SIMD Extensions oder AltiVec , die auf 128-Bit bezieht sich Vektoren von vier 32-Bit - einfacher Genauigkeit oder zwei 64-Bit-Werte mit doppelter Genauigkeit, die gleichzeitig bearbeitet werden.

Siehe auch

Verweise

Externe Links