gfortran REAL 不精确到小数点后 8 位[重复]

问题描述 投票:0回答:2

这个问题之前没有得到解答。我试图在 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 precision fortran90 gfortran real-datatype
2个回答
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
的可能值,因此被存储和打印。


-3
投票

最后两位数字出错是很常见的。这称为浮点误差。

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

© www.soinside.com 2019 - 2024. All rights reserved.