Fortran:究竟是什么.d0?

时间:2014-08-14 06:22:40

标签: fortran

我理解.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. 如果我将1.d0的值分配给声明为real(KIND=DP)的变量会怎样?
  2. 有没有办法在名单中强制执行1_DP?如果它当然重要。

1 个答案:

答案 0 :(得分:6)

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

在源代码中

  1.d0

是双精度实数,

  1._dp 

是真实的dp

  1_dp

是一个带有dp种类的整数(没有小数)。

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

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

如果您在源代码中分配了

,会发生什么

real(dp) :: x = 1.d0

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

相关问题