2016-04-13 17 views
1

fortranの使用acos()とasin()とatan()などの呼び出しを行うルーチンがあります。特定のルーチンで引数の計算が不正になることがあります。 acos(1.0000001))を使用します。倍精度を使用すると、これはなくなりますが、速度は約50〜70%低下します。しかし、それを行うための遅い方法としてfortran acos関数の引数のロバスト性

arg3= arg1/arg2 
if (angle > 1) then 
    arg3= 1 
else if (angle < -1) then 
    arg3= -1 
end if 
angle= acos(arg3) 

それはそうです:私は考えることができる 唯一の他の方法は、引数を制限することです。より速い方法がありますか?私。前もってangleを制限して、この場合は-1と1の間の値しか取らないのですか?

編集:引数はあり、結果は実数(非複合)である必要があります。

+0

abs(arg)> 1ではなく、複雑です。しかし、私の結果は真実である必要があります。 –

+0

申し訳ありませんbrainfault –

+3

「最小」と「最大」の組み込み関数は 'if'条件よりも速いでしょう。倍精度であっても同じ問題が発生する危険性はありますが、おそらくそれほど難しくありません。 –

答えて

0

私は

angle = acos(sign(min(abs(arg1/arg2),1.0),arg1/arg2)) 

を試してみて、私のコンパイラは二回arg1/arg2を行いません願っています可能性があります。もしそうなら、私はそれを事前に計算してそれを2回使ってみよう。