1

我编译并运行这个简单的 FORTRAN 77 程序:

      program test
      write(6,*) '- - - - - - - - - - - - - - - - - - - - - - - - - - ',
     &           '- - - - - - - - - - - - - - - - - - - - - - - - - -'
      write(6,'(2G15.5)') 0.1,0.0
      end

gfortranf95输出为:

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    0.10000         0.0000 

pgf77是:

 - - - - - - - - - - - - - - - - - - - - - - - - - - 
 - - - - - - - - - - - - - - - - - - - - - - - - - -
    0.10000        0.00000E+00

g77ifort

 - - - - - - - - - - - - - - - - - - - - - - - - - - 
 - - - - - - - - - - - - - - - - - - - - - - - - - -
    0.10000         0.0000 

出现了几个问题:

  1. 为什么 0.0 按格式要求打印时有四位小数而不是五位G15.5?这符合规范吗?为什么pgf77写得不一样?

  2. 我猜- - - - - -最后三个编译器的行中的换行符是由于输出行长度的一些限制......有没有办法增加这个限制,或者在编译时强制单行写入?

顺便说一句,所需的输出是

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    0.10000         0.00000

与上述都不匹配。

4

1 回答 1

3

确切地说,G编辑描述符导致打印的内容有点复杂,但对于0.0标准值(2008 版中的 10.7.5.2.2)规定编译器应该打印d-1小数中带有(即在您的示例中为 4 个)数字的表示数的一部分。因此,您的大多数编译器都表现正确;我认为这pgf77是不正确的,但它可能适用于具有不同要求的早期标准。

最简单的解决方法可能是改用f编辑描述符,(2F15.5).

至于连字符行的打印,您使用*编辑描述符会导致列表定向输出,从而将输出的精确控制交给编译器。我的观点是编译器在两行上打印表达式的两个部分有点反常,但这不是非标准行为。

如果您希望将连字符全部打印在一行上,请控制输出格式,write(6,'(2A24)')或者类似的事情应该这样做(我没有为您计算连字符,只是猜测输出的每个部分都有 24 个。)如果这对您没有吸引力,只需写一个包含所有连字符的字符串;即使使用列表导向的输出,它也可能会写在一行上。

于 2013-09-02T09:52:05.497 回答