Fortran语言中两个小数字相减得到零

Fortran语言中两个小数字相减得到零,fortran,gfortran,fortran90,Fortran,Gfortran,Fortran90,我正在写一个fortran代码,它的工作精度很高。在这里,我试图使用ISO_FORTRAN_ENV来实现这一点。我发现如果我减去两个小数字,我得到的答案将是零。但如果我加上它们就好了 这是我的节目: program test USE ISO_FORTRAN_ENV, ONLY : REAL32 IMPLICIT NONE REAL(REAL32), PARAMETER :: RE_L=-1.7499576837060936950743114606, &

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

说来话长,你可以在谷歌上搜索一些关键作品,比如“ “每个程序员都应该知道浮点运算”,一些非常好的相关页面会出现


简言之,浮点格式(float或double)只能表示达到一定精度的数字。在某些情况下,应仔细设计算法以获得合理的精度,例如,使(1.0+x)-1.0=0.0被定义为FLT_EPSILON,它的值出乎意料地大。

这是一个很长的故事,你可以在谷歌上搜索一些关键作品,如 “每个程序员都应该知道浮点运算”,一些非常好的相关页面会出现


简言之,浮点格式(float或double)只能表示达到一定精度的数字。在某些情况下,应仔细设计算法以获得合理的精度,例如,使(1.0+x)-1.0=0.0被定义为FLT_EPSILON,它的值比您预期的要大得多。

您在文本和REAL32范围内遇到了单精度有效数字

跳转到REAL64,在文本
1.74995768370609311049019727d+0上添加一个双说明符

prompt$ gfortran toosmallorg.f90
prompt$ ./a.out
        0.0000000000000004440892098500626161694527
即使使用REAL64 d文字,小数点后也只有16位,显示的结果是错误的。对于REAL32,只能识别小数点后的7位数字(在gfortran 7.3的默认设置下)。REAL128可能会为文本提供足够的回旋余地


公平警告;不是Fortran或允许的数字精度方面的专家

您在文字和REAL32范围内遇到了单精度有效数字

跳转到REAL64,在文本
1.74995768370609311049019727d+0上添加一个双说明符

prompt$ gfortran toosmallorg.f90
prompt$ ./a.out
        0.0000000000000004440892098500626161694527
即使使用REAL64 d文字,小数点后也只有16位,显示的结果是错误的。对于REAL32,只能识别小数点后的7位数字(在gfortran 7.3的默认设置下)。REAL128可能会为文本提供足够的回旋余地


公平警告;不是Fortran或允许的数值精度方面的专家

Fortran中没有FLT_EPSILON,也没有
=在Fortran中。这本书是每一位计算机科学家应该。。。我只推荐给真正的计算机科学家。对于像我这样的普通程序员来说,这是一种进步,特别是如果他们认为我真的应该记住所有这些东西的话。不管fortran打印出多少位数字,只有1.234567Exx中的前7位数字对浮点有效,所有其他值都不准确。您可以尝试在1.0和1.000000119209289550781250000000000000000之间没有单个浮点数。Fortran中没有FLT_EPSILON,也没有
=在Fortran中。这本书是每一位计算机科学家应该。。。我只推荐给真正的计算机科学家。对于像我这样的普通程序员来说,这是一种进步,特别是如果他们认为我真的应该记住所有这些东西的话。不管fortran打印出多少位数字,只有1.234567Exx中的前7位数字对浮点有效,所有其他值都不准确。你可以试试看,在1.0和1.000000119209289550781250000000000000000之间没有一个浮点数。我们已经有很多相关的问题要问了,我建议你读一下。我们已经有很多相关的问题要问了,我建议你读一下!现在我知道结果了!非常感谢。顺便问一下,d是一个双说明符,那么f呢?它不能作为说明符?@ShiqiHe,对于浮点文字,两种指数文字类型是E表示单,D表示双。在上面的
d+0
中,表示将其视为双精度,但不改变大小。对!现在我知道结果了!非常感谢。顺便问一下,d是一个双说明符,那么f呢?它不能作为说明符?@ShiqiHe,对于浮点文字,两种指数文字类型是E表示单,D表示双。在上面的
d+0
中,表示将其视为双精度,但不改变幅度。