Fortran中两个小的号码减去获得零

问题描述 投票:0回答:2

我写一个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。同时我不知道为什么。

fortran gfortran fortran90
2个回答
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或数字精度专家


0
投票

这是一个很长的故事,你可以搜索谷歌像“什么每个程序员都应该知道浮点运算”,一些很好的相关页面会显示一些关键性的作品。

总之,浮点格式,浮动或双面,只能代表数达到一定的精度。该算法需要仔细设计在某些情况下得到合理的精确度,例如,最小浮动点X,使(1.0 + X)-1.0!= 0.0定义为FLT_EPSILON,它的价值是大得出奇比你的预期。

© www.soinside.com 2019 - 2024. All rights reserved.