Was ist der Unterschied zwischen einer Gleitkommaoperation mit einfacher und doppelter Genauigkeit?

168

Was ist der Unterschied zwischen einer Gleitkommaoperation mit einfacher Genauigkeit und einer Gleitkommaoperation mit doppelter Genauigkeit?

Ich interessiere mich besonders für praktische Begriffe in Bezug auf Videospielkonsolen. Verfügt der Nintendo 64 beispielsweise über einen 64-Bit-Prozessor, und wenn dies der Fall ist, bedeutet dies, dass er Gleitkommaoperationen mit doppelter Genauigkeit ausführen kann? Können PS3 und Xbox 360 Gleitkommaoperationen mit doppelter Genauigkeit oder nur mit einfacher Genauigkeit ausführen, und im Allgemeinen werden die Funktionen mit doppelter Genauigkeit verwendet (sofern vorhanden?).

tweetypi
quelle
17
Die Tatsache, dass die CPU 64-Bit ist, bedeutet normalerweise, dass die CPU 64-Bit- Allzweckregister (dh eine Ganzzahl) und eine Speicheradressgröße hat . Aber es sagt nichts über Gleitkomma-Mathematik aus. Intel IA-32-CPUs sind beispielsweise 32-Bit-CPUs, unterstützen jedoch nativ Floats mit doppelter Genauigkeit.
Roman Zavalov

Antworten:

215

Hinweis: Der Nintendo 64 verfügt jedoch über einen 64-Bit-Prozessor:

Viele Spiele nutzten den 32-Bit-Verarbeitungsmodus des Chips, da die bei 64-Bit-Datentypen verfügbare höhere Datengenauigkeit für 3D-Spiele normalerweise nicht erforderlich ist und die Verarbeitung von 64-Bit-Daten doppelt so viel RAM und Cache benötigt und Bandbreite, wodurch die Gesamtsystemleistung verringert wird.

Aus der Webopedia :

Der Begriff doppelte Genauigkeit ist eine Art Fehlbezeichnung, da die Genauigkeit nicht wirklich doppelt ist.
Das Wort double leitet sich aus der Tatsache ab, dass eine Zahl mit doppelter Genauigkeit doppelt so viele Bits verwendet wie eine reguläre Gleitkommazahl.
Wenn für eine Zahl mit einfacher Genauigkeit beispielsweise 32 Bit erforderlich sind, ist ihr Gegenstück mit doppelter Genauigkeit 64 Bit lang.

Die zusätzlichen Bits erhöhen nicht nur die Genauigkeit, sondern auch den Bereich der Größen, die dargestellt werden können.
Der genaue Betrag, um den die Genauigkeit und der Größenbereich erhöht werden, hängt davon ab, welches Format das Programm zur Darstellung von Gleitkommawerten verwendet.
Die meisten Computer verwenden ein Standardformat, das als IEEE-Gleitkommaformat bezeichnet wird.

Das IEEE-Format mit doppelter Genauigkeit hat tatsächlich mehr als doppelt so viele Genauigkeitsbits wie das Format mit einfacher Genauigkeit sowie einen viel größeren Bereich.

Aus dem IEEE-Standard für Gleitkomma-Arithmetik

Mit einfacher Genauigkeit

Die IEEE-Gleitkomma-Standarddarstellung mit einfacher Genauigkeit erfordert ein 32-Bit-Wort, das von links nach rechts als von 0 bis 31 nummeriert dargestellt werden kann.

  • Das erste Bit ist das Vorzeichenbit S,
  • Die nächsten acht Bits sind die Exponentenbits 'E' und
  • Die letzten 23 Bits sind der Bruch 'F':

    S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
    0 1      8 9                    31
    

Der durch das Wort dargestellte Wert V kann wie folgt bestimmt werden:

  • Wenn E = 255 und F ungleich Null ist, dann ist V = NaN ("Keine Zahl")
  • Wenn E = 255 und F Null ist und S 1 ist, dann ist V = -Infinity
  • Wenn E = 255 und F Null ist und S 0 ist, dann ist V = Unendlichkeit
  • Wenn 0<E<255dann, V=(-1)**S * 2 ** (E-127) * (1.F)wo "1.F" die Binärzahl darstellen soll, die durch Präfixieren von F mit einer impliziten führenden 1 und einem Binärpunkt erzeugt wird.
  • Wenn E = 0 und F ungleich Null ist, dann V=(-1)**S * 2 ** (-126) * (0.F). Dies sind "nicht normalisierte" Werte.
  • Wenn E = 0 und F Null ist und S 1 ist, dann ist V = -0
  • Wenn E = 0 und F Null ist und S 0 ist, dann ist V = 0

Bestimmtes,

0 00000000 00000000000000000000000 = 0
1 00000000 00000000000000000000000 = -0

0 11111111 00000000000000000000000 = Infinity
1 11111111 00000000000000000000000 = -Infinity

0 11111111 00000100000000000000000 = NaN
1 11111111 00100010001001010101010 = NaN

0 10000000 00000000000000000000000 = +1 * 2**(128-127) * 1.0 = 2
0 10000001 10100000000000000000000 = +1 * 2**(129-127) * 1.101 = 6.5
1 10000001 10100000000000000000000 = -1 * 2**(129-127) * 1.101 = -6.5

0 00000001 00000000000000000000000 = +1 * 2**(1-127) * 1.0 = 2**(-126)
0 00000000 10000000000000000000000 = +1 * 2**(-126) * 0.1 = 2**(-127) 
0 00000000 00000000000000000000001 = +1 * 2**(-126) * 
                                     0.00000000000000000000001 = 
                                     2**(-149)  (Smallest positive value)

Doppelte Genauigkeit

Die IEEE-Gleitkomma-Standarddarstellung mit doppelter Genauigkeit erfordert ein 64-Bit-Wort, das von links nach rechts als von 0 bis 63 nummeriert dargestellt werden kann.

  • Das erste Bit ist das Vorzeichenbit S,
  • Die nächsten elf Bits sind die Exponentenbits 'E' und
  • Die letzten 52 Bits sind der Bruch 'F':

    S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    0 1        11 12                                                63
    

Der durch das Wort dargestellte Wert V kann wie folgt bestimmt werden:

  • Wenn E = 2047 und F ungleich Null ist, dann ist V = NaN ("keine Zahl")
  • Wenn E = 2047 und F Null ist und S 1 ist, dann ist V = -Infinity
  • Wenn E = 2047 und F Null ist und S 0 ist, dann ist V = Unendlichkeit
  • Wenn 0<E<2047dann, V=(-1)**S * 2 ** (E-1023) * (1.F)wo "1.F" die Binärzahl darstellen soll, die durch Präfixieren von F mit einer impliziten führenden 1 und einem Binärpunkt erzeugt wird.
  • Wenn E = 0 und F ungleich Null ist, V=(-1)**S * 2 ** (-1022) * (0.F)sind dies "nicht normalisierte" Werte.
  • Wenn E = 0 und F Null ist und S 1 ist, dann ist V = -0
  • Wenn E = 0 und F Null ist und S 0 ist, dann ist V = 0

Referenz:
ANSI / IEEE-Standard 754-1985,
Standard für binäre Gleitkomma-Arithmetik.

VonC
quelle
9
Ich weiß, dass dies aus Ihrer Quelle stammt, aber ich mag den Satz nicht: "Der Begriff doppelte Genauigkeit ist eine Art Fehlbezeichnung, weil die Genauigkeit nicht wirklich doppelt ist." Einfache und doppelte Genauigkeit werden heutzutage von IEEE ziemlich universell definiert, und wie Sie hervorheben, hat die einfache Genauigkeit 23 Bits im Bruch und die doppelte 52 Bits - das ist im Grunde die doppelte Genauigkeit ...
Carl Walsh
5
@ZeroDivide ' **' ist Exponentiation
VonC
11
@CarlWalsh 52/23! = 2 ergo ist es nicht "doppelte Präzision"
rfoo
@ Johnson Sie haben weitere Details zu nicht normalisierten Werten in easy68k.com/paulrsm/6502/WOZFPPAK.TXT und auch in stackoverflow.com/a/28801033/6309
VonC
2
@rfoo Wenn Sie pedantisch sicher sein wollen, ist es nicht genau doppelt, aber 52/2> 23, also ja, es ist doppelt so präzise, ​​es ist nur doppelt und dann noch etwas mehr.
JShorthouse
41

Ich habe viele Antworten gelesen, aber keine scheint richtig zu erklären, woher das Wort double kommt. Ich erinnere mich an eine sehr gute Erklärung eines Universitätsprofessors, den ich vor einigen Jahren hatte.

Unter Hinweis auf den Stil der Antwort von VonC verwendet eine Gleitkommadarstellung mit einfacher Genauigkeit ein Wort von 32 Bit.

  • 1 Bit für das Zeichen , S.
  • 8 Bits für den Exponenten 'E'
  • 24 Bits für den Bruch , auch Mantisse oder Koeffizient genannt (obwohl nur 23 dargestellt sind). Nennen wir es 'M' (für Mantisse bevorzuge ich diesen Namen, da "Bruch" missverstanden werden kann).

