具有显式双精度的 Fortran 数组
Fortran array with explicit double precision
首先,我想说我对 Fortran 77 的经验很少。
我发现 this code 存在精度问题。它对 igrf12syn
子例程中的所有变量使用 implicit double precision (a-h,o-z)
定义。
但是,在尝试调试此代码时,我注意到大多数值在某些时候会失去精度,因此在静态定义末尾使用终止符 D0 可以解决此问题。
但是我如何定义我的维度变量 gh 的值是明确的双倍?我试图在数据声明中的静态值末尾添加 D0,但出现编译器错误。
编辑:
Compiler error after adding the "d0" to the end of a value.
请注意,将 "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
TL/DR; Fortran 代码存在精度问题,我需要将 D0 添加到代码中静态定义值的末尾。但是,当将 D0 添加到数组中的值时,出现编译错误。
你的问题是由于固定格式的 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 个值超出列限制或将其全部删除。
首先,我想说我对 Fortran 77 的经验很少。
我发现 this code 存在精度问题。它对 igrf12syn
子例程中的所有变量使用 implicit double precision (a-h,o-z)
定义。
但是,在尝试调试此代码时,我注意到大多数值在某些时候会失去精度,因此在静态定义末尾使用终止符 D0 可以解决此问题。
但是我如何定义我的维度变量 gh 的值是明确的双倍?我试图在数据声明中的静态值末尾添加 D0,但出现编译器错误。
编辑:
Compiler error after adding the "d0" to the end of a value.
请注意,将 "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
TL/DR; Fortran 代码存在精度问题,我需要将 D0 添加到代码中静态定义值的末尾。但是,当将 D0 添加到数组中的值时,出现编译错误。
你的问题是由于固定格式的 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 个值超出列限制或将其全部删除。