这个问题之前没有得到解答。我试图在 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 位小数。
我心情很好,所以我会尝试回答这个问题,这是可以轻松谷歌搜索的基础知识(正如对此问题和你之前问题的评论中已经指出的那样)。
幸运的是,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 周 - 第 2 讲:二进制存储和版本控制 / 定点和浮点实数 (9-08).mp4 @ https://class.coursera.org/scicomp-002/lecture