不精确分配值

时间:2014-03-22 15:00:45

标签: fortran90

在一个简单的程序中,我想通过定义一个函数来构建一个矩阵。问题是在程序中声明和初始化的变量具有零(zero_test)的精确分配值以及分配给D(4,1), D(1,4)的矩阵的一些组件(0.等) ,并不完全是零。后者的值为E-308E-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

1 个答案:

答案 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