Números no Computador
Muitos dos algoritmos de cálculo numérico, por uma questão prática, deverão ser executados numa máquina real.
Nestas máquinas, no entanto, a capacidade de memória para representação dos números é finita. Vários números reais (infinitos, de fato) terão a mesma representação no computador (ou calculadora), daí originando-se os
erros de arredondamentos. Vamos ver qual é a técnica usada atualmente para diminuir os erros de arredondamentos.
Representação de números inteiros numa base
Seja β>1 um número natural. Então podemos representar qualquer número inteiro k como a soma
k=sgn(k)∗a0β0+⋯+asβs
onde cada algarismo
aj representa um número natural entre
0 e
β−1. Só
as é diferente de zero. Esta representação é única.
A representação de
k na base
β é
k=±[as…a0]β
Deixando o sinal de
k de fora, para simplificar. Podemos calcular os algarismos do número daddo na base
β aplicando repetidas vezes o algoritmo da divisão.
Escrevendo
k=a0+β(a1+β(a2+⋯+βas)⋯))
vemos que
a0 é o resto da divisão
k//β,
a1 é o resto da divisão
(k−a0)//β e assim por diante.
Exemplo: 39=[100111]2
Representação de números fracionários e decimais numa base
Seja novamente β>1 um número natural.
Se x∈(0,1) então
x=b1β+⋯+bkβk+⋯
Diremos que
x=[0.b1b2…]β é a representação fracionária na base
β de
x. Quando não houver dúvidas de que base se trata, omite-se a base da notação!
Exemplo: 0.9=[0.1110011001100...]2
Uma função para colocar um número decimal na forma binária
In[1]:
|
# -*- coding: utf-8 -*-
"""
Spyder Editor
"""
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))
|