【问题标题】:Converting arbitrary floating-point string to real in Fortran 95在 Fortran 95 中将任意浮点字符串转换为实数
【发布时间】:2012-11-21 14:27:39
【问题描述】:

在 fortran 中是否有任何简单的方法可以将任意浮点字符串转换为实数?想像strtod 这样的东西? READ 语句的问题是所有浮点格式编辑描述符都需要明确的宽度。到目前为止,我做的最好的解决方法是:

pure function strtod(s)
  real(kind=8) :: strtod
  character(len=*), intent(in) :: s
  character(len=32) :: fmt
  integer :: dot
  dot = index(s, ".")
  if(dot < 1) then
     write(fmt, '("(F",I0,".0)")'), len_trim(s)
  else
     write(fmt, '("(F",I0,".",I0,")")'), len_trim(s), len_trim(s)-dot
  end if
  read(s,fmt), strtod
end function strtod

但我想知道我是否遗漏了什么,可能有更好的方法吗?

【问题讨论】:

  • 为什么不能简单地将字符串读入一个实变量? read(s, *)x 其中s 是你的角色,而x 是它的浮点值。

标签: fortran fortran90 fortran95


【解决方案1】:

我一定错过了什么。使用列表定向有什么问题?

[luser@cromer stackoverflow]$ cat char2.f90
Program char2

  Implicit None

  Integer, Parameter :: wp = Selected_real_kind( 12, 70 )

  Real( wp ) :: a

  Character( Len = 32 ) :: s

  s = '0.'
  Read( s, * ) a
  Write( *, * ) a

  s = '1e10'
  Read( s, * ) a
  Write( *, * ) a

End Program char2
[luser@cromer stackoverflow]$ nagfor -C=all -C=undefined char2.f90
NAG Fortran Compiler Release 5.3.1 pre-release(904)
[NAG Fortran Compiler normal termination]
[luser@cromer stackoverflow]$ ./a.out
   0.0000000000000000
   1.0000000000000000E+10

【讨论】:

  • 列表导向的格式往往会默默地跳过输入错误。例如:尝试将“12*”作为程序的输入。使用列表导向格式它产生零(用 gfortran 测试),使用我的函数它产生一个错误(根据需要)。
猜你喜欢
  • 2011-11-25
  • 2023-03-27
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多