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)
Antwort
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
- Gleitkommazahl in
64 bits
- 64 Bits dargestellt wird, geteilt sind in folgenden
- Vorzeichenbit:
1 bit
(Zeichen von die Nummer) - Exponent:
11 bits
(signiert) - Signifikanden Präzision (Fraktion):
52 bits
- Vorzeichenbit:
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]
- 1. Warum hat Java einen IINC-Bytecode-Befehl?
- 2. Hat Java einen exponentiellen Operator?
- 3. Warum gibt int = int * double einen Fehler und int * = double nicht (in Java)?
- 4. Warum hat Java neue?
- 5. Java Double Comparison
- 6. Warum hat junit4 Assert.assertArrayEquals() für double [] s nicht?
- 7. Code zum Durchlaufen von Spalten für bestimmten Wertebereich
- 8. long double vs double
- 9. Double vs Float - Java
- 10. java instant double to int
- 11. Warum hat dieser Java-Lambda-Ausdrucksparameter einen Fehler?
- 12. Wie kann ich prüfen, ob ein Double einen Bruchteil hat?
- 13. Emoji Wertebereich
- 14. Warum hat Docker einen Daemon?
- 15. Wie prüfe ich in Java, ob eine Liste von `Double` einen bestimmten Wert enthält
- 16. Warum ist Casting Double to Char in Java erlaubt?
- 17. Double to BigDecimal Java
- 18. Update (double, double) Zugang im Task geschützt hat
- 19. Java Singleton mit Double Check
- 20. Java: Warum hat ein Konstruktor Zugriffsmodifizierer?
- 21. Java: Hat die Objektklasse einen Konstruktor?
- 22. Wie werden Werte in einem numpligen Array in Klassen organisiert, die einen bestimmten Wertebereich enthalten?
- 23. Java generischer Rückgabewert: Double Casting
- 24. Warum hat Java kein Bytetyp-Suffix?
- 25. Float vs double Math Java
- 26. float vs double (in Java)
- 27. Java Assert Double ist NaN
- 28. Hat Dart einen Scheduler?
- 29. SQL-Einfügung für Wertebereich
- 30. Matrixmultiplikation Ergebnis Wertebereich
Weil so IEEE-754 spezifiziert ist: https://en.wikipedia.org/wiki/IEEE_f loating_point –
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.) –
Sehen Sie sich meine Antwort an, es hat einige Zeit gedauert, es auszugraben :) – 11thdimension