我有一个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是否是系统值,但如果是,为什么值错了?我应该怎么解决这个问题?
答案 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
的良好表示,而无需担心要输入的小数。此方法允许通过更改pi
,4.
和{{的种类值来增加进动1}}。它可能有助于从三角函数中获得预期的结果,例如1.
。