• Nenhum resultado encontrado

Uma biblioteca intervalar baseada em processamento de strings

N/A
N/A
Protected

Academic year: 2021

Share "Uma biblioteca intervalar baseada em processamento de strings"

Copied!
106
0
0

Texto

(1)Pós-Graduação em Ciência da Computação. “UMA BIBLIOTECA INTERVALAR BASEADA EM PROCESSAMENTO DE CARACTERES” POR. Ivan Oliveira Bernardo Leite Dissertação de Mestrado. Universidade Federal de Pernambuco posgraduacao@cin.ufpe.br www.cin.ufpe.br/~posgraduacao. RECIFE, Agosto/2007.

(2)

(3) UNIVERSIDADE FEDERAL DE PERNAMBUCO CENTRO DE INFORMÁTICA PÓS-GRADUAÇÃO EM CIÊNCIA DA COMPUTAÇÃO. IVAN OLIVEIRA BERNARDO LEITE. “UMA BIBLIOTECA INTERVALAR BASEADA EM PROCESSAMENTO DE STRINGS”. ESTE TRABALHO FOI APRESENTADO À PÓS-GRADUAÇÃO EM CIÊNCIA DA COMPUTAÇÃO DO CENTRO DE INFORMÁTICA DA UNIVERSIDADE FEDERAL DE PERNAMBUCO COMO REQUISITO PARCIAL PARA OBTENÇÃO DO GRAU DE MESTRE EM CIÊNCIA DA COMPUTAÇÃO.. ORIENTADOR(A): MARCÍLIA ANDRADE CAMPOS. RECIFE, AGOSTO/2007.

(4) Leite, Ivan Oliveira Bernardo Uma biblioteca intervalar baseada em processamento de strings / Ivan Oliveira Bernardo Leite. – Recife: O Autor, 2007. xi, 93 p. : il., fig., tab., quadro. Dissertação (mestrado) – Universidade Federal de Pernambuco. CIn. Ciência da Computação, 2007. Inclui bibliografia. 1. Análise intervalar. 2. Computação científica. 3. Processamento de strings. 4. JAVA I. Título.. 511.42. CDD (22.ed.). MEI2008-008.

(5) DEDICATÓRIA. Dedico. esta. dissertação. em. especial a meu pai, minha mãe e meus irmãos,. minha. Andrade. Campos. Patrícia Pires.. orientadora. Marcília. e minha analista.

(6)

(7) AGRADECIMENTOS. Agradeço a meus pais por terem, em momentos de dificuldade, priorizado a educação e formação dos seus filhos e incentivando a todo instante a conclusão deste projeto. Professora Marcília Andrade Campos, sem ela este trabalho não teria sido concluído, sempre acreditou, motivou e lutou por este trabalho. Um agradecimento especial a Neíldes Paiva Vieira Pedrosa, minha gerente de projetos no CESAR, por ser muito paciente, compreensiva e flexível para a realização do mestrado. Ao Professor Antônio Carlos Monteiro do departamento de Matemática da UFPE pela ajuda com algoritmos envolvendo números inteiros. Aos amigos Edmo Ribeiro, Vanilson Burgos, Jorge Mascena, Taíssa Rocha, Taciana Amorim, Eduardo Dominoni e Isabel Wanderley que foram espelhos e pessoas que conviveram comigo durante o curso de pós-graduação, interagindo, cooperando, dividindo angustias e incentivando. A todos os meus amigos que me dão a alegria e o prazer da convivência. Por entenderem minha ausência durante a conclusão deste trabalho..

(8) RESUMO. Java é uma linguagem multiplataforma amplamente utilizada nos dias atuais. Sistemas cliente-servidor, aplicações embarcadas e desktop são desenvolvidos a partir da facilidade que Java oferece. A comunidade que utiliza Java cria suas próprias bibliotecas e as disponibiliza na Web para que todos possam compartilhar de suas facilidades. Bibliotecas para criar servidores HTTP, processar imagens, conectar banco de dados fazem parte do núcleo da linguagem. O objetivo deste trabalho é desenvolver uma biblioteca em Java para representar um novo sistema numérico que utiliza a matemática intervalar e a aritmética de exatidão máxima. As operações aritméticas são realizadas através de processamento de Strings. As principais conclusões deste trabalho foram: (i) a representação de números racionais processados através de strings permite que se trabalhe com precisão e exatidão superiores à Java-XSC e o Maple Intervalar, sendo o custo desta exatidão refletido no tempo das operações; (ii) para qualquer uma das operações, repetidas 1000 vezes, seu tempo total de processamento é menor do que 1 segundo. Palavras-Chaves:. Matemática. Processamento de Strings... intervalar,. Computação. científica,. Java,.

(9) ABSTRACT Java is a multiplatform language widely used nowadays. Client-server systems, embedded systems and desktop applications have been developed from java facilities. Java community creates his own libraries and publishes it on the web to share its functionalities with other members. Libraries to create HTTP Servers, process Images, Database connection are part of Java core. The goal of this work is to develop a Java library to represent a new numerical system that uses Interval mathematic and high precision arithmetic all arithmetic operations shall be executed using string processing. The main conclusions are: the rational number representation processed using Strings enables exactness and precision greater than Java-XSC and Interval Maple, being the exactness cost reflected in operations time. For any operation, 1000 times repeated, process total time is least than one second. Keywords: Intervals, Computational Mathematics, Java, String Processing..

(10) LISTA DE FIGURAS Figura 1. Seqüência de passos para processamento numérico ............................... 7 Figura 2. Distribuição dos números reais na reta ................................................... 10 Figura 3. Representação da primitiva float ............................................................. 13 Figura 4. Representação da primitiva double ......................................................... 13 Figura 5. Espaços da Computação Numérica ........................................................ 20 Figura 6. Representação gráfica do espaço dos Intervalos.................................... 24 Figura 7. Estrutura hierárquica da representação numérica................................... 25 Figura 8. Diagrama UML das Classes do Sistema. ................................................ 30 Figura 9. Diagrama UML da Classe Number.......................................................... 33 Figura 10.Somador (Modelo do full adder) ............................................................. 40 Figura 11. Resolução do carry e do caractere resultante por iteração. .................. 43 Figura 12. Elementos utilizados no algoritmo da divisão ........................................ 46 Figura 13. Definição mdc........................................................................................ 51 Figura 14. Definição mmc....................................................................................... 52 Figura 15. Dividendo da Iteração igual a Zero........................................................ 53 Figura 16 - Identificação da Periodicidade de uma Divisão .................................... 54 Figura 17. Colocando sob a mesma base de denominadores................................ 63 Figura 18. Exemplo do efeito do método que elimina o expoente e o sinal do denominador........................................................................................................... 63 Figura 19. Ajuste de um tipo Number com denominador null para a realização de uma adição ou subtração com outro tipo Number com denominador não-nulo...... 65 Figura 20 - Operação de normalização que iguala os expoentes de dois números 67.