Darstellung:

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0

(Nur um darauf hinzuweisen, das Vorzeichenbit ist das letzte, nicht das erste.)

Eine Gleitkommadarstellung mit doppelter Genauigkeit verwendet ein 64-Bit-Wort.

  • 1 Bit für das Zeichen , S.
  • 11 Bits für den Exponenten 'E'
  • 53 Bits für den Bruch / die Mantisse / den Koeffizienten (obwohl nur 52 dargestellt sind), 'M'

Darstellung:

           S  EEEEEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits:     63 62         52 51                                                  0

Wie Sie vielleicht bemerken, habe ich geschrieben, dass die Mantisse in beiden Typen ein bisschen mehr Informationen enthält als ihre Darstellung. Tatsächlich ist die Mantisse eine Zahl, die ohne all ihre nicht signifikanten Zahlen dargestellt wird 0. Beispielsweise,

  • 0,000124 wird 0,124 × 10 –3
  • 237,141 wird 0,237141 × 10 3

Dies bedeutet, dass die Mantisse immer in der Form sein wird

0.α 1 α 2 ... α t × β p

wobei β die Repräsentationsbasis ist. Da der Bruch jedoch eine Binärzahl ist, ist α 1 immer gleich 1, so dass der Bruch als 1 umgeschrieben werden kann. Α 2 α 3 ... α t + 1 × 2 p und die anfängliche 1 implizit angenommen werden kann, Platz für ein zusätzliches Bit schaffen (α t + 1 ).

Nun ist es offensichtlich wahr, dass das Doppel von 32 64 ist, aber daher kommt das Wort nicht.

Die Genauigkeit gibt die Anzahl der korrekten Dezimalstellen an , dh ohne Darstellungsfehler oder Annäherungen. Mit anderen Worten, es gibt an, wie viele Dezimalstellen sicher verwendet werden können.

Trotzdem ist es einfach, die Anzahl der Dezimalstellen zu schätzen, die sicher verwendet werden können:

  • einfache Genauigkeit : log 10 (2 24 ), was ungefähr 7 ~ 8 Dezimalstellen entspricht
  • doppelte Genauigkeit : log 10 (2 53 ), was ungefähr 15 ~ 16 Dezimalstellen entspricht
Alessandro
quelle
19

Okay, der grundlegende Unterschied an der Maschine besteht darin, dass bei doppelter Genauigkeit doppelt so viele Bits wie bei einzelnen verwendet werden. In der üblichen Implementierung sind das 32 Bit für Single, 64 Bit für Double.

Aber was bedeutet das ? ? Wenn wir den IEEE-Standard annehmen, hat eine einzelne Genauigkeitszahl ungefähr 23 Bits der Mantisse und einen maximalen Exponenten von ungefähr 38; Eine doppelte Genauigkeit hat 52 Bits für die Mantisse und einen maximalen Exponenten von etwa 308.

Die Details finden Sie wie gewohnt bei Wikipedia .

Charlie Martin
quelle
11

Um all die wunderbaren Antworten hier hinzuzufügen

Zunächst werden float und double zur Darstellung von Zahlenbruchzahlen verwendet. Der Unterschied zwischen den beiden ergibt sich aus der Tatsache, mit welcher Genauigkeit sie die Zahlen speichern können.

Zum Beispiel: Ich muss 123.456789 speichern. Einer kann möglicherweise nur 123.4567 speichern, während der andere möglicherweise den genauen 123.456789 speichern kann.

Im Grunde wollen wir wissen, wie genau die Zahl gespeichert werden kann und was wir Präzision nennen.

@Alessandro hier zitieren

Die Genauigkeit gibt die Anzahl der korrekten Dezimalstellen an , dh ohne Darstellungsfehler oder Annäherungen. Mit anderen Worten, es gibt an, wie viele Dezimalstellen sicher verwendet werden können.

Float kann ungefähr 7-8 Stellen im Bruchteil genau speichern, während Double ungefähr 15-16 Stellen im Bruchteil genau speichern kann

Float kann also die doppelte Menge an Bruchteilen speichern . Deshalb wird Double als Double the Float bezeichnet

Einfacher Kerl
quelle
7

Zur Frage "Können ps3 und xbxo 360 Gleitkommaoperationen mit doppelter Genauigkeit oder nur mit einfacher Genauigkeit ausführen und werden im Allgemeinen die Funktionen mit doppelter Genauigkeit verwendet (sofern vorhanden?)."

