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 但复杂就可以了。但我的结果必须是真实的。 minmax 内在函数可能比 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等效

fortran调用 带有参数 且 返回类型为数组的函数 及 相关歧义分析

Python acos() 函数

Excel教程(12) - 数学和三角函数

从 C++ 调用带有可选参数的 Fortran 子例程