2016-04-13 49 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

對不起腦缺陷 –

+3

'min'和'max'內在函數可能會比'if'條件更快。即使是雙精度,你仍然會面臨同樣的問題,但可能性不大。 –

回答

0

我可能會嘗試

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

,並希望我的編譯器不arg1/arg2兩次。如果確實如此,那麼我會嘗試預先計算並使用它兩次。