检查复数是否为NaN

5
我正在尝试检查一个使用http://fftw.org/进行傅里叶变换的std::complex数字是否包含实部或虚部的NaN

由于我正在使用Borland C++,因此无法访问std::isnan。我已尝试通过将其与自身进行比较来检查该数字是否为NaN

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

然而,一旦我调用n.imag()std::imag(n),就会收到“浮点无效操作”的错误提示。

有没有办法验证一个std::complex是否可用;是否包含NaN


5
如果您的编译器不支持 std::isnan,请更换编译器。 - Nawaz
Nawaz:正在处理中。但这是一个庞大的代码库,我同时还要维护产品。 - dagur
4个回答

4

这适用于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";
}

编辑:这个有效。我尝试了一下,这是输出:+NAN(+NAN,2)不行。 - dagur
@dagur:所以它确实起作用了——对于一个复数NaN,它告诉你“yup”。我有什么遗漏吗? - ev-br
是的,当我意识到这一点时,我编辑我的回复很慢 :)。 - dagur
真实输出:+NAN(+NAN,2)yup - dagur

1
float.h头文件。
int _isnan(double d);

如果传入的值是NaN,则返回一个非零值(TRUE),否则返回0(FALSE)。
int _fpclass(double __d);

返回一个整数值,指示其参数的浮点类。可能的值在FLOAT.H中定义(NaN,INF等)。

0

为了检查一个复数是否为NaN,我不得不在Borland中使用以下技巧:给定std :: complex <double> n; double a(n._Val [0]); double b(n.Val [1]); IsNan(a)|| IsNan(b),其中IsNan在Math.hpp中定义。 - dagur

0
math.h中是否有fpclassify()函数?它应该对NaN返回FP_NAN。或者更好的方法是使用isnan()。如果没有这样的函数/宏,您可以查看浮点数或双精度浮点数的二进制表示,并手动检查NaN。有关详细信息,请参见IEEE-754单精度和双精度格式。

在 Borland C++ 使用的 std 中似乎不存在 fpclassify()。 - dagur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接