(11) SUMÁRIO 1. Introdução ................................................................................................................ 1 1.2 Objetivos............................................................................................................. 4 2. Fundamentos ........................................................................................................... 6 2.1 Representação dos Reais nos Computadores ................................................... 7 2.1.1 Sistema de Ponto-flutuante .......................................................................... 8 2.2 Ponto-flutuante em Java................................................................................... 11 2.3 Aritmética intervalar .......................................................................................... 15 2.5 Aritmética de Exatidão máxima: ....................................................................... 20 2.5.1 Semimorfismo ............................................................................................ 22 2.6 Matemática Intervalar ....................................................................................... 23 2.6.1 Intervalo de Números Reais....................................................................... 23 2.6.2 Conjunto de Intervalos ............................................................................... 24 2.6.3 Operações aritméticas ............................................................................... 25 2.6.3.1 Adição Intervalar.................................................................................. 25 2.6.3.2 Pseudo-Inverso Aditivo Intervalar ........................................................ 25 2.6.3.3 Subtração Intervalar ............................................................................ 25 2.6.3.4 Multiplicação Intervalar ........................................................................ 25 2.6.3.5 Pseudo-Inverso Multiplicativo Intervalar .............................................. 25 2.6.3.6 Divisão Intervalar ................................................................................. 26 2.6.4 Operações Entre Conjuntos ....................................................................... 26 2.6.4.1 Interseção de Intervalos ...................................................................... 26 2.6.4.2 União de Intervalos.............................................................................. 26 2.6.4.3 União Convexa de Intervalos............................................................... 26 2.6.5 Outras operações....................................................................................... 26 2.6.5.1 Distância entre Intervalos .................................................................... 26 2.6.5.2 Diâmetro de um Intervalo .................................................................... 26 2.6.5.3 Ponto Médio de um Intervalo............................................................... 27 2.6.5.4 Valor Absoluto de um Intervalo............................................................ 27 2.7. Java-XSC ........................................................................................................ 28 3 Intervalos de Strings Numéricos ............................................................................ 29.

(12) 3.1 Arquitetura ........................................................................................................ 30 3.2 Processamento de Strings................................................................................ 31 3.3 Processamento de Strings em Java ................................................................. 32 3.4 Definição do Tipo Number ................................................................................ 33 3.5. Operações ....................................................................................................... 38 3.5.1 Comparação entre Strings ......................................................................... 38 3.5.2 Operações Aritméticas ............................................................................... 40 3.5.2.1 Adição Natural ..................................................................................... 40 3.5.2.2 Subtração Natural................................................................................ 41 3.5.2.3 Multiplicação Natural ........................................................................... 43 3.5.2.4 Divisão Natural .................................................................................... 46 3.5.2.5 Máximo Divisor Comum (MDC) ........................................................... 51 3.5.2.6 Mínimo Multiplo Comum (MMC) .......................................................... 52 3.5.2.7 Divisão Racional Desconsiderando o Sinal ......................................... 52 3.5.3 Métodos Aritméticos Públicos do Tipo Number.......................................... 60 3.5.3.1 Adição e Subtração Racional .............................................................. 61 3.5.3.2 Multiplicação Racional ......................................................................... 67 3.5.3.3 Divisão Racional.................................................................................. 68 3.5.4 Comparação entre tipos Number ............................................................... 69 4. Resultados ............................................................................................................. 71 4.1 Operações aritméticas com Strings .................................................................. 71 4.1.1 Adição ........................................................................................................ 71 4.1.2 Subtração................................................................................................... 72 4.1.3 Multiplicação .............................................................................................. 73 4.1.4 Divisão Inteira ............................................................................................ 73 4.1.5 Resto da divisão inteira .............................................................................. 74 4.1.6 máximo divisor comum .............................................................................. 74 4.1.7 mínimo multiplo comum ............................................................................. 75 4.2 Operações aritméticas com o Tipo Number ..................................................... 75 4.2.1 Adição ........................................................................................................ 75 4.2.2 Subtração................................................................................................... 76 4.2.3 Multiplicação .............................................................................................. 76.

(13) 4.2.4 Divisão ....................................................................................................... 76 4.2.5 Inverso multiplicativo.................................................................................. 77 4.3 Operações Intervalares .................................................................................... 78 4.3.1 Adição ........................................................................................................ 78 4.3.2 Subtração................................................................................................... 79 4.3.3 MultiplicaçÃo .............................................................................................. 79 4.3.4 Inverso Multiplicativo.................................................................................. 80 4.3.5 Divisão ....................................................................................................... 81 4.3.6 Intersecção................................................................................................. 82 4.3.7 União.......................................................................................................... 83 4.3.8 Distância .................................................................................................... 83 4.3.9 Diâmetro..................................................................................................... 84 4.3.10 Ponto Médio ............................................................................................. 84 4.3.11 Valor Absoluto.......................................................................................... 85 4.4 comparação entre resultados ........................................................................... 85 4.5 Comparação do Desempenho .......................................................................... 87 5 Conclusões e trabalhos futuros ............................................................................... 89 5.1 Trabalhos Futuros............................................................................................. 89 Referências ................................................................................................................ 91.

(14) 1. INTRODUÇÃO Erros numéricos à primeira vista podem errôneamente ter suas conseqüências restringidas a domínios simplistas, sem grandes repercussões ou implicações no diaa-dia das pessoas. O mundo e as sociedades em que vivemos hoje dependem de processos rápidos, ferrementas que auxiliem tomadas de decisão, sistemas de informação, entre outros sistemas que utilizam computadores que realizam cálculos através de sistemas numéricos como o de ponto-fixo ou ponto-flutuante. Estes sistemas são limitados e apresentam problemas e conseqüências quando utilizados. Por exemplo, em 1991 [VUIK] durante a guerra do golfo uma bateria de mísseis patriot americanos falhou ao interceptar um missil Iraquiano scud. O Míssil Iraquiano terminou matando 28 pessoas que estavam num acampamento militar. Um relatorio do Incidente revelou que um problema de software levou a falha. A causa foi um cálculo impreciso do tempo, devido a erros de aritmética computacional. O tempo do clock do sistema era medido em decimos de segundos sendo multiplicado por 1/10 para que o sistema trabalhaste em segundos. O cálculo era efetuado utilizando-se registradores de 24 bits de ponto-fixo. O resultado da multiplicação era truncado depois do 24º bit. O erro de truncamento quando multiplicado por um grande número provocava um erro significativo de aproximadamente 0.000000095. O míssil patriot ficou armazenado cerca de 100 horas. Multiplicando-se o erro gerado pela quantidade de decimos de segundos em 100 horas temos 0.000000095×100×60×60×10=0.34s. Sabendo-se que um Missil scud viaja a aproximadamente 1676 metros por segundo, Em 0.34s o míssil iraquiano percorre mais de meio Kilometro o suficiente para sair do alcance de rastreamento do míssil patriot. Em junho de 1996, o Ariane 5 [VUIK], foguete da companhia espacial européia explodiu 40 segundos após o seu lançamento, por ter perdido controle e altitude. Era sua primeira viagem e seu projeto tinha custado $7 bilhões. Investigações concluiram que a causa da explosão aconteceu por erro no software que controlava o sistema de referência inercial. Especificamente um número de ponto-flutuante de 64 bits relativo a velocidade horizontal do foguete em relação a plataforma de lançamento, foi convertido em um inteiro com sinal de 16 bits. O número era maior que 32768, o maior inteiro armazenável em um registrador de 16 bits.. 1.

(15) Erros numéricos também afetaram as eleições na Alemanha, problema só descoberto em 1992. Existia uma cláusula que afirmava que um partido só poderia ter cadeiras no parlamento se atingisse uma votação mínima de 5%. Se não atigiste este valor os votos eram perdidos. Num domingo o partido verde teria atingido exatamente 5% dos votos Depois dos resultados da eleição terem sido divulgados, descobriu-se que o partido verde tinha obtido apenas 4,97% dos votos. O programa que calculava as percentagens utilizava apenas uma casa decimal de precisão depois da vírgula e tinha arredondado para cima. Este sistema vinha sendo usado há muitos anos e ninguem tinha percebido este erro. Os votos foram recontados e o partido verde perdeu suas cadeiras no parlamento. No Brasil, a Embratel teve problemas no seu sistema de contabilidade implementado em Java. Uma falta de R$100.000 no faturamento mensal, gerando prejuízos para empresa devido a erros de arredondamento. À medida que a tecnologia de fabricação de hardware avança, a velocidade dos processadores aumenta permitindo um poder de processamento maior. Até que ponto pode-se abrir mão da precisão e exatidão numérica em troca de uma melhor performance de processamento? Lembrando que o erro na matemática abstrata é encarado como uma distância entre o valor real e sua aproximação e que num cenário do mundo real significa desperdício ou perda, em algum momento teremos que nos preocupar com a precisão, uma vez que a velocidade de processamento futuramente em alguns contextos não será mais um fator determinante. No cenário acadêmico atual de desenvolvimento de software no Brasil, a linguagem de programação Java [Sun Microsystems] tem grande influência por ter características como portabilidade, segurança e uma infinidade de bibliotecas para atender às mais diversas necessidades. A deficiência que esta linguagem apresenta no tratamento numérico é o que impulsiona a realização deste trabalho. A utilização de Java como uma linguagem para a computação científica tem como base a aritmética intervalar. Java, por ser uma linguagem multiplataforma e interpretada, tem que tratar as plataformas variadas com sistemas numéricos diversos. A solução atual para resolver problemas de ordem numérica é utilizar o tipo “java.math.BigDecimal”, esta abordagem, ainda assim não controla a propagação do erro e falha em algumas operações aritméticas simples. O Exemplo 1 foi implementado utilizando-se o JDK 2.

