Introdução à programação e aos algoritmos

João Araujo Ribeiro · Capítulo 31 de 103

Páginas do PDF

Introdução à programação e aos algoritmos

2.7.3 Números com Ponto Flutuante

tamanho_universo_mm = tamanho_universo \

* velocidade_luz_em_mms \

* segundos_por_ano

Quando um comando em Python tiver de ser continuado nas linhas seguintes, é necessário terminar

cada linha com uma contrabarra (\). Isso avisa ao interpretador Python que a linha ainda não terminou e que a linha seguinte é a continuação do comando. Se esta contrabarra não for usada, a linha seguinte será interpretada como um novo comando e irá provocar um erro no interpretador.

Para terminar esta seção, vamos melhorar a saída do programa. Fica difícil ler um número tão

grande. Gostaríamos de usar algum separador entre os milhares do número, para tornar mais legível o resultado. Python permite uma formatação de números. Na realidade, o comando de formatação é bem poderoso, mas temos que mudar a maneira de imprimir. O comando é o “format()”. No caso específico dos separadores de milhar, enquanto no Brasil usamos o ponto, nos países de língua inglesa é usada a vírgula. Isso cria um problema para nós. Não é possível usar o ponto no comando format. A solução, ainda com vírgulas, é:

print (“O Universo tem aproximadamente”,

“{:,} milímetros.”.format(tamanho_universo_mm))

O comando format em Python irá substituir em uma cadeia de caracteres o que estiver entre

chaves. A formatação é dada pelo código entre as chaves. No caso, o comando diz para o format usar a vírgula como separador de milhares. Execute e veja o resultado. No site do livro, apresento outros comandos de formatação úteis para serem usados em números.

EXERCÍCIO 2.11

O Universo surgiu há cerca de 14 bilhões de anos. Escreva um programa Python que calcule quantos segundos se passaram

desde esse momento.

 

EXERCÍCIO 2.12

Um número realmente grande é um googol. Em 1938, o matemático Edward Kasner pediu ao seu sobrinho de 8 anos que

inventasse um nome para um número muito grande. Assim nasceu o googol. Como você deve estar descon ando, esse número

deu origem ao nome de uma grande empresa da Internet. Um googol corresponde a 10100. Escreva um programa em Python

que imprima um googol. Lembre-se de que a exponenciação em Python é representada por **.

 

EXERCÍCIO 2.13

Um googolplexo é dez elevado a um googol (10googol). Escreva um programa que imprima um googolplexo. Não execute!

Este programa trava. Por quê?

 

2.7.3 NÚMEROS COM PONTO FLUTUANTE Por vezes, números inteiros não bastam, precisamos usar números reais de ponto flutuante em algum cálculo. Normalmente, os processadores têm uma parte dedicada somente aos cálculos em ponto flutuante. Isso torna os cálculos extremamente rápidos. Jogos de computador, por exemplo, com seus gráficos sofisticados, exigem muitos cálculos em ponto flutuante e têm de ser executados o mais rápido possível, senão o jogo fica lento, perdendo seu interesse. Você já deve ter sentido isso, se alguma vez tentou jogar um jogo com gráficos muito “pesados” em um computador que não fosse adequado.

Um jogo gráfico seria muito complexo para apresentar os números de ponto flutuante. Para nossos

objetivos, o exemplo de cálculo do tamanho do Universo é bem didático.

Um ano não tem exatos 365 dias. Na realidade tem 365,25. No Programa 2.6 podemos

simplesmente substituir o valor relativo ao número de dias de um ano para obter um resultado com um número real de ponto flutuante. Modificando a linha de cálculo de segundos por ano, por:

segundos_por_ano = 365.25 * segundos_por_dia

obtemos:

O Universo tem aproximadamente 8.798479339500143e+29 milímetros.

O valor final foi modificado pelo acréscimo da fração do dia, mas o formato de saída também foi

alterado para refletir o uso de números em ponto flutuante. Apesar de omitido na representação, fica subentendida a base dez para o exponencial. Assim, 8.798479339500143e+29 é o mesmo que 8.798479339500143 × 10+29.

Devemos ter atenção redobrada quando trabalhamos com números de ponto flutuante. Na Seção

1.6, mostrei que nem todo número em ponto flutuante pode ser representado corretamente na base binária. No programa do cálculo do tamanho do Universo, ao usar um número com casas decimais, podemos ter inserido algum erro. Vamos reescrever o programa usando apenas números inteiros. Isso é fácil. Basta multiplicar 365,25 por 100. Seu valor passa a ser 36525, e o resultado agora será fornecido em centésimos de milímetros. No resultado final teremos dois zeros a mais. Deste modo, o comando fica:

segundos_por_ano = 36525 * segundos_por_dia

e o resultado,

87984793395001440000000000000000.

Percebeu a diferença? O último dígito antes da sequência de zeros é 4, enquanto ao ser calculado

com números reais, esse dígito era 3. O resultado em inteiros está multiplicado por 100. Se quisermos obter o resultado novamente em milímetros, devemos dividi-lo por 100. Assim, substituindo a linha da impressão por

print (“O Universo tem aproximadamente”,

tamanho_universo_mm/100, “milímetros.”)

o resultado agora é:

8.798479339500145e+29 milímetros.

Nova mudança no resultado. Agora o dígito antes da sequência de zeros é 5. Fazendo teoricamente

o mesmo cálculo, obtivemos três resultados diferentes. Não precisamos trabalhar com números tão grandes para ver o resultado do erro de conversão entre números reais e binários. Veja o Programa 2.7.

print (0.1, “+”, 0.2 ,”=”, 0.1 + 0.2)

■ Programa 2.7: erropf.py.

A execução deste programa simples fornece:

0.1 + 0.2 = 0.30000000000000004

Obviamente, o resultado está errado. Isto não é um erro de Python, mas uma consequência da

representação de números decimais de ponto flutuante com dígitos binários. Aqui existe um fato que talvez você desconhecesse: o computador, que você considerava senhor dos números, comete erros básicos nas contas. Mas isto não é motivo para que você não use números reais de ponto flutuante. Em algumas situações esses números são inevitáveis e o resultado será correto. Na maior parte das situações o erro não é relevante e um arredondamento do resultado será plenamente satisfatório. O resultado do Programa 2.7 será correto se for apresentado com uma ou duas casas decimais.