Ich glaube, dass beide Plattformen nicht in der Lage sind, doppelte Gleitkommazahlen zu verwenden. Der ursprüngliche Cell-Prozessor hatte nur 32-Bit-Floats, genau wie die ATI-Hardware, auf der die XBox 360 basiert (R600). Die Zelle erhielt später doppelte Gleitkomma-Unterstützung, aber ich bin mir ziemlich sicher, dass die PS3 diesen Chippery nicht verwendet.

Codekaizen
quelle
5

Grundsätzlich behandelt Gleitkomma-Arithmetik mit einfacher Genauigkeit 32-Bit-Gleitkommazahlen, während doppelte Genauigkeit 64-Bit behandelt.

Die Anzahl der Bits mit doppelter Genauigkeit erhöht den Maximalwert, der gespeichert werden kann, sowie die Genauigkeit (dh die Anzahl der signifikanten Stellen).

Cletus
quelle
5

Alle haben sehr ausführlich erklärt und nichts, was ich weiter hinzufügen könnte. Obwohl ich es gerne in Laienbegriffen oder einfach in Englisch erklären würde

1.9 is less precise than 1.99
1.99 is less precise than 1.999
1.999 is less precise than 1.9999

..... .....

Eine Variable, die "1.9" speichern oder darstellen kann, bietet eine geringere Genauigkeit als die Variable, die 1.9999 halten oder darstellen kann. Dieser Bruch kann bei großen Berechnungen einen großen Unterschied bedeuten.

Asad
quelle
2

Doppelte Genauigkeit bedeutet, dass das Speichern der Zahlen die doppelte Wortlänge benötigt. Auf einem 32-Bit-Prozessor sind die Wörter alle 32 Bit, also sind Doppel 64 Bit. Für die Leistung bedeutet dies, dass die Ausführung von Operationen mit Zahlen mit doppelter Genauigkeit etwas länger dauert. Sie erhalten also eine bessere Reichweite, aber die Leistung ist geringfügig beeinträchtigt. Dieser Treffer wird durch Hardware-Gleitkommaeinheiten ein wenig gemildert, ist aber immer noch vorhanden.

Der N64 verwendete einen MIPS R4300i-basierten NEC VR4300, der ein 64-Bit-Prozessor ist, aber der Prozessor kommuniziert mit dem Rest des Systems über einen 32-Bit breiten Bus. Daher verwendeten die meisten Entwickler 32-Bit-Zahlen, weil sie schneller sind, und die meisten Spiele benötigten zu diesem Zeitpunkt keine zusätzliche Präzision (daher verwendeten sie Floats, nicht Doubles).

Alle drei Systeme können Floating-Operationen mit einfacher und doppelter Genauigkeit ausführen, dies ist jedoch möglicherweise nicht auf die Leistung zurückzuführen. (obwohl so ziemlich alles nach dem n64 einen 32 bit bus benutzte also ...)

Alex
quelle
1

Zunächst werden float und double zur Darstellung von Zahlenbruchzahlen verwendet. Der Unterschied zwischen den beiden ergibt sich aus der Tatsache, mit welcher Genauigkeit sie die Zahlen speichern können.

Zum Beispiel: Ich muss 123.456789 speichern. Einer kann möglicherweise nur 123.4567 speichern, während der andere möglicherweise den genauen 123.456789 speichern kann.

Im Grunde wollen wir wissen, wie genau die Zahl gespeichert werden kann und was wir Präzision nennen.

@Alessandro hier zitieren

Die Genauigkeit gibt die Anzahl der korrekten Dezimalstellen an, dh ohne Darstellungsfehler oder Annäherungen. Mit anderen Worten, es gibt an, wie viele Dezimalstellen sicher verwendet werden können.

Float kann ungefähr 7-8 Stellen im Bruchteil genau speichern, während Double ungefähr 15-16 Stellen im Bruchteil genau speichern kann

Double kann also doppelt so viel Bruchteil wie Float speichern. Deshalb wird Double als Double the Float bezeichnet

djb7861
quelle
0

Gemäß IEEE754 • Standard für Gleitkommaspeicherung • 32- und 64-Bit-Standards (einfache und doppelte Genauigkeit) • 8- bzw. 11-Bit-Exponent • Erweiterte Formate (sowohl Mantisse als auch Exponent) für Zwischenergebnisse

Abdullah Al Mamun
quelle
-3

Die Zahl mit einfacher Genauigkeit verwendet 32 ​​Bit, wobei das MSB ein Vorzeichenbit ist, während die Zahl mit doppelter Genauigkeit 64 Bit verwendet, wobei das MSB ein Vorzeichenbit ist

Mit einfacher Genauigkeit

SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Doppelte Genauigkeit:

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Steve Bennett
quelle