在一个简单的程序中,我想通过定义一个函数来构建一个矩阵。问题是在程序中声明和初始化的变量具有零(zero_test
)的精确分配值以及分配给D(4,1), D(1,4)
的矩阵的一些组件(0.
等) ,并不完全是零。后者的值为E-308
或E-291
等。我想知道为什么会有区别。
由于我阅读的一些文章,如this,其他组件(D(1,1), D(1,2)
等)由于转换为二进制格式而不精确。
系统信息:IA-32,与Microsoft Visual Studio 2008集成的英特尔Visual Fortran 11.1.048
代码:
program test
implicit none
real(8),parameter :: LAMBDA=75.e9,MU=50.e9
integer,parameter :: ndi=3,ntens=4
real(8) :: D(ntens,ntens),zero_test=0.
D = clcElasticStiffnessMatrix(LAMBDA,MU,ndi,ntens)
contains
function clcElasticStiffnessMatrix(LAMBDA,MU,ndi,ntens)
implicit none
integer :: ndi,ntens,i,j
real(8) :: clcElasticStiffnessMatrix(ntens,ntens),LAMBDA,MU
do i=1,ndi
do j=i,ndi
if(i .eq. j) then
clcElasticStiffnessMatrix(i,j) = 2.*MU + LAMBDA
else
clcElasticStiffnessMatrix(i,j) = LAMBDA
clcElasticStiffnessMatrix(j,i) = clcElasticStiffnessMatrix(i,j)
end if
end do
end do
do i=ndi+1,ntens
do j=i,ntens
if(i .eq. j) then
clcElasticStiffnessMatrix(i,j) = MU
else
clcElasticStiffnessMatrix(i,j) = 0.
clcElasticStiffnessMatrix(j,i) = clcElasticStiffnessMatrix(i,j)
end if
end do
end do
end function
end program
中断模式中的矩阵D
:
D:
174999994368.000 74999996416.0000 74999996416.0000 2.641443384627243E-308
74999996416.0000 174999994368.000 74999996416.0000 2.640433316727162E-308
74999996416.0000 74999996416.0000 174999994368.000 -1.051992669438322E-291
2.640110775815455E-308 0.000000000000000E+000 6.151018477594351E-318 49999998976.0000
答案 0 :(得分:0)
问题在于,当您编写
时,您要将真(4)个值分配给实数(8)变量LAMBDA=75.e9,MU=50.e9
或
clcElasticStiffnessMatrix(i,j) = 0.
尝试使用d代替e并始终指定:
LAMBDA=75.d9,MU=50.d9
clcElasticStiffnessMatrix(i,j) = 0.d0