• Nenhum resultado encontrado

Java-XSC : módulo complexo e complexo intervalar

N/A
N/A
Protected

Academic year: 2017

Share "Java-XSC : módulo complexo e complexo intervalar"

Copied!
261
0
0

Texto

(1)

JAVA-XSC: Módulo Complexo Intervalar

Marciano Lourenço da Silva Gonçalves

Orientador: Prof. Dr. Regivan Hugo Nunes Santiago

Dissertação de Mestrado apresentada ao Programa de Pós-Graduação em Sistemas e Computação da UFRN (área de concentra-ção: Teoria da Computação) como parte dos requisitos para obtenção do título de Mestre em Sistemas e Computação.

(2)

Pereira, Fulano dos Anzóis.

Sobre a Preparação de Propostas de Tema, Dissertações e Teses no Programa de Pós-Graduação em Engenharia Elétrica da UFRN / Fulano dos Anzóis Pereira - Natal, RN, 2006

23 p.

Orientador: Sicrano Matosinho de Melo Co-orientador: Beltrano Catandura do Amaral

Tese (doutorado) - Universidade Federal do Rio Grande do Norte. Centro de Tecnologia. Programa de Pós-Graduação em Engenharia Elétrica.

1. Redação técnica - Tese. 2. LATEX- Tese. I. Melo, Sicrano Matosinho de. II. Amaral, Beltrano Catandura do. III. Título.

(3)

Intervalar

Marciano Lourenço da Silva Gonçalves

Dissertação de Mestrado aprovada em 15 de fevereiro de 2012 pela banca examinadora composta pelos seguintes membros:

Prof. Dr. Regivan Hugo Nunes Santiago (orientador) . . . DIMAp/UFRN

Prof. Dr. Benjamin Rene Callejas Bedregal . . . DIMAp/UFFN

(4)
(5)

Ao meu orientador, professor Regivan Hugo Nunes Santiago, sou grato por suas obser-vações, empenho e dedicação com que me orientou, tornando possível a realização desta dissertação.

Aos colegas Regina Parente Rosa, pelo apoio nos momentos difíceis. Emannuely Mon-teiro e Fabrício Costa pelas intermináveis horas estudando lógica.

Aos demais colegas de pós-graduação, pelas críticas e sugestões.

Aos amigos Reginaldo Aquino, Joafran Paiva e Leonardo Mozer, pelos momentos de descontração que me mantiveram são diante de tanto estudo.

À minha família pelo apoio durante esta jornada.

(6)

Este trabalho tem por finalidade desenvolver módulos que venham aumentar o po-der computacional da biblioteca JAVA-XSC, sendo XSC1um acrônimo para “Language Extensions for Scientific Computation”. Essa biblioteca é na verdade uma extensão da lin-guagem de programação JAVA que possui rotinas elementares e funções padrão úteis da matemática intervalar. Neste trabalho foram acrescentados dois módulos à biblioteca; a saber: o módulo dos números complexos e o módulo dos números complexos intervalares que em conjunto com os módulos originais visam possibilitar que aplicações numéricas, como por exemplo na área da engenharia, possam ser usadas em dispositivos que execu-tam programas JAVA.

Palavras-chave: JAVA, JAVA-XSC, Matemática Intervalar, Números Complexos, Números Complexos Intervalares.

(7)

This work aims to develop modules that will increase the computational power of the Java-XSC library, and XSC an acronym for "Language Extensions for Scientific Com-putation”. This library is actually an extension of the Java programming language that has standard functions and routines elementary mathematics useful interval. in this study two modules were added to the library, namely, the modulus of complex numbers and complex numbers of module interval which together with the modules original numerical applications that are designed to allow, for example in the engineering field, can be used in devices running Java programs.

(8)

Sumário i

Lista de Figuras iv

Lista de Tabelas v

1 Introdução 1

1.1 Motivação . . . 3

1.2 Objetivo . . . 4

1.3 Organização . . . 4

2 Números complexos 6 2.1 Introdução . . . 6

2.2 Os Números Complexos . . . 8

2.2.1 Representação Algébrica . . . 9

2.2.2 Representação Polar . . . 11

2.2.3 Funções Complexas Elementares . . . 14

2.3 Números complexos intervalares . . . 16

2.3.1 Aritmética Intervalar Real . . . 16

2.3.2 Aritmética Complexa Intervalar Retangular . . . 18

2.3.3 Aritmética Complexa Intervalar Circular . . . 19

2.3.4 Aritmética Complexa Intervalar Usando a Forma Polar . . . 20

2.3.5 Funções Complexas Intervalares Elementares . . . 22

2.4 Considerações . . . 24

3 Algumas ferramentas para cálculo numérico 26 3.1 Introdução . . . 26

3.2 CLN (Class Library for Numbers) . . . 26

3.2.1 Tipos Numéricos . . . 27

3.2.2 Números Exatos . . . 27

(9)

3.2.5 Funções de Arredondamento . . . 30

3.3 GNU MP (GMP) . . . 30

3.3.1 Números Racionais . . . 31

3.3.2 Ponto-Flutuante . . . 32

3.4 MPFR (Multiple Precision Floating-Point Reliable) . . . 33

3.4.1 Modos de Arredondamento . . . 33

3.4.2 Ponto-Flutuante . . . 34

3.5 MPFI (Multiple Precision Floating-Point Interval) . . . 35

3.5.1 Modos de Arredondamento . . . 36

3.6 MPC (Multiple Precision Complex) . . . 36

3.6.1 Modos de Arredondamento . . . 36

3.6.2 Funções Complexas . . . 37

3.7 INTLIB . . . 37

3.7.1 Simulação de Arredondamento Direcionado . . . 40

3.8 COMMONS MATH . . . 40

3.8.1 Organização . . . 41

3.8.2 Números Complexos . . . 42

3.9 Linguagens XSC . . . 47

3.9.1 PASCAL-XSC . . . 48

3.9.2 C-XSC . . . 52

3.10 JAVA-XSC . . . 58

3.10.1 A Linguagem de Programação JAVA . . . 58

3.10.2 Desenvolvimento da Biblioteca . . . 59

3.10.3 Pacote IAMath . . . 60

3.10.4 Modo de Arredondamento . . . 61

3.11 Resumo Comparativo . . . 62

3.12 Considerações . . . 64

4 Módulos Complexo e Complexo Intervalar 65 4.1 Objetivos . . . 65

4.2 Os Módulos . . . 66

4.2.1 Módulo Complexo . . . 66

4.2.2 Módulo Complexo Intervalar . . . 69

(10)

5 Conclusão 75

Referências bibliográficas 77

A Modos de Arredondamento 81

A.1 Tipos de Arredondamento . . . 81

A.2 Arredondamento com o Incremento Pré-Determinado . . . 82

A.3 Arredondamento para Inteiro . . . 82

A.4 Regras de Desempate . . . 83

A.5 Arredondamento Escalado . . . 85

A.6 Arredondamento em Ponto-Flutuante . . . 86

B Código Fonte da biblioteca JAVA-XSC 87

C Código Fonte da Classe Complex 111

D Código Fonte da Classe Cinterval 125

(11)

2.1 Interpretação geométrica dos números complexos . . . 12

2.2 Forma algébrica e polar do complexoc=5+i3 . . . 13

3.1 Hierarquia dos tipos numéricos em CLN . . . 28

3.2 Tamanho de uma variável do tipo dotprecision . . . 51

3.3 Formato de um ponto-flutuante . . . 54

3.4 Complexo Intervalar [3.0,4.5] + i[1.0,2.0] . . . 56

4.1 Interface gráfica da ferramenta GraphPad . . . 73

(12)

3.1 Módulos do INTLIB: Aritmética elementar para intervalos . . . 38

3.2 Módulos do INTLIB: Funções padrões para intervalos . . . 38

3.3 Módulos do INTLIB: Funções úteis . . . 39

3.4 Métodos da classeComplex . . . 42

3.5 Métodos da classeComplexFormat . . . 46

3.6 Modos de Arredondamento . . . 63

3.7 Resumo comparativo entre as ferramentas . . . 63

4.1 Métodos da classe Complex . . . 67

4.2 Métodos da classe Cinterval . . . 70

E.1 Complexos Intervalares Utilizados no Teste T . . . 193

(13)

Introdução

No surgimento dos primeiros computadores, e por alguns anos mais, o principal obje-tivo dos pesquisadores era obter ganhos de tempo com ferramentas que automatizassem os cálculos matemáticos e que tais cálculos retornassem uma resposta o mais rápido pos-sível. Na medida em que surgem novas tecnologias e as antigas vão sendo aperfeiçoadas, chegou-se um ponto em que a velocidade do processamento das informações deixou de ser uma preocupação. A preocupação agora é representar essas informações de forma cada vez mais precisa.

Além disso, segundo [Santiago et al. 2006], um dos principais problemas encontrados na computação numérica eram os erros de arredondamento. Observe este exemplo de Rump [Muller et al. 2009] que calcula

y=333.75b6+a2(11a2b2b6121b42) +5.5b8+a/(2b)

Paraa=77617.0 eb=33096.0.

Esta função foi computada por Rump em um IBM S/370 e ele usou três tipos de precisão: simples (com resultado y = 1.172603...), dupla (y = 1.1726039400531...) e es-tendida (y = 1.172603940053178...). Apesar de aparentemente o resultado estar correto, ele está errado. O resultado correto encontra-se no intervalo0.82739605994682135± 5×10−17, pode-se observar que inclusive o sinal está errado. Este exemplo foi revisado e computado em outras máquinas, mas o resultado permanecia errado.

(14)

aspectos: na criação de um modelo computacional que reflita sobre o controle e análise dos erros que ocorrem no processo computacional, e na escolha de técnicas de progra-mação adequadas para desenvolvimento de softwares científicos buscando minimizar os erros nos resultados [Moore 1966].

A necessidade de ferramentas que dessem suporte a essa aritmética fez com que sur-gissem algumas bibliotecas e também as linguagens com extensões científicas, conhecidas como XSC (Language Extensions Scientific Computation). Essas ferramentas favorecem o controle automático de erros através de métodos que se encarregam de verificar e ga-rantir a exatidão dos cálculos efetuados [Garrozi & Albuquerque 2009].

Algumas bibliotecas como a MPFI e INTLIB (Capítulo 3), apresentam módulos es-pecíficos para o uso da aritmética intervalar. Nestes módulos foram desenvolvidos tanto operações elementares; como: adição, subtração, divisão e multiplicação, quanto funções mais elaboradas, tais como funções trigonométricas.

As linguagens XSC permitem que desenvolvedores de softwares numéricos possam criar seus aplicativos através de uma linguagem bastante rica que tem como características fundamentais: controle de arredondamento, tipos de dados com exatidão após a vírgula, bibliotecas com as principais rotinas matemáticas,arraysdinâmicos, a utilização dos ti-pos complexo e intervalo, entre diversas outras [Dutra 2000]. Ao longo do tempo várias linguagens XSC foram sendo desenvolvidas a partir de algumas linguagens de programa-ção, é o caso da PASCAL-XSC e C-XSC, que serão apresentadas no Capítulo 3.

JAVA-XSC foi desenvolvida no Departamento de Informática e Matemática Aplicada da Universidade Federal do Rio Grande do Norte e dá suporte a intervalos de extremos re-ais à linguagem JAVA. Ela é composta por seis módulos: operações básicas, funções entre conjuntos, funções geométricas, funções elementares, funções trigonométricas e funções de conversão entre tipos e definição de constantes. Apesar de estar em um nível avan-çado, JAVA-XSC ainda não está completa. Uma das necessidades atuais da linguagem é um módulo que possa trabalhar tanto com números complexos quanto com uma aritmé-tica intervalar complexa.

(15)

um único número real. Com isso surgiu um grande problema, já que raízes quadradas de números negativos não podem ser representados nesta reta.

O matemático alemão Karl Friedrich Gauss propôs uma associação entre números imaginários e pontos sobre uma reta perpendicular à reta real, passando pelo ponto zero, e assim surgiu um sistema de coordenadas cartesianas, onde os números reais são postos sobre o eixo horizontal (eixo real) e os números imaginários sobre a reta perpendicular (eixo imaginário). Sendo assim, podemos representar√a como sendo √1√a onde a parte imaginária seria exatamente√1 e são colocados no eixo imaginário como seus múltiplos. Desta forma surgiram os números complexos, onde não só os imaginários são representados, mas as possíveis combinações entre reais e imaginários [Menochi 2004].

Com a ajuda da matemática intervalar, é possível representar os números complexos de uma forma mais precisa. Isto associado à uma ferramenta numérica, poderá facilitar a criação de novos aplicativos científicos. E esta é a proposta deste trabalho, o desenvolvi-mento de um módulo complexo intervalar para a biblioteca JAVA-XSC.

1.1

Motivação

Neste trabalho foi tido como motivação a escassez de ferramentas de cálculo numé-rico desenvolvido para a linguagem de programação JAVA, principalmente em se tratando de uma ferramenta que dê suporte a complexos intervalares. Existem algumas ferramen-tas como MPFI (Multiple Precision Floating-Point Interval) e MPC (Multiple Precision Complex), que trabalham respectivamente com intervalos e números complexos, mas am-bas foram desenvolvidas para serem usadas com o compilador C ou C++ e a ferramenta Commons Math que é específica para JAVA, mas não apresenta funções que trabalhem com complexos em sua forma polar.

A linguagem C-XSC possui módulos específicos para trabalhar com complexos in-tervalares, como os tipos complexo (complex), intervalo (interval) e complexo intervalar (cinterval), mas como o próprio nome sugere, ela também foi desenvolvida para ser usada com C e C++.

(16)

traba-lhar com matrizes, vetores intervalares e aritmética intervalar complexa.

Por estas deficiências, tem-se por motivação a criação de dois módulos em JAVA-XSC que venham a trabalhar com números complexos e números complexos intervalares, que no caso corresponderiam aos tiposcomplexecinterval da C-XSC. Estes módulos serão compostos por rotinas de aritmética elementares, além de funções padrões e outras fun-ções úteis.

1.2

Objetivo

Este trabalho tem como pretensão, através do desenvolvimento destes módulos, dar continuidade ao trabalho que já vem sendo desenvolvido pelo Departamento de Informá-tica e MatemáInformá-tica Aplicada da Universidade Federal do Rio Grande do Norte desde 2000, à JAVA-XSC. Esta ferramenta é uma extensão de suporte à computação de alta exatidão para a linguagem de programação JAVA [da Silva 2007]. Nesta nova versão da ferramenta é dado um módulo específico que provê meios para trabalhar com números complexos in-tervalares.

Sendo assim, o objetivo principal deste trabalho está na construção de módulos para JAVA-XSC que irá aumentar, o já enorme, espectro de aplicação da linguagem JAVA, possibilitando que instrumentos comotabletsesmartphonespossam conter aplicações de engenharia baseados na aritmética retangular complexa.

1.3

Organização

A presente dissertação se desenvolve em 5 Capítulos, organizados conforme descrito a seguir.

No Capítulo 2 é apresentada uma breve introdução aos números complexos e números complexos intervalares, com seus históricos, conceitos, operações e funções básicas.

(17)

computação científica, além da biblioteca JAVA-XSC.

No Capítulo 4 mostram-se o desenvolvimento dos módulos complexo e complexo in-tervalar para a ferramenta JAVA-XSC.

No Capítulo 5 são apresentados as considerações finais.

(18)

Números complexos

2.1

Introdução

De acordo com [Cerri & Monteir 2001], na primeira metade do século XVII os mate-máticos franceses Pierre de Fermat e René Descartes construíram a Geometria Analítica. Com o domínio dessa nova linguagem da geometria, Descartes estudou, entre outras coi-sas, as equações algébricas. Descartes mencionou em seu texto Discurso do Método a seguinte afirmação: “Nem sempre as raízes verdadeiras ou falsas de uma equação são reais. Às vezes elas são imaginárias”. Com isto, até hoje o número√1 é chamado de número imaginário.

Alguns personagens contribuíram no desenvolvimento da teoria dos números com-plexos, mas quem fez o trabalho mais importante e decisivo sobre o assunto foi Leonhar Euler. Muitas das notações que conhecemos hoje foram introduzidas por ele, inclusive a substituição de√1 pori.

Euler passou a estudar números da formaz=a+bionde aeb são números reais e i2= -1. Esses números são chamados de números complexos. Segundo [Ezequias 1998], diversas aplicações foram surgindo através do conceito de tais números.

(19)

Na aerodinâmica, os complexos também tiveram sua utilidade. Em 1906, Joukowski utilizando transformações geométricas, construiu uma curva fechada no plano complexo que representa o perfil de uma asa de avião (aerofólio de Joukowski) e, usando o prin-cípio de Bernoulli e a teoria das funções complexas, deduziu a fórmula F =x+yi =

−ieiα(VkLp), que permite calcular a força de levantamento responsável pela sustentação do voo de um avião.

Na eletrônica e na eletricidade, a análise de circuitos de corrente alternada é feita com a ajuda de números complexos. Grandezas como a impedância (em ohms) e a potência aparente (em volt-ampere) são exemplos de quantidades complexas.

Os algoritmos recursivos no plano complexo criaram na maioria das vezes figuras invariantes por escala denominadas fractais. Estas formas geométricas de dimensão fra-cionária servem como ferramenta para: descrever as formas irregulares da superfície da terra; modelar fenômenos, aparentemente imprevisíveis ( teoria do caos ), de natureza meteorológica, astronômica, econômica, biológica, entre outras.

Antes de iniciar a definição completa sobre números complexos é necessário fazer uma breve explanação da evolução do conceito de número.

Os números no qual têm-se contato pela primeira vez são os chamados números natu-rais. Eles são representados pela letraN, como no formato abaixo:

N= {0,1,2,...,n,...}

No intuito de expandir este conjunto de números,para admitir que a subtração de dois números naturais seja possivel, surgiram os números inteiros que são representados pela letraZ:

Z= {..., -n, ..., -2, -1, 0, 1, 2, ..., n,...}

(20)

Mas emQainda existem certas imperfeições, como por exemplo, a solução da equa-ção x2=3 não pode ser encontrada em Q. Desta maneira para construir um conjunto mais amplo que permitisse uma solução a este tipo de equação, surgiram os números re-ais, representado porR. Desta forma pode-se dizer que os números naturais seriam um subconjunto dos números inteiros, que por consequente seria um subconjunto dos racio-nais e este um subconjunto dos reais.

Mas este sistema já mencionado ainda não é suficiente, pois não permite encontrar a solução para a equação x2+4=0. Neste caso não é possível encontrar uma solução

dentro dos conjuntos citados. É aí que entra a definição de números complexos.

2.2

Os Números Complexos

As definições contidas neste capítulo estão mencionadas em [Dias & Dantas 2006], [Santos 2001], [Lohner et al. 1985],[Alefeld & Herberger 1983], [Petkovic & Petkovic 1998], [Candu et al. 2006] e [Blomquist et al. 2005a].

SejaRo conjunto dos números reais e o produto cartesiano

R2={(a,b) | aRe bR}

Ou seja,R2é o conjunto dos pares ordenados (a,b) em que a e b são números reais.

O conjunto dos números complexos consiste no conjunto de todos os pares ordenados de números reais (a, b)R2, juntamente com as regras pelas quais estes serão igualados, adicionados, multiplicados e assim por diante. Este conjunto é representado pela letraC. Para exemplificar serão levados em consideração os dois pares ordenados (a,b) e (c, d) de R2, como segue abaixo:

1. Igualdade: dois pares ordenados são iguais se, e somente se, seus primeiros e últimos termos forem iguais.

(a,b) = (c,d)<=>a=ceb=d

2. Adição: para obter um novo par ordenado a partir da soma dos dois primeiros, é necessário fazer a soma dos primeiros e últimos termos dos pares fornecidos.

(21)

3. Multiplicação:para obter o primeiro elemento do novo par ordenado é necessário fazer a diferença entre o produto dos primeiros termos e o produto dos últimos termos fornecidos e para obter o segundo elemento é preciso somar os produtos do primeiro termo de cada par pelo segundo termo do outro.

(a,b)·(c,d) = (acbd,ad+bc)

4. Subtração: pode-se subtrair dois pares ordenados fazendo as diferença entre pri-meiros e últimos termos.

(a,b)(c,d) = (ac,bd)

5. Divisão: obtêm-se um novo par ordenado a partir de uma operação de divisão fa-zendo uma multiplicação entre dois pares ordenados. Sendo que o primeiro par desta multiplicação é o primeiro par fornecido, o primeiro termo do segundo par é composto pela divisão do primeiro termo do segundo par informado pela soma dos quadrados destes termos e o segundo termo do novo par é composto pela dife-rença da divisão entre o segundo termo do segundo par informado pela soma dos quadrados destes termos.

(c,d)

(a,b) = (c,d)

a a2+b2,−

b a2+b2

=

ca+db a2+b2,

dacb a2+b2

Exemplos:

1 - Adição (2,5) + (3,7) = (2 + 3, 5 + 7)=(5,12)

2 - Multiplicação (1,2).(3,5) = (1.3 - 2.5, 1.5 + 2.3)=(-7, 11)

3 - Subtração (4,6) - (3,1) = (4 - 3,6 - 1)=(1,5)

4 - Divisão (1,2)

(3,4)= (1,2)·

3

32+42,− 4 32+42

= (1,2)·

3

25,− 4 25 = 11 25, 2 25

Dessa forma, o conjunto dos números complexos podem ser vistos como uma estru-tura algébrica da formaR=<R2,+,,·, / >.

Apesar de um número complexo ser um par ordenado(r,g)R2, pode-se representá-los ainda de duas formas distintas, chamadas: forma algébrica e forma polar.

2.2.1

Representação Algébrica

(22)

representação algébrica.

O segundo componente de um complexo c= (a,b)chama-se parte imaginária. Ob-serve que c= (a,b) pode ser representado como c=a(1,0) +b(0,1). (0,1) chama-se unidade imaginária e é representado pela letrai. A representação algébricac=a+ibna verdade expressa a combinação linearc=a(1,0) +b(0,1).

Um complexocé dito um número real se, somente se, sua parte imaginária for igual a zero, é dito imaginário puro quando sua parte real é igual a zero e é chamado de nulo quando ambas as partes são iguais a zero.

Sendo assim, observe que i2 = (0,1).(0,1) = (0.01.1,0.1+1.0) = (1,0), que corresponde ao número real -1. Portanto, é possível escrever

i2=1

Logo,√1=i.

Uma noção importante que ajuda a operacionalidade dos números complexos é a de conjugado. Chamamos conjugado de um complexoc=a+ib, o complexo c=aib. Dessa maneira, a forma algébrica z=a+ib torna-se muito mais operacional que a de par ordenado (a,b) como representação de números complexos. A seguir serão

nova-mente apresentadas as definições de igualdade, adição e multiplicação de complexos, agora usando a representação algébrica.

1. Igualdade: Dois números complexos são iguais se tanto suas partes reais quanto suas partes imaginárias são iguais.

a+ib=c+id<=>a=ceb=d

2. Adição: Obtêm-se um novo complexo a partir de uma adição realizando uma soma onde sua parte real é composta pela soma das partes reais das parcelas e sua parte imaginária é formada pela soma das partes imaginárias da parcela.

(a+ib) + (c+id) = (a+c) + (b+d)i

3. Multiplicação: Um novo complexo obtido a partir de uma multiplicação é o resul-tado do desenvolvimento de (a+ib)(c+id), encarando ib e id como se fossem números reais, aplicando a propriedade distributiva e levando em consideração que i2=1. Tem-se o seguinte:

(23)

4. Divisão: A divisão agora é bem mais simples de ser obtida. Basta multiplicar o numerador,c1=c+ide denominador pelo conjugado do denominadorc2=a+ib, comc26=0+0i.

c1 c2 =

c+id(aib) (a+ib)(aib)=

ca+db a2+b2 +

dacb a2+b2i Exemplos:

1 - Adição:(5+i3) + (3+i4) = (8+i7)

2 - Conjugado:c=6+i9c=6i9

3 - Multiplicação: (2+i3).(5+i4) =2(5+i4) +i3(5+i4) =10+i8+i15+i212=

10+i8+i1512=2+i23 4 - Divisão: (3+i)

(4+i2)=

(3+i)(4i2) (4+i2)(4i2)=

14i2 12+i16

2.2.2

Representação Polar

É possível associar um ponto P= (a,b) no plano cartesiano ao número complexo c=a+ib, onde pode-se representar a parte real por um ponto no eixo real e a parte

imaginária por um ponto no eixo imaginário. A Figura 2.1 representa a interpretação geométrica de um número complexo.

Figura 2.1: Interpretação geométrica dos números complexos

Pode-se perceber que a distância entrePeOé o módulo dec, ou seja,OP=√a2+b2=

|c|, e o ângulo composto porOPcom o eixo real éθ, logoθé o argumento principal dec.

(24)

1. Norma: A norma de um número complexoc=a+ibé definida porN(c) =a2+b2; 2. Módulo ou valor absoluto: O módulo de um número complexo é representado pela

raiz quadrada da sua norma; ou seja:|c|=p

N(c) =√a2+b2. Geralmente usa-se a letra gregaρpara representar |c|;

3. Argumento: O argumento de um número complexoc=a+ib, denotado porarg(c)

é o ânguloθ, medido em radianos, 0θ2π, formado pelo vetor com o eixo real,

tal que, cosθ= a

|c| esenθ= b

|c|.

A forma polar de um número complexoc=a+ibé o par (ρ,θ) associado aC.

A Figura 2.2 apresenta a representação polar do número complexoc=5+i3 no plano

de Argand-Gauss.

Figura 2.2: Forma algébrica e polar do complexoc=5+i3

A representação polar de um número complexo pode ser convertida para a represen-tação algébrica e vice-versa, como é determinado a seguir através dos exemplos:

(25)

|c|=√22+22=√4+4=√8=2√2.

cosθ= 2

2√2= 1

2.Portantoθ=arcsin cosθ=arcsin 1

2 = 45.

Logo a representação polar parac=2+i2 é o par(2√2,45)= (2.828417, 45). 2. Transformação do número complexo polar (4.47, 26.57o) na forma algébrica:

cosθ= a

|c| = cos 26,57

o= a

4,47. Portanto a∼=4. sinθ= b

|c| = sin 26,57

o= b

4,47 Portanto b∼=2.

Logo a representação algébrica do número complexo polar (4.47, 26.57o) é 4+i2.

2.2.3

Funções Complexas Elementares

Além da aritmética complexa, existem operações sobreCque são elementares. Nesta seção expomos algumas funções sobreC:

Função multiplicação por complexo na forma polar

Seja A= r0(cosθ0+isenθ0) e z= r(cosθ+isenθ), então Az =rr0[cos(θ+θ0) + sen(θ+θ0))], ou seja, o cumprimento de zé multiplicado pelo cumprimento de A e seu ânguloθé modificado paraθ+θ0.

Função quadrática

Sendo z=r(cosθ+isenθ), então z2=r2(cos2θ+isen2θ). Neste caso, z2 dobra o ângulo dez. Sendo assim, quando 0θ π2, então 0π.

Função inversão

Esta função é definida porw= 1z.

Algumas observações devem ser levadas em consideração:

• Quando|z|=1, então|w|= 1

(26)

• Quando|z|<1, então|w|= 1

|z| >1, ou seja, wleva o interior do círculo unitário em seu exterior.

• Quando|z|>1, então|w|= 1

|z| <1, ou seja,wleva o exterior do círculo unitário no seu interior.

w= 1

z = ¯ z

|z|2. Então wleva primeiro z no seu complexo conjugado ¯z e em seguida multiplica-o pelo inverso do quadrado do seu comprimento 1

|z|2.

Função exponencial

Na função exponencial real f, sabe-se que f(x+x′) =ex+x′ =exex′, ondeeé a base do logaritmo natural e vale aproximadamente 2,718281828459045. Ou seja, f(x+x′) =

f(x)f(x′)e f(0) =1.Estendendo este conceito para números complexos, toma-se a

fun-çãog(y) =cosy+isiny. Logog(y)g(y′) =g(y+y′)eg(0) =1.Ou seja, ela tem a mesma

propriedade que a exponencial real. Sendo assim pode-se definireiy=cosy+isiny, onde yR.

Mantendo esta propriedade, para z=x+iy, então ez =ex+iy=ex.eiy. Como eiy =

cosy+isinyentãoez=ex(cosy+isiny),zC.

Observação 1: Como a exponencial leva o número complexo z=x+iyno número w=ρeiθ, em queρ=ex eθ=y, então todo número complexo na forma z=x+iypode ser expresso na formaz=ρeiy, chama-se forma polar dez, que, como foi visto, pode ser resumido como o par(ρ,y)

A função exponencial leva o númeroz=x+iyao númerow=ex.eiy transformando

coordenadas cartesianas em coordenadas polares.

Sez ez′ são dois números complexos, então temos as seguintes propriedades da ex-ponencial complexa:

• Propriedade 1:e0=1;

• Propriedade 2:ez+z′ =ezez′;

• Propriedade 3:ez−z′ = ez

ez′;

• Propriedade 4:ez6=0;

(27)

A demonstração destas propriedades podem ser vistas em [Dias & Dantas 2006].

Funções trigonométricas

Em números complexos as funções trigonométricas são definidas por:cosz=e

iz+e−iz

z esenz= e

ize−iz

2i .

Função logarítmica

São definidas logz através das seguintes equivalências: logz =w se, somente se, ew=z. Determinandow=u+iv, então|ew|=|eu+iv|=|eu||eiv|=eu. Escrevendoz=reiθ, deew=z, segue-se que|ew|=|z|, ou seja,eu=r, o que dáu=lnr, ondelné o logaritmo natural der.

Mas ew=z também pode ser visto como eueiv=reiθ, como eu=r então eiv=eiθ, dondev=θ+2kπ,kZ. Substituindo estes dados na equação original, obtêm-se logz=

lnr+i(θ+2kπ),kZ. Sendor=|z|eθ+2kπ=argz, então logz=ln|z|+iargz. Desta forma, é possível observar que existem diversos valores do logaritmo para um mesmo número complexo. Para obter apenas um resultado é preciso tomar como valor do argumento de z, seu argumento principal, 0argz< 2π, resultando no logaritmo

principal dezdenotado por logz=ln|z|+iargz. Casoz=reiθ então logz=lnr+iθ.

2.3

Números complexos intervalares

A matemática intervalar foi uma das soluções propostas para reduzir o custo dos er-ros de uma computação numérica e aumentar a informação com respeito a exatidão dos cálculos matemáticos. Criada paralelamente por Moore e Sunaga na década de 50, ela usa intervalos fechados como forma de representar dados de entrada inexatos ou que não podem ser representados finitamente numa máquina e que causam erros de truncamento ou arredondamento durante a execução de um programa [Santos 2001].

(28)

números reais, pois assim como um número complexo é obtido a partir de números re-ais, espera-se que os números complexos intervalares sejam obtidos a partir de intervalos reais. É o que será visto nas próximas seções.

2.3.1

Aritmética Intervalar Real

Aqui serão apresentadas a aritmética intervalar de Moore, algumas propriedades refe-rentes às operações, bem como relações que são definidas sobre intervalos reais.

Definição 2.3.1.1 (Intervalo real)Um intervalo[a,b]é definido como sendo um

con-junto de números reais da forma

[a,b] ={x R|axb} O conjunto de todos os intervalos é definido por

I(R) ={[a,b]R|ab}

Definição 2.3.1.2 (Igualdade) Dados X = [x1,x2] eY = [y1,y2]. EntãoX =Y se, e somente sex1=y1ex2=y2.

Definição 2.3.1.3 (Interseção) Dados os intervalosX = [x1,x2] eY = [y1,y2]. A in-terseção dos intervalos é dado por

XY = [max{x1,y1},min{x2,y2}], semax{x1,y1} ≤min{x2,y2}]. Semax{x1,y1}> min{x2,y2}], entãoX∩Y não está definida.

Definição 2.3.1.4 (União)SejamX = [x1,x2]eY = [y1,y2]. SeX∪Y 6==0, então a união entre os intervalos X e Y é definida por

XY = [min{x1,y1},max{x2,y2}] Aritmética de Moore

Uma aritmética intervalar é um conjunto de operações compostas por soma, diferença, multiplicação e divisão sobre o conjuntoI(R). No que segue, apresenta-se a aritmética

intervalar proposta por Moore.

(29)

X+Y = [x1+y1,x2+y2] ={x+y|(x ∈ X)&(y ∈ Y)} (Pseudo inverso Aditivo)SejaX = [x1,x2]. Então

−X = [x2,−x1] ={−x|x ∈ X}

(Intervalo simétrico)SejaX um intervalo. Diz-se queX é um intervalo simétrico se X=X

(Subtração)SejamX= [x1,x2]eY = [y1,y2]. A subtraçãoX−Y é dada por XY = [x1−y2,x2−y1] ={x−y|(x ∈ X)&(y ∈ Y)}

(Multiplicação)SejamX= [x1,x2]eY = [y1,y2]. Então X.Y ={x.y|(x X)&(y Y)}=

[min{x1y1,x1y2,x2y1,x2y2},max{x1y1,x1y2,x2y1,x2y2} (Pseudo inverso multiplicativo)SejaX= [x1,x2]tal que 0∈/X. Então

X−1= [x1

2,

1

x1] ={

1

x |x ∈ X}

(Divisão)SejamX = [x1,x2]eY = [y1,y2]tal que 0∈/Y. Então X/Y ={x/y|(x X)&(y Y)}=

[min{x1/y2,x1/y1,x2/y2,x2/y1},max{x1/y2,x1/y1,x2/y2,x2/y1}

As subseções 2.3.2 a 2.3.4 apresentam três abordagens para a representação de núme-ros complexos intervalares. Este trabalho implementará apenas a primeira abordagem.

2.3.2

Aritmética Complexa Intervalar Retangular

SejamAeBI(R). Então o conjunto de números complexos Z={z1+iz2|z1∈A,z2∈B} é chamadointervalo complexo.

(30)

complexoZ= [a,b] +i[c,d]I(C), ondez1∈[a,b]ez2∈[c,d].

SejaA=A1+iA2eB=B1+iB2dois membros deI(C). Diz-se que A e B são iguais se, somente se,

A1=B1eA2=B2

De acordo com [Alefeld & Herberger 1983], a relação de igualdade entre elementos deI(C)proposta anteriormente é: reflexiva, simétrica e transitiva.

Sejam as seguintes operações binárias definidas sobre os elementos deI(C)operações que sejam as conhecidas na literatura comoaritmética retangular[Petkovic & Petkovic 1998]:

1. A+B= (A1+B1) +i(A2+B2); 2. AB= (A1−B1)−i(A2−B2);

3. A.B= (A1B1−A2B2) +i(A1B2+A2B1); 4. A:B= A1B1+A2B2

(B1)2+ (B2)2+

iA2B1−A1B2

(B1)2+ (B2)2,onde 0∈/(B1) 2+ (B

2)2.

2.3.3

Aritmética Complexa Intervalar Circular

SejacCum número complexo erR, tal quer0. [Petkovic & Petkovic 1998] define o conjunto

Z={zC| |zc| ≤r}

como sendo um intervalo circular ou disco. O conjunto de intervalos circulares é re-presentado porK(C). Um disco com centroce raioré escrito comoZ= (c;r).

Dois discosA= (c1,r1)eB= (c2,r2)são iguais se, e somente se, c1=c2er1=r2

Esta relação de igualdade é reflexiva, simétrica e transitiva.

(31)

1. A+B= (a+b;r1+r2); 2. AB= (ab;r1+r2);

3. 1B =|b|2(r2)2,|b|2r2(r2)2 para 0∈/B;

4. A.B= (ab;|a|r2+|b|r1+r1r2); 5. A:B=A.B1 para B/0.

Dado um complexo arbitráriowC, tem-se alguns casos especiais de adição, subtra-ção e multiplicasubtra-ção de discos:

1. w+ (c;r) = (w+c;r); 2. w(c;r) = (wc;r);

3. w.(c;r) = (wc;|w|r);

SendoW = (c;r)K(C), então

(a)|W|=|c|+ré chamado de valor absoluto deW e (b)d(A) =2ré chamado de amplitude deW.

2.3.4

Aritmética Complexa Intervalar Usando a Forma Polar

Esta subseção é baseada no artigo "Complex Interval Arithmetic Using Polar Form"[Candu et al. 2006].

Definição

Sejam ρ−,ρ+,θ−,θ+ R+ e os intervalos de extremos reais [ρ] = [ρ−,ρ+] e [θ] = [θ−,θ+]. O conjunto definido por

(32)

é chamado intervalo complexo polar ou setor intervalar e é denotado por([ρ],[θ])1

Os intervalos[ρ]e[θ]são as representações intervalares, respectivamente, do módulo e do ângulo de um complexo z Z. Para garantir a exclusividade da representação, sempre é possível escolher os limites do último intervalo (θ+θ−2π, 0θ− <2πe

0θ+<4π). O conjunto de todos os setores intervalares é denotado porS(C). Aritmética de intervalos polares

SejamZ1 eZ2 dois setores deS(C)e * uma das quatro operações aritméticas emC. Como o conjunto de intervalos reais é fechado com relação à adição e multiplicação, é possível observar que o produto de dois setores intervalares é também um setor intervalar:

• Z1∗Z2={z1∗z2|z1∈Z1,z2∈Z2}

• {ρ1ρ2i(θ1+θ2)|ρ1∈[ρ1],ρ2∈[ρ2],θ1∈[θ1],θ2∈[θ2]}

• {[ρ1]∗[ρ2],[θ1] + [θ2]}. No caso da divisão obtêm-se:

Z1/Z2= ([ρ1]/[ρ2],[θ1]−[θ2]).

Nestas operações, os intervalos[θ1] + [θ2]e[θ1]−[θ2], embora computados pela arit-mética intervalar, já não podem ser verificadas pelas condições citadas anteriormente. No entanto, como todos os ângulos não possuem valores de módulo 2π, pode-se ajustar

adi-cionando ou subtraindo 2π do seus limites inferiores e superiores até que as condições

sejam cumpridas.

O conjunto

Z1⊕Z2={z1+z2|z1∈Z1,z2∈Z2},

conhecido como soma deMinkowski, não é um setor mas possui uma forma complexa. Para definir adição como uma operação emS(C)é preciso determinar alguns elementos

de S(C) que contém este conjunto. Z1+Z2 é definido como o menor setor contendo Z1⊕Z2:

Z1+Z2=∩Z,Z∈S(C),Z1⊕Z2⊂Z

(33)

A subtração é definida da mesma maneira.

Caracterização da soma de setores

SejaZ1= ([ρ1],[θ1])eZ2= ([ρ2],[θ2])dois setores e Z sua soma, então os limitesρ− eρ+ de[ρ]devem verificar:

ρ− =min|z|,zZ1⊕Z2

ρ+=max|z|,zZ1⊕Z2 Da mesma forma, os limites de[θ]são soluções de:

θ−=minA(z),zZ1⊕Z2

θ+=maxA(z),zZ1⊕Z2

onde A(z), o ângulo de um complexo z, é definido sobre Z1⊕Z2 tal que A(z) ∈

[θ−,θ+].

2.3.5

Funções Complexas Intervalares Elementares

A seguir serão apresentadas as definições formais de cada uma das funções complexas intervalares elementares, na representação polar, elas estendem as suas respectivas fun-ções reais [Blomquist et al. 2005a].

Função quadrada (Z2) SejaZ=X+YiI(C)

Z2= (XY)·(X+Y) +i.(2.X.Y). (2.1) As funções potência, raiz quadrada e logaritmo assumem Z = ([ρ],[θ]), onde [ρ] = [ρ−;ρ+]e[θ] = [θ−;θ+].

Função potência (Zn)

(34)

Raiz quadrada (√Z) Seja

sqrt(z) =√ρ{cos(θ/2) +i.sin(θ/2)},π<θ+π. (2.2) Podemos definir sqrt(Z) como:

sqrt(Z) ={sqrt(z)|zZI(C)}. (2.3) Função logaritmo

ln(Z) =ln(abs(Z)) +i.arg(Z). (2.4) Funções Trigonométricas

De acordo com [da Silva 2007], a forma de onda das funções seno e cosseno são res-ponsáveis pela grande utilidade nas aplicações matemáticas. A seguir serão apresentadas algumas funções trigonométricas.

Função seno

sen(Z) =sen(X).cosh(Y) +i.cos(X).senh(Y). (2.5) Função cosseno

cos(Z) =cos(X).cosh(Y)i.sen(X).senh(Y). (2.6) Função tangente

tan(Z) = sin(2X)

cos(2X) +cosh(2Y)+i.

sinh(2Y)

cos(2X) +cosh(2Y). (2.7)

Função co-tangente

cot(Z) =tan

π

2−Z

(35)

Funções Trigonométricas Inversas Função arco cosseno

arccos(Z) =tanπ

2−arcsen(Z)

. (2.9)

Função arco tangente

arctan(Z) =tan

1

2i.Ln 1+iZ 1iZ

. (2.10)

Função arco co-tangente

arccot(Z) =arctan

1

Z

. (2.11)

Funções Hiperbólicas Função seno hiperbólico

senh(Z) =senh(X).cos(Y) +i.cosh(X).sen(Y) (2.12)

Função cosseno hiperbólico

cosh(Z) =cosh(X).cos(Y) +i.senh(X).sen(Y). (2.13) Função tangente hiperbólico

tanh(Z) =i.tan(iZ). (2.14) Função co-tangente hiperbólico

(36)

2.4

Considerações

Este capítulo apresentou os números complexos com suas representações e aritméti-cas. Pôde-se observar que a escolha entre a representação retangular e a polar vai depender da aplicação que está sendo desenvolvida.

As principais funções foram incluídas no trabalho com o intuito de nortear o leitor ao se deparar com a proposta do mesmo, já que tais funções, tanto as complexas quanto as complexas intervalares, serão implementadas para JAVA-XSC. No módulo complexo foi implementado tanto a forma retangular, quanto funções de conversão para a forma polar. Já no módulo complexo intervalar apenas a forma retangular foi implementada.

Foi visto também que os números complexos intervalares são obtidos a partir de in-tervalos reais, sendo assim este capítulo apresentou a aritmética intervalar real e logo em seguida a aritmética complexa intervalar em suas representações retangular e polar.

(37)

Algumas ferramentas para cálculo

numérico

3.1

Introdução

Neste capítulo serão apresentadas algumas das bibliotecas desenvolvidas para o aper-feiçoamento do cálculo numérico computacional, em especial, as que trabalham com a matemática intervalar. Estas ferramentas utilizam diversos modos de arredondamento para tratar a forma como seus resultados serão exibidos. Os modos de arredondamento são melhores esclarecidos no Anexo A.

Para cada ferramenta/biblioteca serão informados dados gerais de sua criação, os tipos numéricos implementados e os modos de arredondamento implementados.

3.2

CLN (Class Library for Numbers)

As informações contidas nesta seção foram baseadas no Manual da CLN ([Haible 2005]).

CLN1é uma biblioteca eficiente para computação que contém todos os tipos de núme-ros com precisão arbitrária. Ela foi escrita por Bruno Haible e sua versão atual é mantida por Richard Kreckel. A biblioteca é distribuída sobre a GNU General Public License [Brent & Zimmermann 2009]. CLN foi escrita em C++ e as motivações para isto é que a linguagem provê eficiência (compilada em código de máquina), segurança (C++ não permite que uma variável de um tipo assuma um valor que não seja daquele tipo) e uma

(38)

sintaxe algébrica.

Esta biblioteca tem por principais características:

• Rico conjunto de classes numéricas: Inteiro(precisão ilimitada), racional, float (short, single, double e long), complexo, inteiro modular, polinomial univariada.

• Funções elementares (+, -, *, /, sqrt, comparações, ...), lógicas(and, or, not, ...) e

transcendentais(exponencial, logaritmo, trigonometria, funções hiperbólicas e suas funções inversas).

• Eficiência de Memória.

• Eficiência de velocidade: O kernel da CLN foi escrito em linguagem assembly para

algumas CPUs e ela usa divisão binária para avaliação rápida da série de números racionais à medida que ocorrem na avaliação de funções elementares e algumas constantes.

• Interoperabilidade: Apresenta coleta de lixo sem qualquer obrigação para a aplica-ção principal e ganchos para alocaaplica-ção de memória e exceções.

3.2.1

Tipos Numéricos

A CLN implementa as classes númericas presentes na hierarquia ilustrada na Figura 3.1.

A classe basecl_numberé uma classe abstrata, sendo assim, não pode ser usada para declarar uma variável. A classecl_N compreende aos tipos real e números complexos.

A classecl_Rtambém é uma classe abstrata e compreende os números reais de dife-rentes tipos. A classecl_RAcorresponde exatamente aos números reais: números racio-nais, incluindo inteiros. A classecl_F é uma classe abstrata que implementa aproxima-ções de ponto-flutuante para números reais.

3.2.2

Números Exatos

(39)

Figura 3.1: Hierarquia dos tipos numéricos em CLN

Os números racionais são sempre normalizados na forma numerador/denominador onde ambos são inteiros comprimidos e o denominador é positivo, se o resultado do de-nominador for 1, o número racional é convertido para inteiro.

3.2.3

Números de Ponto-Flutuante

Como nem todos os números podem ser representados de forma exata, algumas apro-ximações são necessárias. CLN implementa números de ponto-flutuante com mantissa e expoente. Os números de ponto-flutuante podem ser de quatro tipos distintos:

• Flutuantes curtos (cl_SF): possui 1 bit de sinal, 8 bits de expoente (incluindo o sinal do expoente) e 17 bits de mantissa (incluindo o bit ’oculto’).

• Flutuantes simples (cl_FF): possui 1 bit de sinal, 8 bits de expoente (incluindo o si-nal do expoente) e 24 bits de mantissa (incluindo o bit ’oculto’). São representados como os pontos-flutuantes de precisão simples da IEEE e corresponde ao tipofloat da C/C++.

(40)

sinal do expoente) e 53 bits de mantissa (incluindo o bit ’oculto’). São represen-tados como os pontos-flutuantes de precisão dupla da IEEE e corresponde ao tipo doubleda C/C++.

• Flutuantes longos (cl_LF): possui 1 bit de sinal, 32 bits de expoente (incluindo o sinal do expoente) e n bits de mantissa (incluindo o bit ’oculto’), onde n >= 64. Sua precisão é ilimitada, mas uma vez criada, um flutuante longo tem uma precisão fixa.

CLN não implementa recursos como NaNs, números desnormalizados e estouro (un-derflow). Se o alcance do expoente de alguns tipos de pontos-flutuantes é limitado para alguma aplicação, então é necessário optar por outro com o expoente maior.

3.2.4

Números Complexos

Os números complexos implementados na classecl_Npossuem uma parte real e uma imaginária, ambos números reais. Um número complexo cuja parte imaginária é o nú-mero exato 0 será automaticamente convertido para um núnú-mero real.

Números complexos podem originar-se apenas de números reais. A classecl_Ndefine a seguinte operação:

• cl_Ncomplex (const cl_R& a, const cl_R& b)

Retorna o número complexoa+bi, ondeaé a parte real eba parte imaginária. Cada uma das classescl_Necl_Rdefinem as seguintes operações:

• cl_Rrealpart (const type&x)

Retorna a parte real de x.

• cl_Rimagpart (const type&x)

Retorna a parte imaginária de x.

• type conjugate (const type&x)

Retorna o complexo conjugado de x.

3.2.5

Funções de Arredondamento

(41)

Lisp e o padrão ISO LISP fornece quatro funções de arredondamento:

• floor(x): maior inteiro;

• ceiling(x): menor inteiro;

• truncate(x): inteiros entre 0 e x (inclusive) o mais próximo de x.

• round(x): o mais próximo de x. Se x está exatamente na metade entre dois inteiros

escolhe-se um deles.

3.3

GNU MP (GMP)

As informações contidas nesta seção foram baseadas no Manual da GMP ([Granlund & the GMP development team 2010]).

GMP2é uma biblioteca escrita em C com uma aritmética de precisão arbitrária para inteiros, números racionais e números de ponto flutuante [Granlund & the GMP develop-ment team 2010]. Ela foi desenvolvida por Torbjorn Granlund e outros contribuintes no ano de 1993, sendo que uma versão preliminar foi criada em 1991. A biblioteca é distri-buída sobre a GNU LGPL (esta licença torna a biblioteca livre para usar, compartilhar e melhorar, e permite o repasse do resultado).

As aplicações mais interessadas na GNP são aplicações para criptografia e pesqui-sas, segurança naInternet, sistemas algébricos, pesquisa algébrica computacional, entre diversas outras. Algumas aplicações usam apenas poucas centenas de bits na precisão mas outras podem precisar de milhares de bits. A GNP foi desenvolvida para trabalhar em ambas as situações com bom desempenho, podendo escolher algoritmos baseados no tamanho dos operadores. Essa é uma vantagem em relação a JAVA-XSC pois a mesma está presa a extensão do tamanho por não termos inteiros não sinalizados.

Existem várias categorias de funções em GMP:

• Inteiro (mpz): esta categoria apresenta cerca de 140 funções aritméticas e lógicas.

• Racional (mpq): esta categoria contém cerca de 35 funções, mas todas as funções

da aritmética de inteiros podem ser utilizadas aqui também.

• Ponto Flutuante (mpf): Esta categoria é utilizada quando o tipo double de C não

fornece precisão suficiente para uma aplicação. Aqui encontram-se cerca de 65 funções.

(42)

• Funções de baixo nível que operam com números naturais. Aqui existe cerca de 30

funções.

• Funções diversas: funções para criação de atribuições e funções personalizadas para a geração de números aleatórios.

• Suporte externo: Funções aritméticas de ponto-flutuante com arredondamento pre-ciso (MPFR). A partir do GMP 4.2, MPFR é distribuído separadamente do GMP.

3.3.1

Números Racionais

Os números racionais são armazenados em objetos do tipompq_t.

De acordo com [Granlund & the GMP development team 2010], todas as funções da aritmética racional assumem operandos na forma padrão. Forma padrão quer dizer que o denominador e o numerador não possuem fatores em comum e que o denominador é positivo. Zero tem uma representação única 0

1.

3.3.2

Ponto-Flutuante

Ainda segundo [Granlund & the GMP development team 2010], a mantissa de cada f loat tem uma precisão determinada pelo usuário, limitada somente pela capacidade de memória. Cada variável possui sua própria precisão que pode ser incrementada ou decre-mentada a qualquer momento.

O expoente de cada f loat é uma precisão fixa, uma palavra de máquina na maioria dos sistemas. Na versão mais recente (5.0.1), o expoente é uma contagem de membros, por exemplo, sobre um sistema de 32-bit, significa um intervalo de cerca de 2−68719476768 a 268719476736. Sobre um sistema de 64-bit isto será maior.

Cada variável mantém os dados do tamanho da mantissa atualmente em uso. Isso sig-nifica que se o f loaté representado exatamente em apenas poucos bits então apenas esses bits serão usados no cálculo, mesmo se a precisão selecionada for alta.

(43)

A mantissa é armazenada em binário. Uma consequência disto é que frações decimais como 0.1 não podem ser representadas de forma exata, o mesmo também ocorre no IEEE double f loats.

Funções ’mpf’ e variáveis não possuem uma notação especial para infinito ou NaN, e as aplicações devem tomar cuidado para não sobrecarregar o expoente ou os resultados se tornarão imprevisíveis.

As funçõesmp f não são extensões do IEEE-754, sendo assim, os resultados obtidos em um computador, muitas vezes diferem dos resultados em um computador com uma palavra de tamanho diferente.

Esta ferramenta não possui funções para se trabalhar com números complexos.

3.4

MPFR (

Multiple Precision Floating-Point Reliable

)

As informações contidas nesta seção foram baseadas no Manual da MPFR ([Hanrot et al. 2011]).

A MPFR3é uma biblioteca que trabalha com uma aritmética altamente precisa sobre números de ponto flutuante. Escrita em C e baseada na biblioteca GNU MP vista anteri-ormente, ela provê uma classe de ponto flutuante com semântica precisa. Suas principais características são:

• Apresenta um código portável, ou seja, o resultado da operação não depende da máquina na qual esta sendo executada.

• a precisão em bits pode ser definida exatamente para qualquer valor válido para

cada variável.

• MPFR oferece cinco modos de arredondamento do padrão IEEE 754-2008 (provê

arredondamento correto e exceções).

Com isto, a biblioteca MPFR provê operações de aritmética básica, algumas funções elementares e várias funções especiais, com arredondamento correto a qualquer precisão.

(44)

3.4.1

Modos de Arredondamento

Em MPFR são suportados cinco tipos de arredondamento [Hanrot et al. 2011]:

• MPFR_RNDN: Arredondamento para o mais próximo (roundTiesToEvenno IEEE

754-2008);

• MPFR_RNDZ: Arredondamento para o zero (roundTowardZero no IEEE

754-2008);

• MPFR_RNDU: Arredondamento em direção ao infinito positivo (roundTowardPo-sitiveno IEEE 754-2008);

• MPFR_RNDD: Arredondamento em direção ao infinito negativo (roundToward-Negativeno IEEE 754-2008);

• MPFR_RNDA: Arredondamento distante do zero (experimental).

O arredondamento para o mais próximo trabalha tal qual o padrão IEEE 754, ou seja, no caso do número estar arredondado exatamente entre dois números representáveis, ele é arredondado para aquele com o bit menos significativo de zero. Por exemplo, o número 2.5, que é representado por 10.1 em binário, é arredondado para 10.0 = 2 com precisão de dois bits e não para 11.0 = 3.

A maioria das funções em MPFR utilizam três argumentos, o primeiro é a variável de destino, o segundo são as variáveis de entrada e por último um modo de arredondamento. Estas funções retornam um valor do tipo inteiro, chamado de valor ternário. O valor arma-zenado na variável de destino é corretamente arredondado, ou seja, MPFR comporta-se como se ela computasse os resultados com uma precisão infinita, então arredonda para a precisão desta variável.

Em consequência, no caso de um resultado de arredondamento diferente de zero, o erro no resultado é menor ou igual a 1

2 ulp (unit in the last place), que é o peso do úl-timo bit significativo representado no resultado após o arredondamento, resultando em um arredondamento para o mais próximo, e menos que 1 ulp resultando nos modos de arredondamento direcionado.

(45)

obtido poroverflowe exato caso contrário. Um resultado NaN sempre corresponde a um valor de retorno exato.

3.4.2

Ponto-Flutuante

De acordo com [Fousse et al. 2007], um número de ponto-flutuante x em MPFR é representado por uma mantissam, um sinalse um expoente sinalizadoe. O tamanho (em bits) da mantissa será de acordo com a precisão, p, dex. Neste caso a mantissa terápbits significantes e é interpretada como 1

2 ≤m<1.

A MPFR utiliza uma estratégia onde cada parte de um número de ponto flutuante apresenta uma precisão local. Segundo [Muller et al. 2009], esta estratégia é muito efici-ente, pois o usuário pode alocar grandes precisões somente para variáveis que realmente necessitam delas e pequenas precisões para as outras.

Esta ferramenta não possui funções para se trabalhar com números complexos nem intervalos. Mas algumas ferramentas foram construídas baseadas nela, entre elas temos a MPFI, que possui funções específicas para o uso de intervalos, e a MPC, que trabalha com números complexos.

3.5

MPFI (

Multiple Precision Floating-Point Interval

)

As informações contidas nesta seção foram baseadas no Manual da MPFI ([Revol 2002]).

MPFI4é uma biblioteca para aritmética intervalar com precisão múltipla desenvolvida por [Revol & Rouillier 2002]. Esta biblioteca foi escrita em C e desenvolvida seguindo os conceitos da MPFR e GNP. Por ser um software livre ela pode ser adquirida gratuitamente através do site do projeto.

Segundo [Revol & Rouillier 2002], múltipla precisão significa que a precisão com-putada não é limitada à precisão simples ou dupla da máquina dos números de ponto-flutuante, no contrário, precisões arbitrárias devem estar disponíveis. Além disso, esta

(46)

’computação precisa’ deve ser ajustada dinamicamente para cumprir a exatidão necessá-ria. Uma das exigências mais requeridas pela aritmética intervalar é facilitar o arredon-damento: isso garante que para cada operação, o intervalo computado usando aritmética de ponto-flutuante contenha o intervalo obtido se a aritmética real exata está sendo usada. Ainda mais desejável é um arredondamento direcionado exato para evitar perda de acurá-cia.

No MPFI os intervalos são implementados usando seus extremos que são números de pontos-flutuantes MPFR seguros.

3.5.1

Modos de Arredondamento

De acordo com [Revol 2002], apenas dois modos de arredondamento são usados no manuseio de intervalos representados por seus extremos:

• MPFI_RNDU: Arredondamento em direção ao infinito positivo;

• MPFI_RNDD: Arredondamento em direção ao infinito negativo.

A MPFI ainda está em fase de desenvolvimento, no futuro, planeja-se incrementar a biblioteca com novas facilidades tais como diferenciação automática e álgebra linear.

3.6

MPC (Multiple Precision Complex)

As informações contidas nesta seção foram baseadas no Manual da MPC ([team 2011]).

MPC5, desenvolvida por [Enge et al. 2011], é uma biblioteca também escrita em C que apresenta uma aritmética precisa sobre números complexos provendo um arredonda-mento correto. Ela foi escrita baseando-se nas bibliotecas GNU MP e na GNU MPFR. Todas as declarações necessárias para usar MPC estão no arquivo ’mpc.h’, que pode tra-balhar tanto com o compilador C quando com C++.

Esta biblioteca utiliza a representação cartesiana: o número complexox+iyé armaze-nada como um par(x,y)de dois números de ponto-flutuante de precisão arbitrária (pares

(47)

real e imaginária). A precisão é o número de bits usados para representar a mantissa das partes real e imaginária.

3.6.1

Modos de Arredondamento

O modo de arredondamento especifica a maneira de arredondar o resultado de uma operação complexa, no caso o resultado exato não pode ser representado exatamente na mantissa de destino. O modo de arredondamento de complexos é um par de dois modos de arredondamento: um para a parte real e outra para a parte imaginária.

Um modo de arredondamento complexo é da forma MPC_RNDxy, onde x e y per-tencem a N (mais próximo), Z (direção ao zero), U (direção ao infinito positivo) ou D (direção ao infinito negativo). O primeiro refere-se ao modo de arredondamento da parte real e o segundo da parte imaginária. Por exemplo: MPC_RNNZ indica que a parte real usará o arrendondamento para o mais próximo e a parte imaginária utilizará o arredonda-mento em direção ao zero.

O arredondamento para o mais próximo trabalha como no padrão IEEE P754, ou seja, no caso do número estar arredondado exatamente no meio de dois números representáveis, ele é arredondado de forma que o último bit significante seja igual a zero. Por exemplo: o número 5 (101 em binário), é arredondado para 4 (100) com uma precisão de dois bits e não para 6 (110).

3.6.2

Funções Complexas

As funções ponto-flutuante MPC possuem uma interface que é similar às funções in-teiras GMP. O prefixo da função para operações sobre números complexos émpc_.

A computação da precisão acontece da seguinte forma: calcula-se exatamente a ope-ração solicitada (com precisão infinita) e arredonda o resultado na variável de destino com o modo de arredondamento informado.

(48)

Existem diversas funções divididas em módulos, tais como: funções de atribuição, funções de conversão, funções de comparações, funções de projeções e decomposições, funções aritméticas básicas, funções de potência e logaritmo, funções trigonométricas, funções diversas e funções avançadas.

3.7

INTLIB

INTLIB é uma biblioteca desenvolvida para a linguagem Fortran 77 que oferece um padrão nas operações com intervalos, facilitando desta forma, a utilização da aritmética intervalar. Ela alcança portabilidade com arredondamento e pode ser utilizada tanto por Fortran 77 quanto por Fortran 90. A INTLIB tem como principais características [Kearfott et al. 1994]:

• Portabilidade. Desta forma os usuários conseguem transferir programas de

aplica-ção de uma máquina para outra e o programa executará eficazmente sem nenhuma alteração, e apresenta uma rigorosa aritimética intervalar para a comunidade For-tran.

• Apresenta uma grande quantidade de documentos para as diversas versões disponí-veis.

• A biblioteca suporta sobrecarga de operador em Fortran 90. • Apresenta um paradigma de teste razoável.

• Sinalização de erros simples mas eficiente.

As rotinas desta biblioteca são consideradas significativamente legíveis para os usuá-rios, sendo precisas e sem grande número de funções desnecessárias, ou que gerem ambi-guidade de interpretação matemática. A INTLIB é dividida em cinco módulos, que são: módulo para aritmética intervalar elementar (Tabela 3.1), módulo de funções intervalares elementares (Tabela 3.2), módulo de funções úteis (Tabela 3.3), módulo de impressão de erros e módulo de constantes matemáticas de programas que é utilizada para inicializar parâmetros e constantes globais.

Tabela 3.1: Módulos do INTLIB: Aritmética elementar para intervalos

Nome Função

ADD Adição

(49)

MULT Multiplicação

IDIV Divisão

RNDOUNT Arredondamento

SCLADD Adição de intervalos e números re-ais

SCLMLT Multiplicação de escalar

Tabela 3.2: Módulos do INTLIB: Funções padrões para intervalos

Nome Função

IEXP Exponencial

ISQRT Raiz quadrada

POWR Potência inteira

HIIPOWR Potência para um intervalo não ne-gativo

ILOG Logaritmo

ISIN Seno

ICOS Co-seno

IASIN Arco seno

IACOS Arco co-seno

IATAN Arco tangente

IACOT Arco co-tangente

ISINH Seno hiperbólico

Tabela 3.3: Módulos do INTLIB: Funções úteis

Nome Função

ICAP Interseção

IDISJ Dois intervalos disjuntos

IHULL União convexa

(50)

IILTI Inclusão no interior

IINF Retorna a esquerda do ponto final IMID Ponto médio de um intervalo

IMIG Magnitude

IRLEI Inclusão de ponto no fechamento do intervalo

IRLTI Inclusão de ponto no interior do in-tervalo

ISUP Retorna o ponto final direito IVL1 Constroi intervalo para um ponto IVLABS Construção de um intervalo a partir

de outro

IVLI Atribuir um intervalo a outro

IWID Diâmetro de um intervalo

3.7.1

Simulação de Arredondamento Direcionado

O arredondamento direcionado simulado é uma forma com a qual fechamentos rigo-rosos para resultados de pontos-flutuantes podem ser obtidos em FORTRAN 77 e outras linguagens e máquinas que não possuem acesso ao arredondamento direcionado verda-deiro. A única exigência é que os parâmetros aritméticos, tais como a exatidão de uma operação elementar, sejam conhecidos. Para mais detalhes ver [Kearfott 1995].

3.8

COMMONS MATH

Commons Math é uma biblioteca desenvolvida em JAVA composta de um pequeno conjunto de utilitários com objetivo de resolver alguns problemas de programação, como os citados abaixo:

• Variâncias e estatísticas de resumo para uma lista de números;

• Ajuste de uma reta a um conjunto de pontos por meio de regressão linear;

• Encontrar uma curva suave que passe através de uma coleção de pontos

(51)

• Colocação de um modelo paramétrico para um conjunto de medidas usando

méto-dos de mínimos quadraméto-dos;

• Resolução de equações envolvendo funções reais

• Resolução de sistemas de equações lineares;

• Solução de equações diferenciais ordinárias;

• Minimização de funções multi-dimensional;

• Geração de números aleatórios com mais restrições (por exemplo, a distribuição

gama), do que é possível usar no JDK;

• Realização de testes de significância estatística;

• Diversas funções matemáticas tais como fatoriais, coeficientes binomial e "funções

especiais".

3.8.1

Organização

Commons Math é dividido em catorze sub-pacotes, com base na funcionalidade for-necida. Estes sub-pacotes são:

1. org.apache.commons.math.stat- estatísticas, testes estatísticos.

2. org.apache.commons.math.analysis- integração, interpolação, polinômios.

3. org.apache.commons.math.random- números aleatórios, cordas e de geração de dados.

4. org.apache.commons.math.special- funções especiais (Gama, Beta).

5. org.apache.commons.math.linear- matrizes, resolução de sistemas lineares.

6. org.apache.commons.math.util- matemática comum/ funções estendendo java.lang.Math.

7. org.apache.commons.math.complex- números complexos.

8. org.apache.commons.math.distribution- distribuições de probabilidade.

(52)

10. org.apache.commons.math.transform - métodos de transformação (Fast Fou-rier).

11. org.apache.commons.math.geometry- geometria (espaços euclidianos e Parti-cionamento Espacial Binária).

12. org.apache.commons.math.optimization - maximização ou minimização da função.

13. org.apache.commons.math.ode- equações diferenciais ordinárias integração.

14. org.apache.commons.math.genetics- algoritmos genéticos.

3.8.2

Números Complexos

O pacote org.apache.commons.math.complex é responsável pela criação do tipo nú-mero complexo e pela implementação das suas funções.

Este pacote é composto pelas seguintes classes:

Complex

Esta classe é responsável pela representação do número complexo, ou seja, um nú-mero com uma parte real e uma parte imaginária.

As implementações de operações aritméticas lidam com NaN e valores infinitos de acordo com as regras para o tipo Double, ou seja, equals (java.lang.Object) é uma relação de equivalência para todas as instâncias que têm um NaN, na parte real ou imaginária, por exemplo, são considerados iguais:

• 1 + NaNi • NaN + i

• NaN + NaNi

(53)

1. Complex(double real): Cria um número complexo dado sua parte real.

2. Complex(double real, double imaginaria): Cria um número complexo dado sua parte real e imaginária.

Métodos:

A Tabela 3.4 apresenta todos os métodos implementados na classeComplex:

Tabela 3.4: Métodos da classeComplex

Método Função

abs() Retorna o valor absoluto de um número

com-plexo

acos() Calcula o arco-cosseno de um número

com-plexo

add(Complex c) Retorna o complexo cujo valor é (this + c) add(double d) Retorna o complexo cujo valor é (this + d)

asin() Calcula o arco-seno de um número complexo

atan() Calcula o arco-tangente de um número

com-plexo

cosh() Calcula o cosseno hiperbólico de um número

complexo

createComplex(double r, double i) Cria um número complexo dado sua parte real e imaginária

divide(Complex divisor) Retorna um número complexo cujo valor é (this / divisor)

Divide(double divisor) Retorna um número complexo cujo valor é (this / divisor)

equals(java.lang.Object outro) Testa se dois Complexos são iguais

exp() Calcula a função exponencial de um número

complexo

(54)

getImaginary() Retorna aparte imaginária de um número com-plexo

getReal() Retorna a parte real de um número complexo hasCode() Obter um hashCode para o número complexo isInfinity() Verifica se ambas as partes de um número

com-plexo tem um valor infinito

isNaN() Verifica se uma ou ambas as partes de um nú-mero complexo é NaN.

log() Calcula o logaritmo natural de um número com-plexo

multiplay(Complex f) Retorna um número complexo cujo valor é (this * f)

multiplay(double f) Retorna um número complexo cujo valor é (this * f)

multiplay(int f) Retorna um número complexo cujo valor é (this * f)

negate() Retorna um número complexo cujo valor é (-this)

nthRoot(int n) Calcula as n raízes de um número complexo pow(Complex x) Retorna um número complexo elevado à x pow(double x) Retorna um número complexo elevado à x reciprocal() Retorna o inverso multiplicativo

sin() Calcula o seno de um número complexo

sinh() Calcula o seno hiperbólico de um número com-plexo

sqrt() Calcula a raiz quadrada de um número

com-plexo

sqrt1z() Calcula a raiz quadrada de (this -1)

substract(Complex s) Retorna um número complexo cujo valor é (this -s)

substract(double s) Retorna um número complexo cujo valor é (this -s)

(55)

tanh() Calcula a tangente hiperbólica de um número complexo

toString() Complex valueOf(double realPart) Cria um nú-mero complexo dado a parte real

valueOf(double r, double i) Cria um número complexo dado ambas as par-tes

ComplexField

Esta classe é responsável pela representação dos números complexos. É composta pelos seguintes métodos:

getInstance(): Obtém uma instância única retornando um ComplexField;

getOne():Obtém a identidade multiplicativa e retorna um Complex;

getRuntimeClass(): Retorna a classe runtime do FieldElement e

getZero():Obtém a identidade aditiva e retorna um Complex;

ComplexFormat

Esta classe é responsável pelo formato de um número complexo, Re(c) + Im(c)i. i pode ser substituído por j(ou qualquer outra coisa), e o formato de número de peças reais e imaginárias podem ser configurados.

Construtores:

1. ComplexFormat (): Cria uma instância com a parte imaginária padrão, i, e o for-mato de número padrão para ambas as partes reais e imaginárias.

Imagem

Figura 2.1: Interpretação geométrica dos números complexos
Figura 2.2: Forma algébrica e polar do complexo c = 5 + i3
Figura 3.1: Hierarquia dos tipos numéricos em CLN
Tabela 3.1: Módulos do INTLIB: Aritmética elementar para intervalos
+7

Referências

Documentos relacionados

Assim sendo, não posso deixar de agradecer uma vez mais a todos os colaboradores que viveram comigo esta experiência e que contribuíram para toda a minha aprendizagem em contexto

Nesse sentido, os cursos de formação de professores, por meio do estágio, devem valorizar as atividades que desenvolvem as habilidades do diálogo, da reflexão, da pesquisa e

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

O enfermeiro, como integrante da equipe multidisciplinar em saúde, possui respaldo ético legal e técnico cientifico para atuar junto ao paciente portador de feridas, da avaliação

Apesar do glicerol ter, também, efeito tóxico sobre a célula, ele tem sido o crioprotetor mais utilizado em protocolos de congelação do sêmen suíno (TONIOLLI

Quando se fala em computação numérica, a exatidão dos cálculos é algo de muita importância e por isso necessária para uma solução satisfatória, sendo assim, a

Art. 24 – Remoção é a passagem das Classes de Docente Titular e de Suporte Pedagógico de uma para outra Unidade Escolar, sem que se modifique sua situação funcional.

A Tabela 3 apresenta os resultados de resistência ao impacto Izod e as caracterizações térmicas apresentadas em função dos ensaios de HDT, temperatura Vicat e a taxa de queima do