最近在编写一个算法时发现了以下两个难以理解的问题:
第一个是使用了write语句输出后会影响后续计算结果。。:
[Fortran] 纯文本查看 复制代码 write(*,*) resid
call zgeqp3(n, d, resid, n, workint,
& workqr,workqr(1+min(n,d)),
& worklen, rwork, info)
write(*,*) resid
这里zgeqp3是一个计算QR分解的subroutine,是来自于lapack库的。residue作为存放要分解的矩阵,在经过zgeqp3后上三角部分存放得到的R矩阵。
可以看到里面有两处write语句。非常奇怪的是,如果把第一个write语句注释掉,则计算得到的结果residue会出现NAN;反之,如果不注释掉,则计算得到的residue显示正常。这实在难以理解。
第二个是两个数相乘得到了NAN。
[Fortran] 纯文本查看 复制代码 do 15 i=1, d, 1
call zcopy(min(d+1-i,nrv),resid(1+(d-i)*n),1,
& u(1,(-1+i)*(ncv+1)+1),1)
temp1=(1.0d0)/rnorm
do 16 jj=1, min(d+1-i,nrv)
write(*,*) u(jj,(i-1)*(ncv+1)+1)
write(*,*) cmplx(temp1,0.0d0)
write(*,*) u(jj,
& (i-1)*(ncv+1)+1)*cmplx(temp1,0.0d0)
u(jj,(i-1)*(ncv+1)+1)=u(jj,
& (i-1)*(ncv+1)+1)*cmplx(temp1,0.0d0)
16 continue
15 continue
这里是将一个矩阵residue复制到另一个矩阵u中,之后再对u中元素乘以一个数。cmplx是使得temp1从实数转为复数。三个write语句输出了每次乘法的过程。结果见图:
可以看到我相乘的两个数中并没有nan,且也不存在0与无穷相乘的情况。但结果却有nan。这对我完全无法理解。。。
我使用的是MinGW编译器。现在程序就耗在这,不止到如何解决。。。如果大家发现了什么问题,能提供相应的思路的话,那就太感谢了。
|