(16) 1.4.2 da Sun [Sun Microsystems]. Neste exemplo 10 iterações adicionam a razão de 0,1 à variável “d”. Todos os algoritmos estarão coloridos em vermelho e seus resultados na saída do console estarão coloridos em azul. Exemplo 1. Erro na adição entre tipos double private static void main(String args[]) { double d = 0.0; for (int i = 0 ; i < 10; i++) { d += 0.1; } System.out.println("Resultado = " + d); } Resultado = 0,9999999999999999.. Analisando o resultado da execução do trecho de código do Exemplo 1 acima, escrito em linguagem Java, o resultado esperado deveria ser 1, mas o valor obtido é 0,9999999999999999. Como é de conhecimento público, o sistema de ponto-flutuante representa apenas um subconjunto do conjunto dos números reais. À medida que operações aritméticas são realizadas o erro inerente a esta falha na representação dos números reais é propagado. A aritmética intervalar surge então como a técnica para controlar o erro máximo produzido por uma seqüência qualquer de cálculos. Sistemas computacionais que interagem com ferramentas de medição, amplamente utilizadas em Engenharia, Química e Física, sofrem da incerteza intrínseca do ato de medir. Medidas sujeitas a erro podem ser substituídas por um intervalo que contenha os limites da incerteza. Sistemas computacionais numéricos necessitam, em algum momento, de cálculo. de. fórmulas,. somatórios,. taxa. de. juros,. percentagens,. realizar. arredondamentos, truncamentos, etc. Em sistemas computacionais científicos esta necessidade é crítica, como em aplicações espaciais, bancárias, sistemas de segurança ou que tratem de grandezas numéricas de ordens elevadas. Nos bancários, por exemplo, qualquer erro de natureza numérica pode trazer prejuízo para os usuários e mantenedores do sistema.. 3.

(17) 1.2 OBJETIVOS Sistemas computacionais, tanto antigos como os mais recentes, são incapazes de representar todos os números reais. A representação dos números reais em computação é realizada através dos números de ponto-flutuante [CAMPOS e FIGUEIREDO, 2005], que provê uma representação binária capaz de armazenar uma quantidade finita de valores.. O objetivo deste trabalho é desenvolver uma biblioteca em Java para representar um novo sistema numérico que utiliza a matemática intervalar e a aritmética de exatidão máxima. As operações aritméticas são realizadas através de processamento de Strings. No modelo convencional, as operações aritméticas são realizadas em registradores com uma quantidade finita de bits ou emuladas em linguagem de programação (como Java) com tipos de dados com quantidades fixas de casas decimais. 1. A nova abordagem proposta utiliza intervalos com limites superiores e inferiores representados por um novo tipo que processa strings, assumindo a forma de números racionais. Calcular processando Strings é mais custoso do que utilizar a ULA, mas o quanto mais custoso é o que será avaliado. Será então medido o desempenho deste sistema comparando com o sistema numérico padrão de Java, Portanto o objetivo deste trabalho é alcançado através dos seguintes passos: Desenvolver uma biblioteca que contemple a inclusão do tipo Intervalo e das operações sobre esse tipo na linguagem Java, onde todas as operações serão realizadas por processamento de caracteres. A biblioteca será estruturada e implementada de forma modular da seguinte maneira: •. Definição do tipo Number,. •. Operações com o tipo Number,. •. Definição do tipo Intervalo,. •. Operações com o tipo Intervalo.. 4.

(18) 2. Comparar a performance do sistema desenvolvido neste trabalho com operações em Java e Java-XSC [JAVA-XSC]. Validação através da comparação dos resultados com o Maple Intervalar [MAPLE, INTPAKX] será realizada. Esta dissertação está estruturada como descrito abaixo: O Capítulo 2 contém os fundamentos dos sistemas de ponto-flutuante, aritmética de exatidão máxima e dos sistemas intervalares. O Capítulo 3 define o tipo Number como um tipo de Java e mostra como as operações são realizadas através de processamento de caracteres, suas regras de formação e restrições. Introduz o tipo Intervalo que utiliza o tipo Number. O Capítulo 4 apresenta o resultado das comparações das operações com os tipos Java nativos, comparações de exatidão com os tipos Java-XSC e o Maple Intervalar e testes comparativos de performance com o Java-XSC. Finalmente, o Capítulo 5 mostra as conclusões obtidas com o este trabalho, bem como explicita trabalhos futuros que podem ser realizados a partir da primeira versão da biblioteca desenvolvida.. 5.

(19) 2. FUNDAMENTOS Este capítulo apresenta os fundamentos para o desenvolvimento deste trabalho. Portanto, serão abordados sistemas de ponto-flutuante, ponto-flutuante em Java, matemática intervalar e aritmética de exatidão máxima. A representação dos números reais em computadores é uma questão importante desde os primórdios da história dos computadores. Os números reais inicialmente eram representados no sistema numérico de ponto fixo. A passagem para a representação em ponto-flutuante iniciou-se na década de 50 e caracterizou uma evolução significativa na área da computação científica, principalmente pela melhora da exatidão nos resultados de operações efetuadas em ponto-flutuante com cada vez mais dígitos significativos na mantissa. O tamanho da mantissa era dependente da máquina e ainda poderia ser variado, resultando os formatos conhecidos como precisão simples, dupla precisão e precisão estendida. A representação de um número em ponto-flutuante proporcionou muitas vantagens, mas também introduziu algumas desvantagens com a geração do problema do controle de erros nas computações numéricas, que muitas vezes proporcionaram resultados totalmente errados com aparência de serem corretos, ou seja, um procedimento correto, mas com o resultado perdendo o significado devido à inexatidão da representação numérica e de arredondamentos aplicados nas avaliações das operações e expressões aritméticas em ponto-flutuante. A resolução de problemas de computador na maioria das vezes é feita através de algoritmos. Os algoritmos numéricos são geralmente definidos e projetados no espaço dos números reais e complexos. Os cálculos, por sua vez, são efetuados no conjunto dos números representáveis e operáveis no computador. Este conjunto é finito e varia de máquina para máquina. Existem dois tipos de sistemas numéricos usados em computadores digitais, o sistema de ponto fixo e o sistema de ponto-flutuante. Cada um deles tem seu próprio conceito de aritmética computacional. O sistema de ponto fixo é utilizado em alguns sistemas financeiros e comerciais. No modelo de representação de números em ponto fixo, considera-se duas partes, uma inteira e outra fracionária. A caracterização consiste da base numérica utilizada (b), o número de dígitos (n) e o número de dígitos 6.

