Quais são as constantes INFINITY em Java, realmente?

Recentemente, encontrei as constantes nas classs de wrapper do tipo primitivo, como Double.POSITIVE_INFINITY e Double.NEGATIVE_INFINITY . Na API, define o primeiro como:

Uma constante mantendo o infinito positivo do tipo double. É igual ao valor retornado por Double.longBitsToDouble (0x7ff0000000000000L).

Os outros têm definições ao longo dessas mesmas linhas.

O que estou tendo problemas é entender o que essas constantes realmente são. Eles não podem realmente ser ou representar infinitos positivos / negativos, porque o sistema é por natureza finito. É apenas uma configuração arbitrária de bits que os criadores de Java considerariam definir o conceito de infinito? Ou estes realmente têm algum tipo de valor especial? Se for apenas uma cadeia arbitrária de bits interpretados como um double , existe algum número normal lá fora que, quando interpretado como um double , retornará POSITIVE_INFINITY vez de qualquer valor realmente esperado?

Perdoe-me se a resposta for óbvia, dada a parte Double.longBitsToDouble(0x7ff0000000000000L) da API. Na verdade, essa descrição é bem misteriosa para mim e não vou fingir que entendo o que os valores hexadecimais realmente significam ou representam.

O ponto flutuante Java é baseado no padrão de ponto flutuante binário IEEE 754, Floating Point Standard , cuja primeira versão foi lançada por volta de 1985, então é muito mais antigo que Java. Dada a ampla implementação de hardware do IEEE 754 no momento em que o Java estava sendo definido, os criadores do Java tinham pouca escolha.

Cada número de ponto flutuante IEEE 754 possui três componentes, um bit de sinal, um expoente e uma mantissa. Simplificando consideravelmente, a magnitude de um número normal é:

  mantissa * (2 ** exponent) 

onde “**” representa poder.

O bit principal é o bit de sinal. Em duplas, os próximos 11 bits são o expoente.

Os padrões de bits com todos os bits expoentes estão reservados para infinitos e NaNs. Todos os números normais têm pelo menos um bit zero no expoente. Os dois infinitos são representados tendo todos os bits de expoente ligados e todos os bits de mantissa zero. O bit de sinal principal distingue o infinito positivo e negativo.

A escolha de todos os bits expoente para os casos especiais não é arbitrária. É mais fácil cortar um dos extremos do que lidar com uma lacuna no meio de um intervalo de números, especialmente para implementações de hardware. Tirar o expoente de todos os bits para casos especiais teria impedido a codificação de zero com o padrão all bits off, e teria dado os maiores valores de magnitude absoluta, os infinitos, o menor expoente, o que também tornaria o hardware mais complicado. Todos os bits no expoente são definitivamente a melhor escolha para os infinitos.

Os dois infinitos são usados ​​para representar duas coisas, na verdade, resultados infinitos e resultados que são muito grandes em magnitude absoluta para representar no sistema numérico normal, números maiores que Double.MAX_VALUE ou menores que -Double.MAX_VALUE. 1,0 / 0,0 é infinito. Então é 2 * Double.MAX_VALUE.

Existem alguns algoritmos que podem ser simplificados, com menos casos especiais, permitindo que resultados intermediários sejam infinitos, em qualquer sentido. Isso também permite, por exemplo, que até uma linha paralela ao eixo y tenha um gradiente armazenável que possa ser usado em cálculos.

Elas de fato representam o infinito positivo e negativo, que são conceitos claramente definidos no padrão de ponto flutuante do IEEE . Por exemplo, dividir um número de ponto flutuante positivo por zero produz um infinito positivo. Quanto ao padrão de bits em si, é apenas um padrão que foi escolhido para representar o infinito.

Os Números de Ponto Flutuante Padrão 754 do IEEE declaram:

“Os valores + infinito e -infinito são denotados com um expoente de todos os 1s e uma fração de todos os 0s. O bit de sinal distingue entre infinito negativo e infinito positivo. Ser capaz de denotar infinito como um valor específico é útil porque permite operações continuar as situações de estouro passado. As operações com valores infinitos são bem definidas no ponto flutuante IEEE. “

Além disso: “Operações em números especiais são bem definidas pelo IEEE. No caso mais simples, qualquer operação com um NaN produz um resultado NaN. Outras operações são as seguintes:

  Operation Result n ÷ ±Infinity 0 ±Infinity × ±Infinity ±Infinity ±nonzero ÷ 0 ±Infinity Infinity + Infinity Infinity ±0 ÷ ±0 NaN Infinity - Infinity NaN ±Infinity ÷ ±Infinity NaN ±Infinity × 0 NaN 
    Intereting Posts