2012-03-16 10 views
4

虚数部分が非常に小さいかどうかを確認し、0でなければならない非常に小さい非ゼロの虚数部分を生じる浮動小数点エラーを取り除くためにゼロに設定する必要があります。次のように複素数の虚数部をゼロに設定するにはどうすればよいですか?

私のコードは次のとおりです。残念ながら、コンパイラは単に返す

kz2 = SQRT((n2*(2.0*PI*eta))**2 - kxarray(p)**2) 
kz1 = SQRT((n1*(2.0*PI*eta))**2 - kxarray(p)**2) 

if (aimag(kz2) < 0.0005) then 
    kz2 = (REAL(kz2),0.0) 
end if 

if (aimag(kz1) < 0.0005) then 
    kz1 = (REAL(kz1), 0.0) 
end if 

gaussian1.f90:122.18: 

kz2 = (REAL(kz2),0.0) 
       1 
Error: Expected a right parenthesis in expression at (1) 

gaussian1.f90:126.18: 

kz1 = (REAL(kz1), 0.0) 
       1 
Error: Expected a right parenthesis in expression at (1) 

を何かアドバイスをいただければ幸いです - 私もこの問題について正しい道を行くのですか?

UPDATE:私は使用して問題を回避するために管理:

if (aimag(kz2) < 0.0005) then 
    kz2 = real(kz2) 
end if 

if (aimag(kz1) < 0.0005) then 
    kz1 = real(kz1) 
end if 

しかし、私は、私は非ゼロ量の虚部を設定したい場合は何をしますか?

答えて

9

私はCMPLX関数を探していると思います。実数または整数の引数を複素数に変換します。だから、あなたがこのような何かを行うことができる必要があります例:

kz1 = cmplx(real(kz1), 0.) 

あなたは試してみました(1.0,1.0)スタイルの括弧表記は、変数に保持されている値から複素数を形成しない、一定の値に対してのみ有効です。

+0

ありがとうございます。 複雑な変数の代入は、変数や式を引数として取ることしかできないと思いますか? 私は以前はC/Python/Matlabでプログラミングに慣れていましたので、直接割り当てではなく関数を使って設定しなければならないという事実は私には分かりませんでした。 このような些細な質問には申し訳ありません。 –

+0

@AlexMcMurray:はい、複雑な代入の '(、)'表記は定数に対してのみ機能します。コンパイル時に知られていない量を使うには 'cmplx'関数が必要です。私はこれを含めるために私の答えを更新します。この回答があなたの問題を解決した場合、あなたは[それを受け入れる]と考えるかもしれません(http://meta.stackexchange.com/a/5235/163653)。 – talonmies

8

Fortran 2008にはさらに多くの可能性があります。実数部と虚数部は派生型のコンポーネントとしてアクセスできます。

a = c%re 
    b%im = 5 

だから、あなたはz%im = 0を試すことができz新しいコンパイラでゼロへの虚部を設定します。

関連する問題