(20) da parte fracionária (f). Sendo representada pela terna ordenada P(b, n , f). Na seção seguinte veremos a caracterização dos sistemas de ponto-flutuante.. 2.1 REPRESENTAÇÃO DOS REAIS NOS COMPUTADORES Nesta seção será mostrado como os números reais são representados nos computadores, porque têm de ser representáveis e exemplos de propriedades algébricas dos reais que são perdidas com essa representação [CAMPOS e FIGUEIREDO, 2005]. Por último, além dos erros citados acima, o processamento numérico nos computadores é realizado na base 2, Figura 1, portanto, adicionalmente ainda têm-se os erros de conversão de base. O conjunto dos números reais é um corpo ordenado completo. O fato dos reais constituírem um corpo possibilita que nele sejam resolvidas equações do tipo ax = b, a ≠ 0, onde a solução única é x = a-1b. Como é completo, equações do tipo x2 = 2 têm solução. Por razões de ordem prática, os computadores, em geral, representam um número em ponto-flutuante com uma quantidade constante de bits.. Usuário digita números na base 10. Base 10. Usuário recebe resultados na base 10. Cálculos realizados na base 2. Base 2. Base 10 Base 2. Figura 1. Seqüência de passos para processamento numérico.. No caso dos reais é necessário substituí-los por outro conjunto que os represente, usualmente o dos números de ponto-flutuante. O problema, porém é que o conjunto dos números de ponto-flutuante, diferentemente dos reais, não tem 7.

(21) propriedades algébricas que garantam os resultados dos cálculos efetuados, além de não existir uma bijeção entre os conjuntos, um conjunto finito representando um não enumerável. Por exemplo, a soma de dois números de grande magnitude pode gerar overflow, ou seja, nem sempre a soma de dois números de ponto-flutuante é um número flutuante.. 2.1.1 SISTEMA DE PONTO-FLUTUANTE Um número de ponto-flutuante, x, é da forma : x = m x be = d1.d2...dl x be, onde, m é uma mantissa de comprimento l, b é a base, a qual é um inteiro maior ou igual a 2, e e é o expoente, tal que emin ≤ e ≤ emax são números inteiros. Os dígitos da mantissa são restritos a 1 ≤ d1 ≤ b -1 e 0 ≤ dk ≤ b -1, k =2,..., n. Porque d1 ≠ 0, x é denominado um número de ponto-flutuante normalizado. Um sistema de ponto-flutuante, F, é usualmente representado por: F (b, l, emin, emax) Sendo um número real X não nulo representado em F, na forma:. A representação do zero real, dos elementos de menor e maior valor absoluto, xmin e xmax, e o número de elementos de F, são respectivamente: emin. 0 = + 0.000…0 x b. xmin = + 0.10…0 x b. ,. emin. ,. emax. xmax = + 0.(b-1)(b-1)...(b-1) x b. ,. l -1. #F = 2(b-1)b (emax – emin + 1) + 1.. O termo número de ponto-flutuante deve-se ao fato de que o ponto se move no número dependendo do expoente da base. Alguns autores usam vírgula ao invés do ponto; neste trabalho adotou-se o ponto e que é a notação usada nas máquinas digitais.. 8.

(22) Exemplo 2. Seja o sistema de ponto-flutuante F = F(2, 3, -1, 2). Portanto F tem base binária, mantissa de 3 dígitos, o menor expoente é emin = -1 e o maior expoente emax = 2, assim a excursão do expoente vai de -1 a 2 e todos os expoentes deste sistema são {-1,0,1,2}, isto é, tem-se um total de 4 expoentes, que vem do cálculo emax – emin + 1. Para este sistema tem-se: Representação do zero:. 0 = + 0.000 x 2-1,. Maior elemento de F:. xmax = + 0.111 x 22,. Menor elemento de F:. -xmax = - 0.111 x 22,. Menor elemento positivo de F:. xmin = + 0.100 x 2-1,. Maior elemento negativo de F:. -xmin= - 0.100 x 2-1,. Número de elementos de F:. #F = 33.. Exemplos de sistemas de ponto-flutuante, são dados a seguir com diferentes bases: decimal (10), binária (2), octal (8), hexadecimal (16). a) PDP-11 : F(2, 24, -128, 127), b) Texas SR52 : F(10, 12, -98, 100), c) HP41C : F(10, 10, -98, 100), d) IBM 360/370: F(16, 6, -64, 63), e) B6700 : F(8, 13, -51, 77), f) UNICAC 1108 : F(2, 27, -128, 127).. O subconjunto dos números reais, R, que é representável em F são os números não igualmente espaçados localizados na região hachurada mais o zero na Figura 2 a seguir.. 9.

(23) -xmax. -xmin. 0. xmin. xmax. regiões de underflow regiões de overflow Figura 2. Distribuição dos números reais na reta. Além da restrição ao número de elementos, uma vez que R é não-enumerável e F é finito, propriedades algébricas que são válidas em R não são válidas em F. A referência [HÖLBIG] traz vários exemplos, porém aqui será mostrado no Exemplo 3, a falha na lei do corte aditiva que consiste na seguinte afirmação: ∀a, b, c ∈ R, a + b = a + c ⇒ b = c. Será mostrado que em F, ∃a, b, c ∈ F, tais que a + b = a + c não implica b = c . Exemplo 3. Sejam F = F (10, 4, -9, 9), a = 0.3245 x 102, b = 0.4587 x 10-3, c = 0.8764 x 10-4. Colocando os números na potência do maior expoente, a = 0.3245 x 102, b = 0.00004587 x 102, c = 0.000008764 x 102. Somando, a + b = 0.32454587 x 102, a + c = 0.324508794 x 102. Arredondando porque l = 4, a + b = 0.3245 x 102, 10.

(24) a + c = 0.3245 x 102. Portanto, tem-se que a + b = a + c, mas b ≠ c!. 2.2 PONTO-FLUTUANTE EM JAVA A linguagem Java oferece os seguintes elementos para representação de ponto-flutuante: •. Tipo primitivo float.. •. Tipo primitivo double.. •. Wrapped Classes – Float / Double do pacote java.lang [Sun Microsystems, 2005].. A seguir, nos Exemplos 4, 5, 6 e 7 estão erros em operações de pontoflutuante obtidos a partir da execução de um código fonte em Java, utilizando-se o JDK 1.4.2 da Sun: Exemplo 4. Subtração entre tipos double. public class exemplo4 { private static void main(String args[]) { double d = 3.9-3.8; if(d==0.1) { System.out.println("igual"); } else { System.out.println("diferente"); } } } diferente. A resposta para Exemplo 4 deveria ser a literal igual, mas executando-se o programa Java acima, obtém-se como resposta “diferente”, devido à operação resultar o valor 0.10000000000000009.. 11.

(25) No Exemplo 5 utilizamos um laço para adicionar um tipo double com ele mesmo quatro vezes e dividir pelo seu valor multiplicado por quatro, este processo se repete 10 vezes: Exemplo 5. Laço de divisões com o tipo double public static void main(String args[]) { double d = 0.1; for(int i = 0; i < 10; i++) { d = (d+d+d+d)/4*d; } System.out.println(“divisão==” + d); } divisão==0.0. O resultado desta seqüência de operações retorna na saída padrão o resultado zero! Costuma-se utilizar o tipo java.math.BigDecimal para contornar este tipo de problemas com o tipo double porém o Exemplo 6 abaixo demonstra que o tipo BigDecimal também apresenta falhas: Exemplo 6. Adição e Subtração com o tipo java.math.BigDecimal public static void main () { BigDecimal f = new BigDecimal(10E29); BigDecimal g = new BigDecimal(1); BigDecimal h = new BigDecimal(10E28); f = f.add(g); f = f.subtract(h); System.out.println("f=" + f); } f=900000000000000028451473981441. O. resultado. apresentado. na. saída. padrão. de. Java. para. f. é. 900000000000000028451473981441! Esses fatos ocorrem porque a implementação da representação de pontoflutuante na linguagem Java implementa de maneira parcial o padrão IEEE Standard for Binary Floating-Point Arithmetic, ANSI/IEEE Standard 754-1985 de aritmética de ponto-flutuante [Macaulay Institute, 2004]. Os tipos primitivos float e double da linguagem representam a precisão simples (32 bits) e a precisão dupla (64 bits), respectivamente, seguindo parcialmente o padrão. A seguir estão duas figuras que ilustram a representação das primitivas da linguagem Java. 12.

