Debugging Fortran变量具有不同的值
我有一个FORTRAN程序,其中我指定PI=3.14159265 当我运行这个程序时,我的数字可能会稍微偏离。 因此,我重新编译了调试标志集,并开始逐步使用gdb。 在几行中,我注意到PI不是我设置的值 (gdb)s 57π=3.14159265 (gdb)s 58 TWOPI=2*PI (gdb)打印pi $1=3.1415927410125732Debugging Fortran变量具有不同的值,debugging,gdb,fortran,fortran77,Debugging,Gdb,Fortran,Fortran77,我有一个FORTRAN程序,其中我指定PI=3.14159265 当我运行这个程序时,我的数字可能会稍微偏离。 因此,我重新编译了调试标志集,并开始逐步使用gdb。 在几行中,我注意到PI不是我设置的值 (gdb)s 57π=3.14159265 (gdb)s 58 TWOPI=2*PI (gdb)打印pi $1=3.1415927410125732 这是怎么回事?我会理解PI是否是一个系统值,但如果是,为什么该值是错误的??如何修复此问题?它正在打印与您输入的pi值的最佳二进制近似值;在C语言
这是怎么回事?我会理解PI是否是一个系统值,但如果是,为什么该值是错误的??如何修复此问题?它正在打印与您输入的pi值的最佳二进制近似值;在C语言中,我使用浮点数得到了完全相同的答案。使用双精度可以获得更高的精度,但使用32位二进制和浮点数的常用表示法,可以获得最接近您的值。无论如何,我不是fortan专家,尽管F77是我使用的最后一个版本。对于单精度浮点表示的估计,这看起来是正确的。简而言之,所有数字都以基数2表示。3.14159265的单精度浮点表示最终为3.14159274。。。这本书对这门学科出奇地好。如果你感兴趣,你应该读戈德堡的 您的示例实际上表示为非常接近:
(1 + (4788187 * (2 ^ -23))) * 2
原因是对表示为浮点数的表示进行了舍入 您可以使用以下命令将
pi
定义为参数
REAL, PARAMETER :: pi = 4. * ATAN(1.) ! set pi = 3.14...
获得良好的
pi
表示,而不必担心要输入的小数。这种方法允许通过改变pi
、4.
和1.
的种类值来增加进动。它可能有助于从三角函数中获得预期的结果,例如,SIN(pi)
由@KyleKanos引用的强制性Goldberg论文已获得神圣令状的地位(此处如此)。不幸的是,对于门徒来说,这就像许多经文一样,是一本难懂的书。我认为对于初学者来说,一个更好的参考是维基百科的文章()。然后,如果你想了解得越来越深入,就去研究戈德堡的论文吧。我同意你关于进一步阅读的建议,特别是把戈德堡的论文放在第二位而不是第一位。我被告知,pi=acos(-1.0)
比使用atan精确2位。@KyleKanos我无法用gfortran 4.8.2证明这一点。我的一位CS朋友告诉我这一点,我还没有亲自测试过。在单精度3.14159250