Tema1 - Aritmética Computacional em Python
Tema1 - Aritmética Computacional em Python
Tema1 - Aritmética Computacional em Python
Objetivos
Módulo 1 Módulo 2
Módulo 3 Módulo 4
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 2/90
14/11/22, 09:37 Aritmética computacional em Python
Introdução
Este conteúdo não é um manual abrangente de Python. O único objetivo é
fornecer informações fiáveis para lhe dar um bom começo, se você não
estiver familiarizado com Python. Se você conhecer outra linguagem de
computador, e presumimos que sim, não é difícil que compreenda conforme
avança.
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 3/90
14/11/22, 09:37 Aritmética computacional em Python
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 4/90
14/11/22, 09:37 Aritmética computacional em Python
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 5/90
14/11/22, 09:37 Aritmética computacional em Python
2
y = v 0 t + 0.5gt
Onde:
V0 g
É a aceleração da gravidade no local,
É a velocidade inicial da bola.
que pode ser aproximado por 10m/s2.
Python
content_copy
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 6/90
14/11/22, 09:37 Aritmética computacional em Python
code #
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html#
é t ib i ã i P th " i " 7/90
14/11/22, 09:37 Aritmética computacional em Python
que é atribuição seria pensar que o Python gera uma "caixa"
no computador (memória) com o nome v0 escrito no topo.
O número 5 é, então, colocado nessa caixa. Sempre que o
Python, mais tarde, encontra o nome v0 no código, ele
encontra a caixa, de modo que o Python tira o número cinco
e substitui o nome v0 pelo número. Isso também acontece
com as linhas seguintes: g = 10 e t = 0,5.
code print(y)
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html#
N últi li h d i t( ) é d 8/90
14/11/22, 09:37 Aritmética computacional em Python
Na última linha, vem o comando print(y), que é um comando
de impressão na tela do valor de y, pois, caso não seja
colocado essa função print, o Python executaria a fórmula e
atribuiria na “caixa” y o valor de 1,25 e nada aparecia na tela.
Matemática Programação
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 9/90
14/11/22, 09:37 Aritmética computacional em Python
Strings
\n \t \b
Cria uma nova linha. Cria uma tabulação. É uma backspace.
Python
content_copy Python
content_copy
1 >>>print('abc\nd') 1 >>>>print('abc\td')
2 abc 2 abc d
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 10/90
14/11/22, 09:37 Aritmética computacional em Python
3 d
Python
content_copy
Python
content_copy
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 11/90
14/11/22, 09:37 Aritmética computacional em Python
1
2 >>>
ab palavra[0:2]
Expressões Booleanas
São utilizados para realizar comparações relacionais e retornam verdadeiro
(True) e falso (False). Os operadores são:
Python
content_copy
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 12/90
14/11/22, 09:37 Aritmética computacional em Python
Operadores Aritméticos
+ - *
Adi ã
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html#
S bt ã M 13/90
14/11/22, 09:37 Aritmética computacional em Python
Adição Subtração Mu
Python
content_copy
1 >>> s = ’Olá’
2 >>> t = ’para você’
3 >>> a = [1, 2, 3]
4 >>> print(3*s) # Repetição
5 Olá Olá Olá
6 >>> print(3*a) # Repetição
7 [1, 2, 3, 1, 2, 3, 1, 2, 3]
8 >>> print(a + [4, 5]) # Adicionando elementos
9 [1, 2, 3, 4, 5]
10 >>> print(s + t)
11 Olá para você
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 14/90
14/11/22, 09:37 Aritmética computacional em Python
Operadores Aritméticos
Tuplas e Listas
A tupla é uma sequência de objetos arbitrários separados por vírgulas e
incluídos entre parênteses. Se a tupla contém um único objeto, uma vírgula final
é necessária; por exemplo, x = (2,). Tuplas suportam as mesmas operações que
strings e são imutáveis. Veja a seguir um exemplo onde a tupla dados contém
outra tupla (31,10,73):
Python
content_copy
10 Roberto Gomes
11 >>> print(rec [0: 2])
12 ('Gomes', 'Roberto')
Uma lista é semelhante a uma tupla, mas é mutável, de modo que seus
elementos e comprimento podem ser mudados. Uma lista é identificada
colocando-a entre colchetes. Seguem alguns exemplos da operações realizadas
em listas:
Python
content_copy
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 16/90
14/11/22, 09:37 Aritmética computacional em Python
Python
content_copy
Para criar uma cópia independente de uma lista a, use a declaração c =a[:],
conforme mostrado no exemplo a seguir:
Python
content_copy
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 17/90
14/11/22, 09:37 Aritmética computacional em Python
1 >>> c = a[:]
2 >>> c[0] = 1.0
3 >>> print(a)
4 [5.0, 2.0, 3.0]
Importando Bibliotecas
Para dar uma visão aplicada ao nosso
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 18/90
14/11/22, 09:37 Aritmética computacional em Python
Comentário
Não precisaremos recapitular todo o assunto, já visto no ensino médio, para que
o objetivo deste conteúdo seja atingido.
Problema
A bala de um canhão, com massa (m) de 15kg, é lançada com velocidade inicial
(v0) de 300m/s. Determine o alcance horizontal máximo (A) do projétil para o
caso de o ângulo (θ) formado entre o canhão e a horizontal ser de 15°. Considere
a gravidade (g) igual a 10m/s.
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 19/90
14/11/22, 09:37 Aritmética computacional em Python
2
v sen 2θ
0
A =
g
Onde:
v0 θ g
É o ângulo com a É a gravidade.
É velocidade inicial.
horizontal
Python
content_copy
Embora o Python tenha muitas funções internas, como o print(), também possui
um conjunto de bibliotecas-padrão, que são programas em Python que podem
ser incluídos no seu programa. Usaremos o módulo math, pois ele disponibiliza
diversas funções matemáticas. Existem certas formas de “chamar” esses
módulos no seu programa, a seguir veremos algumas.
Python.
import “alguma-coisa”
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 21/90
14/11/22, 09:37 Aritmética computacional em Python
Python
content_copy
1 >>>import math
Quando fazemos isso, temos acesso a todas as funções da biblioteca math, mas
devemos informar ao Python de qual biblioteca estamos chamando a função,
para isso utilizamos a sintaxe módulo.função(). Desse modo, utilizaremos o
math.sin() e o math.pi. Então, nosso programa pode ser escrito da seguinte
maneira:
Python
content_copy
1 >>>import math
2 >>>v0 =300
3 >>>g=10
4 >>>theta=15
5 >>>A= (v0**2/g)*math.sin(2*theta*math.pi/180)
6 >>>print(A)
7 4500
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 22/90
14/11/22, 09:37 Aritmética computacional em Python
Python
content_copy
Python
content_copy
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 23/90
14/11/22, 09:37 Aritmética computacional em Python
2 >>>v0 =300
3 >>>g=10
4 >>>theta=15
5 >>>A= (v0**2/g)*sin(2*theta*pi/180)
6 >>>print(A)
Python
content_copy
1 >>>import math as m
2 >>>v0 =300
3 >>>g=10
4 >>>theta=15
5 >>>A= (v0**2/g)*m.sin(2*theta*m.pi/180)
6 >>>print(A)
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 24/90
14/11/22, 09:37 Aritmética computacional em Python
Observe que o apelido será m; assim, chamamos a função seno com m.sin(). De
maneira análoga, podemos atribuir “apelidos” para as funções from módulo
import função as apelido. Por exemplo:
Python
content_copy
Funções
Até agora, vimos sobre biblioteca de funções, módulos, parâmetros, utilizando,
no entanto, o que o Python já tem pronto. É possível também criar a nossa
própria função e seus respectivos argumentos. Essa necessidade geralmente
ocorre quando algum procedimento se repete no programa. Por exemplo, vamos
supor que em um problema você tenha que calcular diversos alcances de um
lançamento oblíquo para diversos ângulos, respectivamente, 15º, 30º, 45º, 60ºe
75º, usando esse programa.
Python
content_copy
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 25/90
14/11/22, 09:37 Aritmética computacional em Python
1 >>>import math
2 >>>v0 =300
3 >>>g=10
4 >>>theta=15
5 >>>
6 >>>print(A)
Uma solução para isso é criar uma função, e a estrutura para declarar uma
função em Python é dada da seguinte maneira:
Declarações
return valor-de-retorno
Condicionais (if)
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 26/90
14/11/22, 09:37 Aritmética computacional em Python
if condições:
bloco de instruções
elif condições:
bloco de instruções
else:
bloco de instruções
Python
content_copy
1 >>>def sinal_numerico(a):
2 >>> if a < 0.0: # Se a menor que zero
3 >>> sinal = ’negativo’
4 >>> elif a > 0.0: # Se a maior que zero
5 >>> sinal = ’positivo’
6 >>> else: # Senão, ou seja, se a não é ma
7 >>> sinal = ’zero’
8 >>> return sinal
9 >>> a = 1.5
10 >>>print(’a é ’ + sinal_numerico(a))
11 a é positivo
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 27/90
14/11/22, 09:37 Aritmética computacional em Python
O Comando for
Python
content_copy
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 28/90
14/11/22, 09:37 Aritmética computacional em Python
1
2 >>> range(3) # parada indicada 3, como não foram indicados,
[0,1,2]
3 >>> range(2,5,2) # início 2, parada 5 e incremento 2
4 [2,4]
5 >>> range(5,2,-2) # o incremento é negativo
6 [5,3]
O comando for permite que nos informemos sobre os elementos de uma lista.
De modo geral, o comando é expresso da seguinte maneira:
Python
content_copy
Solução do Problema
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 29/90
14/11/22, 09:37 Aritmética computacional em Python
Python
content_copy
matplolib.pyplot
Vamos retornar ao nosso problema do início do conteúdo, ou seja: determinar a
posição vertical y da bola no tempo t. Para construir o gráfico dessa função,
utilizaremos o módulo matplotlib, usado, em geral, para realizar gráficos em 2D.
Python
content_copy
1 >>>import numpy as np
2 >>>import matplotlib.pyplot as plt
3 >>>v0 = 5 # Velocidade inicial
4 >>>g = 10 # Aceleração da gravidade
5 >>>t = np.linspace(0,1,1001)# Tempo
6 >>>y = v0 * t - 0.5 * g * t ** 2 # Posição vertical
7 >>>plt.plot(t,y) # plotar o grafico yxt
8 >>>plt.xlabel('t (s)') # eixo x com t(s)
9 >>>plt.ylabel('y (m)') # eixo y como y(m)
10 >>>plt.show() #mostrar a figura
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 31/90
14/11/22, 09:37 Aritmética computacional em Python
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 32/90
14/11/22, 09:37 Aritmética computacional em Python
Questão 1
A 39378
B 39377
C 39376
D 39375
E 39374
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 33/90
14/11/22, 09:37 Aritmética computacional em Python
Questão 2
a=[1,2,3,4,5]
a[-5]
A 1
B 5
C [3,4]
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 34/90
14/11/22, 09:37 Aritmética computacional em Python
D [4, 5]
E [1,2,3,4,5]
Em uma lista, os índices começam com 0. Nesse caso, a lista segue a ordem
até 4. Quando utilizamos índices negativos, ele usa a ordem inversa,
começando com -1 e indo até -5, ou seja, a[-5] = 1.
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 35/90
14/11/22, 09:37 Aritmética computacional em Python
Exemplo
O número 179 significa uma (1) centena (100) mais (+) sete (7) dezenas (10) e
nove (9) unidades, ou, de forma simplificada, por símbolos matemáticos: 179 =
1x102 + 7x10 + 9.
Agora, vamos generalizar essa notação matemática. Para isso, vamos adotar
como representação para qualquer digito numérico decimal a letra di, onde i é a
posição no número N com n+1 dígitos. Por exemplo, no número 179, o dígito
decimal 1 encontra-se na posição i=2; 7 na posição i=1; e 9 na posição i=0. Em
uma forma de notação matemática, temos:
n n−1 1 0
N = d n d n−1 . . . . d i , . . . d 1 d 0 = d n ×10 + d n−1 ×10 +. . . +d 1 ×10 + d 0 ×10 ,
Onde
0 ≤ di < 10, i = 0, 1, … , n
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 37/90
14/11/22, 09:37 Aritmética computacional em Python
(dndn-1....di...d1d0 )10. Essa notação nos leva a outra, caso se deseje representar
o número com uma base diferente de 10, que seria N=(dndn-1....di...d1d0 )b , com
b sendo uma base diferente de 10; consequentemente, teremos 0≤ di < b.
n n−1 1 0
N = (d n d n−1 . . . . d i , . . . d 1 d 0 ) b = d n ×b + d n−1 ×b +. . . +d 1 ×b + d 0 ×b
2 1 0
(101) 2 = 1 × 2 + 0 × 2 + 1 × 2
2 1 0
(175) 8 = 1 × 8 + 7 × 8 + 5 × 8
2 1 0
(A2D) 16 = A × 16 + 2 × 16 + D × 16
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 38/90
14/11/22, 09:37 Aritmética computacional em Python
n n−1 i 1 0
N = (d n d n−1 . . . . d i , . . . d 1 d 0 ) b = d n ×b + d n−1 ×b +. . . +d i ×b +. . . . +d 1 ×b + d 0 ×b
2 1 0
(101) 2 = 1 × 2 + 0 × 2 + 1 × 2 = 4 + 0 + 1 = 5
2 1 0
(175) 8 = 1 × 8 + 7 × 8 + 5 × 8 = 1 × 64 + 7 × 8 + 5 × 1 = 125
2 1 0 2
(A2D) 16 = A × 16 + 2 × 16 + D × 16 = 10 × 16 + 2 × 16 + 13 = (2605) 10
De modo geral:
n n−1 i 1 0
(d n d n−1 … d i , … d 1 d 0 ) = dn × b + d n−1 × b + … + di × b + … + d1 × b + d0 × b = (N ) 10 =
b
Onde N terá outros dígitos na base 10, como visto nos exemplos anteriores.
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 39/90
14/11/22, 09:37 Aritmética computacional em Python
Para converter um número inteiro positivo N na base 10, para uma base b, é
necessário determinar os seus respectivos dígitos: di, de (dn dn-1....di,...d1 d0 )b.
Para entender o procedimento, devemos nos lembrar do algoritmo da divisão de
números inteiros positivos, onde, ao dividir um número D por um número d,
obtém-se um quociente q e um resto r; e quando r=0, dizemos que a divisão foi
exata e o resto só pode assumir os valores de 0,1,2...d-1. Formalizando por
símbolos matemáticos:
Agora, vamos fazer a divisão de N, na base 10, pela base b que deseja se
transformar. Dessa forma, D=N e d=b, sendo necessário descobrir quem será o q
e o r. Lembrando o princípio da igualdade: se A=b, então, B=A. Podemos observar
que, na mudança da base b para a base 10, temos:
n n−1 i 1 0
dn × b + d n−1 × b + … + di × b + … + d1 × b + d0 × b = (N ) 10 = N
n n−1 i 1 0
N = dn × b + d n−1 × b + … + di × b + … + d1 × b + d0 × b
n−1 n−2 i−1 0
q = dn × b + d n−1 × b + … + di × b + … + d1 × b
expressão, obtém-se:
Então, quando dividimos o número inteiro positivo N, na base 10, por um número
b na base desejada, obtemos o resto r igual ao último digito d0 da representação
de N-decimal na base b. Sabemos, pelo exemplo anterior, que 2605 = (A2D)16,
onde a letra D é o ultimo dígito na representação da base 16; de fato, quando
dividimos 2605 por 16, resulta, como quociente, q=162 e resto r=13, que, na
representação na base 16, é a letra D.
Atenção
Define-se como bit (binary digit) o elemento de memória básico de um
computador que assume dois estados, que são representados pelos dígitos zero
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 41/90
14/11/22, 09:37 Aritmética computacional em Python
Comentário
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 42/90
14/11/22, 09:37 Aritmética computacional em Python
Existem diversas formas de resolver esse problema, mas não é o objetivo deste
conteúdo.
1 0 −1 −2
9 × 10 + 5 × 10 + 3 × 10 + 2 × 10
Agora, vamos generalizar essa ideia: um número real r na base dez (10), com n+1
dígitos na parte inteira e m dígitos na parte fracionária, pode ser representado
como:
r = (d n d n−1 … d i , … d 1 d 0 , d −1 d −2 … d −m )
10
n n−1 1 0 −1
d n × 10 + d n−1 × 10 + … + d 1 × 10 + d 0 × 10 + d −1 × 10
−2 −m
+d −2 × 10 + … + d −m × 10
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 43/90
14/11/22, 09:37 Aritmética computacional em Python
r = (d n d n−1 … d i , … d 1 d 0 , d −1 d −2 … d −m )
b
n n−1 1 0 −1 −2 −m
dn × b + d n−1 × b + … + d1 × b + d0 × b + d −1 × b + d −2 × b + … + d −m × b
i f
É a parte inteira. É a parte fracionária.
−1 −2 −m
r = (0, d −1 d −2 … d −m ) = d −1 × b + d −2 × b + … + d −m × b
b
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 44/90
14/11/22, 09:37 Aritmética computacional em Python
−1 −m+1
r × b = d −1 + d −2 × b + … + d −m × b
Obtém-se uma parte inteira, d-1, e a parte fracionária começa com d-2.
Multiplicando a parte fracionária restante por b, o resultado será d-2, e, assim,
sucessivamente. A seguir, veremos dois exemplos de conversão dos número
reais 0,625 e 0,2 para a base binária, o seja base dois (2):
Exemplo 1 Exemplo 2
0,625 x 2 = 1,250 = 1 + 0,250 0,2 x 2 =0,4 = 0 + 0,4
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 45/90
14/11/22, 09:37 Aritmética computacional em Python
Esses dois exemplos ilustram que é possível, numa transformação de base dois
de um número real na base 10, obter um resultado cuja representação possui um
número finito de zeros e um ou um número infinito (dízima periódica) de zeros e
um.
−1 −2 −m
r = (0, d −1 d −2 … d −m ) = d −1 × b + d −2 × b + … + d −m × b
b
Por exemplo, converter o número (0,561)8 para a base 10, aplicando a fórmula:
−1 −2 −3
(0, 561) 8 = 5 × 8 + 5 × 8 + 5 × 8 = 0, 720703124
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 46/90
14/11/22, 09:37 Aritmética computacional em Python
e
r = ±M × b
Onde:
M b≥2 e
É um inteiro real não É um número inteiro É chamado de expoente.
negativo, chamado de positivo, chamado de
mantissa. base.
No entanto, essa notação possui uma ambiguidade. O número 0,1, por exemplo,
pode ser representado de formas equivalentes:
∘ −1 1 2 −2
0, 1 × 10 = 1 × 10 = 0, 01 × 10 = 0, 001 × 10 = 50 × 10 = …
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 47/90
14/11/22, 09:37 Aritmética computacional em Python
−1
M = 0 se r = 0 e b ≤ M < 1 se r ≠ 0
Mantissa Expoente
Alterar para um número finito p de Criar um intervalo para o expoente, ou
dígitos. seja, o expoente e possui um valor
mínimo (emin) e um valor máximo
(emax).
A notação que usaremos é FP(b,p, emin, emax), para nos referirmos ao número no
sistema de ponto flutuante de base b, na qual a mantissa possui p dígitos (na
base b) e os expoentes estão contidos no intervalo fechado [emin, emax], ou seja,
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 48/90
14/11/22, 09:37 Aritmética computacional em Python
representar o número real 0,1x10100, pois o expoente é igual a 100 > 99, que é o
expoente máximo.
Atenção
Em uma modelagem matemática, isso é chamado de overflow. De maneira
semelhante, 0,1x10-100, e o motivo é o mesmo -100<-99, que é o valor mínimo.
Essa situação é definida como underflow.
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 49/90
14/11/22, 09:37 Aritmética computacional em Python
Questão 1
A (E2A)6
B (111)6
C (325)6
D (235)6
E (125)6
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 50/90
14/11/22, 09:37 Aritmética computacional em Python
>>> print(str(d2)+str(d1)+str(d0))
325
Questão 2
A (11,1)4
B (111)4
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 51/90
14/11/22, 09:37 Aritmética computacional em Python
C (10,1)4
D (1,11)4
E (10,1)4
>>>N = 5; d0 = (N % 4);
>>> print(str(d1)+str(d0))
11
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 52/90
14/11/22, 09:37 Aritmética computacional em Python
f =0.25
d=1, x =0.000000
Ao final deste módulo, você será capaz de distinguir os principais tipos de erros computacionais.
Erros de representação
Caso não seja possível representar o número real r no sistema de ponto flutuante
com exatidão, existem duas técnicas possíveis fl(r):
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 54/90
14/11/22, 09:37 Aritmética computacional em Python
Essa técnica é a mais comum e tem por objetivo reduzir o erro entre o
ponto flutuante fl(r) e o valor exato r, ou seja, o valor mais próximo.
Utilizando o exemplo anterior, aproximar fl(r) para 0,3416x10 tem um erro
menor que aproximar para o valor truncado.
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 55/90
14/11/22, 09:37 Aritmética computacional em Python
Atenção
Os arrendondamentos por truncamento e aproximação são realizados somente
na mantissa, ou seja, não é considerado erro no expoente.
t t t
E = f l(r) − r = m × b − M × b = (m − M ) × b
1
t−p
t−p |E| ⩽ b
|E| ⩽ b 2
É possível demonstrar que para o truncamento e para
aproximação. Define-se como erro relativo e:
f l(r) − r
e = ou f l(r) = (1 + e)r
r
1−p
e ⩽ u = b
De maneira análoga, pode-se demonstrar que para o truncamento
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 56/90
14/11/22, 09:37 Aritmética computacional em Python
1
1−p
e ⩽ u = b
2
e para a aproximação, onde u é chamado de unidade de
arrendondamento.
Exemplo
Para determinar a unidade de arrendondamento u de FP(2,24,-99,99) para o
truncamento, temos:
Soma Subtração
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 57/90
14/11/22, 09:37 Aritmética computacional em Python
a c a c
x1 + x2 = m1 b + m2 b = (m 1 + m x 1 − x 2 = m 1 b − m2 b = (m 1 − m
Multiplicação Divisão
a c a c
x 1 ×x 2 = m 1 b ×m 2 b = (m 1 ×m 2 ) x 1 ÷x 2 = m 1 b ÷m 2 b = (m 1 ÷m 2 )
Soma Subtração
y= x1 + x2 y= x1 - x2
Multiplicação Divisão
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 58/90
14/11/22, 09:37 Aritmética computacional em Python
y= x1 * x2 y= x1 / x2
∘ ∘
f l(1/7) = (0, 1429) ∗ 10 = (0, 1429) ∗ 10
∗ −1 ∗ ∘
f l(1/60) = (0, 1667) 10 = (0, 1667) 10
∗ ∘
y = f l(1/7) + f (1/60) = (0, 1596) ∗ 10
Adição expand_more
Como sabemos:
y
^ = f l (x 1 + x 2 ) = (1 + e 1 )x 1 + (1 + e 2 )x 2
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 59/90
14/11/22, 09:37 Aritmética computacional em Python
^ − y = e1 x1 + e2 x2
E = y
O erro relativo:
E x1 x2
e = = e1 ( ) + e2 ( )
y x1 + x2 x1 + x2
E a estimativa:
∗
|E| ≤ 2u y e |e| ≤ 2u
Subtração expand_more
^ = f l (x 1 − x 2 ) = (1 + e 1 )x 1 − (1 + e 2 )x 2
y
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 60/90
14/11/22, 09:37 Aritmética computacional em Python
^ − y = e1 x1 − e2 x2
E = y
E x1 x2
e = = e1 ( ) + e2 ( )
y x1 − x2 x1 − x2
E as respectivas estimativas:
∗
|E| ≤ 2u (|x 1 | + |x 2 |) e |e| ≤ 2u ((|x 1 | + |x 2 |)/ (|x 1 − x 2 |))
Multiplicação expand_more
y
^ = f l (x 1 × x 2 ) = (1 + e 1 ) (1 + e 2 )x 1 x 2
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 61/90
14/11/22, 09:37 Aritmética computacional em Python
E = [(1 + e 1 ) (1 + e 2 ) − 1]x 1 x 2
e = (1 + e 1 ) (1 + e 2 ) − 1
Ou seja:
Divisão expand_more
(1 + e 1 )x 1
y
^ = f l (x 1 ÷ x 2 ) =
(1 + e 2 )x 2
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 62/90
14/11/22, 09:37 Aritmética computacional em Python
(1 + e 1 ) x1
E = [ − 1]
(1 + e 2 ) x2
(1 + e 1 )
e = − 1
(1 + e 2 )
Ou seja:
x1
f l (x 1 ÷ x 2 ) = (1 + e) com |e| ≤ 3u
x2
Exemplo
maneira |E| = 0,60 * 10-6 e |e| = 1,5. Agora, observamos que, embora o erro
absoluto seja pequeno, o erro relativo foi alto. Esse problema é conhecido como
cancelamento, sendo comum nas operações que envolvem subtração. Existem
técnicas para diminuir o cancelamento e uma delas é acrescentar 1 ou 2 dígitos
na representação do número arredondado no sistema de ponto flutuante
utilizado.
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 63/90
14/11/22, 09:37 Aritmética computacional em Python
3000
Σ xk xk
k=1
y= para constante e igual a 0,5, o valor
exato é 15000;
3000
Σ xk xk
k=1
y= para constante e igual a 0,1, o valor
exato é 3000.
Python
content_copy
1 # Soma 1
2 >>>soma = 0.1 + 0.1 + 0.1
3 >>>print('soma = '+str(val))
4 soma =0.30000000000000004
5
6 # Soma 2
7 >>>n = 30000
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 64/90
14/11/22, 09:37 Aritmética computacional em Python
8 >>>lista1 = [0.5] * n
9 >>> print('sum(lista1) = '',sum(lista1)')
10 sum(lista1) = 15000.0
11
12 # Soma 3
13 >>>n = 30000
Questão 1
A 0.710 e 0.00250000
B 0.716 e 0.00031340
C 0.731 e 0.00030396
D 0.713 e 0.00030369
E 0.713 e 0.00030396
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 66/90
14/11/22, 09:37 Aritmética computacional em Python
>>>n_exato = 2345.713
>>>n_aprox = 2345.000
>>>print(E_abs)
>>>E_relativo = E_abs/n_exato
>>>print(E_relativo)
0.7130000000001928
0.0003039587536924563
Questão 2
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 67/90
14/11/22, 09:37 Aritmética computacional em Python
√2
1 2
x n+1 = (x n + )
2 xn
x0 = 1 x1
chute inicial e .
A 0,05882
B 0,00173
C 0,02222
D 0,33333
E 0,00001
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 68/90
14/11/22, 09:37 Aritmética computacional em Python
1 2 x1 − x0
x0 = 1 x1 = (x 0 + ) = 1.500, = 0, 33333
2 x0 x1
Ao final deste módulo, você será capaz de calcular zeros de funções não lineares utilizando Python.
x0
É dado um valor inicial ( ), que, às vezes, chamamos de
chute inicial.
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 70/90
14/11/22, 09:37 Aritmética computacional em Python
x1
É calculado o próximo valor , geralmente, com a seguinte
x1 = x0 + p
formulação matemática: , onde p é um passo.
O passo pode ser constante ou depender de x, ou seja, p(x).
x i+1 p(x i )
São calculados os próximos até o ficar tão
pequeno quanto desejamos, normalmente adotado em uma
tolerância, tol. Então, a iteração pode ser dada pela seguinte
anotação:
x i+1 = x i + p (x i ), |p (x 1 )| ≥ tol
√2
Agora, vamos determinar a raiz quadrada de dois, usando o método iterativo,
x0 = L
com chute inicial . Seja x o valor que queremos encontrar, então,
2 2
x = √2 ⇒ x = 2 2x
; somamos em ambos os lados .
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 71/90
14/11/22, 09:37 Aritmética computacional em Python
2 2 2
2x + x = 2x + 2
2 2 2
2x + 2x = x + 2 ÷ (2x)
2
x − 2
x = x −
2x
2
x − 2
p (x) =
2x
2
x − 2
i
x i+1 = x i −
2x i
x0 = 1
Agora, com , temos:
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 72/90
14/11/22, 09:37 Aritmética computacional em Python
2 2
x − 2 1 − 2
0
x1 = x0 − = 1 − = 1, 5
2x 0 2 ⋅ 1
2 2
x − 2 1, 5 − 2
1
x2 = x1 − = 1 − = 1, 4167
2x 1 2 ⋅ 1, 5
Método da bisseção
O método da bisseção consiste na ideia de obter uma raiz, z, que esteja
exatamente no ponto médio de um intervalo. Esse intervalo é obtido pelo
processo iterativo do método, onde parte da hipótese que existe, pelo menos,
uma raiz contida nesse intervalo inicial. Além disso, esse intervalo inicial tem
como condição que os valores da função não linear, no intervalo entre os
extremos, tenham os sinais opostos.
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 73/90
14/11/22, 09:37 Aritmética computacional em Python
Seja o intervalo inicial I0 =[a0,b0] = [a,b], de tal modo f(a) . f(b)< 0, ou seja, f(a) e
f(b) possuem sinais contrários. Adotaremos a notação de Ii = [ai, bi], os intervalos
na primeira iteração i=1, na segunda iteração i=2, e, assim, sucessivamente. Para
x i+1
Ii, teremos o ponto médio, , isto é:
ai + bi
x 1+1 =
2
f (z i+1 ) = 0 z i+1
Se , então, é o zero da função e interrompe o algoritmo; se
f (z i+1 ). f (a i ) f (z i+1 ). F (b i )
não, deverá verificar o sinal de e . Caso
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 74/90
14/11/22, 09:37 Aritmética computacional em Python
Python
content_copy
1 >>>import math
2 >>>from numpy import sign
3 >>>def bisection(f,x1,x2,switch=1,tol=1.0e-9):
4 >>> f1 = f(x1)
5 >>> if f1 == 0.0: return x1
6 >>> f2 = f(x2)
7 >>> if f2 == 0.0: return x2
8 >>> if sign(f1) == sign(f2):
9 >>> print('Raiz não se encontra no intervalo
10 >>> n = int(math.ceil(math.log(abs(x2 - x1)/t
11 >>> for i in range(n):
12 >>> x3 = 0.5*(x1 + x2); f3 = f(x3)
13 >>> if (switch == 1) and (abs(f3) > ab
14 >>> and (abs(f3) > ab
Método do secante
O método do secante consiste, basicamente, em obter uma reta que contém os
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 75/90
14/11/22, 09:37 Aritmética computacional em Python
f (x)
é a interseção com a função . A diferença desse método com o de
bissecação é que não é necessário verificar a condição do Teorema de Bonzano:
f (x i−1 ) × f (x i )
é ou não menor que zero. O método está ilustrado no gráfico
a seguir.
x i+1
A expressão que determina o valor de é dada por:
f (x i )x i−1 − f (x i−1 )x i
x i+1 =
f (x i ) − f (x i−1 )
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 76/90
14/11/22, 09:37 Aritmética computacional em Python
f (x i )
x i+1 = x i + p i , onde pi =
[f (x i ) − f (x i−1 )/ (x i − x i−1 )]
Python
content_copy
1 >>>import sys
2 >>>def secant(f, x0, x1, eps):
3 >>> f_x0 = f(x0)
4 >>> f_x1 = f(x1)
5 >>> numero_de_iteracoes = 0
6 >>> while abs(f_x1) > eps and numero_de_iteracoe
7 >>> try:
8 >>> denominador = (f_x1 - f_x0)/(x1 -
9 >>> x = x1 - f_x1/denominador
10 >>> except ZeroDivisionError:
11 >>> print('Erro! - denominador zero p
12 >>> sys.exit(1)# Sair do programa cas
13 >>> x0 = x1
14 >>> x1 = x
Python
content_copy
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 78/90
14/11/22, 09:37 Aritmética computacional em Python
(x i , f (x i )) f (x)
somente com um ponto , determinar a reta tangente a função
nesse ponto e obter a interseção dessa reta, como o eixo-x, determinando xi+1,
como ilustra o gráfico a seguir.
g (x) = mx − n
De modo geral, a equação da reta é dada por , onde:
m n
É o coeficiente angular. É o termo independente.
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 79/90
14/11/22, 09:37 Aritmética computacional em Python
′
g(x) = f (x i ) − f (x i ) (x − x i )
x i+1
Logo, ao calcular , que é a interseção de g (x) com eixo-x, ou seja,
g (x i+1 ) = 0
, chegamos a:
f (x i )
x i+1 = x i −
′
f (x i )
f (x i )
x i+1 = x i −
′
f (x i )
Ou seja, o passo p_ipi do método de Newton . Porém, nem
sempre é possível obter o valor da derivada algebricamente; na maioria das
vezes, a derivada é obtida numericamente conforme vemos a seguir, com um
valor de h muito pequeno, determinado pelo modelo matemático:
f (x i + h) − f (x i )
′
f (x i ) ≃
h
Atenção
x0
O método de Newton é eficiente quando o chute inicial, , é próximo da raiz
que se deseja determinar. Algumas vezes, é interessante obter uma raiz
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 80/90
14/11/22, 09:37 Aritmética computacional em Python
Python
content_copy
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 81/90
14/11/22, 09:37 Aritmética computacional em Python
Questão 1
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 82/90
14/11/22, 09:37 Aritmética computacional em Python
M
−n
C = [1 − (1 + r) ]
r
Considere a seguinte equação: , em que C é o
capital emprestado, M é a mensalidade, r é a taxa de juro por cada período
(expressa como uma fracção) e n é o número de anos. Uma pessoa pode
pagar uma mensalidade de R$1.250,00. Se pretender contrair um empréstimo
de R$10.000,00 a 10 anos, qual é a taxa que poderá suportar?
OBS.: O valor da taxa deve estar entre 0.01 e 0.05. Use um método iterativo
que não recorra à derivada.
A 0,0151
B 0,0456
C 0,0428
D 0,0500
E 0,0482
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 83/90
14/11/22, 09:37 Aritmética computacional em Python
1250 −10
f (x) = [1 − (1 + x) ] − 10000 = 0
x
>>>import math
>>>from numpy import sign
>>>def biss(f,x1,x2,switch=1,tol=1.0e-9):
>>> f1 = f(x1)
>>> if f1 == 0.0: return x1
>>> f2 = f(x2)
>>> if f2 == 0.0: return x2
>>> if sign(f1) == sign(f2):
>>> print('Raiz não existe nesse intervalo')
>>> n = int(math.ceil(math.log(abs(x2 - x1)/tol)/math.log(2.0)))
>>> for i in range(n):
>>> x3 = 0.5*(x1 + x2); f3 = f(x3)
>>> if (switch == 1) and (abs(f3) > abs(f1)) / and (abs(f3) > abs(f2)):
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 84/90
14/11/22, 09:37 Aritmética computacional em Python
Questão 2
t
y = 7 (2 − 0.9 )
y = 10
Existe uma aldeia no sopé da montanha a uma distância de .O
gabinete de proteção civil advertiu os moradores da aldeia de que a lava
chegaria às suas casas em menos de 6 horas. Calcule, utilizando o método
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 85/90
14/11/22, 09:37 Aritmética computacional em Python
x
da
x
= a ln(a)
dx
Obs: .
A 5,3141
B 5,4113
C 5,3411
D 5,1341
E 5,3114
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 86/90
14/11/22, 09:37 Aritmética computacional em Python
t
f (x) = 7 (2 − 0.9 ) − 10 = 0
E sua derivada:
x
df (x) = −7 × 0.9 × ln(0.9)
>>>import numpy as np
>>>def f(x): return 7*(2 - 0.9**x) -10
>>>def df(x): return -7*(0.9**x)*np.log(0.9)
>>>def newtonRaphson(x,tol=1.0e-3):
>>> for i in range(30):
>>> dx = -f(x)/df(x)
>>> x = x + dx
>>> if abs(dx) < tol: return x,i
>>>print('Muitas iterações\n')
>>>x,numIter = newtonRaphson(2.0)
>>>print('x =', '{:6.4f}'.format(x))
>>>print('Numero de iterações =' ,numIter)
x = 5.3114
Numero de iterações = 3
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 87/90
14/11/22, 09:37 Aritmética computacional em Python
Considerações finais
Chegamos ao final deste conteúdo, no qual apresentamos conceitos
fundamentais para a modelagem matemática. Nesta, a representação numérica
em base binária possui limitações computacionais que podem causar erros.
Esses erros podem ser mensurados e, dependendo do conhecimento dos valores
exatos, podemos calculá-los.
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 88/90
14/11/22, 09:37 Aritmética computacional em Python
headset Podcast
Ouça, no podcast, uma explicação a respeito dos recursos do Python na
aritmética computacional e dos principais tipos de erros computacionais.
Referências
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 89/90
14/11/22, 09:37 Aritmética computacional em Python
IEEE. Standard for Floating-Point Arithmetic. In: EEE Std 754-2019 (Revision of
IEEE 754-2008), vol., no., pp.1-84, 22 July 2019, doi:
10.1109/IEEESTD.2019.8766229.
Explore +
Você pode acessar e realizar o download de bibliotecas de Python disponíveis
nos sites Phyton, Jupyter e Colaboratory.
https://stecine.azureedge.net/repositorio/00212ti/02279/index.html# 90/90