(26) 1 bit. 8 bits. 23 bits. sinal. expoente. significante. Figura 3. Representação da primitiva float. 1 bit. 11 bits. 52 bits. sinal. expoente. significante. Figura 4. Representação da primitiva double. A representação através da primitiva float oferece de seis a nove dígitos de precisão, enquanto que a representação double dentre quinze e dezessete dígitos de precisão [GOSLING, 1996]. Java requer que os resultados nas operações de ponto-flutuante sejam arredondados para o número mais exato que a máquina consiga representar. Para resultados inexatos a resposta deve ser aproximada para o valor mais próximo representável. Esta é mais uma definição do padrão 754 IEEE conhecida como round to nearest [GOSLING, 1996]. Operações entre números de ponto-flutuante em Java podem produzir exceções, que são tratadas da seguinte maneira: •. Operações que produzem overflow como resultado, apresentam uma representação de infinito como resposta;. •. Operações que produzem underflow como resultado, apresentam o valor zero como resposta;. •. Operações que geram resultados matemáticos não definidos produzem como resposta a notação NaN (Not a Number).. Uma vez que apresentamos problemas da representação de números de ponto-flutuante na linguagem Java e detalhamos sua representação e seus propósitos, vamos agora apresentar as discordâncias e inadequações dessa implementação com o padrão internacionalmente reconhecido ANSI/IEEE Standard. 13.

(27) 754-1985. A implementação de ponto-flutuante em Java falha nos seguintes aspectos em relação ao padrão IEEE [Macaulay Institute, 2004]: •. Ausência de suporte às seguintes flags de exceções: o Operação inválida, o Overflow, o Underflow, o Divisão por zero, o Resultados inexatos.. •. Não implementação dos arredondamentos direcionados;. •. Não oferecimento de suporte para os seguintes tipos de dados próprios para aritmética intervalar de máquina: o Tipo intervalo, o Tipos complexos, o Operações aritméticas intervalares, o Matrizes intervalares, o Operações matriciais intervalares.. Como mostrado acima, embora existam evoluções na representação numérica para os computadores, os problemas das operações computacionais não foram completamente resolvidos. Mesmo com o surgimento da padronização da representação de ponto-flutuante, que podemos eleger como a primeira solução para problema de exatidão e precisão de máquina, os erros de computação não estavam descartados de maneira satisfatória. Como a representação numérica de ponto-flutuante não conseguiu de maneira satisfatória minimizar esses problemas para programas de computação científica, surgiu a proposta de incluir a matemática intervalar como auxílio às linguagens de computador. Dessa maneira, pelo menos é possível garantir aquela incerteza das respostas. A definição e os propósitos da aritmética intervalar são descritos na. 14.

(28) próxima seção deste documento para mostrar ao leitor como este novo tipo de informação contribui para a garantia e exatidão de rotinas computacionais científicas.. 2.3 ARITMÉTICA INTERVALAR As pesquisas em aritmética computacional estão sendo desenvolvidas desde os anos sessenta, com o objetivo de controlar os erros computacionais e para que os computadores suportem uma aritmética muito mais poderosa e precisa que a aritmética empregada na maioria das linguagens modernas de programação. A aritmética proposta por Moore [MOORE], em 1966, possibilitou um grande desenvolvimento destas pesquisas. Esta aritmética trata com dados na forma de intervalos numéricos e tem como objetivo automatizar a análise de erro computacional. Serve para controlar o erro de arredondamento e para representar dados inexatos, aproximações e erros de truncamento de procedimentos. Atualmente, também vem sendo empregada na elaboração de algoritmos numéricos autovalidáveis. O uso da aritmética intervalar permite alta exatidão que é uma qualidade necessária nos ambientes que propiciam a resolução de problemas da computação cientifica e das engenharias. A minimização dos arredondamentos resulta em qualidade no resultado que também é uma das características necessárias à resolução de problemas de verificação de resultado. A necessidade de termos linguagens de programação para estas aritméticas computacionais com suporte à computação científica fez que surgissem, na cooperação de institutos de pesquisas universitários e empresas (como a IBM) as linguagens com extensões científicas, conhecidas como XSC, que é o acrônimo de Language Extensions for Scientific Computation. As. linguagens. XSC. provêem. características. indispensáveis. para. o. desenvolvimento de softwares numéricos modernos e aplicações científicas tais como: controle de arredondamento, tipos de dados com exatidão após a vírgula; bibliotecas com as principais rotinas matemáticas para a resolução de problemas, com arrays dinâmicos, conceito de operador (operadores definidos pelo usuário), tipos de dados não existentes nas linguagens comuns como o dado complex (complexo), interval (intervalo), além de outras características. 15.

(29) Nos últimos anos, a visão sobre a computação de rede ganhou uma crescente aceitação à medida que cada vez mais soluções computacionais se voltam para internet e redes sem fio. A linguagem de programação JAVA é amplamente utilizada para programação deste tipo de aplicações. Java é orientada a objetos, independente de plataforma, tem API’s destinadas a dispositivos móveis, servidores de aplicação e uma grande comunidade de usuários que colaboram criando novas bibliotecas. Esta linguagem associada a uma extensão científica poderá ser a primeira escolha nas aplicações computacionais e científicas na solução de problemas físicos, químicos e das engenharias que necessitam de alta exatidão ainda com a facilidade da programação voltada a Internet, dispositivos móveis e tv digital. A matemática intervalar busca resolver problemas que se concentram basicamente em dois aspectos: I. Na criação de um modelo computacional que reflita fidedignamente o controle e análise dos erros que ocorrem no processo computacional e, II. Na. escolha. de. técnicas. de. programação. adequadas. para. desenvolvimento de softwares científicos buscando minimizar os erros nos resultados. O usuário não pode afirmar a exatidão da resposta estimada sem o auxílio de uma análise de erro, que é extensa, dispendiosa e nem sempre viável. Assim, a matemática intervalar busca dar suporte a estes problemas. Para computarmos qualquer objeto é necessário representá-lo em um dispositivo computacional o qual é em essência finito. Infelizmente, muitos objetos fundamentais para resolvermos problemas do dia-a-dia, não são finitamente representáveis em máquinas. A solução de equações reais complexas é essencial para resolvermos problemas das engenharias e ciências da natureza, e economia, entretanto um número irracional não é finitamente representável. A solução deste tipo de plataforma utiliza as conhecidas aproximações que induzem a erros. O numero racional 3.14 aproxima o número irracional π =3.1415... Esta abordagem remete ao problema das limitações dessas aproximações, suscitando questões tais como se elas possuem as mesmas propriedades algébricas que os objetos que aproximam. 16.

(30) No caso dos números racionais, do ponto de vista algébrico, eles são perfeitos como aproximações de números reais, pois assim como os números reais, eles também constituem um corpo, possibilitando a substituição de equações de coeficientes irracionais por coeficientes racionais. Entretanto esta abordagem nos conduz ao bem conhecido erro de aproximação que é a distância entre o irracional e sua aproximação racional. Esse ainda não é o principal problema desta abordagem. O problema maior reside no fato de que esse erro de aproximação não obedece a qualquer lei durante as computações, o que pode levar a distorções em uma computação. O controle deste erro de aproximação durante as computações é feito por uma computação em paralelo, requerendo esforços computacionais extras. Existem três fontes de erros de computação numérica: A propagação de erros nos dados e parâmetros iniciais: Ao se tentar representar um fenômeno do mundo físico por meio de um modelo matemático raramente se tem uma descrição correta deste fenômeno. Normalmente, são necessárias várias simplificações do mundo físico para que se tenha um modelo matemático com o qual se posso trabalhar, tomando-se apenas algumas grandezas como tempo, temperatura, distancia, carga, entre outras. Estas são obtidas de instrumentos que têm precisão limitada de modo que a incerteza destes parâmetros iniciais levará conseqüentemente a incertezas dos resultados. A questão de como a incerteza dos dados contribui para a incerteza da resposta pode ser ignorada ou pode ser feita uma análise profunda com simulações ou com auxílio da experiência de pesquisador. A análise é freqüentemente difícil ou impossível, simulações são dispendiosas, especialmente em muitas dimensões e a experiência do pesquisador deve ser considerada com cautela. Este tipo de erro é o mais sério porque não é possível torná-lo arbitrariamente pequeno através da computação tradicional. •. Se o problema é calcular a área de um círculo de raio 6, na fórmula c = πr2, π deve ser representado por um número. A questão é que o conjunto de números disponíveis em qualquer computador é finito, assim como é finita a excursão de qualquer elemento deste conjunto. Em outras palavras, no modelo da matemática, o conjunto dos números reais, longe está de ser representável e operável por. 17.

