Alguém pode esclarecer porque Double.MIN_VALUE
não é realmente o valor mínimo que o Doubles pode receber? É um valor positivo, e um Double pode, é claro, ser negativo.
Entendo por que é um número útil, mas parece um nome pouco intuitivo, especialmente quando comparado a Integer.MIN_VALUE
. Ligá-lo Double.SMALLEST_POSITIVE
ou MIN_INCREMENT
similar teria uma semântica mais clara.
Além disso, qual é o valor mínimo que o Doubles pode receber? É isso -Double.MAX_VALUE
? Os documentos não parecem dizer.
java
numbers
floating-point
mo-seph
fonte
fonte
writeBytes
que usa aString
.Respostas:
O formato IEEE 754 tem um bit reservado para o sinal e os bits restantes representando a magnitude. Isso significa que é "simétrico" ao redor do origo (em oposição aos valores Inteiros, que têm mais um valor negativo). Portanto, o valor mínimo é simplesmente o mesmo que o valor máximo, com o bit de sinal alterado, portanto , sim ,
-Double.MAX_VALUE
é o menor número real possível que você pode representar com adouble
.Suponho que isso
Double.MAX_VALUE
deva ser visto como magnitude máxima ; nesse caso, faz sentido simplesmente escrever-Double.MAX_VALUE
. Também explica por queDouble.MIN_VALUE
é o valor menos positivo (já que isso representa a menor magnitude possível).Mas claro, concordo que o nome é um pouco enganador. Ao me acostumar com o significado
Integer.MIN_VALUE
, também fiquei um pouco surpreso ao ler que esseDouble.MIN_VALUE
era o menor valor absoluto que poderia ser representado. Talvez eles achem supérfluo ter uma constante que represente o menor valor possível, pois é simplesmente uma-
distânciaMAX_VALUE
:-)(Observe, também há,
Double.NEGATIVE_INFINITY
mas estou desconsiderando isso, pois ele deve ser visto como um "caso especial" e, de fato, não representa nenhum número real.)Aqui está um bom texto sobre o assunto.
fonte
SmallestNonzeroFloat64
por exemplo.Essas constantes não têm nada a ver com sinal. Isso faz mais sentido se você considerar um duplo como um composto de três partes: Sign, Exponent e Mantissa. Double.MIN_VALUE é, na verdade, o menor valor que Mantissa pode assumir quando o expoente estiver no valor mínimo antes que ocorra uma descarga para zero. Da mesma forma, MAX_VALUE pode ser entendido como o maior valor que Mantissa pode assumir quando o expoente estiver no valor máximo antes que ocorra uma liberação para o infinito.
Um nome mais descritivo para esses dois poderia ser Maior Absoluto (adicione diferente de zero para verbosidade) e Menor Menor Absoluto Valor (adicione não-infinito para verbosidade).
Confira o padrão IEEE 754 (1985) para obter detalhes. Existe uma versão revisada (2008), mas que apenas introduz mais formatos que nem são suportados pelo java (estritamente falando, o java ainda não suporta alguns recursos obrigatórios do IEEE 754 1985, como muitos outros idiomas de alto nível).
fonte
Presumo que os nomes confusos possam ser rastreados até C , que definiu
FLT_MIN
como o menor número positivo.Como em Java, onde você tem que usar
-Double.MAX_VALUE
, você precisa usar-FLT_MAX
para obter o menor número flutuante em C.fonte
O valor mínimo para um duplo é por
Double.NEGATIVE_INFINITY
isso queDouble.MIN_VALUE
não é realmente o mínimo para aDouble
.Como os números duplos são de ponto flutuante, você pode ter apenas o maior número (com menor precisão) ou o número mais próximo a 0 (com grande precisão).
Se você realmente deseja um valor mínimo para um dobro que não é infinito, pode usar
-Double.MAX_VALUE
.fonte
Double.MIN_VALUE
poderia ser igual aDouble.NEGATIVE_INFINITY
.Double.POSITIVE_INFINITY
+ ∞> tudo e —∞ <tudo #Double.MIN_VALUE
seria igual aDouble.NEGATIVE_INFINITY
, porque seria consistente comMIN_VALUE
os tipos inteiros. Eu poderia inicializar qualquer variável para calcular o máximo comMIN_VALUE
e seria correto. ODouble.MIN_VALUE
que temos agora teria um nome melhor. (E analogamente paraMAX_VALUE
.)Porque com números de ponto flutuante, a precisão é o que é importante, pois não há alcance exato .
Mas concordo que provavelmente deveria ter sido nomeado algo melhor :)
fonte
Como diz nos documentos ,
O truque aqui é que estamos falando de uma representação de número de ponto flutuante. O tipo de dados duplo é um ponto flutuante IEEE 754 de 64 bits e precisão dupla. Os pontos flutuantes representam números de 1.000.000.000.000 a 0.0000000000000001 com facilidade e maximizando a precisão (o número de dígitos) nas duas extremidades da escala. (Para saber mais, consulte este )
A mantissa, sempre um número positivo , contém os dígitos significativos do número de ponto flutuante. O expoente indica a potência positiva ou negativa da raiz pela qual a mantissa e o sinal devem ser multiplicados. Os quatro componentes são combinados da seguinte maneira para obter o valor do ponto flutuante.
Pense que MIN_VALUE é o valor mínimo que a mantissa pode representar. Como os valores mínimos de uma representação de ponto flutuante é a magnitude mínima que pode ser representada usando isso. (Poderia ter usado um nome melhor para evitar essa confusão)
Abaixo está apenas o FYI.
O ponto flutuante de precisão dupla pode representar 2.098 potências de dois, de 2 ^ -1074 a 2 ^ 1023. Os poderes desnormalizados de dois são os de 2 ^ -1074 a 2 ^ -1023; potências normalizadas de dois são aquelas de 2 ^ -1022 a 2 ^ 1023. Consulte isto e isto .
fonte