Kann jemand etwas Licht ins Dunkel bringen, warum Double.MIN_VALUE
nicht der Mindestwert ist, den Doppel annehmen können? Es ist ein positiver Wert, und ein Double kann natürlich negativ sein.
Ich verstehe, warum es eine nützliche Zahl ist, aber es scheint ein sehr unintuitiver Name zu sein, besonders im Vergleich zu Integer.MIN_VALUE
. Nennt es Double.SMALLEST_POSITIVE
oder MIN_INCREMENT
würde oder ähnliche klarere Semantik hat.
Was ist der Mindestwert, den Doubles annehmen können? Ist es -Double.MAX_VALUE
? Die Dokumente scheinen nicht zu sagen.
java
numbers
floating-point
mo-seph
quelle
quelle
writeBytes
die a nimmtString
.Antworten:
Das IEEE 754-Format hat ein Bit, das für das Vorzeichen reserviert ist, und die verbleibenden Bits, die die Größe darstellen. Dies bedeutet, dass es um origo "symmetrisch" ist (im Gegensatz zu den Integer-Werten, die einen weiteren negativen Wert haben). Somit ist der Minimalwert einfach der gleiche wie der Maximalwert, wobei das Vorzeichenbit geändert wird. Ja , dies
-Double.MAX_VALUE
ist die kleinstmögliche tatsächliche Zahl, die Sie mit a darstellen könnendouble
.Ich nehme an, das
Double.MAX_VALUE
sollte als maximale Größe angesehen werden. In diesem Fall ist es tatsächlich sinnvoll, einfach zu schreiben-Double.MAX_VALUE
. Es wird auch erklärt, warumDouble.MIN_VALUE
der Wert am wenigsten positiv ist (da dies die geringstmögliche Größe darstellt).Aber sicher stimme ich zu, dass die Benennung etwas irreführend ist. Da
Integer.MIN_VALUE
ich an die Bedeutung gewöhnt war, war auch ich etwas überrascht, als ich las, dass diesDouble.MIN_VALUE
der kleinste absolute Wert war, der dargestellt werden konnte. Vielleicht hielten sie es für überflüssig, eine Konstante zu haben, die den geringstmöglichen Wert darstellt, da sie einfach nicht zu-
erreichen istMAX_VALUE
:-)(Beachten Sie, dass es auch gibt,
Double.NEGATIVE_INFINITY
aber ich ignoriere dies, da es als "Sonderfall" anzusehen ist und tatsächlich keine tatsächliche Zahl darstellt.)Hier ist ein guter Text zu diesem Thema.
quelle
SmallestNonzeroFloat64
zum Beispiel gewählt.Diese Konstanten haben nichts mit Vorzeichen zu tun. Dies ist sinnvoller, wenn Sie ein Double als eine Zusammensetzung aus drei Teilen betrachten: Zeichen, Exponent und Mantisse. Double.MIN_VALUE ist tatsächlich der kleinste Wert, den Mantissa annehmen kann, wenn sich der Exponent auf einem minimalen Wert befindet, bevor ein Flush auf Null auftritt. Ebenso kann MAX_VALUE als der größte Wert verstanden werden, den Mantissa annehmen kann, wenn der Exponent den Maximalwert erreicht, bevor ein Flush ins Unendliche auftritt.
Ein aussagekräftigerer Name für diese beiden könnte " Größtes Absolut" (Add-Nicht-Null für Verbositiy) und Kleinster Absolut- Wert (Add Nicht-Unendlich für Verbositiy) sein.
Weitere Informationen finden Sie im IEEE 754 (1985) -Standard. Es gibt eine überarbeitete Version (2008), die jedoch nur weitere Formate einführt, die nicht einmal von Java unterstützt werden (genau genommen unterstützt Java einige obligatorische Funktionen von IEEE 754 1985 nicht, wie viele andere Hochsprachen).
quelle
Ich gehe davon aus, dass die verwirrenden Namen auf C zurückgeführt werden können , das
FLT_MIN
als kleinste positive Zahl definiert ist.Wie in Java, wo Sie verwenden müssen
-Double.MAX_VALUE
, müssen Sie verwenden-FLT_MAX
, um den kleinsten Float in C zu erhalten.quelle
Der Mindestwert für ein Double ist
Double.NEGATIVE_INFINITY
, weshalb diesDouble.MIN_VALUE
nicht wirklich der Mindestwert für ein Double istDouble
.Da es sich bei dem Doppel um Gleitkommazahlen handelt, können Sie nur die größte Zahl (mit geringerer Genauigkeit) oder die Nummer 0 (mit hoher Genauigkeit) am nächsten kommen.
Wenn Sie wirklich einen minimalen Wert für ein Double wollen, das nicht unendlich ist, können Sie verwenden
-Double.MAX_VALUE
.quelle
Double.MIN_VALUE
könnte gleich seinDouble.NEGATIVE_INFINITY
.Double.POSITIVE_INFINITY
+ ∞> alles undDouble.MIN_VALUE
wäre das gleichDouble.NEGATIVE_INFINITY
, denn dann wäre es konsistent mitMIN_VALUE
den Integer-Typen. Ich könnte jede Variable für die Berechnung eines Maximums mit initialisierenMIN_VALUE
und es wäre korrekt. Das habenDouble.MIN_VALUE
wir jetzt hätten einen besseren Namen. (Und analog fürMAX_VALUE
.)Denn bei Gleitkommazahlen ist die Genauigkeit wichtig, da es keinen genauen Bereich gibt .
Aber ich stimme zu, dass es wahrscheinlich etwas besseres hätte heißen sollen :)
quelle
Wie es in den Dokumenten heißt ,
Der Trick hier ist, dass es sich um eine Gleitkommazahlendarstellung handelt. Der doppelte Datentyp ist ein 64-Bit-IEEE 754-Gleitkomma mit doppelter Genauigkeit. Gleitkommazahlen repräsentieren mühelos Zahlen von 1.000.000.000.000 bis 0,0000000000000001 und maximieren gleichzeitig die Genauigkeit (die Anzahl der Stellen) an beiden Enden der Skala. (Weitere Informationen finden Sie hier )
Die Mantisse, immer eine positive Zahl , enthält die signifikanten Ziffern der Gleitkommazahl. Der Exponent gibt die positive oder negative Potenz des Radix an, mit der Mantisse und Vorzeichen multipliziert werden sollen. Die vier Komponenten werden wie folgt kombiniert , um den Gleitkommawert zu erhalten.
Denken Sie, dass MIN_VALUE der Mindestwert ist, den die Mantisse darstellen kann. Als Mindestwerte einer Gleitkommadarstellung gilt die Mindestgröße, die damit dargestellt werden kann. (Hätte einen besseren Namen verwenden können, um diese Verwirrung zu vermeiden)
Unten ist nur zu Ihrer Information.
Gleitkommazahlen mit doppelter Genauigkeit können 2.098 Zweierpotenzen von 2 ^ -1074 bis 2 ^ 1023 darstellen. Denormalisierte Zweierpotenzen sind die von 2 ^ -1074 bis 2 ^ -1023; normalisierte Zweierpotenzen sind die von 2 ^ -1022 bis 2 ^ 1023. Verweisen Sie dies und das .
quelle