(31) qualquer computador. Portanto, expressões como “para todo x real...”, não têm sentido em computações que exigem um processamento. numérico. automático,. incluindo. desde. os. calculadores que realizam operações básicas, aos computadores dos centros científicos.. Erros de Arredondamento: Para a resolução de modelos matemáticos, muitas vezes torna-se necessária à utilização de instrumentos de cálculo como computadores digitais. Sabemos que estes instrumentos de cálculo trabalham com números arredondados, ou seja, representam os números em forma finita de dígitos, de acordo com o seu sistema interno de reapresentação e que tais limitações geram erros durante as computações numéricas. Erros de truncamento: São erros provenientes da utilização de processos, que deveriam ser infinitos, para a determinação de um valor e que por razões práticas são truncados. Estes processos infinitos são muito utilizados na avaliação de funções matemáticas, tais como a função exponencial, logarítmica, funções trigonométricas e várias outras que uma máquina pode ter. A limitação dos dados de entrada e a acumulação do erro de arredondamento em qualquer seqüência finita de operações aritméticas podem ser ambas rigorosamente controladas, simplesmente pela utilização de aritmética de máquina ordinária. Assim espera-se que técnicas intervalares forneçam garantias e que possam ser aplicadas quase automaticamente. Uma resposta intervalar possui a garantia de sua incerteza.. 1   ∑ n=0  r  ∞. Como calcular. n. r ≠ 0? Não sendo possível realizar tal feito, a. ação tomada é truncar a expressão acima, ou seja, limitar sua operação para um valor passível de cálculo.. Foi por causa destes erros que surgiram os primeiros trabalhos buscando a sua resolução Sunaga [SUNAGA] fez o primeiro trabalho sobre intervalos munido de. 18.

(32) uma aritmética. Sunaga e Moore [MOORE], aparentemente, desenvolveram a mesma teoria, ao mesmo tempo, em lugares diferentes. Todavia sempre se refere a Moore quando se fala em matemática intervalar. Os trabalhos de Moore e Sunaga permitiram que uma idéia simples se transformasse numa poderosa ferramenta para análise de erros inerentes à computação científica. Assim, os algoritmos trabalham sobre intervalos em vez de números racionais, tendo como resultados da computação, intervalos que contém as soluções reais desejadas, cuja amplitude dá uma medida de sua qualidade. As respostas aos problemas dos erros de aproximação surgiram nos anos 60 com a aritmética intervalar proposta por Moore, que introduziu operações aritméticas de maneira a controlar este erro de aproximação, de modo que o resultado de uma operação com intervalos é novamente um intervalo. Esta abordagem define um intervalo fechado [a1;a2] como uma aproximação de todos os números reais pertences a ele. O computador pode ser definido como uma máquina digital, utilizada também para realizar cálculos, que tem como unidade fundamental de processamento o bit. Os bits que constituem as informações da memória do computador são utilizados para representar letras do alfabeto, números inteiros, imagens, vídeos, sons, aplicações comerciais, entre outros diversos tipos de informações. Todos os elementos acima citados apresentam como característica comum e principal o fato de poderem ser finitamente representados, ou seja, o computador possui uma maneira exata para representá-los a partir de uma determinada codificação. Os problemas para os computadores começam a surgir quando é necessário operar os números reais, os quais são representados pelos números de ponto-flutuante. A utilização de intervalos permite diminuir e controlar a perda de exatidão depois de repetidos cálculos numéricos com números de ponto-flutuante. Através da aritmética intervalar [MOORE], os números reais podem ser representados na forma de intervalos, e então passam a ser manipulados como tal, aproveitando todos os benefícios que esta representação pode proporcionar: exatidão numérica dos cálculos efetuados com verificação automática dos resultados.. 19.

(33) 2.5 ARITMÉTICA DE EXATIDÃO MÁXIMA A aritmética de exatidão máxima garante que o resultado de operações realizadas ou é um número de máquina ou está compreendido entre dois números de máquinas consecutivos. A Figura 5 a seguir lista todos os espaços da computação numérica do ponto de vista da aritmética de alta exatidão ou a aritmética computacional avançada.[CAMPOS, 1995]. Figura 5. Espaços da Computação Numérica. •. D e S representam os conjuntos dos números de ponto-flutuante de precisão dupla(D) e Simples (S). VD e VS são os conjuntos dos vetores cujos elementos são números de ponto-flutuante de precisão dupla e simples, respectivamente. MD e MS, conjunto das Matrizes cujos elementos são números de ponto-flutuante de precisão dupla e simples, respectivamente.. •. R, conjunto dos números reais. VR, espaço dos vetores cujas componentes são números reais. MR, espaço das matrizes cujos elementos são números reais.. •. C, conjunto dos complexos. VC, espaço dos vetores cujas componentes são números complexos. MC, espaço das matrizes cujos elementos são números complexos. VCD, MCS conjunto dos vetores e matrizes complexas de ponto-flutuante de precisão dupla e simples, respectivamente.. 20.

(34) •. IR, espaço dos intervalos de reais. Os elementos da tabela iniciados por I indicam espaços de intervalos. Assim IVR, por exemplo é o espaço dos intervalos cujas componentes são vetores de números reais; IS, é o conjunto dos intervalos cujos limites são números de ponto-flutuante de precisão simples.. •. Os espaços iniciados por P indicam conjunto das partes. PVR, por exemplo, é o conjunto das partes do espaço dos vetores cujas componentes são números reais.. A aritmética de exatidão máxima [KULISCH, 1983] foi desenvolvida para computação científica. Ela fornece um método axiomático para as operações aritméticas realizadas em computadores que captura propriedades essenciais associadas com arredondamentos em computações, construindo um sistema de axiomas para problemas gerais que permite várias aplicações; seu grande mérito é propor uma forma de operar números reais representados por números de máquina preservando uma estrutura algébrica chamada de anelóide ou vetóide. A forma de operar valores mantendo essa estrutura algébrica é através do semimorfismo [KULISCH, 1983]. Semimorfismos são arredondamentos com algumas características básicas. Contudo a definição de semimorfismo [CAMPOS, 1995] pressupõe conjuntos onde a existência de supremos e ínfimos seja garantida. Não somente aos anelóides, vetóides e semimorfismos, a proposta e o desenvolvimento da aritmética computacional avançada se deve a Moore que na década de 60 introduziu o intervalo. Erros de medições, arredondamentos e controle do erro podem ser resolvidos através de intervalos. Uma área de pesquisa com amplo espectro de aplicações, além do potencial de desenvolvimento teórico, têm progredido a partir dos trabalhos de Moore. Seja R, o conjunto dos números reais e S (b, l, emin, emax) um sistema de ponto-flutuante, tem-se que: Para cada x ∈ R, | x | ≤ * • d1d2...dl • bemax , di = b-1, i = 1,...,l; existem limites inferiores para x em S e existem limites superiores para x em S; O conjunto dos limites inferiores de x em S tem um maior elemento e o conjunto dos limites superiores de x em S tem um menor elemento.. 21.

