我在这个计算f(x)= sqrt(x)的fortran90函数上执行自动差分(使用Tapenade:https://www-sop.inria.fr/tropics/tapenade/refman.html)。
SUBROUTINE FFUN(X,RES)
implicit none
real(8), intent(in) :: X
real(8), intent(out) :: RES
RES = DSQRT(X)
RETURN
END
我收到此错误消息:
(TC19)对实际的平等测试不可靠
并且文档提供了此解决方案:
REAL之间没有很好地定义平等和不平等,因为 它们仅被定义为给定的“机器精度”。平等测试 可以在不同的机器上产生不同的结果。
你为什么要关心?就AD而言,平等测试 REAL有时被用作某些迭代的停止标准 处理。然后它涉及一个众所周知的问题:做衍生物 当函数执行时会收敛,如果是,它们会收敛于 同样的速度?
你能做什么?检查这不会影响差异化。采取 小心对计算机进行通常的验证测试 衍生物。
但是,我不明白这个问题是如何不可避免的,因为他们要求我们检查“这不会影响差异化”。我可能认为这是一个糟糕的实现,我可以避免这个问题。
以下是Tapenade生成的代码:
SUBROUTINE FFUN_D(x, xd, res, resd)
IMPLICIT NONE REAL*8, INTENT(IN) :: x
REAL*8, INTENT(IN) :: xd
REAL*8, INTENT(OUT) :: res
REAL*8, INTENT(OUT) :: resd
INTRINSIC DSQRT
IF (x .EQ. 0.0) THEN
resd = 0.0_8
ELSE
resd = xd/(2.D0*DSQRT(x))
END IF res = DSQRT(x)
RETURN
END SUBROUTINE FFUN_D