我正在编写一个高精度的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。同时我不知道为什么。
答案 0 :(得分:2)
您将在文字和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或允许的数字精度方面的专家
答案 1 :(得分:0)
这是一个很长的故事,您可以在Google上搜索一些重要的作品,例如“ 每个程序员应该知道的有关浮点运算的知识”,将显示一些非常相关的页面。
简而言之,浮点数格式float或double只能表示达到一定精度的数字。在某些情况下,应仔细设计算法以获得合理的准确性,例如,使(1.0 + x)-1.0!= 0.0的最小浮点x定义为FLT_EPSILON,其值超出您的预期。 / p>