2010-10-07 12 views
127

¿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.¿Por qué Double.MIN_VALUE no es 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.

+1

Gracias por las respuestas! La diferencia entre rango y precisión tiene sentido. Todavía encuentro la denominación bastante extraña e inconsistente, pero es viable. –

+1

Supongo que está escrito por los mismos genios que llamaron a un método 'writeBytes' que toma' String'. – Trejkaz

Respuesta

134

El formato IEEE 754 tiene reservado para el signo y el resto de bits que representan la magnitud de un bit. 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, por lo que , -Double.MAX_VALUE es el número real más pequeño posible que puede representar con un double.

supongo que el Double.MAX_VALUE debe ser visto como magnitud máxima, en cuyo caso lo que realmente 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. Siendo usado para el significado Integer.MIN_VALUE, yo también estaba un poco sorprendido cuando leí que Double.MIN_VALUE era el valor absoluto más pequeño que podía ser representado. Tal vez pensaron que era superfluo tener una constante que representa el valor mínimo posible, ya que es simplemente una - lejos de MAX_VALUE :-)

(Nota, también hay Double.NEGATIVE_INFINITY pero lo estoy haciendo caso omiso de esto, ya que es a ser visto como un "caso especial" y de hecho no representa ningún número real.)

Here es un buen texto sobre el tema.

+2

Gracias por esto. Estaba portando un código de análisis estadístico y traduciendo ciegamente Java a C#. Noté que algunos números salían en -infinity o NaN y eché un vistazo más de cerca al algoritmo. Me di cuenta de que double.MIN_VALUE no tenía sentido en contexto e hice una búsqueda. Esta publicación aparece antes de los documentos de Java. Realmente es un nombre confuso para lo que realmente es doble. Epsilon. No es gran cosa, tomó menos de un minuto arreglarlo, pero definitivamente fue sorprendente. –

+0

¿No se supone que el "valor absoluto más pequeño que se puede representar" se llama "épsilon"? –

+0

@Sahuagin, en realidad no se "supone" que se nombre algo en particular. Epsilon es solo una letra griega que comúnmente representa una cantidad arbitrariamente pequeña y positiva en matemáticas/física. Go eligió 'SmallestNonzeroFloat64' por ejemplo. – aioobe

1

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 de coma flotante, 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 sea infinito, puede usar -Double.MAX_VALUE.

+1

Siguiendo esa idea, ¿es el valor máximo para Double Double.MAX_VALUE o Double.POSITIVE_INFINITY? –

+0

'Double.MIN_VALUE' podría ser igual a' Double.NEGATIVE_INFINITY'. – starblue

+0

@starblue, no. @ mo-seph, 'Double.POSITIVE_INFINITY', + ∞> todo y -∞

2

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

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

pero estoy de acuerdo que probablemente debería haber sido nombrado algo mejor :)

+0

Bien, pero entonces ¿por qué tiene sentido tener Double.MAX_VALUE? Eso parece estar claramente definido. –

+0

porque es el valor preciso máximo (no infinito), sin tener en cuenta su signo. –

9

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 más grande absoluta (añadir distinto de cero para verbositiy) y más pequeño absoluta valor (no añadir infinidad de verbositiy).

Consulte la norma IEEE 754 (1985) para obtener más información. 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).

1

Supongo que los nombres confusos pueden ser traced back to C, que definió FLT_MIN como el número positivo más pequeño.

Al igual que en Java, donde usted tiene que utilizar -Double.MAX_VALUE, usted tiene que utilizar -FLT_MAX para obtener el flotador más pequeño en C.

Cuestiones relacionadas