Frage

Ich weiß, ein wenig darüber, wie Gleitkommazahlen dargestellt werden, aber nicht genug, ich habe Angst.

Die allgemeine Frage lautet:

  

Für eine gegebene Genauigkeit (für meine Zwecke, die Zahl der genauen Dezimalstellen in der Basis 10), welcher Zahlenbereich kann für 16- dargestellt werden, 32- und 64-Bit-IEEE-754-Systeme?

Insbesondere bin ich nur daran interessiert, im Bereich von 16-Bit- und 32-Bit-Zahlen genau zu +/- 0,5 (an der Einerstelle) oder +/- 0,0005 (die tausendsten Stelle).

War es hilfreich?

Lösung

Für einen gegebenen IEEE-754 Gleitkommazahl X wenn

2^E <= abs(X) < 2^(E+1)

dann der Abstand von X auf die nächste größte darstellbare Gleitkommazahl ( epsilon ) ist:

epsilon = 2^(E-52)    % For a 64-bit float (double precision)
epsilon = 2^(E-23)    % For a 32-bit float (single precision)
epsilon = 2^(E-10)    % For a 16-bit float (half precision)

Die obigen Gleichungen können wir die folgenden berechnen:

  • Für Halb Präzision ...

    Wenn Sie eine Genauigkeit von +/- 0,5 (oder 2 ^ -1) wollen, ist die maximale Größe, die die Zahl sein kann, ist 2 ^ 10. Alle größer als diese und der Abstand zwischen Gleitkommazahlen größer als 0,5 ist.

    Wenn Sie eine Genauigkeit von +/- 0,0005 (etwa 2 ^ -11) wollen, ist die maximale Größe, dass die Zahl sein kann, 1. ist Jede größer als diese und der Abstand zwischen Gleitkommazahlen größer als 0,0005.

  • Für single precision ...

    Wenn Sie eine Genauigkeit von +/- 0,5 (oder 2 ^ -1) wollen, ist die maximale Größe, die die Zahl sein kann, ist 2 ^ 23. Alle größer als diese und der Abstand zwischen Gleitkommazahlen größer als 0,5 ist.

    Wenn Sie eine Genauigkeit von +/- 0,0005 (etwa 2 ^ -11) wollen, ist die maximale Größe, die die Zahl sein kann, ist 2 ^ 13. Alle größer als diese und der Abstand zwischen Gleitkommazahlen größer als 0,0005.

  • Für double precision ...

    Wenn Sie eine Genauigkeit von +/- 0,5 (oder 2 ^ -1) wollen, ist die maximale Größe, die die Zahl sein kann, ist 2 ^ 52. Alle größer als diese und der Abstand zwischen Gleitkommazahlen größer als 0,5 ist.

    Wenn Sie eine Genauigkeit von +/- 0,0005 (etwa 2 ^ -11) wollen, ist die maximale Größe, die die Zahl sein kann, ist 2 ^ 42. Alle größer als diese und der Abstand zwischen Gleitkommazahlen größer als 0,0005.

Andere Tipps

Für Gleitkomma-Zahlen (Ich werde meine Antwort in Bezug auf IEEE doppelter Genauigkeit geben), jede Zahl zwischen 1 und 2 ^ 53 ist exakt darstellbar. Jenseits von 2 ^ 53, ganzen Zahlen, die genau darstellbar sind voneinander beabstandet durch Zweierpotenzen erhöht. Zum Beispiel:

  • Jede zweite ganze Zahl zwischen 2 ^ 53 + 2 und 2 ^ 54 können genau dargestellt werden.
  • Jede vierte ganze Zahl zwischen 2 ^ 54 + 4 und 2 ^ 55 genau dargestellt werden.
  • 8. Jede ganze Zahl zwischen 2 ^ 55 + 8 und 2 ^ 56 können exakt dargestellt werden.
  • Jede 16. ganze Zahl zwischen 2 ^ 56 + 16 und 2 ^ 57 genau dargestellt werden.
  • Jede 32. ganze Zahl zwischen 2 ^ 57 + 32 und 2 ^ 58 genau dargestellt werden.
  • Jede 64th ganze Zahl zwischen 2 ^ 58 + 64 und 2 ^ 59 kann genau dargestellt werden.
  • 128. Jede ganze Zahl zwischen 2 ^ 59 + 128 und 2 ^ 60 genau dargestellt werden.
  • Jede 256. ganze Zahl zwischen 2 ^ 60 + 256 und 2 ^ 61 kann genau dargestellt werden.
  • 512. Jede ganze Zahl zwischen 2 ^ 61 + 512 und 2 ^ 62 kann genau dargestellt werden. . . .

