如何将单精度数字读入fortran中作为双精度?

问题描述

我有一个数据文件,其中一些数字确实很大,例如1E252。我如何将数据作为1D252读入Fortran。我尝试将变量声明为double和kind = 16,但是当其读为1E252时,它会出错。

不幸的是,用于解析数据文件并将所有E转换为Ds的简单解决方案将不起作用,因为它还需要与python兼容。

还有比这更优雅的东西吗?

program test
   Integer :: i
   real (kind = 8) :: another_test
   Character(len=20) :: char_arr 
   
   char_arr = "1.10E+223"
   
   Do i = 1,20
    If (char_arr(i:i) == "E") then
         char_arr(i:i) = "D"
    EndIf
   EndDo
   Read(char_arr,*) another_test
   Write(*,*) another_test
  

end program test

解决方法

这不是一个完整的答案,主要是因为我无法复制您的前提。 (我在家用计算机上,只能访问Windows 10 / cygwin上的gfortran v7.3.0。)

此代码可以完美编译并打印正确的值:

program large_float
    use iso_fortran_env,only: real64
    implicit none
    character(len=20) :: strrep
    real(kind=real64) :: val
    strrep  = '1.10E+223'
    read (strrep,*) val
    print *,val
end program large_float

现在,您可以看到我与您不同的是:我使用固有的kind=8来获取64位浮点值的正确种类,而不是模棱两可的iso_fortran_env。 我强烈建议使用这种语法,因为它是独立于编译器的 1 ,您将确切知道所得到的。

我认为在Fortran 2003中添加了

1 iso_fotran_env,但是我不知道有任何Fortran编译器无法识别它。如果出现错误,您仍然可以使用selected_real_kind

integer,parameter :: real64 = selected_real_kind(R=300)