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 representaçã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 reservados 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 representados. 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 decimal, mas é uma dízima periódica no sistema binário. Você não precisa se preocupar com esses detalhes agora, mas pode investigá-los mais tarde quando precisar
(normalmente cursos de computação apresentam uma disciplina, chamada cálculo 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 representaçã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 esperados, 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 inicialmente para representar o número não é armazenada na variável em si, apenas o valor já convertido.