Articles

Double-Precision Floating-Point-Format

Double-Precision Binary Floating-Point ist ein häufig verwendetes Format auf PCs, aufgrund seiner größeren Reichweite über Single-Precision Floating-Point, trotz seiner Leistung und Bandbreitenkosten. Es ist allgemein einfach als double bekannt. Der IEEE 754-Standard spezifiziert ein binary64 mit:

  • Vorzeichenbit: 1 Bit
  • Exponent: 11 Bit
  • Signifikanzgenauigkeit: 53 Bit (52 explizit gespeichert)

Das Vorzeichenbit bestimmt das Vorzeichen der Zahl (auch wenn diese Zahl Null ist, die vorzeichenbehaftet ist).

Das Exponentenfeld ist eine 11-Bit-Ganzzahl ohne Vorzeichen von 0 bis 2047 in voreingenommener Form: Ein Exponentenwert von 1023 repräsentiert die tatsächliche Null. Exponenten reichen von -1022 bis +1023, da Exponenten von -1023 (alle 0s) und +1024 (alle 1s) für spezielle Zahlen reserviert sind.

Die 53-Bit-Signifikanzgenauigkeit ergibt eine Genauigkeit von 15 bis 17 signifikanten Dezimalstellen (2-53 ≈ 1,11 × 10-16). Wenn eine Dezimalzeichenfolge mit höchstens 15 signifikanten Ziffern in eine IEEE 754-Darstellung mit doppelter Genauigkeit konvertiert und dann wieder in eine Dezimalzeichenfolge mit derselben Anzahl von Ziffern konvertiert wird, sollte das Endergebnis mit der ursprünglichen Zeichenfolge übereinstimmen. Wenn eine IEEE 754-Zahl mit doppelter Genauigkeit in eine Dezimalzeichenfolge mit mindestens 17 signifikanten Stellen konvertiert und dann wieder in eine Darstellung mit doppelter Genauigkeit konvertiert wird, muss das Endergebnis mit der ursprünglichen Zahl übereinstimmen.

Das Format wird mit dem Signifikanten geschrieben, der ein implizites ganzzahliges Bit vom Wert 1 hat (außer für spezielle Daten, siehe die Exponentencodierung unten). Wenn die 52 Bits des Bruchs (F) -Signifikanden im Speicherformat erscheinen, beträgt die Gesamtgenauigkeit daher 53 Bits (ungefähr 16 Dezimalstellen, 53 log10 (2) ≈ 15,955). Die Bits sind wie folgt angelegt:

IEEE 754 Double Floating Point Format.svg

Der reale Wert, der von einem gegebenen 64-Bit-Datum mit doppelter Genauigkeit mit einem gegebenen vorgespannten Exponenten e {\displaystyle e}

e

und einem 52-Bit−Bruch angenommen wird, ist ( – 1 ) Vorzeichen ( 1. b 51 b 50 . . . b 0 ) 2 × 2 e − 1023 {\displaystyle (-1)^{\text{Zeichen}}(1.b_{51}b_{50}…b_{0})_{2}\mal 2^{e-1023}}

(-1)^{\text{Zeichen}}(1.b_{51}b_{50}...b_{0})_{2}\mal 2^{e-1023}

oder

( − 1 ) Vorzeichen ( 1 + ∑ i = 1 52 b 52 − i 2 − i ) × 2 e − 1023 {\displaystyle (-1)^{\text{Vorzeichen}}\links(1+\Summe _{i=1}^{52}b_{52-i}2^{-i}\rechts)\mal 2^{e -1023}}

(-1)^{\text{sign}}\links(1+\Summe _{i=1}^{52}b_{52-i}2^{-i}\rechts)\mal 2^{e-1023}

Zwischen 252=4.503.599.627.370.496 und 253 = 9.007.199.254.740.992 die darstellbaren Zahlen sind genau die ganzen Zahlen. Für den nächsten Bereich von 253 bis 254 wird alles mit 2 multipliziert, sodass die darstellbaren Zahlen die geraden sind usw. Umgekehrt beträgt der Abstand für den vorherigen Bereich von 251 bis 252 0,5 usw.

