ARITMÉTICA DE PONTO FLUTUANTE/ERROS EM OPERAÇÕES NUMÉRICAS 1. Introdução O conjunto dos números representáveis em uma máquina (computadores, calculadoras,...) é finito, e portanto discreto, ou seja não é possível representar em uma máquina todos os números reais de um dado intervalo [a, b]. A implicação imediata desse fato é que o resultado de uma simples operação aritmética ou cálculo de uma função, realizadas com esses números, podem conter erros. 2. Representação de um número real em uma máquina Esta representação depende, em geral, da máquina utilizada. A aritmética de ponto flutuante é universalmente utilizada nos dias atuais. 2. Aritmética de ponto flutuante. Sistemas F(β β, t, m, M). Dado um número real não nulo. Este número é representado em ponto flutuante da seguinte forma: r = ± (0, d1d 2 d 3 K d t ) × β exp (2.1) Onde: (1) β é a base do sistema e d1, d2, d3, ..., dt é a mantissa (sequência de casas decimais do número). t é o número de dígitos da mantissa. (2) 0 ≤ d j ≤ (β − 1) , j = 1, K, t . (3) O expoente da base, o número representado por exp, está contido no intervalo de números inteiros [m,M]. Observações: 1. Em um sistema de ponto flutuante dito “normalizado” , d1 ≠ 0 ; 2. O número zero de um sistema de ponto flutuante normalizado tem sua representação particular: (2.2) Em linhas gerais a definição de um sistema de ponto flutuante é a seguinte: união de todos os números reais não nulos que podem ser representados por (2.1), verificados os requisitos (1),(2) ,(3) e a observação 1, com o zero que tem sua representação em (2.2). EXEMPLO: Considerando-se o sistema hipotético: F(10, 3, -5, 5). Os números com representação neste sistema podem ser representados da seguinte forma: r = ±0, d1d 2 d 3 × 10 exp Aqui, • β = 10 (a chamada base decimal) • 0 ≤ d j ≤ 9 , j = 1,2,3 ( d1 ≠ 0 ); • exp ∈ [−5 ,5] . & t = 3; Alguns números com representação em F: r1 = 0,123 × 10 2 r2 = −0,904 × 10 −3 O número 50 teria representação em F ? Observa-se o seguinte: r3 = 50 = 50,0 = 50,0 × 10 0 = 5,00 × 101 = 0,500 × 10 2 Ou seja, o número 50 neste sistema é representado da forma: 0,500 ×10 2 Da mesma forma: r4 = −0,012 = −0,012 × 10 0 = −0,120 × 10 −1 3) O sistema de ponto flutuante como um conjunto Já foi dito que os números representáveis em uma máquina são discretos. Isto quer dizer que eles podem ser representados por um conjunto finito. Ainda tomando o sistema do último exemplo. Pode-se escrever o seguinte: i = menor número não nulo, em valor absoluto, com representação em F i = 0,100×10-5 a = maior número não nulo, em valor absoluto, com representação em F a = 0,999×105 Assim, se um número real x tem representação em F: 0,100 × 10 −5 ≤ x ≤ 0,999 × 10 5 Ou, para se ter uma generalização: i≤ x ≤a Ou ainda, o conjunto de todos os números não nulos com representação em F pode ser escrito: GF = {x ∈ ℜ / i ≤ x ≤ a} Vejamos o que isto significa: Considerando-se o sistema F(10, 3, -5, 5) e os números: x1 = 0,107×107 x2 = 0,314×10-6 Observa-se que x1 > a (este número é maior que o maior número com representação em F – ocorrência de overflow) e x2 < i (este número é menor que o menor número com representação em F – ocorrência de underflow). Os dois números “não tem representação em F”, eles não estão contidos no conjunto GF. Obs.: overflow e underflow são considerados erros. Estes erros são cometidos quando é feita uma operação numérica em que o resultado, o seu valor absoluto, é maior que o maior número com representação na máquina usada. Ou quando este resultado, em valor absoluto, é menor que o menor número com representação na máquina usada. 4. Número de elementos de um GF (NF) Já foi dito que o conjunto de todos os números com representação em um sistema F é discreto (o conjunto tem um número finito de elementos). Deste modo, pode-se determinar esta quantidade de elementos (“contar” os elementos do conjunto). Seja, inicialmente, o sistema exemplo F(2, 3, -1, 2). Os números com representação neste sistema têm a forma: r = ±0, d1d 2 d 3 × 2 exp Onde, β = 2 ; t = 3 0 ≤ d ≤ 1 j d1 ≠ 0 exp ∈ [− 1,2] = {−1,0,1,2} Podem-se escrever todos os números positivos com os requisitos anteriores: 0,100×2-1 0,100×20 0,100×21 0,100×22 0,101×2-1 0,101×20 0,101×21 0,101×22 0,110×2-1 0,110×20 0,110×21 0,110×22 0,111×2-1 0,111×20 0,111×21 0,111×22 Foram escritos 16 números positivos. Com os números negativos, a contagem de números com representação neste sistema dobra: 32. Ou seja, somando-se o zero, que tem sua representação particular, 0,000×2-1, o número de elementos com representação neste sistema é: 33. Percebe-se que este sistema (o conjunto que o representa) tem poucos elementos. Um outro sistema, com uma quantidade maior de números representativos, poderia deixar a contagem, como feita acima, inviável. Para estes, pode-se usar o chamado princípio fundamental da contagem. Vejamos um exemplo: Seja o sistema F(10, 3, -2, 2). Um número com representação neste sistema tem a forma: r = ±0, d1d 2 d 3 × 10 exp Onde, β = 10 ; t = 3 0 ≤ d ≤ 9 j d 1 ≠ 0 exp ∈ [− 2,2] = {−2,−1,0,1,2} Trabalha-se com possibilidades para cada termo do número. Parte do número Sinal d1 d2 d3 10exp Possibilidades 2 9 10 10 5 + ou 1 ou 2 ou 3 ou ... ou 9 0 ou 1 ou 2 ou 3 ou ... ou 9 0 ou 1 ou 2 ou 3 ou ... ou 9 10-2 ou 10-1 ou 100 ou 101 ou 102 O produto dos números da coluna “possibilidades” dá o número de elementos não nulos com representação no sistema: N = 2 × 9 × 10 × 10 × 5 = 9000 Somando-se o zero do sistema (que tem sua representação particular), N F = N + 1 = 9001 Tem-se então que o número de elementos com representação no sistema deste exemplo é 9001. A generalização para um sistema F(β, t, m, M) pode ser feita com facilidade. A forma do número com representação neste sistema: r = ± (0, d1d 2 d 3 K d t ) × β exp Montando-se a tabela de possibilidades: Parte do número Sinal d1 d2 d3 Possibilidades 2 β–1 β β M M dt βexp β (M – m) + 1 Observa-se na tabela que β aparece sozinho t – 1 vezes (d2 até dt). Quando o produto é feito tem-se: N = 2( β − 1) β t −1 [( M − m) + 1] Esta equação representa a quantidade de números não nulos com representação em um sistema. Somando-se o zero do sistema, tem-se a quantidade total de elementos de F: N F = N + 1 = 2( β − 1) β t −1 [( M − m) + 1] + 1 Obs.: O número de possibilidades para βexp é obtido pela contagem dos elementos do intervalo de inteiros [m, M]. Pode-se chegar à equação que está na tabela a partir de alguns exemplos simples: I = [1, 4] = {1, 2, 3, 4} NI = 4 = (4 -1) + 1 I = [2, 7] = {2, 3, 4, 5, 6, 7} NI = 6 = (7 -2) + 1 I = [-1, 3] = {-1, 0, 1, 2, 3} NI = 5 = [3 – (-1)] + 1 Assim: I = [m, M] NI = (M – m) +1 Exemplo: Usando-se a equação obtida para NF, será calculada a quantidade de números com representação no sistema F(10, 4, -99, 99): N F = 2(10 − 1)103 [(99 + 99) + 1] + 1 = 3582001elementos. 5. Arredondamento/truncamento de um número Considerando-se o sistema de base decimal F(10, 4, -5, 5). Pode-se escrever: a = 0,9999×105 i = 0,1000×10-5 Supondo-se que uma operação aritmética realizada nesta máquina resulte no número indicado abaixo: R1 = 0,2034685×103 Este número, em valor absoluto, está entre a e i. No entanto ele tem 7 dígitos na mantissa, enquanto o sistema exemplo “trabalha” com 4 casas decimais (t = 4). Nesse caso, para o sistema, o número R1 assume a seguinte forma: R1 = 0,2035×103 ou, R1 = 0,2034×103 No primeiro caso ouve um arredondamento, o sistema escreve o número “mais próximo” a R1 com 4 dígitos na mantissa. No segundo caso, o sistema “desconsiderou” todos os dígitos após a quarta decimal. Obs.: Ainda com respeito ao arredondamento. Considerando-se último sistema e o número: R = 0,13476 × 10 2 . Para este número são escritos duas aproximações: R 1 = 0,1347 × 10 2 e R 2 = 0,1348 × 10 2 Efetuando-se as operações: R − R 1 = 0,13476 × 10 2 − 0,1347 × 10 2 = 0,006 R − R 2 = 0,13476 × 10 2 − 0,1348 × 10 2 = 0,004 Tem-se aqui; R − R1 > R − R 2 Isto quer dizer que a aproximação “desvio” R 2 está “mais próxima” do número R (o R − R 2 é menor que o desvio R − R 1 ). O arredondamento do número está indicado por R2. Exemplo: A tabela seguinte ilustra os conceitos de arredondamento e truncamento. F(10, 3, -4, 4) Número Representação na base 10 (livre) arredondamento truncamento (I) 1,168 0,1168×101 0,117×101 0,116×101 (II) 10,05 0,1005×102 0,101×102 0,100×102 (III) -238,15 - 0,23815×103 - 0,238×103 - 0,238×103 (IV) 0,000007 0,7×10-5 UNDERFLOW (V) 718235,82 0,71823582×106 OVERFLOW Observação: O número (II), 0,1005×102, foi “arredondado” para 0,101×102. Contudo este arredondamento poderia ser 0,100×102. A razão para isto vem da definição de arredondamento mostrada anteriormente. Observa-se o seguinte: 0 ,1005 − 0 ,101 = 0 ,1005 − 0 ,100 Ou seja, o desvio dos dois arredondamentos em relação ao número 0,1005 é o mesmo. Quando o último dígito de um número é 5 o seu arredondamento pode ser feito por um critério qualquer. Um dos critérios usados é o “arredondamento no corte de dígito” que arredonda o número sempre para o maior valor. 6. Erros em operações numéricas Quando se faz uma operação numérica é necessária a definição do número de casas decimais que será usado. Por causa disto, eventualmente haverá arredondamentos a serem feitos (ou truncamentos). Estes arredondamentos (aproximações que são feitas para que uma certa quantidade de casas decimais seja verificada) geram erros (afastam o valor real da operação do valor aproximado). Como o arredondamento é inevitável, esses erros tem que ser “tolerados”. Exemplo ilustrativo: Sejam os números, x = 0,937×104 e y = 0,1272×102 Pode-se escrever o segundo número da seguinte maneira: y = 0,001272×104 Portanto, somando-se os dois números: S = x + y = 0,938272×104 Em um sistema que trabalha com uma mantissa de quatro dígitos (t = 4): S = 0,9383×104 no arredondamento S = 0,9382×104 no truncamento Erro devido ao arredondamento: Observa-se a “perda” de casas decimais quando a soma foi escrita no sistema escolhido. Isto gera um “afastamento” da aproximação erro. S em relação ao valor exato S. Este afastamento constitui um Costuma-se usar equações para se ter uma medida relativa deste erro. (1) Erro absoluto (desvio absoluto) E A = S − S = 0 ,28 (2) Erro relativo ER = S −S = 0,298 × 10 −4 S Observação: Os valores dos erros absoluto e relativo, para o último exemplo ilustrativo, não produzem conclusões definitivas. O valor de um erro pode ter significância se os parâmetros envolvidos forem grandezas físicas (pressão, temperatura, condutividade elétrica,...), ou quando se têm o cálculo do erro várias vezes, de forma seqüencial, comparando os seus valores. Outro exemplo envolvendo erro em operação numérica Seja a função linear f(x) = 7x – 3. Pretende-se encontrar o valor de x tal que f(x) = 0. Este problema consiste, simplesmente, em resolver a equação: 7x – 3 = 0 Então tem-se: x = 3/7 Escrevendo-se este número usando ponto flutuante: x = 0,428571428.... O número apresentou-se com um número de casas decimais infinitas. Como uma máquina trabalha com uma mantissa definida, este número teria que ser arredondado. 1º caso: Supondo que se desejasse trabalhar com três casas decimais: x = 0,429 Aplicando-se este valor na função: f ( x ) = 7(0,429) − 3 = 0,003 Este valor não retorna à função o valor zero. A diferença é considerada um erro devido ao arredondamento. 2º caso: Usando, agora, 4 casas decimais: x = 0,4286 Aplicando-se este valor na função: f ( x ) = 7(0,4286) − 3 = 0,0002 Novamente a função não retornou o valor zero para a função. No entanto a “distância” ao zero diminuiu. Levando-se estes resultados para analisar as operações numéricas de um modo geral, pode-se dizer que para alcançar uma maior precisão deve-se usar uma quantidade de casas decimais maior. Na maioria dos processos numéricos isto acarreta num aumento do número de operações numéricas envolvidas no processo (aumento do “tempo computacional”).