我们在一些英特尔 FORTRAN 代码中遇到了一些奇怪的崩溃,我最终追踪到:
L_F = EXP(-L_B2*L_BETASQ*L_DS)
其中 -L_B2*L_BETASQ*L_DS 项评估为大约 -230。碰巧,EXP(-230) 的计算结果约为 1e-100。在所有其他已知情况下,L_DS 小得多,导致 EXP 的最小(已知)返回值约为 1e-50,这不会导致错误。
一旦 FORTRAN 计算子句 EXP(-230),你就会得到:
forrtl: severe (157): Program Exception - access violation
Image PC Routine Line Source
但没有其他信息。
异常 157 通常与互操作性有关,您无法在 FORTRAN 中调试 EXP,因为它找不到特定的 .c 文件——这可能意味着 EXP 是用 C 实现的(我觉得这很奇怪)。
我的假设是 FORTRAN 在 C 中实现了 EXP,但接口无法将小于 1e-100 的浮点数转换为 REAL(4)s。由于我之前认为浮点数和 REAL(4) 在字节方面是相同的,所以我无法支持这个假设——而且我在任何地方都找不到任何关于它的信息。
在我关闭这个错误之前,任何人都可以确认或否认我的假设 - 或者为我提供另一个假设吗?
此致,
麦克风
编辑: 我将把这个问题标记为已回答,因为高性能标记已经回答了直接问题。
不幸的是,我的假设是不正确的——我试图解决这个问题:
L_ARG = L_B2*L_BETASQ*L_DS
IF (L_ARG .GT. 230.0) THEN
L_F = 0.0
ELSE
L_F = EXP(-L_ARG)
ENDIF
不幸的是,现在(显然)异常发生在 L_ARG .GT 中。230.0 条款。这要么意味着发布模式下的调试比我想象的要糟糕,要么是某种“存储”的浮点错误(在将浮点数输入到字符串流时,请参阅“浮点无效操作”)。