Проверка, имеет ли комплексное число NaN - PullRequest
5 голосов
/ 21 февраля 2012

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

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

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

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

Есть ли способ проверить, является ли std::complex хорошим, если он содержит NaN?

Ответы [ 4 ]

4 голосов
/ 21 февраля 2012

Это работает на 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";
}
1 голос
/ 14 февраля 2013

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

int _isnan(double d);

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

int _fpclass(double __d);

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

0 голосов
/ 09 марта 2012

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

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Math_IsNan@Double.html

0 голосов
/ 21 февраля 2012

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

...