Neste aula estudaremos como são representados os números no computador e como isso interfere em sua aritmética.
Se fixamos um número natural $\beta > 1$, que se chamará base do sistema, podemos representar todo número inteiro $k$ como :$$ k = a_n\beta^n+ a_{n-1}\beta^{n-1}+\cdots + a_0$$ onde cada $a_i$ é um número entre $0$ e $\beta -1$ e $a_n>0$. Dizemos que esta é a representação de $k$ na base $\beta$ e denotamos $k=[a_n...a_0]_{\beta}$. Podemos pensar no número $\beta$ como o valor máximo de agrupamentos que conseguimos distinguir, e para contarmos, dividimos tudo em grupos de tamanho máximo $\beta$.
Se $x$ é um número real no intervalo $(0,1)$ podemos representá-lo como :$$ x= \sum_{k=1}^\infty \frac{b_k}{\beta^k} $$ A sequência de $b_k$ pode ser infinita e não é única, denotaremos o número como $x=[0.b_1b_2\dots]_{\beta}$
A função descrita abaixo dá a representação binária de um número na representação decimal.
def binario(a):
# da a representacao binaria do numero a
ParteInteira = int(a)
ParteDecimal = a-int(a)
# representacao binaria da parte inteira
# a lista seguinte guarda os dígitos da parte inteira
ListaDigitos=[]
while (ParteInteira > 0):
ListaDigitos.append(ParteInteira%2)
ParteInteira=ParteInteira//2
# lista dos digitos depois da virgula
ListaResto=[]
k=1
while ((ParteDecimal!=0)&(k<50)):
ListaResto.append(int(2*ParteDecimal))
ParteDecimal=2*ParteDecimal - int(2*ParteDecimal)
k=k+1
# produz a string de representacao:
i=len(ListaDigitos)-1
p1=""
while (i>=0):
p1=p1+str(ListaDigitos[i])
i=i-1
# Depois disso p1 tem a parte inteira
l=0
p2=""
while (l<len(ListaResto)):
p2=p2+str(ListaResto[l])
l=l+1
return p1+"."+p2
print (binario(21.75))
binario(0.1)
'.0001100110011001100110011001100110011001100110011'
Consideramos uma base fixa $\beta > 1$. Um número real $\alpha \in \mathbb{R}$ positivo pode ser escrito nesta base como: :$$\alpha = [a_k\cdots a_0.b_1b_2\cdots]_{\beta} $$ Isto significa que: :$$\alpha = a_k\beta^k + \cdots + a_0 + \frac{b_1}{\beta} +\frac{b_2}{\beta^2} + \cdots $$ Na equação acima, colocando $\beta^{k+1}$ em evidência temos: :$$\alpha = \left( \frac{a_k}{\beta} + \cdots + \frac{a_0}{\beta^{k+1}} + \frac{b_1}{\beta^{k+2}} +\frac{b_2}{\beta^{k+3}} + \cdots\right)\times \beta^{k+1} $$ ou ainda, lembrando da notação de um número numa base dada: :$$\alpha = [0.a_k \cdots a_0 b_1 b_2\cdots]_{\beta} \times \beta^{k+1} $$ Esta última fórmula é importante. O número real $ \alpha$ fica caracterizado por três dados:
Esta representação do número $\alpha$ como $\sigma m \times \beta^e$ chamaremos de representação normal em ponto flutuante na base $\beta$. Em geral a base fica clara pelo contexto!
Se fixamos uma base, $\beta$, a quantidade de dígitos na mantissa, $\mathbf{m}$ e limite para o expoente, $|e|\leq M$, temos o subconjunto finito de $\mathbb{R}$
$$ \mathbb{M}= \{ 0.d_1\dots d_{\mathbf{m}} \times \beta^{e} \text{ com } |e|\leq M\}$$
que é chamado de conjunto de números de máquina.
Uma função
$$ A: \mathbb{R} \to \mathbb{M} $$é uma ma função de arredondamento se preserva a ordem e restrita ao conjunto $\mathbb{M}$ é a identidade. Dois são os arredondamentos mais típicos.
Se $x$ e $y$ são dois números consecutivos de $\mathbb{M}$ então temos
$ x = 0.d_1\dots d_m \times \beta^e$ e $y = (0.d_1\dots d_m + \beta^{-m})\times \beta^e$ e a diferença dá:
$|x-y| = \beta^{e-m}$
Se x é um número real qualquer entâo
$|x-\text{rd}(x)| \leq \frac{\beta^{e-m}}{2}$
e o erro relativo
$$ \frac{|x-\text{rd}(x)|}{|x|} \leq \frac{\beta^{e-m}}{2|x|}$$e como sabemos que $\beta^{e-1} \leq x \leq \beta^{e}$ concluimos que
$$ \frac{|x-\text{rd}(x)|}{|x|} \leq \frac{\beta^{e-m}}{2\beta^{e-1}}= \frac{\beta^{m+1}}{2}$$