Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging Fortran变量具有不同的值_Debugging_Gdb_Fortran_Fortran77 - Fatal编程技术网

Debugging Fortran变量具有不同的值

Debugging 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语言

我有一个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语言中,我使用浮点数得到了完全相同的答案。使用双精度可以获得更高的精度,但使用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