gfortran REAL不精确到小数点后8位

-4 precision fortran gfortran fortran90 real-datatype

这个问题以前没有回答过.我正试图在Fortran中正确表示真实或任何数字.gfortran为我做的事情远没有.例如,当我声明变量REAL pi = 3.14159 fortran打印pi = 3.14159012而不是说3.14159000.见下文:

PROGRAM Test
IMPLICIT NONE
REAL:: pi = 3.14159
PRINT *, "PI = ",pi
END PROGRAM Test
Run Code Online (Sandbox Code Playgroud)

这打印:

PI = 3.14159012
Run Code Online (Sandbox Code Playgroud)

我可能已经预料到类似PI = 3.14159000的东西,因为REAL应该精确到至少8位小数.

Ste*_*fan 5

我的心情很好,所以我会尝试回答这个问题,这个基本知识很容易用谷歌搜索(正如在这个和你以前的问题的评论中已经指出的那样).


幸运的是,Fortran提供了一些非常有趣的内在函数来了解浮点数.

您正在谈论的8位数是经验法则,可以与函数相关,该函数EPSILON(x)打印的最小偏差为1,可以在所选模型中表示(例如REAL4).这个值实际上是1.19e-7,这意味着你的第8位数字很可能是错误的.我写的最有可能,因为有些数字可以准确表示.

在这种情况下PI,可以使用内在函数打印最小的可表示偏差SPACING(PI).这显示的值为2.38e-7,略大于epsilon,仍然允许7位正确的数字.

现在,为什么你的PI值存储为3.14159012?存储浮点数时,始终存储最近的可表示数字.使用间距值,我们可以获得pi的可能值.可能的数字及其与您的价值的差异3.14159是:

3.14158988         1.20E-007
3.14159012        -1.18E-007
3.14159036        -3.56E-007
Run Code Online (Sandbox Code Playgroud)

如您所见,3.14159012是最近的可能值,3.14159因此存储和打印.