Jump to content

Recommended Posts

Posted

Tal como o tópico indica, estava aqui a programar e em vez de atribuir um valor manhoso, lembrei-me já que posteriormente facço a verificação se se trata de uma variável "nan", se era possível atribuir este "valor" directamente a uma variável.

Ocorreu-me agora uma ideia martelada de

double x;

x = 10.0/0;

mas não sei se isto funciona, e mesmo que funcione gostava de saber se existe alguma forma mais correcta?

Agradecido a todos.

Posted

Sabes que saber se isso funciona é tão fácil como experimentar. Isso dá infinito. Mas podes obter NaN dividindo zero por zero.

Se, quando imprimes o valor te dá infinito, podes comparar da seguinte forma:

if (x - x != 0.0) printf("infinito");

Para verificares se é NaN:

if (x != x) printf("não é um número");

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Posted (edited)

O Standard C99 tem a macro isnan() (definida em <math.h>) que eventualmente podes usar para detectar se um numero é "not a number".

Ainda em C99 existem as funcoes

#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);

que devolvem nans do tipo especificado (ou zero se a implementacao nao suportar nans).

Ou ainda para meteres um NAN numa variavel; se o teu compilador for o gcc e nao te importares em usar coisas nao portavies, podes usar a macro NAN.

E ainda, le o ponto 14.9 da FAQ do comp.lang.c.

Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

Era mesmo isto que estava á procura, eu uso de facto o gcc, e para verificar se era nan, usei a macro isnan() como o pmg diz.

Realmente baralhei-me, 10/0 é infinito e não nan, até porque têm codificações diferentes no formato de virgula flutuante.

Então para a atribuição do nan acho que vou escolher o 0./0. ao invés do sqrt(-1); A nível de complexidade computacional, apenas por curiosidade, qual será o mais complexo? eu pensaria que fosse a raiz quadrada, mas dado que ambos vão dar "erro" não sei se a complexidade se manterá a mesma.

Posted

Então para a atribuição do nan acho que vou escolher o 0./0. ao invés do sqrt(-1); A nível de complexidade computacional, apenas por curiosidade, qual será o mais complexo?

A complexidade computacional deve ter efeito apenas durante a compilacao.

O codigo compilado tera o equivalente a

var = 42;

... e se estas preocupado com a performance do compilador ganhas muito mais com, por exemplo, a remocao de comentarios do codigo; ou seja: nao te preocupes 🙂

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.