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関数でこのような複雑な無限大を作成することはできません。
正しく動作する[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/を参照してください。 –
複雑な平面に対して4つの無限大が必要ですか?私はあなたがリーマン球のように1つしか望んでいないと思うだろう。 –
さて、リーマン球を表現しようとするなら、 '1/std :: complex(0)'を試してみてください。唯一重要なのは '1/infty == 0'です。 –