使用fortran我有一些例程可以调用acos()和asin()以及atan()等等。在特定的例程中,参数的计算有时会变得非法(即acos(1.0000001))使用单精度变量时。使用双精度,这会消失,但速度减慢约50-70%。 我能想到的另一种方法是限制论证:
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 :(得分:0)
我可能会尝试
angle = acos(sign(min(abs(arg1/arg2),1.0),arg1/arg2))
并希望我的编译器不会arg1/arg2
两次。如果确实如此,那么我尝试预先计算并使用它两次。