Der Abstand als Bruchteil der Zahlen im Bereich von 2n bis 2n+1 beträgt 2n−52.Der maximale relative Rundungsfehler beim Runden einer Zahl auf die nächste darstellbare (die Maschine epsilon) beträgt daher 2-53.

Die 11-Bit-Breite des Exponenten ermöglicht die Darstellung von Zahlen zwischen 10-308 und 10308 mit voller Genauigkeit von 15-17 Dezimalstellen. Durch Kompromisse bei der Genauigkeit ermöglicht die subnormale Darstellung noch kleinere Werte bis zu etwa 5 × 10-324.

Exponent encodingEdit

Der binäre Gleitkomma-Exponent mit doppelter Genauigkeit wird unter Verwendung einer Offset-Binärdarstellung codiert, wobei der Null-Offset 1023 ist; im IEEE 754-Standard auch als Exponenten-Bias bezeichnet. Beispiele für solche Darstellungen wären:

e =00000000001200116=1: 2 1 − 1023 = 2 − 1022 {\displaystyle 2^{1-1023}=2^{-1022}}

{\displaystyle 2^{1-1023}=2^{-1022}}
(smallest exponent for normal numbers)
e =0111111111123ff16=1023: 2 1023 − 1023 = 2 0 {\displaystyle 2^{1023-1023}=2^{0}}

{\displaystyle 2^{1023-1023}=2^{0}}
(zero offset)
e =10000000101240516=1029: 2 1029 − 1023 = 2 6 {\displaystyle 2^{1029-1023}=2^{6}}

{\displaystyle 2^{1029-1023}=2^{6}}
e =1111111111027fe16=2046: 2 2046 − 1023 = 2 1023 {\displaystyle 2^{2046-1023}=2^{1023}}

{\displaystyle 2^{2046-1023}=2^{1023}}
(highest exponent)

The exponents 00016 and 7ff16 have a special meaning:

  • 00000000000200016 is used to represent a signed zero (if F = 0) and subnormals (if F ≠ 0); und
  • 1111111111127ff16 wird verwendet, um ∞ (wenn F = 0) und NaNs (wenn F ≠ 0) darzustellen,

wobei F der Bruchteil des Signifikanten ist. Alle Bitmuster sind gültige Codierung.

Mit Ausnahme der obigen Ausnahmen wird die gesamte Zahl mit doppelter Genauigkeit beschrieben durch:

( − 1 ) sign × 2 e − 1023 × 1. bruch {\displaystyle (-1)^{\text{sign}}\mal 2^{e-1023}\mal 1.{\text{Bruch}}}

{\displaystyle (-1)^{\text{Zeichen}}\mal 2^{e-1023}\mal 1.{\text{Bruch}}}

Im Fall von Subnormalen (e = 0) wird die Zahl mit doppelter Genauigkeit beschrieben durch:

( – 1 ) Vorzeichen × 2 1 − 1023 × 0. bruch = ( – 1 ) Vorzeichen × 2 – 1022 × 0. bruch {\displaystyle (-1)^{\text{sign}}\mal 2^{1-1023}\mal 0.{\text{Bruch}}=(-1)^{\text{Zeichen}}\mal 2^{-1022}\mal 0.{\text{Bruch}}}

{\displaystyle (-1)^{\text{Zeichen}}\mal 2^{1-1023}\mal 0.{\text{Bruch}}=(-1)^{\text{Zeichen}}\mal 2^{-1022}\mal 0.{\text{fraction}}}

EndiannessEdit

