Números reais¶
Tópicos¶
Leia sobre o tipo
float
na seção Variáveis de tipos de dados.Leia sobre a função de conversão
float()
, que converte destr
parafloat
, nas seções Funções para conversão de valores e Operadores e operandos. Veja a diferença entre/
e//
e como%
se comporta comfloat
.Problemas com o tipo float.
Introdução¶
Um número real em um computador é representado na notação de ponto flutuante (do inglês floating point). Dada a limitação de dígitos imposta por essa notação, os resultados dos cálculos realizados pelos computadores são aproximações dos valores reais. Por exemplo, o valor real de Pi tem infinitas casas decimais mas, no computador, é necessário limitar o número de casas decimais, aproximando o valor de Pi.
Para que possamos confiar nos resultados, uma boa prática é tentar minimizar a propagação de erros devido ao uso dessas aproximações. Assim, em geral:
Operações de divisão e multiplicação são “seguras”, podem ser executadas em qualquer ordem.
Adições e subtrações são “perigosas”, pois quando números de magnitudes muito diferentes são envolvidos, os dígitos menos significativos são perdidos.
Essa perda de dígitos pode ser inevitável e sem consequência (quando os dígitos perdidos são insignificantes para o resultado final) ou catastróficos (quando a perda é magnificada e causa um grande erro no resultado).
Quanto mais cálculos são realizados (em particular quando os cálculos são feitos de forma iterativa), mais importante é considerar esse problema.
O método de cálculo pode ser estável (tende a reduzir os erros de arredondamento) ou instável (tende a magnificar os erros). Frequentemente, há soluções estáveis e instáveis para um problema.
Para saber mais dê uma olhada em http://floating-point-gui.de/errors/propagation.
Se você já aprendeu a utilizar funções, você pode escrever as soluções dos problemas a seguir usando funções.
Problema 1¶
(exercício 2 da lista de exercícios sobre reais). Dado um número inteiro \(n > 0\), determinar o número harmônico \(H_n\) dado por
Imprima cada termo da sequência e o resultado final. Faça 2 implementações:
Da direita para a esquerda e
da esquerda para direita.
Qual dessas formas é estável?
Observe que para \(n = 10\), os resultados são iguais, mas para \(n = 100 \ldots\)
Problema 2¶
Nota: Questão 6 da lista de exercícios sobre reais do caderno de exercícios.
Dados \(x\) real e \(n\) natural, calcular uma aproximação para \(\cos(x)\) através dos \(n\) primeiros termos da seguinte série
Compare com os resultados de sua calculadora!
Problema 3¶
Nota: Questão 7 da lista de exercícios sobre reais do caderno de exercícios.
Dados \(x\) real e \(\epsilon\) real, \(\epsilon > 0\), calcular uma aproximação para \(\sin(x)\) através da seguinte série infinita:
incluindo todos os termos até que \(\frac{|x^{2k+1}|}{(2k+1)!} < \epsilon\)
Compare com os resultados de sua calculadora!
Problema 4¶
Nota: Questão 1 da Prova 1 de 2014.
Na figura, no plano cartesiano, a região sombreada não inclui as
linhas de bordo. Note que o eixo y
cai bem no meio da figura,
e usamos o lado do quadrado para indicar as ordenadas
correspondentes.
Escreva na página do desenho um programa que lê as coordenadas
cartesianas (x, y)
de um ponto, ambas do tipo float
e imprime dentro
se esse ponto está na região, e fora
caso contrário.
Problema 5¶
Dado um número real \(x\) e um número real \(\text{epsilon} > 0\), calcular uma aproximação de \(e^x\) através da seguinte série infinita:
Inclua na aproximação todos os termos até o primeiro de valor absoluto (módulo) menor do que epsilon.
Problema 6¶
- Dados números reais \(x >= 0\) e \(\text{epsilon} > 0\), calcular uma aproximação da raiz quadrada de \(x\) através da seguinte sequência:
\(r_0 = x\) e
\(r_{n+1} = (r_n+ \frac{x}{r_n}) / 2\).
- Exemplos:
Para \(x = 3, r_0 = 3, r_1 = 2, r_2 = 1.75, r_3 = 1.732143, r_4 = 1.732051\)
Para \(x = 4, r_0 = 4, r_1 = 2.5, r_2 = 2.05, r_3 = 2.000610, r_4 = 2.000000\)
Para \(x = 5, r_0 = 5, r_1 = 3, r_2 = 2.33, r_3 = 2.238095, r_4 = 2.236068\)
Para \(x = 0.81, r_0=0.81, r_1=0.905, r_2=0.9000138122, r_3=0.9000000001\)
A aproximação será o primeiro valor \(r_{n+1}\) tal que \(|r_{n+1}-r_n| < \text{epsilon}\).