C++ 使用std::complex<;创建复杂无穷大;T>;在C++;

C++ 使用std::complex<;创建复杂无穷大;T>;在C++;,c++,nan,infinity,complex-numbers,numeric-limits,C++,Nan,Infinity,Complex Numbers,Numeric Limits,我试图创建一个复数无穷大,等于Inf+Inf*j,其中j是复数变量。当我这样做时: #include <complex> #include <limits> using std; ... complex<double> attempt1 = complex<double>( numeric_limits<double>::infinity(), numeric_limits<dou

我试图创建一个复数无穷大,等于Inf+Inf*j,其中j是复数变量。当我这样做时:

#include <complex>
#include <limits>
using std;

...

complex<double> attempt1 =
   complex<double>( numeric_limits<double>::infinity(),
                    numeric_limits<double>::infinity() );
如果不使用-std=c++0x选项,结果如下:

my_complex_inf = (inf,inf)
attempt2 = (inf,0)
attempt_at_imag_inf = (0,inf)
所以问题是为什么GNUG++V4.6.1给出了它在指定C++0x时的答案

对原员额的修订2

我刚刚在倍频程(类似于MATLAB的数字软件包)中尝试了以下内容:

a=inf+j*inf

答案是:

a=NaN+Infi

这正是我在C++11代码(C++0x)中看到的。我不知道八度是用什么来编译的(它是C++和FORTRAN的组合),但是如果那个包返回了我得到的结果,那么我认为这是众所周知的行为。 然而,我已经看过了C++11标准草案,没有发现任何关于这种行为的提及

对原员额的第3次修订

添加以下行

my_complex_inf.real(my_complex_inf.imag());

在为C++11编译时,在构造完我的\u复杂\u inf之后返回“正确”答案(inf,inf)。不幸的是,这是一个两步过程,我无法在constexpr函数中创建这种复数无穷大。

转换为复数的标量Inf是Inf+0j。以上是正确的。复平面中的标量Inf偏移意味着V aa旋转,且不可计算,因此Nan是正确的。又是什么问题


“有龙存在。”

您遇到了C++11(和C11)指定复数的方式,并且感到困惑

基本上,在规范规定的模型中,只有一个无穷大(由(inf,0)表示),并试图在Nan中的复杂结果的虚部中放入一个“无穷大”,因为它在该模型中没有意义。

在主线(gcc-4.8)中,我得到了-std=c++0x预期的(无-std)答案:

gcc-4.6.3和-std-c++11给出了意外的答案:

my_complex_inf = (-nan,inf)
attempt2 = (inf,0)
attempt_at_imag_inf = (-nan,inf)

我认为构造函数应该根据相应的参数设置实类型和虚类型。不应该有
nan

它工作正常、、4.6.3和4.7.0。请提供一个简短、完整的示例程序。看,你确定复平面要4个可能的无穷大吗?我认为您只需要一个(就像在黎曼球中一样)。好吧,您可以尝试
1/std::complex(0)
,因为如果您试图表示黎曼球,您唯一需要的是
1/infty==0
。它在
clang++3.5
中正常工作。我可以构造所有这些数字,
(inf,1)(1,inf)(inf,inf)
让a=1,即1+0*j。pi/4的旋转为1*exp(jpi/4),即sqrt(2)+jsqrt(2)。如果a是inf,那么b=infexp(jpi/4)。因为这只涉及到实数部分和复数部分的inf的乘法,那么结果也应该是inf(对于实数部分和复数部分)。所以我不认为nan应该产生于旋转的计算,如果它是这样实现的。
my_complex_inf = (nan,inf)
attempt2 = (inf,0)
attempt_at_imag_inf = (nan,inf)
my_complex_inf = (inf,inf)
attempt2 = (inf,0)
attempt_at_imag_inf = (0,inf)
my_complex_inf.real(my_complex_inf.imag());
my_complex_inf = (inf,inf)
attempt2 = (inf,0)
attempt_at_imag_inf = (0,inf)
my_complex_inf = (-nan,inf)
attempt2 = (inf,0)
attempt_at_imag_inf = (-nan,inf)