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
,但这是一种风格。