Linux Fortran‘write(*,';(3G24.16)';)`错误

Linux Fortran‘write(*,';(3G24.16)';)`错误,linux,ubuntu,math,fortran,gfortran,Linux,Ubuntu,Math,Fortran,Gfortran,我有一个Fortran文件,必须写这些复杂的数字,基本上我不能更改这些数字: 文件名:complexdnumbers.f implicit none write (*,'(3G24.16)') 0.4940656458412465-323, 8.651144521298990, 495.6336980600139 end 然后在我的Ubuntu上使用gfortran-o outa complexizedNumbers.f运行,但出现以下错误: Error

我有一个Fortran文件,必须写这些复杂的数字,基本上我不能更改这些数字:

文件名:complexdnumbers.f

      implicit none

      write (*,'(3G24.16)')  0.4940656458412465-323, 8.651144521298990, 495.6336980600139
      end
然后在我的Ubuntu上使用
gfortran-o outa complexizedNumbers.f
运行,但出现以下错误:

Error: Expected expression in WRITE statement at (1)
我确信这与复杂的数字有关,因为如果我将三个复杂的数字更改为简单的数字,例如
11.11、22.2、33.3
,则不会出现错误

这实际上是一个复杂Fortran文件的精简版本,其中包含许多变量和指向其他文件的链接。因此,理想情况下,不应更改3G24.16

3G24.16是什么意思?


我如何修复它,以便最终可以使用./outa打印出这些数字?

您向我们展示的代码片段中没有语法错误。但是,使用后缀为
.f
的文件名使我认为编译器假定您的代码是以固定格式编写的。这是gfortran通常的默认行为。如果是这种情况,它可能会在最后一个
处截断该行,这意味着编译器会看到

write (*,'(3G24.16)')  0.4940656458412465-323, 8.651144521298990, 
并提出您与我们分享的投诉。加入21世纪的我们,切换到自由格式的源文件,将
.f
更改为
.f90
,看看接下来会发生什么有趣的事情,或者在下一行的第6列中正确地继续这一行

关于
3G24.16
的含义,请参阅数据编辑描述符标题下您最喜欢的Fortran参考资料,尤其是g数据编辑描述符


哦,如果我对固定格式源代码和自由格式源代码这两个术语的讨论让你感到迷惑,那么也请在你最喜欢的Fortran参考资料中阅读它们。

你的程序中有三个错误:

  • 由于您明确使用Fortran固定格式,指令限制为72个字符(自由格式为132个字符)

  • 数字0.4940656458412465-323可能写得不正确。缺少指数字符。请改用0.4940656458412465D-323。这里Fortran计算的减法=>0.4940656458412465-323被-322.505934354159替换。请注意,我建议使用指数D(双精度)。写入0.4940656458412465E-323是不准确的,因为对于单精度数字,指数的最小值为-127

  • 其他数字也应具有指数D0,因为在单精度中,有效位数不超过6

可能的更正,始终采用固定格式:

  implicit none

  write (*,'(3G24.16)')  0.4940656458412465D-323,
 &                       8.651144521298990d0, 
 &                       495.6336980600139d0
  end

嗯,我不确定您产生
0.4940656458412465D-323
的“更正”是否正确,它可能会产生一个编译器警告,大意是结果是一个非规范化的数字。表达式
0.4940656458412465-323
没有什么不寻常的地方。同样,请注意,第一点,指令不限于72个字符,固定格式行上的指令必须位于列
[7,72]
中,只为指令留下66个有用的字符位置。但指令最多可以跨19个延续行进行延续。我想这意味着一条指令被限制在20*66=1320个字符以内。关于“指令”,你是对的:我应该写“行”。表达式0.4940656458412465-323不是一个数字:它可能是通过使用一种带有两个小空格的指数格式写入一个数字获得的:因此字符E消失了。当我运行我的更正程序时,我得到的结果是:0.4940656458412465-3238.651144521298990 495.6336980600139:字符E消失了!实际上,
0.4940656458412465-323
不是一个数字,但是减法的结果是一个数字,Fortran很高兴地在
write
语句中接受这种表达式。但我想知道OP打算在那里写些什么,而不是你和我争论这个和那个。