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

时间:2014-05-19 11:19:28

标签: fortran precision fortran90 gfortran 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

打印:

PI = 3.14159012

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

2 个答案:

答案 0 :(得分: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

如您所见,3.14159012是与3.14159最接近的可能值,因此会被存储和打印。

答案 1 :(得分:-3)

最后两位数通常是错误的。它被称为浮点错误。

检查一下: 第1周 - 第2讲:二进制存储和版本控制/固定和浮点实数(9-08).mp4 @ https://class.coursera.org/scicomp-002/lecture