具有显式双精度的Fortran数组

haw*_*aii 3 arrays precision double fortran dimension

首先,我想说我对Fortran 77的经验很少.

我发现此代码存在精度问题.它使用子例程implicit double precision (a-h,o-z)内所有变量的定义igrf12syn.

但是,在尝试调试此代码时,我注意到大多数值在某些时候会丢失精度,并且在静态定义结束时使用终结符D0可以解决此问题.

但是,如何定义维度变量gh上的值是否显式加倍?我试图在数据声明中的静态值的末尾添加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
Run Code Online (Sandbox Code Playgroud)

TL/DR; Fortran代码存在精度问题,我需要将D0添加到代码中静态定义值的末尾.但是,当将D0添加到数组内的值时,我遇到了编译器错误.

cas*_*sey 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
Run Code Online (Sandbox Code Playgroud)

这里需要注意两件事.这些值1900不是数组的一部分.第72个字符是最后一个逗号,这些剩余的数字被截断.其次,当您添加D0到这些数字时,您将推送经过第72列的最后一个实际值,然后将其截断,现在您的值比变量少.

要解决此问题,您可以使用编译器选项增加固定格式的行长度,但是您需要确保尾随值(例如1900)仍然被截断.或者,您可以使用更多延续行重新构建数据声明,以使其全部符合72列限制.无论您选择做什么,您都需要确保1900值超出列限制或全部删除.