¿Por qué Double.MIN_VALUE no es negativo?

¿Alguien puede arrojar algo de luz sobre por qué Double.MIN_VALUE no es realmente el valor mínimo que Dobles puede 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 cuando se compara con Integer.MIN_VALUE . Llamarlo Double.SMALLEST_POSITIVE o MIN_INCREMENT o similar tendría una semántica más clara.

Además, ¿cuál es el valor mínimo que Dobles puede tomar? ¿Es -Double.MAX_VALUE ? Los documentos no parecen decir.

El formato IEEE 754 tiene un bit reservado para el signo y los bits restantes representan la magnitud. Esto significa que es “simétrica” ​​alrededor de origo (a diferencia de 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, entonces , -Double.MAX_VALUE es el número real más pequeño posible que puede representar con un double .

Supongo que Double.MAX_VALUE debe ver como la magnitud máxima , 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 de Integer.MIN_VALUE , también me sorprendí un poco cuando leí que Double.MIN_VALUE era el valor absoluto más pequeño que podía representarse. Quizás pensaron que era superfluo tener una constante que representara el menor valor posible, ya que está simplemente a - lejos de MAX_VALUE 🙂

(Tenga en cuenta que también existe Double.NEGATIVE_INFINITY pero Double.NEGATIVE_INFINITY esto, ya que se lo debe considerar como un “caso especial” y de hecho no representa ningún número real).

Aquí hay un buen texto sobre el tema.

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 tiene un valor mínimo antes de que se produzca un enrase a cero. Del mismo modo MAX_VALUE puede ser entendido como el valor más grande que Mantissa puede asumir cuando el Exponente está en su valor máximo antes de que ocurra un enrasamiento hasta el infinito.

Un nombre más descriptivo para estos dos podría ser el Absoluto Mayor (agregue un valor distinto de cero para la verbosidad) y el valor Absoluto más pequeño (agregue el no infinito para la verbosidad).

Consulte el estándar IEEE 754 (1985) para más detalles. Hay una versión revisada (2008), pero que solo presenta 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).

Porque con los números de coma flotante, la precisión es lo importante ya que no hay un rango exacto .

 /** * A constant holding the smallest positive nonzero value of type * double, 2-1074. It is equal to the * hexadecimal floating-point literal * 0x0.0000000000001P-1022 and also equal to * Double.longBitsToDouble(0x1L). */ 

Pero estoy de acuerdo en que probablemente debería haber sido nombrado algo mejor 🙂

Supongo que los nombres confusos pueden remontarse 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 flotante más pequeño en C.

El valor mínimo para un doble es Double.NEGATIVE_INFINITY por eso Double.MIN_VALUE no es realmente el mínimo para un Double .

Como el doble son números flotantes, solo puede tener el número más grande (con una precisión menor) o el número más cercano a 0 (con una gran precisión).

Si realmente quiere un valor mínimo para un doble que no es infinito, puede usar -Double.MAX_VALUE .

Como dice en los documentos ,

Double.MIN_VALUE es una constante que contiene el valor POSITIVO menos pequeño cero del tipo double, 2 ^ (- 1074).

El truco aquí es que estamos hablando de una representación numérica en coma flotante. El tipo de datos doble es un punto flotante IEEE 754 de 64 bits de doble precisión. Los puntos flotantes representan números de 1,000,000,000,000 a 0.0000000000000001 con facilidad, y al mismo tiempo maximizan la precisión (el número de dígitos) en ambos extremos de la escala. (Para obtener más información, 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 base que la mantisa y el signo deberían multiplicarse. Los cuatro componentes se combinan de la siguiente manera para obtener el valor de coma flotante.

enter image description here

Piensa 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. (Podría haber usado un nombre mejor para evitar esta confusión)

123> 10> 1> 0.12> 0.012> 0.0000123> 0.000000001> 0.0000000000000001

A continuación es solo para tu información.

El punto flotante de doble precisión puede representar 2.098 potencias de dos, desde 2 ^ -1074 hasta 2 ^ 1023. Los poderes desormalizados de dos son aquellos desde 2 ^ -1074 hasta 2 ^ -1023; Los poderes normalizados de dos son los de 2 ^ -1022 a 2 ^ 1023. Referir esto y esto