(35) 2.5.1 SEMIMORFISMO A Questão que se coloca de modo geral, com respeito a uma computação científica, é como operações aritméticas que são definidas numa estrutura R, *, ≤ podem ser mais bem aproximadas em uma outra estrutura S, *, ≤ com S ⊆ R. Tomando como exemplo o conjunto dos reais R, sabe-se que R, +, • , ≤ é um corpo [CAMPOS, 1995]. As operações aritméticas nos reais, quando realizadas em computadores, têm que ser aproximadas em S ⊆ R, Onde S é um sistema de pontoflutuante de determinada máquina. Além disso, essa aproximação não pode ser realizada por meio de um isomorfismo, nem por meio de um homomorfismo. A Aritmética de alta exatidão, define uma técnica que permite aproximar as operações aritméticas definidas nos reais, no Screen [CAMPOS, 1995]. Um subconjunto S de R é um Screen de R se R é “visto” através de S. O sistema de ponto-flutuante é um Screen para o conjunto dos números reais. Não é possível operar os reais em qualquer sistema de computação existente, pois este dispõe apenas dos números de máquina, os quais formam um conjunto finito enquanto os reais são não enumeráveis. Assim, os reais são vistos através dos números de ponto-flutuante. Seja. :R → S tal que. a = a, ∀a ∈ S. O mapeamento. , é denominado. arredondamento. Homomorfismos preservam operações nas transformações entre estruturas, mas. não é um homomorfismo como pode ser visto através do exemplo a. seguir. Seja R o conjunto dos reais e S(10,1,-1,1) um sistema de ponto-flutuante;. éo. arredondamento para o mais próximo ou, se ponto médio para o extremo superior e + a operação de adição em S. Sejam a,b ∈ R, a = 0.34 e b = 0.54. Então: a = 0.34 = 0.3 b = 0.54 = 0.5 (a + b) = (0.34 + 0.54) = 0.88 = 0.9 ( a) + ( b) = ( 0.34) + ( 0.54) = 0.3 + 0.5 = 0.8 logo, (a + b) ≠ (a) + (b) 22.

(36) 2.6 MATEMÁTICA INTERVALAR As primeiras pesquisas e trabalhos na área da matemática intervalar foram desenvolvidos por Moore [MOORE, 1979] que propôs a utilização de intervalos numéricos para operar entre si. Assim, os problemas de aproximação passaram a ser contornados, pois a resposta das operações seria agora um intervalo que conteria o resultado esperado, caso este não pudesse ser representado de forma exata pela máquina. O passo seguinte foi incorporar os intervalos e sua aritmética, bem como os princípios da aritmética de exatidão máxima [KULISCH, 1983], às linguagens de programação. A utilização de intervalos para expressar resultados permite controlar a perda de exatidão depois de repetidos cálculos numéricos computacionais. Através da aritmética intervalar, os números reais podem ser representados na forma de intervalos, e então passam a ser manipulados como tal, aproveitando todos os benefícios que esta representação pode proporcionar, seja na exatidão numérica dos cálculos efetuados ou nas linguagens com verificação automática dos resultados Esta abordagem define um intervalo como sendo uma aproximação de todos os números reais pertencentes a ele, ou seja, se a representação de um intervalo for [i1, i2], então todos os números reais entre i1 e i2, inclusive, farão parte deste intervalo, abstraindo dessa maneira a representação numérica limitada da máquina. Concluindo, a aritmética intervalar trata da representação numérica através de intervalos e das operações neles realizadas. A seguir serão detalhadas as principais definições, bem como as operações de maior destaque. Esta seção visa ambientar os leitores no universo da Aritmética Intervalar, para um melhor entendimento e compreensão do restante do documento de dissertação.. 2.6.1 INTERVALO DE NÚMEROS REAIS Um intervalo de números reais, R, é da forma I = [x1, x2], onde, x1 e x2 pertencem ao conjunto dos números reais, tal que x1 ≤ x2. São exemplos de intervalos: [1,2], [-2,-1], [1.9, 4.8], [1,1].. 23.

(37) 2.6.2 CONJUNTO DE INTERVALOS O conjunto de todos os intervalos de reais pode ser definido da seguinte forma: IR = { [x1, x2] | x1, x2 ∈ R , x1 ≤ x2}. Associando-se a cada intervalo [x1, x2] ∈ IR um ponto (x1, x2) ∈ R2, obtemos uma representação geométrica para IR, conforme a Figura 6 a seguir:. R. [x1, x2]. x1 = x2 0. Figura 6. Representação gráfica do espaço dos Intervalos. Importante ressaltar que todo e qualquer número real x ∈ R pode ser visto como um intervalo de IR. Basta identificar os pontos x ∈ R com os intervalos pontuais X = [x, x] ∈ IR. Estes intervalos também são chamados de intervalos degenerados, porém a nomenclatura de intervalo pontual é comumente utilizada. A Figura 7 representa a hierarquia numérica dos conjuntos, onde N é o conjunto dos números naturais, Z, dos inteiros, Q, dos racionais, R, dos reais e IR dos intervalos.. 24.

(38) Figura 7. Estrutura hierárquica da representação numérica. 2.6.3 OPERAÇÕES ARITMÉTICAS Nesta subseção serão exibidas as definições das operações intervalares [MOORE, 1979, DIVÉRIO,1997]. Considerando os intervalos A = [a1, a2] e B = [b1,b2], a definição das operações aritméticas entre intervalos pode ser generalizada através da fórmula a seguir. A * B = {a * b | a ∈ A, b ∈ B}, * ∈ {+, -, *, / }.. 2.6.3.1 ADIÇÃO INTERVALAR A + B = [ (a1 + b1 ) , ( a2 + b2 ) ].. 2.6.3.2 PSEUDO-INVERSO ADITIVO INTERVALAR -A = [-a2 ,- a1].. 2.6.3.3 SUBTRAÇÃO INTERVALAR A - B = A + (-B) = [ (a1 - b2 ) , ( a2 - b1 ) ].. 2.6.3.4 MULTIPLICAÇÃO INTERVALAR A x B = [ mim { a1.b1,a1.b2,a2.b1.,a2.b2} , max{ a1.b1,a1.b2,a2.b1.,a2.b2} ].. 2.6.3.5 PSEUDO-INVERSO MULTIPLICATIVO INTERVALAR A-1 = 1/A = [1 / a2 ,1 / a1], 0 ∉A.. 25.

