Uma outra forma de explicar ponto flutuante…

Já expliquei de várias formas aqui, ai vai mais uma: “Ponto flutuante é uma maneira de lidar com frações racionais”. Para entender isso, voltemos à equação que descreve um float:

\displaystyle v=(-1)^S+\left(1+\frac{F}{2^{23}} \right )\cdot2^e

Onde os valores S, F e e são os “pedaços” de um float e são inteiros e positivos:

Estrutura de um float

Note que S tem apenas 1 bit de tamanho (S de “sinal”), F (de “fração”) tem 23 bits e, portando, suporta valores entre 0 e 2^{23}-1. Assim, \frac{F}{2^{23}} sempre será menor que 1.0! Já e é expresso pela equação e=E-127. O E, maiúsculo, é o valor que consta na estrutura…

Sendo assim, 1+\frac{F}{2^{23}} sempre será uma fração racional. Isso é evidente se você pensar que, numa estrutura com quantidade limitada de bits, não dá para armazenar um valor como π (3.1415926… e não acaba nunca).

O importante aqui é lembrar que a fração racional deve ser racional em binário. O valor 0.1, em decimal, não é racional em binário. Aliás, qualquer valor que seja diferente de 0.0 que não termine, na parte fracionária, em 5, não é um valor racional em binário. Isso é fácil perceber quando você calcula cada “casa” binária “depois da vírgula”:

2^{-1}=0.5\quad2^{-2}=0.25\quad2^{-3}=0.125\quad\cdots

E se somarmos cada um desses bits “fracionários”, verá que o final sempre terá o algarismo 5, em decimal.

Regra geral: Se a parte fracionária de um valor decimal for diferente de zero e não terminar em 5, o valor em ponto flutuante não é exato! Exemplo: 454.76 não é exato com qualquer tipo de ponto flutuante (float, double, long double) porque a parte fracionária termina em 6.

Anúncios