显式双精度Fortran数组

4

首先,我要说我在Fortran 77方面的经验非常有限。

我发现这个代码存在一个精度问题。它在igrf12syn子程序中使用了implicit double precision (a-h,o-z)定义所有变量。

但是,在尝试调试此代码时,我注意到大多数值在某个点上失去了精度,并且在静态定义的末尾使用终止符D0可以解决这个问题。

但是,如何定义我的维度变量gh的值明确为双精度? 我尝试在Data声明中的静态值的末尾添加D0,但是我收到了编译器错误。

编辑:

添加“d0”到值的末尾后,出现编译器错误。

请注意,在数组之外的代码中添加“d0”到其他值时,不会发生此错误。

igrf.f:527.10:

  data g0/ -31543.d0,-2298., 5922., -677., 2905.,-1061.,  924., 1121
      1
Error: DATA statement at (1) has more variables than values

简而言之,一个Fortran代码存在精度问题,我需要在代码中静态定义的值末尾添加D0。然而,当我将D0添加到数组内的值时,出现了编译器错误。


你得到了什么编译器错误? - amaurea
您需要在此处解释问题,而不是指向外部代码。特别是,您应该告诉我们有关错误的信息(编译器消息、与您期望的差异等)。请参见[mcve]。 - francescalus
抱歉,我添加了编译器错误。这似乎是一个简单的Fortran语法问题,我没有想到人们需要编译器错误。 - hawaii
它被声明为“dimension gh(3451),g0(120)...”,这是代码中的前一条语句。据我所见,这段代码中唯一的类型定义是隐式的双精度声明。 - hawaii
1个回答

7

你的问题是由于固定格式的Fortran所限制,每行只允许72个字符。例如,可以看看源代码中如何处理g0

      dimension gh(3451),g0(120) !... more declarations cut from this
c
      data g0/ -31543.,-2298., 5922., -677., 2905.,-1061.,  924., 1121., 1900
     1           1022.,-1469., -330., 1256.,    3.,  572.,  523.,  876., 1900
     2            628.,  195.,  660.,  -69., -361., -210.,  134.,  -75., 1900
     3           -184.,  328., -210.,  264.,   53.,    5.,  -33.,  -86., 1900
     4           -124.,  -16.,    3.,   63.,   61.,   -9.,  -11.,   83., 1900
     5           -217.,    2.,  -58.,  -35.,   59.,   36.,  -90.,  -69., 1900
     6             70.,  -55.,  -45.,    0.,  -13.,   34.,  -10.,  -41., 1900
     7             -1.,  -21.,   28.,   18.,  -12.,    6.,  -22.,   11., 1900
     8              8.,    8.,   -4.,  -14.,   -9.,    7.,    1.,  -13., 1900
     9              2.,    5.,   -9.,   16.,    5.,   -5.,    8.,  -18., 1900
     a              8.,   10.,  -20.,    1.,   14.,  -11.,    5.,   12., 1900
     b             -3.,    1.,   -2.,   -2.,    8.,    2.,   10.,   -1., 1900
     c             -2.,   -1.,    2.,   -3.,   -4.,    2.,    2.,    1., 1900
     d             -5.,    2.,   -2.,    6.,    6.,   -4.,    4.,    0., 1900
     e              0.,   -2.,    2.,    4.,    2.,    0.,    0.,   -6./ 1900
!23456789012345678901234567890123456789012345678901234567890123456789012XXXXX
!        1         2         3         4         5         6         7  XXXXX

这里有两个需要注意的问题。首先,数值1900不是数组的一部分。第72个字符是最后一个逗号,这些剩余数字被截断了。其次,当你给这些数字加上D0后,你会把最后一个实际值推到72列之外,然后它就被截断了,现在你的变量比数值少。

要解决这个问题,可以通过编译器选项增加固定格式行长度,但必须确保尾随数值(例如1900)仍然被截断。或者,可以使用更多的连续行来重构数据声明,以适应所有内容都在72列限制内。无论你选择哪种方法,都需要确保1900值在列限制之外,或者将它们全部删除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接