(39) 2.6.3.6 DIVISÃO INTERVALAR A / B= [ min{a1/b1,a1/b2,a2/b1,a2/b2 } , max{ a1/b1,a1/b2,a2/b1,a2/b2 ].. 2.6.4 OPERAÇÕES ENTRE CONJUNTOS Nesta subseção serão exibidas as funções envolvendo conjuntos de intervalos.. 2.6.4.1 INTERSEÇÃO DE INTERVALOS Se max {a1, b1} ≤ min {a2, b2}, então A ∩ B = [ max {a1, b1} , min {a2, b2} ]. Caso min {a2, b2} < max {a1, b1} então A ∩ B = Ø.. 2.6.4.2 UNIÃO DE INTERVALOS A ∪ B = [ min {a1, b1} , max {a2, b2} ], A ∩ Β ≠ Ø.. 2.6.4.3 UNIÃO CONVEXA DE INTERVALOS A ∪ B = [ min {a1, b1} , max {a2, b2} ]. Um ponto importante é que ao contrário da operação de união, em operações de união convexa, a intersecção entre intervalos é permitida ser vazia.. 2.6.5 OUTRAS OPERAÇÕES 2.6.5.1 DISTÂNCIA ENTRE INTERVALOS d = max{|a1 − b1|, |a2 − b2|}.. 2.6.5.2 DIÂMETRO DE UM INTERVALO w = a2 – a1.. 26.

(40) 2.6.5.3 PONTO MÉDIO DE UM INTERVALO Seja A = [a1, a2] um intervalo pertencente ao intervalo dos números reais. O ponto médio deste intervalo define-se como sendo a média aritmética dos seus valores extremos. m = (a1 + a2) / 2.. 2.6.5.4 VALOR ABSOLUTO DE UM INTERVALO |A| = max{|a1|,| a2|}. O Exemplo 7 ilustra as definições anteriormente mostradas. Exemplo 7. Sejam os seguintes intervalos A = [0,10], B = [-3, 6] e C = [1, 3]. Então: A + B = [0, 10] + [-3, 6] = [-3, 16]. A - B = [0, 10] + ( - [-3, 6] ) = [0, 10] + [-6, 3] = [-6, 13]. A x B = [0, 10] X [-3, 6] = [min {0 X -3, 0 X 6, 10 x -3, 10 X 6}, max {0 X -3, 0 X 6, 10 x -3, 10 X 6}] = [0, 60]. A / B = [0, 10] / [-3, 6] = [ min {0 / -3, 0 / 6, 10 / -3, 10 / 6}, max {0 / -3, 0 / 6, 10 / -3, 10 / 6}] = [0, 10/6]. C-1. = [1/3, 1].. A ∩ B = [0, 10] ∩ [-3, 6] = [ max (0, -3), min (10, 6) ] = [ 0, 6]. A ∪ B = [0, 10] ∪ [-3, 6] = [ min (0, -3), max (10, 6) ] = [-3, 10]. d(A, B) = max { |0 – (-3)| , |10 - 6| } = max (3, 4) = 4 w(A). = w (10 – 0 ) = 10. m(A). = m ((10 + 0) / 2) = 5. |A|. = max{|0|, |10|} = 10. 27.

(41) 2.7. JAVA-XSC Concebida na década de 90, a linguagem de programação Java alcançou enorme popularidade desde o início de sua utilização. Sua rápida ascensão e grande aceitação devem-se, principalmente, às propriedades do paradigma de orientação a objeto, particularmente, o fato de ser portável. Ou seja, as aplicações desenvolvidas na linguagem Java podem ser executadas em diferentes tipos de plataformas. Uma sucinta e boa definição para a linguagem Java pode ser encontrada em um artigo próprio de sua empresa, criadora e mantenedora, a Sun Microsystems, que a define da seguinte maneira: Java é simples, orientada a objeto, distribuída, interpretada, robusta, segura, neutra de arquitetura, portável, multi-thread e dinâmica [CHOUDHARI, 2001]. Outras características que fazem de Java uma linguagem de alto nível de abstração e de fácil manipulação pelos programadores são o suporte a herança entre os objetos, abolição do uso de ponteiros, alocação dinâmica de memória e, por fim, utilização do processo interno de garbage collector para desalocação de memória. Embora apresente todas as vantagens acima citadas, Java apresenta falhas na sua implementação que comprometem aplicações de caráter matematicamente computacional. Conforme apresentado anteriormente, a implementação do padrão ANSI/IEEE Standard 754-1985 referente a representação de ponto-flutuante, inviabiliza o desenvolvimento de aplicações matemáticas que necessitem de alta exatidão nos resultados. Um trabalho nesta linha foi desenvolvido pelo grupo de matemática computacional da Universidade Federal de Pernambuco [JAVA-XSC] e Universidade Federal do Rio grande do Norte [DUTRA] que implementaram uma biblioteca intervalar utilizando os tipos primitivos de Java como limites superiores e inferiores dos Intervalos. Porem esta abordagem está passível dos erros apresentados nos Exemplos 4, 5, 6 e 7. Exatamente, neste ponto é que entra a contribuição deste trabalho propondo a inclusão de uma biblioteca intervalar que processa caracteres tendo como linguagem alvo Java . A biblioteca desenvolvida neste trabalho conterá a definição de novos tipos de dados, entre eles o tipo Number (Strings numéricos), e Intervalo que utilizam Strings Numéricos. Fazendo uso dos conceitos da Matemática Intervalar [MOORE, 1979] na definição das operações entre esses novos tipos. 28.

(42) 3 INTERVALOS DE STRINGS NUMÉRICOS. Os algoritmos que utilizamos para realizar cálculos sem a ajuda de máquinas podem ser implementados numa linguagem de programação. No primário escolar, aprendemos a processar cadeias de caracteres (Strings) em um papel, portanto, tendo isto em mente por que não ensinar a máquina a fazer o mesmo utilizando Strings numéricos? Os algoritmos que realizam operações aritméticas utilizam truncamentos e arredondamentos para contornar a sua incapacidade de representar todos os números reais. A solução alternativa proposta para diminuir a propagação de erro ao se trabalhar com números, outrora não representáveis, é mudar o paradigma de representação. O conjunto dos números racionais tem uma característica peculiar que é a possibilidade de ser representado numericamente por uma quantidade finita de símbolos; até uma dízima periódica pode facilmente ser representada por um conjunto finito de símbolos na sua representação fracionária. Uma limitação desta abordagem é representar e realizar operações sem propagação de erro com o conjunto dos números irracionais em que é impossível obter a representação de seus elementos por uma seqüência finita de caracteres. Por este motivo, intervalos são utilizados para representar um número irracional. Para calcularmos operações com o menor erro possível, um sistema intervalar foi implementado como a representação genérica, tendo como limites superiores e inferiores, strings numéricos.. 29.

(43) 3.1 ARQUITETURA Um sistema hierárquico é o modelo percebido naturalmente quando estamos lidando com objetos que possuem características e comportamentos comuns que não precisam ser modificados em tempo de execução. A biblioteca numérica intervalar foi implementada seguindo o modelo UML [BOOCH] descrito na Figura 8.. StringNumber divisor expoente mantissa sinal sinalExpoente. Intervalo limi teInferior : StringNumber limi teSuperior : StringNumber diam etro() pontoMedio(). somar() subtrair() multiplicar() dividir() ...(). Operacao executarOperacao(). .... Interseccao OperacaoUnaria. OperacaoBinaria. operador1 : Intervalo. operador1 : Intervalo operador2 : Intervalo. Multiplicacao. Soma .... InversoAditivo. inversoMultiplicativo. Divisao. Subtracao. Uniao. Figura 8. Diagrama UML das Classes do Sistema.. A classe Intervalo é a classe base do sistema. Ela possui como atributos o limiteSuperior e o limiteInferior que são do tipo Number (detalhes sobre esta classe serão discutidos nas seções posteriores). Operações como calcular o diâmetro de um intervalo, ponto médio, multiplicação por um escalar, distância e valor absoluto são definidas nesta classe. A classe abstrata Operacao herda da classe Intervalo e impõe que as classes filhas concretas implementem o método abstrato executarOperacao. Este método tem por finalidade definir a operação aritmética que será executada pelas classes. 30.

Referências

Documentos relacionados

Segundo Rossignolo (2009) as pesquisas e o desenvolvimento da tecnologia do concreto leve estrutural, tiveram como marco inicial os trabalhos da Professora Yasuko

O distrito, para além dos outros clubes que o compõem, deve um apoio especial a este novel clube, (já é a 3ª vez que é criado um club em Beja), com um quadro social

O Coordenador do Programa de Engenharia Oceânica(PENO) do Instituto Alberto Luiz Coimbra de Pós-graduação e Pesquisa de Engenharia, também conhecido como Coordenação

Os passivos são reconhecidos pelos montantes em caixa ou equivalentes de caixa, não descontados, que se espera seriam necessários para liquidar a obrigação na data do

Muitos apostaram no desaparecimento da pequena produção, que a presença do capital no campo seria avassaladora como já havia previsto Lenin (1973) e Kautsky (1968), mas

Considerando a formação da equipe de trabalho, o tempo de realização previsto no projeto de extensão e a especificidade das necessidades dos catadores, algumas

Cada uma dessas soluções pode ser representada por um par ordenado (x, y). Dispondo de dois pares ordenados de uma equação, podemos representá-los graficamente num plano

Os Programas Integrais da Política de Assistência Estudantil do IFAM são compostos por um grupo de Programas, cujos Projetos estão voltados para as suas