问题描述
我有一个数据文件,其中一些数字确实很大,例如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 ,您将确切知道所得到的。
1 iso_fotran_env
,但是我不知道有任何Fortran编译器无法识别它。如果出现错误,您仍然可以使用selected_real_kind
:
integer,parameter :: real64 = selected_real_kind(R=300)