[1,0 ponto]
Seja
um número digitado e armazenado em precisão dupla em um computador. Qual é o valor possível para
(ou qual é a faixa de valores) tal que
, sendo essa conta realizada em um computador, também em precisão dupla?
Exiba as etapas necessárias para justificar sua resposta.
Exiba as etapas necessárias para justificar sua resposta.
Passo 1
O enunciado dá o número
armazenado em precisão dupla (IEEE 754 binary64) e pergunta quais valores
(ou faixa de valores) fazem com que, ao somar em precisão dupla, o resultado seja igual a
, isto é,
computacionalmente. Informações relevantes dadas:
-
é o valor que está em ponto flutuante double. - A operação de soma é realizada também em precision dupla (binary64).
A missão: encontrar a faixa de valores detal que a soma arredondada em double seja exatamente o mesmo bit-pattern de .
Passo 2
Vou explicar o modelo de representação e o que determina quando
é arredondado para
.
Em IEEE 754 binary64 (precisão dupla):
- O número é representado como
, com um bit escondido 1 e bits de fracção armazenados, totalizando bits de precisão (incluindo o 1 escondido). - A distância entre dois números consecutivos normalizados com o mesmo expoente
(ou seja, o tamanho do menor incremento representável nessa região) é
- A aritmética de ponto flutuante usa, tipicamente, arredondamento “round-to-nearest, ties-to-even” (arredonda para o valor representável mais próximo; se empatar exatamente, escolhe o cujo campo de mantissa menos significativa é par).
Portanto, para que
seja representado como exatamente
, o valor exato
deve estar suficientemente próximo de
para que o arredondamento produza
. Concretamente, se a diferença exata entre
e
tiver magnitude menor que metade de um ulp em torno de
, a soma arredonda para
; no caso de igualdade exata a metade do ulp, entra a regra “ties-to-even” e o resultado pode ser
ou o vizinho dependendo da paridade da mantissa de
.
Passo 3
Vou escrever
em binário e obter o expoente
adequado.
Normalizando para a forma
:
Portanto, para
temos
(expoente binário) e a mantissa normalizada tem a sequência
seguida de zeros nos bits restantes.
Passo 4
Calcular o
na vizinhança de
.
Usando a fórmula
com
e
:
Logo a metade do ulp é
Para referência decimal aproximada:
Passo 5
Explicar a condição concreta para
arredondar para
.
Se o valor exato
estiver no intervalo fechado
então, com arredondamento para o mais próximo e empates para o valor com LSB par, o resultado arredondado será
sempre que o empate (caso ocorra) favoreça
. Se o empate favorecesse o outro vizinho, o endpoint correspondente deveria ser excluído.
Portanto precisamos checar a paridade (bit menos significativo) da mantissa de
para decidir se os pontos extremos
também são incluídos.
Passo 6
Determinar a paridade da mantissa de
(para aplicar ties-to-even).
A mantissa normalizada de
é
seguida de zeros nos
bits restantes. Isso corresponde, como inteiro de
bits (incluindo o 1 escondido), ao valor
Esse inteiro
tem o bit menos significativo igual a
(é múltiplo de
), portanto a mantissa armazenada é par (LSB = 0). Isso significa que, se o valor exato
ficar exatamente no ponto médio entre
e o vizinho superior ou entre
e o vizinho inferior (caso de
), a regra ties-to-even escolherá
(porque
é o representável com mantissa par).
Passo 7
Concluir a faixa de
.
Como a metade do ulp é
e os empates de meio-ulp são arredondados para
(já que
tem mantissa par), qualquer
que satisfaça
faz com que a soma exata
seja arredondada para
em precisão dupla. Em forma decimal aproximada: