7 Jan 2009 acs   » (Journeyer)

Numeros complexos vs NaN (Not-a-Number)


Lendo uma thread em uma lista de discussão que acompanho, surgiu uma duvida bem interessante sobre NaN e em uma das mensagens me deparei com a seguinte afirmação.

“Números imaginários são um exemplo, sqrt (-1) retorna NaN. Outro é dividir zero ou +/- infinito por zero.”

Vamos analisar essa frase começando pelo fim.

De acordo com a IEEE 754, se eu tenho uma variável a = 0 e divido a mesma por 0, vai dar um NaN, porem se eu tenho em a um valor positivo que tende ao infinito, o valor vai ser positivo e se o valor de a for negativo, logo essa divisão vai resultar em um valor negativo.

Ok, até aqui nenhuma objeção, tudo nos conformes. Porém, porém… agora vamos a primeira afirmação.

“Números imaginários são um exemplo, sqrt (-1) retorna NaN.”

Ooopss…. Sinto que houve um equivoco ai, pois não foi definido pelo autor da frase em qual conjunto numérico ele está trabalhando, penso que ele se limitou a qualquer conjunto no qual sqrt(-1) realmente não tem solução (Q, R, Z…), porém, existe também o conjunto dos complexos e nesse conjunto, existe solução para sqrt(-1). E vamos provar isso utilizando o nosso velho amigo C++, pois ele possui uma classe/template por padrão que trabalha com números complexos usando tipos de ponto flutuante, ou seja, utilizando o nosso amigo, podemos provar que existe sim solução para sqrt(-1) no campo dos complexos

Listarei logo abaixo um código simples que demonstra a nossa teoria em C++, ou seja, provar que existe sim resposta para sqrt(-1) e que ela é diferente de NaN

(jumpi@Painkiller:~)$ vi complex.cpp


#include <iostream>
#include <complex>

using namespace std;

int main(int argc, char **argv)
{
    complex<float> res = sqrt(complex<float>(-1));
    cout << res << endl;
    return(0);
}

(jumpi@Painkiller:~)$ ./complex
(0,1)
(jumpi@Painkiller:~)$

Antes recapitulando, a forma geral de um numero complexo no seu plano obedece a forma a + b*i, onde a representa o numero real e b um numero imaginário, ou seja, o retorno do tipo complex em C++ retorna as coordenadas de um numero complexo no plano.

No nosso caso, substituindo na fórmula, teremos a + b*i == 0 + 1*i que equivale a i.

Vamos fazer o teste para confirmar?? Utilizando o google, sim… o google, pois a busca serve como uma excelente calculadora e vai nos ajudar com a prova, digite sqrt(-1), qual a resposta??? Sim… sim… sqrt(-1) equivale a i, mesmo resultado apresentado pelo nosso simples programinha em C++.

Q.E.D.

Logo, sqrt(-1) = i e não um NaN conforme foi dito na thread.

Essa foi apenas uma demonstração de que não podemos esquecer da base matemática para formular uma resposta, principalmente no que envolve recursos que podem ser representados pela linguagem.

Maiores informações podem ser encontradas nos seguintes sites:

Wolfram Complex Number
Wolfram Complex Plane
C plus plus complex reference

      

Syndicated 2009-01-06 03:45:04 from Jumpi's Notepad

Latest blog entries     Older blog entries

New Advogato Features

New HTML Parser: The long-awaited libxml2 based HTML parser code is live. It needs further work but already handles most markup better than the original parser.

Keep up with the latest Advogato features by reading the Advogato status blog.

If you're a C programmer with some spare time, take a look at the mod_virgule project page and help us with one of the tasks on the ToDo list!