【发布时间】:2017-04-11 17:37:44
【问题描述】:
我想知道在编译我的 Fortran 代码时是否有适当的方法将浮点数(或双精度数)相乘或平方而不出现下溢错误
gfortran -ffpe-trap=invalid,zero,overflow,underflow ...
我知道underflow 选项并不总是一个好主意,但我想知道是否可以使用此选项进行乘法运算。事实上,在下面的示例中,我知道可能会发生下溢,但也许我不知道我的代码中有其他情况。这就是为什么我想尽可能保留这个选项。
这是一个例子,我为矩阵的每个 x,y 索引计算一个向量 u;组成这些向量的 2 个值介于 0 和 1 之间。然后我计算其范数的平方。
非常合乎逻辑,由于这个平方运算,我的值会下溢。因为,这些非常小的值对我来说可以被认为是零。有没有办法不使用underflow 而不是使用if 比较?
implicit none
double :: u(100,100,2), uSqr(100,100)
integer :: x,y
DO x= 1, 100
DO y = 1, 100
CALL Poisin( u(x,y,:), x, y )
ENDDO
ENDDO
uSqr = u(:,:,1)*u(:,:,1) + u(:,:,2) * u(:,:,2) ! where comes the underflow errors
【问题讨论】:
-
明确地说,您是要避免下溢,还是要避免下溢成为错误条件?
-
你不能在每个文件的基础上设置
-ffpe-trap选项吗?如果是这样,也许您可以将上面引用的部分分离到一个源文件中,并从-ffpe-trap列表中省略underflow以编译此文件,同时保留其他源文件的原始异常陷阱列表。我假设您希望通过将uSqr值视为零来允许程序继续运行。 -
我必须支持@francescalus 的评论。你想保持计算而不是退出错误吗?为什么要或需要捕获
underflow?认真考虑不要诱捕underflow。在我看来,这是非常无用的,甚至是有害的。 -
@norio 这就是我所知道的。但是有了这个解决方案,我不知道他们在这个文件中是否还有其他
underflow错误。 -
@VladimirF 和@francescalus 我想捕获
underflow以确保它们在我的其余代码中没有underflow错误。所以我想知道他们是否可以更好地编写避免underflow问题的示例。也许我的问题很愚蠢,答案是因为我进行平方运算underflow和overflow可能会发生,所以没有其他方法,除非我使用条件测试来阈值“小”和“大”值。
标签: floating-point fortran underflow