Frage

Was ist die größte „no-floating“ Ganzzahl, die ohne Verlust Präzision in einer IEEE 754 mit doppelter Art gespeichert werden kann?

War es hilfreich?

Lösung

Die größten / größte ganze Zahl, die ohne Verlust Präzision im Doppel gespeichert werden kann, ist der gleiche wie der größtmögliche Wert eines Doppel. Das heißt, DBL_MAX oder etwa 1,8 × 10 308 (wenn Ihr Doppel ist ein IEEE-754 64-Bit-Doppelzimmer). Es ist eine ganze Zahl. Es ist genau dargestellt. Was wollen Sie?

Gehen Sie weiter, fragen Sie mich, was die größte ganze Zahl ist, so dass es und alle kleineren Zahlen in IEEE gespeichert werden 64-Bit verdoppelt, ohne Präzision zu verlieren. Ein IEEE 64-Bit verfügt über Doppel 52 Bits Mantisse, so dass ich denke, es ist 2 53 :

  • 2 53 + 1 kann nicht gespeichert werden, da die 1 am Anfang und die 1 am Ende zu viele Nullen dazwischen.
  • Alles, was weniger als 2 53 gespeichert werden kann, mit 52 Bits explizit in der Mantisse gespeichert und dann der Exponent in Effekt, den Ihnen einen anderen geben.
  • 2 53 offensichtlich gespeichert werden kann, da es sich um eine kleine Potenz von 2 ist.

Oder eine andere Art und Weise, es zu betrachten: einmal die Vorspannung den Exponenten genommen wurde, und das Vorzeichenbit als irrelevant für die Frage zu ignorieren, wird der Wert durch eine doppelte gespeichert ist eine Potenz von 2, sowie eine 52-Bit-Integer multipliziert mit 2 Exponenten - 52 . So mit 52 Exponenten können Sie alle Werte speichern von 2 52 bis zu 2 53 - 1. Dann mit Exponenten 53, die nächste Nummer, die Sie nach speichern 2 53 ist 2 53 + 1 × 2 53-52 . So Genauigkeitsverlust tritt zunächst mit 2 53 + 1.

Andere Tipps

9007199254740992 (das ist 9,007,199,254,740,992) ohne Garantien:)

Programm

#include <math.h>
#include <stdio.h>

int main(void) {
  double dbl = 0; /* I started with 9007199254000000, a little less than 2^53 */
  while (dbl + 1 != dbl) dbl++;
  printf("%.0f\n", dbl - 1);
  printf("%.0f\n", dbl);
  printf("%.0f\n", dbl + 1);
  return 0;
}

Ergebnis

9007199254740991
9007199254740992
9007199254740992

Wikipedia hat dies mit einem Link im gleichen Kontext zu sagen IEEE 754 :

  

Auf einem typischen Computersystem ein ‚double precision‘ (64-Bit) binäre Gleitkommazahl einen Koeffizienten von 53 Bit hat (von denen eine angedeutet wird), einen Exponenten von 11 Bits und ein Vorzeichenbit.

2 ^ 53 ist etwas mehr als 9 * 10 ^ 15.

die größte ganze Zahl, die im IEEE 754 double (64 Bit) ist die gleiche wie der größte Wert dargestellt werden kann, dass der Typ darstellen kann, da dieser Wert selbst ist eine ganze Zahl.

Dies ist als 0x7FEFFFFFFFFFFFFF dargestellt, die aus gemacht wird:

  • Das Vorzeichenbit 0 (positiv) statt 1 (negative)
  • Der maximale Exponent 0x7FE (2046 1023, die, nachdem die Vorspannung repräsentiert wird abgezogen), anstatt 0x7FF (2047, die ein oder NaN infinity angibt).
  • Die maximale Mantisse 0xFFFFFFFFFFFFF die 52 Bits alle 1.

im Binär-, ist der Wert, die impliziten 1 um weitere 52 diejenigen aus den Mantisse gefolgt, dann 971 Nullen (1023-1052 = 971). Vom Exponenten

Die genaue Dezimalwert ist:

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

Dies ist etwa 1,8 x 10 308 .

Sie müssen die Größe der Mantisse suchen. Eine IEEE 754 64-Bit-Gleitkomma-Zahl (die 52 Bits, plus 1 angedeutet) kann genau ganze Zahlen mit einem absoluten Wert von weniger als oder gleich 2 ^ 53 dar.

DECIMAL_DIG von <float.h> sollte zumindest eine vernünftige Annäherung an das geben. Da dies mit Dezimalstellen beschäftigt, und es ist wirklich binär gespeichert sind, können Sie wahrscheinlich speichern etwas ein kleine größer ohne Präzision zu verlieren, aber genau, wie viel ist schwer zu sagen. Ich nehme an, Sie sollten in der Lage sein, herauszufinden, von FLT_RADIX und DBL_MANT_DIG, aber ich bin nicht sicher, ob ich völlig dem Ergebnis vertrauen.

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