2012-02-21 2 views
5

Я пытаюсь проверить, есть ли номер std::complex, являющийся результатом преобразования Фурье (с использованием http://fftw.org/), содержит NaN в реальной или воображаемой части.Проверка того, содержит ли комплексное число NaN

Я использую Borland C++, поэтому у меня нет доступа к std::isnan. Я попытался проверить, если число NaN, сравнивая его с собой:

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

Однако, как только я называю n.imag() или std::imag(n), я получаю «плавающую точку недопустимую операцию».

Есть ли способ проверить правильность std::complex; если он содержит NaN?

+5

Измените свой компилятор, если он не поддерживает 'std :: isnan'. – Nawaz

+0

Nawaz: Работа над ним. Но это большая база кода, и я должен поддерживать продукт в среднее время. – dagur

ответ

0

Я узнал, что у Borland есть своя математическая библиотека. Поэтому, если вы хотите избежать ошибок с плавающей запятой, используйте IsNan из Borlands Math.

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

+0

Чтобы проверить NaN на комплексном числе, мне пришлось сделать этот взлом в Borland: данный std :: комплекс n; double a (n._Val [0]); double b (n.Val [1]); IsNan (a) || IsNan (b), где IsNan определен в Math.hpp – dagur

4

Это работает на г ++:

#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

Редактировать: Это работает. Я попробовал это, и вот результат: + NAN (+ NAN, 2) nope – dagur

+0

@dagur: так что это действительно сработало --- он сказал вам «yup» для сложного числа, которое является NaN. Я что-то упускаю? –

+0

Да, я медленно редактировал свой ответ, когда понял это :). – dagur

0

Есть в math.hfpclassify()? Он должен вернуть FP_NAN для NaNs. Или еще лучше использовать isnan(). Если таких функций/макросов нет, вы можете посмотреть двоичное представление ваших поплавков или удвоений и проверить вручную для NaN. Для получения более подробной информации см. IEEE-754.

+0

fpclassify(), похоже, не существует в std Borland C++ использует – dagur

1

Из float.h заголовка

int _isnan(double d); 

Возвращает nonzero значение (TRUE), если значение, переданное в является NaN; в противном случае он возвращает 0 (FALSE).

int _fpclass(double __d); 

Возвращает целочисленное значение, которое указывает класс с плавающей запятой его аргумента. Возможные значения определены в FLOAT.H (NaN, INF и т. Д.)

Смежные вопросы