fortran acos 函数参数稳健性
Posted
技术标签:
【中文标题】fortran acos 函数参数稳健性【英文标题】:fortran acos function argument robustness 【发布时间】:2016-04-13 10:44:24 【问题描述】:使用 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)
这似乎是一种缓慢的方法。有没有更快的方法? IE。预先限制angle
以便它只取值,在这种情况下,介于 -1 和 1 之间?
编辑:参数是真实的,结果必须是真实的(非复杂的)。
【问题讨论】:
不适用于 abs(arg) > 1 但复杂就可以了。但我的结果必须是真实的。min
和 max
内在函数可能比 if
条件更快。即使在双精度下,您仍然会冒同样的问题,这可能只是不太可能。
【参考方案1】:
我可以试试
angle = acos(sign(min(abs(arg1/arg2),1.0),arg1/arg2))
并希望我的编译器不会两次执行arg1/arg2
。如果是这样,那么我会尝试预先计算它并使用它两次。
【讨论】:
以上是关于fortran acos 函数参数稳健性的主要内容,如果未能解决你的问题,请参考以下文章
fortran调用 带有参数 且 返回类型为数组的函数 及 相关歧义分析
R语言manova函数稳健多元方差分析(Robust one-way MANOVA)rrcov包中的wilks.test函数稳健单向MANOVAvegan包的adonis函数非参数Manova等效