有没有办法在Fortran中打印极小的双精度数字固定格式?不知何故,“E”被截断了。
在下面的代码中将“ES15”更改为“ES18”无效:
program print_double
implicit none
double precision :: x
x = 2.71818D-200
write(*,*) "fmt=* : x = ", x
write(*,fmt='(A,ES15.3)') " fmt=ES15.3: x = ", x
write(*,fmt='(A,E15.3)') " fmt= E15.3: x = ", x
end program print_double
这是输出:
$ gfortran print_double.f90 -o print_double && ./print_double
fmt=* : x = 2.7181800000000000E-200
fmt=ES15.3: x = 2.718-200
fmt= E15.3: x = 0.272-199
$ ifort print_double.f90 -o print_double && ./print_double
fmt=* : x = 2.718180000000000E-200
fmt=ES15.3: x = 2.718-200
fmt= E15.3: x = 0.272-199
注意:这是一个代码,我在其中检查通过两种不同的数学方法获得的解决方案是否一致。大多数情况下,差异很小(即远低于机器精度),但情况可能并非总是如此。
答案 0 :(得分:2)
您可以使用Ew.dEe
描述符指定指数中的位数。它也适用于科学和工程格式。
write(*,fmt='(A,ES15.3E3)') " fmt=ES15.3E3: x = ", x
给出
fmt=ES15.3E3: x = 2.718E-200
答案 1 :(得分:1)
如果没有规范,指数字段大小的默认宽度为2。如果指数大小需要比指数字段提供的字符多一个字符,则删除E
或D
指数字母。 (请注意,此表单带有缺少的指数字母,对于Fortran格式化输入完全可以接受。)
如果你想要三个字符指数,那么指定三个字符指数。
write(*,fmt='(A,ES15.3E3)') " fmt=ES15.3E3: x = ", x
write(*,fmt='(A,E15.3E3)') " fmt= E15.3E3: x = ", x