C++ C++;标准::复杂<&燃气轮机;NAN、INF的数据类型测试(不收敛)

C++ C++;标准::复杂<&燃气轮机;NAN、INF的数据类型测试(不收敛),c++,math,double,nan,C++,Math,Double,Nan,我希望测试对复数(std::complex)的操作是否会产生+/-INF或NAN结果。(非收敛结果。) 例如,在映射z->z*z+c下 对于float或double数据类型,我相信可以使用x!=x来测试NAN。我不确定这是否适用于+/-INF.使用。如果此函数的输入既不是nan也不是inf,则返回true。您还可以使用std::isnan和std::isinf检查这些特定属性 编辑:对于std::complex,可以对real和imag零件应用相同的检查。您也可以简单地将其应用于std::com

我希望测试对复数(std::complex)的操作是否会产生+/-INF或NAN结果。(非收敛结果。)

例如,在映射z->z*z+c下

对于float或double数据类型,我相信可以使用x!=x来测试NAN。我不确定这是否适用于+/-INF.

使用。如果此函数的输入既不是
nan
也不是
inf
,则返回true。您还可以使用
std::isnan
std::isinf
检查这些特定属性

编辑:对于
std::complex
,可以对
real
imag
零件应用相同的检查。您也可以简单地将其应用于
std::complex
对象的
abs

不要使用此测试:

std::abs(z) > std::numeric_limits<double>::max()
isfinite(z)
z - z != complex<double>(0)
您可以使用此测试:

std::abs(z) > std::numeric_limits<double>::max()
isfinite(z)
z - z != complex<double>(0)
z-z!=复杂(0)

如果
z
有两个有限分量,那么
z-z
有两个零分量,并且将与
0
进行比较。如果
z
至少有一个无限或NaN分量,则
z-z
的分量将为NaN。NaN比较
=到所有东西,包括
0
和它本身。

类似于
z.abs()>std::numeric\u limits::max()
,也许?@igortandtnik会起作用还是只是猜测?(无论哪种方式都很有用,但我想更确定一点。)我相当肯定它会起作用,但我还没有尝试过。
x-x!=0将告诉您是否有有限的东西。这同样适用于
complex
complex
@IgorTandetnik:你的意思是
!(z.abs()>std::numeric_limits::max()
,但请注意它很容易溢出。std::complex呢?我想可以传递复数的模数?@user3728501是的,
abs
将是最安全的。如果您需要再推一点,您可以停止检查
real
imag
。@tmyklebu这是因为abs()我认为它只适用于整数参数。我认为它只适用于与旧C程序的向后兼容性,或者只用于清除符号位。@user3728501:complex的
abs
重载问题是有一个有限的
complex
abs
是无限的。