Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran:到底什么是.d0?_Fortran - Fatal编程技术网

Fortran:到底什么是.d0?

Fortran:到底什么是.d0?,fortran,Fortran,我知道.d0表示双精度,但我想知道它如何与用户定义的精度相结合。我用 module precision implicit none integer, parameter :: DP = selected_real_kind(r=250,p=13) end module precision 并将浮动声明为 real(KIND=DP) :: var1 每当我需要在程序中的某个地方为这样的浮点赋值时,我都会这样做 var1 = 1_DP 现在我遇到的问题是,如果我从一个名字列表中读取值,

我知道
.d0
表示
双精度
,但我想知道它如何与用户定义的精度相结合。我用

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\u DP
    ?当然,如果有关系的话
    种类的整个概念只有在源代码中才有意义,没有办法让它对输入数据起作用,因为在运行时系统对它们一无所知

    在源代码中

      1.d0
    
    是双精度真的吗

      1._dp 
    
    是一个带种类的实数
    dp

      1_dp
    
    是一个带有种类
    dp
    的整数(没有小数点)

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

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

    如果在源代码中指定

    real(dp)::x=1.d0


    如果
    dp
    类型与双精度类型相同,只需简单赋值即可。否则它将被转换。如果实际常量值是一个小整数,则转换很简单,不会丢失精度,因为它们是精确表示的。

    您没有写为什么它不起作用。事实上,这个短语alnost总是意味着你应该排除更多的东西,错误信息或任何东西
    1\u dp
    是一个整数。等一下,
    1\u dp
    是一个整数?!Ups,真的吗?好吧,暂时忘掉问题2。问题1怎么样?如果我做了
    1.d0
    我实际上在做什么?同时,我将检查编译器消息。这个仍处于活动状态的线程还可能帮助您理解@VladimirF的详细信息。非常感谢我已经开始阅读它,它看起来非常有用。感谢您的解释,这正是我所需要的。所以我的错误是没有区分
    1\u DP
    1.\u DP
    。我一直在源代码中这样做,但是编译器必须将整数转换成浮点,这样我就不会注意到差异。虽然我在某个地方读到,
    1_DP
    将被转换为
    单精度(现在找不到)。因此,我无意中落入了这个陷阱。关于你的问题“
    real(dp)::x=1.\u d0
    ?”,当我做
    x=1\u dp
    x=1.\u dp
    x=1.d0
    时,它编译。做
    x=1.\u d0
    实际上没有。有趣的是,在名称列表文件中执行
    x=1.\u DP
    也不起作用,但我还没有看到错误消息,但我只能说它返回非零状态,并因此返回SEGFULTS。然而,从你的回答中,我推断姓名列表中的
    x=1.d0
    是可以的,不会让我失去任何精度。即使是1也应该可以。或1.0。运行时系统不理解名称列表中的后缀,无法将其转换为数字。很抱歉,
    1.\u d0
    是一个错误,它应该是
    1.0d0
    1.d0
    。另外,我更喜欢数据文件中的
    e
    而不是
    d
    ,但这是一种风格。