【问题标题】:fortran acos function argument robustnessfortran acos 函数参数稳健性
【发布时间】: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 条件更快。即使在双精度下,您仍然会冒同样的问题,这可能只是不太可能。

标签: performance fortran trigonometry


【解决方案1】:

我可以试试

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

并希望我的编译器不会两次执行arg1/arg2。如果是这样,那么我会尝试预先计算它并使用它两次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2017-02-09
    • 2013-03-30
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多