Dieser Abschnitt ist ein Auszug aus Endianness § Floating point
Obwohl die allgegenwärtigen x86-Prozessoren von heute Little-Endian-Speicher für alle Arten von Daten (Integer, Floating Point) verwenden, gibt es eine Reihe von Hardware-Architekturen, bei denen Gleitkommazahlen in Big-Endian-Form dargestellt werden, während ganze Zahlen in Little-Endian-Form dargestellt werden. Es gibt ARM-Prozessoren mit einer halben Little-Endian- und einer halben Big-Endian-Gleitkommadarstellung für Zahlen mit doppelter Genauigkeit: beide 32-Bit-Wörter werden in Little-Endian-ähnlichen ganzzahligen Registern gespeichert, aber das höchstwertige zuerst. Da es viele Gleitkommaformate ohne „Netzwerk“ -Standarddarstellung für sie gab, verwendet der XDR-Standard Big-Endian IEEE 754 als Darstellung. Es mag daher seltsam erscheinen, dass der weit verbreitete Gleitkomma-Standard IEEE 754 keine Endianness spezifiziert. Theoretisch bedeutet dies, dass selbst von einer Maschine geschriebene Standard-IEEE-Gleitkommadaten möglicherweise nicht von einer anderen Maschine gelesen werden können. Auf modernen Standardcomputern (z., Implementierung von IEEE 754), kann man in der Praxis sicher davon ausgehen, dass die Endianness für Gleitkommazahlen die gleiche ist wie für ganze Zahlen, was die Konvertierung unabhängig vom Datentyp unkompliziert macht. (Kleine eingebettete Systeme, die spezielle Gleitkommaformate verwenden, können jedoch eine andere Sache sein.)

Beispiele mit doppelter Genauigkeitbearbeiten

0 01111111111 00000000000000000000000000000000000000000000000000002 ≙ 3FF0 0000 0000 000016 ≙ +20 × 1 = 1

0 01111111111 00000000000000000000000000000000000000000000000000012 ≙ 3FF0 0000 0000 000116 ≙ +20 × (1 + 2-52) ≈ 1.0000000000000002, the smallest number > 1

0 01111111111 00000000000000000000000000000000000000000000000000102 ≙ 3FF0 0000 0000 000216 ≙ +20 × (1 + 2−51) ≈ 1.0000000000000004

0 10000000000 00000000000000000000000000000000000000000000000000002 ≙ 4000 0000 0000 000016 ≙ +21 × 1 = 2

1 10000000000 00000000000000000000000000000000000000000000000000002 ≙ C000 0000 0000 000016 ≙ −21 × 1 = −2

0 10000000000 10000000000000000000000000000000000000000000000000002 ≙ 4008 0000 0000 000016 ≙ +21 × 1.12 = 112 = 3

0 10000000001 00000000000000000000000000000000000000000000000000002 ≙ 4010 0000 0000 000016 ≙ +22 × 1 = 1002 = 4

0 10000000001 01000000000000000000000000000000000000000000000000002 ≙ 4014 0000 0000 000016 ≙ +22 × 1.012 = 1012 = 5

0 10000000001 10000000000000000000000000000000000000000000000000002 ≙ 4018 0000 0000 000016 ≙ +22 × 1.12 = 1102 = 6

0 10000000011 01110000000000000000000000000000000000000000000000002 ≙ 4037 0000 0000 000016 ≙ +24 × 1.01112 = 101112 = 23

0 01111111000 10000000000000000000000000000000000000000000000000002 ≙ 3F88 0000 0000 000016 ≙ +2−7 × 1.12 = 0.000000112 = 0.01171875 (3/256)

0 00000000000 00000000000000000000000000000000000000000000000000012 ≙ 0000 0000 0000 000116 ≙ +2−1022 × 2−52 = 2−1074
≈ 4.9406564584124654 × 10−324 (Min. subnormal positive double)

0 00000000000 11111111111111111111111111111111111111111111111111112 ≙ 000F FFFF FFFF FFFF16 ≙ +2−1022 × (1 − 2−52)
≈ 2.2250738585072009 × 10−308 (Max. subnormal double)

0 00000000001 00000000000000000000000000000000000000000000000000002 ≙ 0010 0000 0000 000016 ≙ +2−1022 × 1
≈ 2.2250738585072014 × 10−308 (Min. normal positive double)

0 11111111110 11111111111111111111111111111111111111111111111111112 ≙ 7FEF FFFF FFFF FFFF16 ≙ +21023 × (1 + (1 − 2−52))
≈ 1.7976931348623157 × 10308 (Max. Double)

