Aula 1 de 0
Em Progresso

2.1 Representação de valores numéricos

Internamente, todos os números são representados utilizando o sistema binário, ou seja, de base 2. Esse sistema permite apenas os dígitos 0 e 1. Para representar números maiores, combinamos vários dígitos, exatamente como fazemos com o sistema decimal, ou de base 10, que utilizamos.

Vejamos primeiro como isso funciona na base 10:

 

 

531 = 5 x 102 + 3 x 101 + 1 x 10°

= 5 x 100 + 3 x 10 + 1 x 1

=500+30+1

= 531

Multiplicamos cada dígito pela base elevada a um expoente igual ao número de casas à direita do dígito em questão. Como em 531 o 5 tem 2 dígitos à direita, mulnplicamos 5 x 102. Para o 3, temos apenas outro dígito à direita, logo, 3 x 101. Finalmente, para o 1, sem dígitos à direita, temos 1 x 10°. Somando esses componentes, temos o número 531. Fazemos isso tão rápido que é natural ou automático pensarmos desse jeito.

A mudança para o sistema binário segue o mesmo processo, mas a base agora é 2, e não 10. Assim, 1010 em binário representa:

1010 = 1 x 23 + 0 x 22 + 1 x 2‘ + 0 x 2o

=lx8+0x4+lx2+0xl

= 8 + 0 + 2 + 0

= 10

A utilização do sistema binário é transparente em Python, ou seja, se você não solicitar explicitamente que esse sistema seja usado, tudo será apresentado na base 10 utilizada no dia a dia. A importância da noção de diferença de base é importante, pois ela explica os limites da representação. O limite de represen­tação é o valor mínimo e máximo que pode ser representado em uma variável numérica. Esse limite é causado pela quantidade de dígitos que foram reserva­dos para armazenar o número em questão. Vejamos como funciona na base 10.

Se você tem apenas 5 dígitos para representar um número, o maior número é 99999. E o menor seria (-99999). O mesmo acontece no sistema binário, sendo que lá reservamos um dígito para registrar os sinais de positivo e negativo.

Para números inteiros, Python utiliza um sistema de precisão ilimitada que permite a representação de números muito grandes. E como se você sempre pudesse escrever novos dígitos à medida que for necessário. Você pode calcular em Python valores como 21000000 (2 ** 100 0 0 00) sem problemas de representação, mesmo quando o resultado é um número de 301030 dígitos.

Em ponto flutuante, temos limite e problemas de representação. Um número decimal é representado em ponto flutuante utilizando-se uma mantissa e um expoente {sinal x mantissa x baseexpoeme). Tanto a mantissa quanto o expoente têm um número de dígitos máximos que limita os números que podem ser represen­tados. Você não precisa se preocupar com isso no momento, pois esses valores são bem grandes e você não terá problemas na maioria de seus programas. Obtenha mais informações acessando http://pt.wikipedia.org/wiki/Ponto_flutuante.

A versão 3.7 do Python tem como limites 2.2250738585072014 x IO’308 e 1.7976931348623157 x IO308, suficientemente grandes e pequenos para quase qualquer tipo de aplicação. É possível encontrar problemas de representação em função de como os números decimais são convertidos em números de ponto flutuante. Esses problemas são bem conhecidos e afetam todas as linguagens de programação, não sendo um problema específico do Python.

Vejamos um exemplo: o número 0.1 não tem nada de especial no sistema deci­mal, mas é uma dízima periódica no sistema binário. Você não precisa se preocu­par com esses detalhes agora, mas pode investigá-los mais tarde quando precisar

(normalmente cursos de computação apresentam uma disciplina, chamada cál­culo numérico, para abordar esses tipos de problemas). Digite no interpretador

3 * 0.1

Você deve ter obtido como resultado 030000000000000004, e não 0.3, como esperado. Não se assuste: não é um problema de seu computador, mas de repre­sentação. Se for necessário, durante seus estudos, cálculos mais precisos, ou se os resultados em ponto flutuante não satisfizerem os requisitos de precisão espera­dos, verifique os módulos decimais e fractions. A documentação do Python traz uma página específica sobre esse tipo de problema: http://docs.python.org/py3k/ tutorial/floatingpoint.html.

Você também pode trabalhar com a base 2 (binária), base 8 (octal) ou base 16 (hexa- decimal) em Python. Embora seja um recurso pouco utilizado, pode ser interessante para você no futuro. É possível entrar números em binário utilizando o prefixo 0b (zero b), em octal com o prefixo 0o (zero ó) e em hexadecimal Ox (zero x):

 

 

»> a = OblO # Base 2 - binário

»> a

2

»> b = 0x10 # Base 16 - hexadecimal

»> b

16

»> c = 0ol0 # Base 8 - octal

»> c

8

 

Observe que, independentemente da base da dados utilizada para introduzir o número, este é mostrado por padrão na base 10. A base que você utilizou inicial­mente para representar o número não é armazenada na variável em si, apenas o valor já convertido.