我编译并运行这个简单的FORTRAN 77程序:
program test
write(6,*) '- - - - - - - - - - - - - - - - - - - - - - - - - - ',
& '- - - - - - - - - - - - - - - - - - - - - - - - - -'
write(6,'(2G15.5)') 0.1,0.0
end
gfortran
或f95
输出为:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
0.10000 0.0000
使用pgf77
:
- - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - -
0.10000 0.00000E+00
以及g77
或ifort
:
- - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - -
0.10000 0.0000
出现了几个问题:
为什么0.0打印有四个小数位而不是五位,如
请求格式G15.5
?这是否符合规范?为什么呢
pgf77
以不同的方式写出来吗?
我猜最后三行的- - - - - -
行换行了
编译器是由于输出行长度的一些限制...是
有没有办法增加这个限制,或以其他方式强制
单行写入,在编译时?
顺便说一句,所需的输出是
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
0.10000 0.00000
与上述任何一项都不匹配。
答案 0 :(得分:3)
G
编辑描述符导致打印的确实有点复杂,但对于值0.0
,标准(2008版本中的10.7.5.2.2)指出编译器应该打印一个在数字的小数部分中使用d-1
(在您的示例中为4)数字表示。所以你的大多数编译器都表现正常;我认为pgf77
不正确,但它可能适用于具有不同要求的早期标准。
对此最简单的解决方法可能是使用f
编辑描述符,而不是(2F15.5)
。
对于连字符行的打印,使用导致 list-directed 输出的*
编辑描述符会放弃对编译器输出的精确控制。我的观点是,在两行上打印表达式的两个部分对编译器来说有点不正常,但它不是非标准行为。
如果你想在一行上打印连字符,控制输出格式,write(6,'(2A24)')
或类似的东西应该这样做(我没有为你计算连字符,只是猜到有24个输出的每一部分。)如果这对您没有吸引力,只需编写一个包含所有连字符的字符串;即使使用列表导向的输出,也可能写在一行上。