Ganzzahlen, die nicht gerade sind darstellbare werden auf die nächste ganze Zahl gerundet darstellbare, so dass die Worst-Case-Rundung ist 1/2 der Abstand zwischen den darstellbaren ganze Zahlen sind.

Die Präzision Form Peter R Link zu dem MSDN ref zitiert ist wahrscheinlich eine gute Faustregel, aber natürlich Realität ist komplizierter.

Die Tatsache, dass der „Punkt“ in „Floating Point“ ist ein binär Punkt und nicht Dezimalpunkt hat einen Weg, um unsere Intuitionen zu besiegen. Das klassische Beispiel ist 0,1, die eine Genauigkeit von nur eine Ziffer in Dezimalzahl muss aber nicht genau darstellbar überhaupt in binär.

Wenn Sie ein Wochenende zu töten, haben einen Blick auf Was jeder Informatiker wissen sollten über Gleitkommaarithmetik . Sie werden wahrscheinlich besonders interessiert in den Abschnitten über Precision und Binary zu Dezimal-Konvertierung .

Zunächst einmal, weder IEEE-754-2008 noch -1985 haben 16-Bit schwimmt; aber es ist ein vorgeschlagene Zusatz mit einem 5-Bit-Exponenten und 10-Bit-Bruchteil. IEE-754 verwendet einen dedizierten Vorzeichenbit, so dass die positiven und negativen Bereich ist die gleiche. Auch die Fraktion hat eine implizites 1 vor, so dass Sie ein zusätzliches Bit zu bekommen.

Wenn Sie die Genauigkeit auf die Einerstelle wollen, wie es in Sie jede ganze Zahl darstellen kann, die Antwort ist recht einfach: Der Exponent der Dezimalpunkt verschiebt sich auf der rechten Ende der Fraktion. Also, eine 10-Bit-Fraktion bekommt man ± 2 11 .

Wenn Sie ein Bit nach dem Komma wollen, geben Sie ein wenig, bevor es nach oben, so dass Sie ± 2 10 .

einfache Genauigkeit hat eine 23-Bit-Fraktion, so würde man 2 hat ± 24 ganze Zahlen sind.

Wie viele Bits der Präzision Sie müssen nach dem Komma ganz auf die Berechnungen ab, die Sie tun, und wie viele Sie tun.

  • 2 10 = 1.024
  • 2 11 = 2.048
  • 2 23 = 8388608
  • 2 24 = 16777216
  • 2 53 = 9,007,199,254,740,992 (mit doppelter Genauigkeit)
  • 2 113 = 10,384,593,717,069,655,257,060,992,658,440,192 (Quad-precision)

Siehe auch

Siehe IEEE 754-1985 :

v = (-1) ^ Zeichen * s ^ (Exponent-exponent_bias) * (1 + Fraktion)

Hinweis (1 + Fraktion). Wie @bendin weisen darauf hin, binäre Gleitkomma verwenden, können Sie nicht einfach Dezimalzahl ausdrücken Werte wie 0,1. Die Implikation ist, dass Sie, indem Sie einfache Additionen viele, viele Male oder rufen Dinge wie Verkürzungsrundungsfehler einführen können. Wenn Sie in jeder Art von Präzision überhaupt interessiert sind, der einzige Weg zu erreichen, es zu benutzen ist ein fester Punkt dezimal, das ist im Grunde eine skalierte ganze Zahl ist.

Wenn ich Ihre Frage richtig verstanden hat, hängt es von Ihrer Sprache.
Für C # Besuche der MSDN-ref . Schwimmer hat eine 7-stellige Präzision und Doppel 15-16 stellige Präzision.

Es dauerte eine ganze Weile, um das herauszufinden, wenn verdoppelt in Java verwenden, ich war nicht signifikant Genauigkeit bei Berechnungen zu verlieren. Floating-Point hat tatsächlich eine sehr gute Fähigkeit, Zahlen zu recht vernünftig Genauigkeit darzustellen. Die Präzision ich zu verlieren war, war sofort nach Umwandlung dezimal Zahlen eingegeben werden von den Benutzern auf die binäre Gleitkommadarstellung, die nativ unterstützt wird. Ich habe vor kurzem begonnen Umwandlung all meine Zahlen zu BigDecimal. BigDecimal ist viel mehr Arbeit als mit Schwimmern oder Doppel im Code zu tun, da sie nicht zu den primitiven Typen sind. Aber auf der anderen Seite, ich werde in der Lage sein, genau die Zahlen darstellen, die Benutzer eingeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top