在Fortran中将两个小数减为零

时间:2019-02-07 01:59:48

标签: fortran gfortran fortran90

我正在编写一个高精度的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。同时我不知道为什么。

2 个答案:

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