2012-02-21 14 views
5

Estoy tratando de verificar si un número std::complex que es el resultado de una transformación de Fourier (usando http://fftw.org/) contiene un NaN en la parte real o imag.Comprobando si un número complejo tiene NaN

Estoy usando Borland C++, entonces no tengo acceso a std::isnan. He tratado de comprobar si el número es NaN comparándolo a sí mismo:

(n.imag() != n.imag()) 

Sin embargo, tan pronto como lo llamo el n.imag() o std::imag(n), consigo una "operación no válida de punto flotante".

¿Hay alguna manera de validar si un std::complex es bueno; si contiene un NaN?

+5

Cambie su compilador si no es compatible con 'std :: isnan'. – Nawaz

+0

Nawaz: trabajando en ello. Pero es una gran base de código y tengo que mantener el producto mientras tanto. – dagur

Respuesta

0

Descubrí que Borland tiene su propia biblioteca de matemáticas. Entonces, si quiere evitar los errores de coma flotante, use IsNan de Borlands Math.

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/[email protected]

+0

Para verificar NaN en un número complejo, tuve que hacer este hack en Borland: std dado :: complejo n; doble a (n._Val [0]); doble b (n.Val [1]); IsNan (a) || IsNan (b), donde IsNan se define en Math.hpp – dagur

4

Esto funciona en g ++:

#include<iostream> 
#include<cmath> 
#include<complex> 

int main(){ 

    double x=sqrt(-1.); 
    std::complex<double> c(sqrt(-1.), 2.); 

    std::cout<<x<<"\n"; 
    std::cout<<c<<"\n"; 

    std::cout<< ((c!=c) ? "yup" : "nope")<<"\n"; 
} 
+0

Editar: Esto funciona. Intenté esto, y aquí está la salida: + NAN (+ NAN, 2) no – dagur

+0

@dagur: así funcionó --- te dijo 'yup' para un número complejo que es un NaN. ¿Me estoy perdiendo de algo? –

+0

Sí, tardé en editar mi respuesta cuando me di cuenta de eso :). – dagur

0

¿Hay fpclassify() en math.h? Debería devolver FP_NAN para NaNs. O mejor aún, use isnan(). Si no hay tales funciones/macros, puedes mirar la representación binaria de tus flotantes o dobles y verificar manualmente los NaN. Vea los formatos de precisión simple y doble IEEE-754 para más detalles.

+0

fpclassify() no parece existir en el estándar Borland C++ usa – dagur

1

Desde la cabecera float.h

int _isnan(double d); 

devuelve un valor nonzero (TRUE) si el valor pasado es un NaN; de lo contrario, devuelve 0 (FALSE).

int _fpclass(double __d); 

Devuelve un valor entero que indica la clase de coma flotante de su argumento. Los valores posibles se definen en FLOAT.H (NaN, INF, etc.)

Cuestiones relacionadas