我理解.d0
表示double precision
但是我想知道它是如何与用户定义的精度一起使用的。我用
module precision
implicit none
integer, parameter :: DP = selected_real_kind(r=250,p=13)
end module precision
并将浮动声明为
real(KIND=DP) :: var1
每当我需要在程序的某个地方为这样的浮点赋值
var1 = 1_DP
现在我遇到的问题是,如果我从名单中读取值,它就不起作用。编译器坚持
&namelistName
var1 = 1.d0
!var1 = 1_DP ! this does not work
&end
以下两个问题:
1.d0
的值分配给声明为real(KIND=DP)
的变量会怎样?1_DP
?如果它当然重要。 答案 0 :(得分:6)
种类的整个概念只在源代码中才有意义,没有办法让它适用于输入数据,因为在运行时系统对它们一无所知。
在源代码中
1.d0
是双精度实数,
1._dp
是真实的dp
,
1_dp
是一个带有dp
种类的整数(没有小数)。
在输入数据中,您根本不需要指定精度,只需要一个数字。然后,运行时系统将带有数字的字符串转换为您尝试读取的正确类型的变量。
您可以使用1.e0
,1.d0
作为扩展,甚至1.q0
,只是为了灵活,但它不会改变含义。在输入文件中,它只是一个表示数字的字符串。
如果您在源代码中分配了
,会发生什么 real(dp) :: x = 1.d0
?
如果dp
种类与双精度相同,则只是简单地分配。否则它被转换。如果实常数值是一个小整数,则转换很简单,并且由于它们被准确表示,因此不会丢失精度。