在 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
我正在尝试将数字格式化为一定数量的数字(实际上是 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