0 00000000000 00000000000000000000000000000000000000000000000000002 ≙ 0000 0000 0000 000016 ≙ +0

1 00000000000 00000000000000000000000000000000000000000000000000002 ≙ 8000 0000 0000 000016 ≙ −0

0 11111111111 00000000000000000000000000000000000000000000000000002 ≙ 7FF0 0000 0000 000016 ≙ +∞ (positive infinity)

1 11111111111 00000000000000000000000000000000000000000000000000002 ≙ FFF0 0000 0000 000016 ≙ −∞ (negative infinity)

0 11111111111 00000000000000000000000000000000000000000000000000012 ≙ 7FF0 0000 0000 000116 ≙ NaN (sNaN on most processors, such as x86 and ARM)

0 11111111111 10000000000000000000000000000000000000000000000000012 ≙ 7FF8 0000 0000 000116 ≙ NaN (qNaN on most processors, such as x86 and ARM)

0 11111111111 11111111111111111111111111111111111111111111111111112 ≙ 7FFF FFFF FFFF FFFF16 ≙ NaN (eine alternative Kodierung von NaN)

0 01111111101 01010101010101010101010101010101010101010101010101012 = 3FD5 5555 5555 555516 ≙ +2-2 × (1 + 2-2 + 2-4 + … + 2-52) ≈ 1/3

0 10000000000 10010010000111111011010101000100010000101101000110002 = 4009 21FB 5444 2D1816 ≈ pi

Kodierungen von qNaN und sNaN sind in IEEE 754 nicht vollständig spezifiziert und hängen vom Prozessor ab. Die meisten Prozessoren, wie die Prozessoren der x86-Familie und der ARM-Familie, verwenden das höchstwertige Bit des Signifikand-Feldes, um ein ruhiges NaN anzuzeigen. Dies wird von IEEE 754 empfohlen. Die PA-RISC-Prozessoren verwenden das Bit, um eine Signalisierungs-NaN anzuzeigen.

Standardmäßig rundet 1/3 aufgrund der ungeraden Anzahl von Bits im Signifikanden nach unten statt nach oben wie eine einfache Genauigkeit.

Im Detail:

Given the hexadecimal representation 3FD5 5555 5555 555516, Sign = 0 Exponent = 3FD16 = 1021 Exponent Bias = 1023 (constant value; see above) Fraction = 5 5555 5555 555516 Value = 2(Exponent − Exponent Bias) × 1.Fraction – Note that Fraction must not be converted to decimal here = 2−2 × (15 5555 5555 555516 × 2−52) = 2−54 × 15 5555 5555 555516 = 0.333333333333333314829616256247390992939472198486328125 ≈ 1/3

Ausführungsgeschwindigkeit mit arithmeticEdit mit doppelter Genauigkeit

Die Verwendung von Gleitkommavariablen mit doppelter Genauigkeit und mathematischen Funktionen (z. B. sin, cos, atan2, log, exp und sqrt) ist langsamer als die Arbeit mit ihren Gegenstücken mit einfacher Genauigkeit. Ein Bereich der Datenverarbeitung, in dem dies ein besonderes Problem darstellt, ist paralleler Code, der auf GPUs ausgeführt wird. Wenn Sie beispielsweise die CUDA-Plattform von NVIDIA verwenden, dauern Berechnungen mit doppelter Genauigkeit je nach Hardware etwa 2 bis 32 Mal so lange wie Berechnungen mit einfacher Genauigkeit.

Genauigkeitsbeschränkungen für ganzzahlige Wertebearbeiten

  • Ganze Zahlen von -253 bis 253 (-9007199254740992 bis 9007199254740992) können genau dargestellt werden
  • Ganze Zahlen zwischen 253 und 254 = 18014398509481984 runden auf ein Vielfaches von 2 (gerade Zahl)
  • Ganze Zahlen zwischen 254 und 255 = 36028797018963968 runden auf ein Vielfaches von 4

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.