我写一个Fortran代码,它具有精度高的作品。在这里,我试图用ISO_FORTRAN_ENV来实现这一目标。我发现,如果我减去两个数量少,回答我得到的将是零。但是,如果我加入他们来说,这将是罚款。
下面是我的程序:
program test
USE ISO_FORTRAN_ENV, ONLY : REAL32
IMPLICIT NONE
REAL(REAL32), PARAMETER :: RE_L=-1.7499576837060936950743114606, &
RE_R=-1.7499576837060933110499019727
REAL(REAL32) :: A
A=(RE_R)-(RE_L)
PRINT 20, A
20 FORMAT(f50.40)
end program test
我得到的结果是0.00000000000000000000000000000。同时我不知道为什么。
您撞到单精度显著位数的文字,并在REAL32范围。
凸点REAL64,在文字1.7499576837060933110499019727d+0
加上一个双符
prompt$ gfortran toosmallorg.f90
prompt$ ./a.out
0.0000000000000004440892098500626161694527
即使REAL64 d文字,你只有小数点后得到16个数字,显示的结果是错误的。随着REAL32只有7小数点后的数字被认为(在默认设置下Fedora本机具有与gfortran 7.3)。 REAL128可能给予足够的回旋余地与文字。
公平警告;不允许有关的Fortran或数字精度专家
这是一个很长的故事,你可以搜索谷歌像“什么每个程序员都应该知道浮点运算”,一些很好的相关页面会显示一些关键性的作品。
总之,浮点格式,浮动或双面,只能代表数达到一定的精度。该算法需要仔细设计在某些情况下得到合理的精确度,例如,最小浮动点X,使(1.0 + X)-1.0!= 0.0定义为FLT_EPSILON,它的价值是大得出奇比你的预期。