【发布时间】:2021-02-18 16:19:41
【问题描述】:
Brent root-finding function 的 Netlib 库模块检查两个变量的符号是否不同,如下所示:
if (fa * (fb/dabs(fb)) .le. 0.0d0) go to 20
...
为什么这个检查会包含/dabs(fb) 而不是简单的(fa*fb) .le. 0.0d0?我用 Python 做了一个快速检查,似乎 x 和 y 的值非常大 (+/-1e200),其中 x*y=+/- inf,比较 x*y
【问题讨论】:
-
问:如果您只对符号感兴趣...那么
(fb/dabs(fb))("+1/-1") 没有任何“错误”。我猜它只是减轻了溢出的风险?出于历史原因? -
@paulsm4 看来您在减轻溢出风险方面可能是对的。 This (old) page 描述了浮点溢出的默认 Fortran 行为(对于 f77 和 f90 不同)和捕获异常。我猜 gcc 会有类似的选择。