EXPANCAO DE FRACAO EM BINARIO

Deduzi o seguinte algoritmo para a expanção de uma fração para binário:

Algoritmo

Suponha que desejamos obter a expanção binária \(e\) de 0.3. Procedemos assim:

  1. \(0.3 < 1\), logo o valor antes da vírgula é zero. Se não fosse, esse valor seria a representação binária do chão do número em questão (i.e., se quisessemos expandir 7.3, antes da vírgula teriamos a representação binária de 7).

Então \(e_0=0\).

  1. A primeira casa após a vírgula, quando vale 1, adiciona \(1/2^1=0.5\) a \(e\). Entretanto, \(0.5>0.3\), então essa casa deve valer 0.

Então \(e_1=0.0\)

  1. A segunda casa, quando vale 1, adiciona \(1/2^2=0.25\) a \(e\). Além disso, \(0.25<0.3\), então essa casa deve valer 1.

Então \(e_2=0.01\), e guardamos o total representado até agora \(\Sigma=0.25\) e a diferença \(\Delta = 0.3-\Sigma = 0.05\).

  1. A terceira casa adiciona \(1/2^3 = 0.125\). Entretanto, \(\Delta>0.125\), então essa casa deve valer 0.

Então \(e_3 = 0.010\)

  1. A quarta casa adiciona \(1/2^4 = 0.0625\). Entretanto, \(\Delta > 0.0625\), então essa casa deve valer 0.

Então \(e_4=0.0100\)

  1. A quinta casa adiciona \(1/2^5 = 0.03125\). Além disso, \(\Delta < 0.03125\), então essa casa deve valer 1.

Então \(e_5 = 0.01001\) e fazemos \(\Sigma \leftarrow \Sigma+0.03125 = 0.28125\) e \(\Delta = 0.3 - \Sigma = 0.01875\).

E assim por diante.

Código

Segue uma função que expande o float \(x \in (0,1)\) em \(n\) casas decimais.

def exp_bin(x, n):
    out = '0.'
    sum = 0
    
    for i in range(n):
        valor_casa = 1/(2**(i+1))
        if x - sum >= valor_casa:
            out = out + '1'
            sum += valor_casa
        else:
            out = out + '0'
return out
© 2025 Luã Jaz. Todos os direitos reservados.