2017-05-23 4 views
-2

Warum Double in Java hat einen bestimmten Wertebereich von ±5,0*10(^-324) bis ±1,7*10(^308)? Ich meine, warum ist es nicht wie ±5,0*10(^-324) zu ±5,0*10(^308) oder ±1,7*10(^-324) zu ±1,7*10(^308)?Warum hat Double einen bestimmten Wertebereich? (Java)

+8

Weil so IEEE-754 spezifiziert ist: https://en.wikipedia.org/wiki/IEEE_f loating_point –

+1

Wenn es keinen bestimmten Bereich hätte, wäre "double" unmöglich darzustellen. (Sie können nicht unbegrenzt große Zahlen mit begrenztem Speicher darstellen.) –

+0

Sehen Sie sich meine Antwort an, es hat einige Zeit gedauert, es auszugraben :) – 11thdimension

Antwort

1

Antwort auf Ihre Frage ist subnormale Zahlen, testen Sie bitte folgenden Link

https://en.wikipedia.org/wiki/Denormal_number

Doppel Gleitkommazahlen in Java auf das Format basiert in IEEE 754 definiert.

Siehe diesen Link für die Erklärung.

https://en.wikipedia.org/wiki/Double-precision_floating-point_format

folgt einem einfachen Satz von Regeln

  1. Gleitkommazahl in 64 bits
  2. 64 Bits dargestellt wird, geteilt sind in folgenden
    1. Vorzeichenbit: 1 bit (Zeichen von die Nummer)
    2. Exponent: 11 bits (signiert)
    3. Signifikanden Präzision (Fraktion): 52 bits

double bits

Zahlenbereich, die wir von diesem Setup erhalten, ist

-1022 <= Exponent <= 1023 (total 2046) (excluding 0 and 2047, they have special meanings) 


000 (0 in base 16) is used to represent a signed zero (if F=0) and subnormals (if F≠0); and 
7ff (2047 in base 16) is used to represent ∞ (if F=0) and NaNs (if F≠0), 

https://en.wikipedia.org/wiki/Exponent_bias

und

-2^52 <= Fraction <= 2^52 

also die minimale und maximale Zahl, die dargestellt werden können, sind

Min positive double = +1 * 2^(-1022) ≈ 2.225 * 10(−308) 
Note: 1022 * Math.log(2)/Math.log(10) = 307.652 
     and Math.pow(10, 1 - .652) = 2.228 (.652 is approximation) 

Max positive double = +(2^52) * (2^1023) = 1.797 * 10^308 

So wird der Bereich [-2,225 * 10 (-308), 1,797 * 10^308]

Dieser Bereich Änderungen aufgrund subnormal numbers

Subnormal Nummer ist eine Nummer, die kleiner als die minimale Norm Nummer durch die Spezifikation definiert ist.

Wenn ich eine Nummer 0.00123 habe, würde es als 1.23 * 10^(-3) dargestellt werden. Fließkommazahlen nach Spezifikation haben keine führenden Nullen. Wenn also eine Zahl mit führenden Nullen vorhanden ist, wird der Standardwert Exponent hinzugefügt. Wenn also eine Zahl mit einem minimalen Exponenten mit führenden Nullen möglich ist, werden führende Nullen zum negativen Exponenten addiert.

Es gibt 52 Bits für die signifand (fraction), so dass die maximale Anzahl führender Nullen im Binärformat 51 sein kann. welche effektiv folgende Nummer erzeugen.

Min positive Subnormal = 1 * 2^-52 * (2^-1022) = 2^(-2074) ≈ 4.9·10^(−324) 

Note: 1074 * Math.log(2)/Math.log(10) = 323.306 
     Math.pow(10, 1 - 0.306) = 4.943 

So dort haben Sie es, Reichweite ist jetzt

[- Min subnormale Zahl, + Max normale Anzahl]

oder

[- 4,9 * 10^(-324), + 1.79769 * 10^308]