这个问题以前没有回答过。我正试图在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位小数。
答案 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