Fortran:究竟是什么.d0?

Pet*_*trH 5 fortran

我明白这.d0表示double precision我想知道它如何与用户定义的精度一起使用.我用

module precision
implicit none
    integer, parameter :: DP = selected_real_kind(r=250,p=13)
end module precision
Run Code Online (Sandbox Code Playgroud)

并声明浮动为

real(KIND=DP) :: var1
Run Code Online (Sandbox Code Playgroud)

每当我需要在程序的某个地方为这样的浮点赋值

var1 = 1_DP
Run Code Online (Sandbox Code Playgroud)

现在我遇到的问题是,如果我从名单中读取值,它就不起作用.编译器坚持认为

&namelistName
    var1 = 1.d0
    !var1 = 1_DP   ! this does not work
&end
Run Code Online (Sandbox Code Playgroud)

两个问题如下:

  1. 如果我1.d0为声明为变量的变量赋值,会发​​生什么real(KIND=DP)
  2. 有没有办法如何1_DP在名单中强制执行?如果它当然重要.

Vla*_*r F 6

类的整个概念只在源代码中才有意义,没有办法使它适用于输入数据,因为在运行时系统对它们一无所知.

在源代码中

  1.d0
Run Code Online (Sandbox Code Playgroud)

是双精度真实的,

  1._dp 
Run Code Online (Sandbox Code Playgroud)

真是善良dp,

  1_dp
Run Code Online (Sandbox Code Playgroud)

是一个整数(没有小数)与种类dp.

在输入数据中,您根本不需要指定精度,只需要一个数字.然后,运行时系统将带有数字的字符串转换为您尝试读取的正确类型的变量.

您甚至可以使用1.e0,1.d0作为扩展1.q0,只是为了灵活,但它不会改变含义.在输入文件中,它只是一个表示数字的字符串.

如果您在源代码中分配,会发生什么

real(dp) :: x = 1.d0

如果dp种类与双精度相同,则只需简单分配.否则它被转换.如果实常数值是一个小整数,则转换很简单,并且精确表示精度不会丢失.