如何在Fortran中以固定格式打印极小的双精度数字?

时间:2015-11-27 02:51:29

标签: fortran

有没有办法在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

注意:这是一个代码,我在其中检查通过两种不同的数学方法获得的解决方案是否一致。大多数情况下,差异很小(即远低于机器精度),但情况可能并非总是如此。

2 个答案:

答案 0 :(得分:2)

您可以使用Ew.dEe描述符指定指数中的位数。它也适用于科学和工程格式。

write(*,fmt='(A,ES15.3E3)') " fmt=ES15.3E3: x = ", x

给出

fmt=ES15.3E3: x = 2.718E-200

答案 1 :(得分:1)

如果没有规范,指数字段大小的默认宽度为2。如果指数大小需要比指数字段提供的字符多一个字符,则删除ED指数字母。 (请注意,此表单带有缺少的指数字母,对于Fortran格式化输入完全可以接受。)

如果你想要三个字符指数,那么指定三个字符指数。

write(*,fmt='(A,ES15.3E3)') " fmt=ES15.3E3: x = ", x
write(*,fmt='(A,E15.3E3)')  " fmt= E15.3E3: x = ", x