Fortran变量具有不同的值

时间:2014-01-07 03:01:33

标签: debugging gdb fortran fortran77

我有一个FORTRAN程序,我指定PI = 3.14159265

当我运行该程序时,我的数字可能略微偏离。 所以我重新编译了调试标志集,并开始逐步使用gdb。 在几行中,我注意到PI不是我设置的那个?

(gdb)s

57 PI = 3.14159265

(gdb)s

58 TWOPI = 2 * PI

(gdb)print pi

$ 1 = 3.1415927410125732

这里发生了什么?我会理解PI是否是系统值,但如果是,为什么值错了?我应该怎么解决这个问题?

3 个答案:

答案 0 :(得分:1)

它打印出你输入的pi值的最佳二进制近似值;我使用浮点数在C中得到完全相同的答案。通过转换为双精度可以获得更高的精度,但这与使用32位二进制和浮点数的通常表示得到的值非常接近。

答案 1 :(得分:1)

我不是万能专家,尽管F77是我用过的最后一个版本。这确实看起来对于单精度浮点表示的估计是正确的。简短的回答是所有数字都以基数2表示.3.14159265的单精度浮点表示最终为3.14159274 ... wikipedia article for Single-Precision对于主题来说非常好。如果您有兴趣,请阅读Goldberg的"What Every Computer Scientist Should Know About Floating-Point Arithmetic"

您的示例实际上表示为非常接近的内容:

(1 + (4788187 * (2 ^ -23))) * 2

答案 2 :(得分:0)

原因是表示为浮点数的舍入。

您可以使用

pi定义为参数
REAL, PARAMETER :: pi = 4. * ATAN(1.)  ! set pi = 3.14...

获得pi的良好表示,而无需担心要输入的小数。此方法允许通过更改pi4.和{{的种类值来增加进动1}}。它可能有助于从三角函数中获得预期的结果,例如1.