【问题标题】:gfortran REAL not accurate to 8 decimal places [duplicate]gfortran REAL 不精确到小数点后 8 位 [重复]
【发布时间】:2014-07-07 08:01:54
【问题描述】:

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


【解决方案1】:

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

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

【讨论】:

  • 只有拥有 coursera 帐户并订阅了该课程的人才能访问。找到一些打开的东西。
【解决方案2】:

我心情很好,所以我会尝试回答这个问题,这是可以很容易地在谷歌上搜索到的基本知识(正如在这个问题和你之前的问题的 cmets 中已经指出的那样)。


幸运的是,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 的值,因此被存储和打印。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多