防止过量或下溢

时间:2011-10-05 15:44:21

标签: overflow fortran

我打电话给gges,我想得到特征值。在应用说明中,我阅读了此免责声明:

商数字alphar(j)/ beta(j)和alphai(j)/ beta(j)可能容易上溢或下溢,而beta(j)甚至可能为零。因此,您应该避免简单地计算比率。然而,alphar和alphai总是小于且通常与范数(A)相当,并且beta总是小于且通常与范数(B)相当。

我想防止上溢或下溢并停止程序并出现错误:

do i=1,N
    if (sometest(alphar(i), beta(i)) then
        stop 'Eigenvalues over- or underflow!'
    endif
    Lambda(i) = alphar(i)/beta(i)
enddo

提前致谢

1 个答案:

答案 0 :(得分:1)

溢出意味着,结果大于巨大,因此有些测试可能是:

abs(alphar(i)) > abs(beta(i))*huge(alphar(i))

对于下溢,结果将小于微小,因此一些测试可能是:

abs(alphar(i)) < abs(beta(i))*tiny(alphar(i))

巨大而微小的内在功能。

编辑:实际上第二个想法是溢出的测试可能不太好,因为如果abs(beta(i))大于1,乘法本身会导致溢出。因此你需要捕获它。如果beta小于1,则只能进行溢出测试,只有小于1时才能进行下溢测试。