在 Fortran 中将数字格式化为特定位数

Formatting number to a specific number of digits in Fortran

我正在尝试将数字格式化为一定数量的数字(实际上是 7 位),如下所示:

215.5745
6.569674
16.42418

根据 this page(“F、D、E 和 G 格式代码”),可能的格式代码为:

[n]F[+][-][w][.d]

The variable w specifies the number of digits to be transferred

这似乎正是我要找的。

我知道不应提供 d 参数,因为这会导致小数位数固定,并且可以省略,因为:

d is an optional width specification

但是,当提供格式代码如“F7”时,gfortran 拒绝编译。

Error: Period required in format specifier in format string at (1)

链接的页面似乎过于简单或完全不正确。这个时期确实是强制性的。期间的数字必须是非负数(正数或零)。

我认为您无法使用这些格式描述符完全满足您的要求。相反,我会先将数字打印成一个字符串,然后只打印该字符串的前 8 位数字 - 但它不准确,因为它只是削减剩余的数字而不是四舍五入。

如果需要精确,则必须计算逗号前的数字并手动设置格式字符串。据我所知,不会有通用格式字符串可供使用。

    double precision :: a(3) = [215.5745d0,6.569674d0,16.42418d0]
    integer :: digs(3)
    character(20) :: form

    digs = log10(a) + 1

    do i = 1, 3
        write(form,'(a,i0,a)') "(f8.", max(min(7-digs(i),7),0), ")"
        print form, a(i)
    end do

end

我认为 g0.7 格式规范应该可以满足您的需求。

这里是一个格式化的小测试代码。

print '(1x,a24,1x,a24,1x,a24)', "g24.7", "e24.7", "f24.7"
do i=1, n
    print '(1x,g24.7,1x,e24.7,1x,f24.7)', a64(i), a64(i), a64(i)
end do

和示例输出

如您所见,gw.7 类型的格式保留了一定数量的有效数字,这就是您的示例所显示的。但如果这是不可能的,那么它将恢复为科学格式。

                g24.7                    e24.7                    f24.7
        0.3710828E-02            0.3710828E-02                0.0037108
         8.318075                0.8318075E+01                8.3180745
         33.02631                0.3302631E+02               33.0263091
         133.7840                0.1337840E+03              133.7839844
         152.5674                0.1525674E+03              152.5673802
         274.5596                0.2745596E+03              274.5595695
         317.6714                0.3176714E+03              317.6713521
         452.4193                0.4524193E+03              452.4193376
         646.8024                0.6468024E+03              646.8024139
         1117.582                0.1117582E+04             1117.5816049
         1384.222                0.1384222E+04             1384.2222737
         5529.837                0.5529837E+04             5529.8374344
         6555.235                0.6555235E+04             6555.2346832
         24251.70                0.2425170E+05            24251.6980498
         27283.39                0.2728339E+05            27283.3873660
         167907.9                0.1679079E+06           167907.8873403
         270053.5                0.2700535E+06           270053.4615256
         317435.1                0.3174351E+06           317435.0603955
         586812.5                0.5868125E+06           586812.5125615
         3538679.                0.3538679E+07          3538679.3597321