对不起,一个看似愚蠢的问题。在用内在函数替换矩阵上的 for 循环操作时,我正在测试计算效率。当我检查两种方法的矩阵乘积结果时,我很困惑这两种输出不一样。这是我使用的简化代码
program matmultest
integer,parameter::nx=64,ny=32,nz=16
real*8::mat1(nx,ny),mat2(ny,nz)
real*8::result1(nx,nz),result2(nx,nz),diff(nx,nz)
real*8::localsum
integer::i,j,m
do i=1,ny
do j=1,nx
mat1(j,i)=dble(j)/7d0+2.65d0*dble(i)
enddo
enddo
do i=1,nz
do j=1,ny
mat2(j,i)=5d0*dble(j)-dble(i)*0.45d0
enddo
enddo
do j=1,nz
do i=1,nx
localsum=0d0
do m=1,ny
localsum=localsum+mat1(i,m)*mat2(m,j)
enddo
result1(i,j)=localsum
enddo
enddo
result2=matmul(mat1,mat2)
diff=result2-result1
print*,sum(abs(diff)),maxval(diff)
end program matmultest
Run Code Online (Sandbox Code Playgroud)
结果给出
1.6705598682165146E-008 5.8207660913467407E-011
Run Code Online (Sandbox Code Playgroud)
real8当我integer稍后测试时,差异不为零,但为零。我想知道是因为我的代码在某处出错还是MATMUL()单精度的数值精度?
我使用的编译器是 GNU Fortran (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
谢谢!