2016-04-13 124 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两次。如果确实如此,那么我会尝试预先计算并使用它两次。