¿Alguien puede arrojar algo de luz sobre por qué Double.MIN_VALUE
no es realmente el valor mínimo que los Dobles pueden tomar? Es un valor positivo, y un Doble puede, por supuesto, ser negativo.
Entiendo por qué es un número útil, pero parece un nombre muy poco intuitivo, especialmente en comparación con Integer.MIN_VALUE
. Llamándolo Double.SMALLEST_POSITIVE
o MIN_INCREMENT
o semejante tendría la semántica más claras.
Además, ¿cuál es el valor mínimo que pueden tomar los Dobles? Es -Double.MAX_VALUE
? Los documentos no parecen decir.
java
numbers
floating-point
mo-seph
fuente
fuente
writeBytes
que toma aString
.Respuestas:
El formato IEEE 754 tiene un bit reservado para el signo y los bits restantes que representan la magnitud. Esto significa que es "simétrico" alrededor del origo (en oposición a los valores enteros, que tienen un valor negativo más). Por lo tanto, el valor mínimo es simplemente el mismo que el valor máximo, con el bit de signo cambiado, así que sí ,
-Double.MAX_VALUE
es el número real más pequeño posible que puede representar con adouble
.Supongo que
Double.MAX_VALUE
debería verse como la máxima magnitud , en cuyo caso en realidad tiene sentido simplemente escribir-Double.MAX_VALUE
. También explica por quéDouble.MIN_VALUE
es el valor menos positivo (ya que representa la menor magnitud posible).Pero claro, estoy de acuerdo en que nombrar es un poco engañoso. Al estar acostumbrado al significado
Integer.MIN_VALUE
, también me sorprendió un poco cuando leí que eseDouble.MIN_VALUE
era el valor absoluto más pequeño que podía representarse. Tal vez pensaron que era superfluo tener una constante que representara el menor valor posible, ya que simplemente está-
lejos deMAX_VALUE
:-)(Tenga en cuenta que también existe,
Double.NEGATIVE_INFINITY
pero no tengo en cuenta esto, ya que debe considerarse como un "caso especial" y, de hecho, no representa ningún número real).Aquí hay un buen texto sobre el tema.
fuente
SmallestNonzeroFloat64
por ejemplo.Estas constantes no tienen nada que ver con el signo. Esto tiene más sentido si considera un doble como un compuesto de tres partes: signo, exponente y mantisa. Double.MIN_VALUE es en realidad el valor más pequeño que Mantissa puede asumir cuando el exponente está en el valor mínimo antes de que ocurra un vaciado a cero. Del mismo modo, MAX_VALUE puede entenderse como el valor más grande que Mantissa puede asumir cuando el exponente está en el valor máximo antes de que ocurra una descarga al infinito.
Un nombre más descriptivo para estos dos podría ser Absoluto más grande (agregue distinto de cero para verbositiy) y Absoluto más pequeño valor (agregar no infinito para verbositiy).
Consulte el estándar IEEE 754 (1985) para más detalles. Hay una versión revisada (2008), pero que solo introduce más formatos que ni siquiera son compatibles con java (estrictamente hablando, java incluso carece de soporte para algunas características obligatorias de IEEE 754 1985, como muchos otros lenguajes de alto nivel).
fuente
Supongo que los nombres confusos se remontan a C , que definió
FLT_MIN
como el número positivo más pequeño.Al igual que en Java, donde tiene que usar
-Double.MAX_VALUE
, debe usar-FLT_MAX
para obtener el flotador más pequeño en C.fuente
El valor mínimo para un doble es
Double.NEGATIVE_INFINITY
por esoDouble.MIN_VALUE
que no es realmente el mínimo para unDouble
.Como el doble son números de coma flotante, solo puede tener el número más grande (con una precisión más baja) o el número más cercano a 0 (con una gran precisión).
Si realmente desea un valor mínimo para un doble que no sea infinito, puede usarlo
-Double.MAX_VALUE
.fuente
Double.MIN_VALUE
podría ser igual aDouble.NEGATIVE_INFINITY
.Double.POSITIVE_INFINITY
+ ∞> todo y —∞ <todoDouble.MIN_VALUE
sería igual aDouble.NEGATIVE_INFINITY
, porque entonces sería coherente conMIN_VALUE
los tipos enteros. Podría inicializar cualquier variable para calcular un máximo conMIN_VALUE
y sería correcto. ElDouble.MIN_VALUE
que tenemos ahora tendría un mejor nombre. (Y análogamente paraMAX_VALUE
.)Porque con los números de coma flotante, la precisión es lo importante, ya que no hay un rango exacto .
Pero estoy de acuerdo en que probablemente debería haber sido nombrado algo mejor :)
fuente
Como dice en los documentos ,
El truco aquí es que estamos hablando de una representación de número de coma flotante. El tipo de datos doble es un punto flotante IEEE 754 de doble precisión de 64 bits. Los puntos flotantes representan números de 1,000,000,000,000 a 0.0000000000000001 con facilidad y maximizan la precisión (el número de dígitos) en ambos extremos de la escala. (Para más consulte esto )
La mantisa, siempre un número positivo , contiene los dígitos significativos del número de coma flotante. El exponente indica la potencia positiva o negativa de la raíz por la cual la mantisa y el signo deben multiplicarse. Los cuatro componentes se combinan de la siguiente manera para obtener el valor de coma flotante.
Piense que MIN_VALUE es el valor mínimo que la mantisa puede representar. Como los valores mínimos de una representación en coma flotante es la magnitud mínima que se puede representar con eso. (Sin embargo, podría haber usado un nombre mejor para evitar esta confusión)
A continuación se muestra solo para su información.
La coma flotante de doble precisión puede representar 2.098 potencias de dos, desde 2 ^ -1074 hasta 2 ^ 1023. Los poderes desnormalizados de dos son aquellos desde 2 ^ -1074 hasta 2 ^ -1023; las potencias normalizadas de dos son aquellas desde 2 ^ -1022 hasta 2 ^ 1023. Consulte esto y esto .
fuente