2012-05-14 11 views
13

Inf + Inf * jと等しい複素無限大を作成しようとしています。ここで、jは複素数変数です。私がこれをするとき:C++でstd :: complexで複素数無限を作成する

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

... 

complex<double> attempt1 = 
    complex<double>(numeric_limits<double>::infinity(), 
        numeric_limits<double>::infinity()); 

は、複素数(NaN + Inf * j)を返します。

しかし

complex<double> attempt2 = 
    complex<double>(numeric_limits<double>::infinity()); 

は、複素数(INF + 0 * jを)返します。また

complex<double> attempt_at_imag_inf = 
    complex<double>(any_value_here, numeric_limits<double>::infinity()); 

複素数(NaNを+ Infを* jを)返します。

誰でもここで何が起こっているのか分かりませんか?私が虚数部に対してインフィニティを持たせようとすると、実数部にNaNが書き込まれます。

上記はNaNとInfinityをサポートするタイプにのみ当てはまります。私はg ++ v4.6.1を使用しています。私はnumeric_limitsヘッダーを見てきましたが、上記がまったく起こらないという兆候はありません。

上記を文脈に入れるために、私はcomplexのnumeric_limitsの部分的な特殊化で実際に上記を行っています。この問題を検討してくれてありがとう。

REVISION私は問題を説明するための完全なものの、短いプログラムを提供しています

最初の投稿に。また、結果を生成するためにプログラムをどのようにコンパイルするべきかについていくつかの適格な情報が含まれています。 -std = C++ 0xのオプションを指定しない

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

:グラムで上記をコンパイル

#include <iostream> 
#include <complex> 
#include <limits> 

using namespace std; 

int main(int argc, char* argv[]) 
{ 

    complex<double> my_complex_inf = 
     complex<double>(numeric_limits<double>::infinity(), 
         numeric_limits<double>::infinity()); 

    cout << "my_complex_inf = " << my_complex_inf << endl; 

    complex<double> attempt2 = 
     complex<double>(numeric_limits<double>::infinity()); 

    cout << "attempt2 = " << attempt2 << endl; 

    double any_value_here = 0; 

    complex<double> attempt_at_imag_inf = 
     complex<double>(0, numeric_limits<double>::infinity()); 

    cout << "attempt_at_imag_inf = " << attempt_at_imag_inf << endl; 

    return 0; 

} 

-std = C++ 0xでUbuntuの上++バージョン4.6.1には、次のような結果を与えます結果は以下のとおりです。

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

だから、本当に質問GNU G ++ V4.6.1は、C++ 0xのが指定されている場合はそれがない答えを与えるのはなぜですか?オリジナルのポスト

TO

REVISION 2は私がちょうどオクターブ(MATLABのような数字パッケージ)に次のように試してみました:

= INF + j個* INF

そして答えは:

a = NaN + Infi

これは私のC++ 11コード(C++ 0x)での表示とまったく同じです。私はOctaveがコンパイルされているかどうかわかりませんが(C++とFORTRANの組み合わせです)、もしそのパッケージが私が得ている結果を返したら、これはよく知られている動作だと思います。

しかし、私はC++ 11ドラフト標準を見てきましたが、この動作については何も言及していません。C++ 11としてコンパイルするときだけmy_complex_infの建設後に "正しい" 解答(INF、INF)を返すために次の行を

my_complex_inf.real(my_complex_inf.imag()); 

追加ORIGINAL POST

TO

改訂第3。残念ながら、これは2段階のプロセスであり、constexpr関数でこのような複雑な無限大を作成することはできません。

+4

正しく動作する[g ++ 4.3.4](http://ideone.com/xfXDo)、[g ++ 4.5.1](http://ideone.com/FpmZK)、4.6.3 、および4.7.0。簡潔で完全なサンプルプログラムを提供してください。 http://sscce.org/を参照してください。 –

+1

複雑な平面に対して4つの無限大が必要ですか?私はあなたがリーマン球のように1つしか望んでいないと思うだろう。 –

+1

さて、リーマン球を表現しようとするなら、 '1/std :: complex (0)'を試してみてください。唯一重要なのは '1/infty == 0'です。 –

答えて

4

スカラーInfを複素数に変換すると、inf + 0jとなります。 Thsは上記のとおりです。複素平面内のスカラーInfオフセットは、回転を意味し、計算不可能であるため、Nanは正しい。問題は何ですか?

「ドラゴンズがいる」

+0

はa = 1、つまり1 + 0 * jとします。 π/ 4の回転は、1 * exp(j * pi/4)、すなわちsqrt(2)+ j * sqrt(2)である。 aがinfの場合、b = inf * exp(j * pi/4)となります。これは実数部と複素数部の両方のinfを乗算するだけなので、結果はinfでなければなりません(実数部と複素数部の場合)。回転が計算されていないと考えません。どのように実装されています。 –

4

C++ 11(およびC11)が複素数を指定して混乱するようになっています。

基本的に、仕様で規定されているモデルでは、(inf、0)で表される無限大が1つしかなく、複合体の虚数部に '無限大'を入れようとすると、Nanそのモデルでは意味がありません。

私は-std = C++ 0xの予想(無-std)答えを得るメインライン(GCC-4.8)で
0

:-std-C++ 11で

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

のgcc-4.6.3

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

コンストラクタは、実際の型と虚偽の型を対応する引数で設定する必要があると思います。 nanはありません。

関連する問題