在Fortran 90中(在Mac OS X上使用gfortran)如果我将一个值赋给双精度变量而没有明确地添加一种类型,则精度不会“采用”。我的意思是,如果我运行以下程序:
program sample_dp
implicit none
integer, parameter :: sp = kind(1.0)
integer, parameter :: dp = kind(1.0d0)
real(sp) :: a = 0.
real(dp) :: b = 0., c = 0., d = 0.0_dp, e = 0_dp
! assign values
a = 0.12345678901234567890
b = 0.12345678901234567890
c = DBLE(0.12345678901234567890)
d = 0.12345678901234567890_dp
write(*,101) a, b, c, d
101 format(1x, 'Single precision: ', T27, F17.15, / &
1x, 'Double precisison: ', T27, F17.15, / &
1x, 'Double precision (DBLE): ', T27, F17.15, / &
1x, 'Double precision (_dp): ', T27, F17.15)
end program
我得到了结果:
Single precision: 0.123456791043282
Double precision: 0.123456791043282
Double precision (DBLE): 0.123456791043282
Double precision (_dp): 0.123456789012346
单精度结果按预期在第8个十进制处开始四舍五入,但只有我用_dp明确指定的双精度变量保持所有16位精度。这看起来很奇怪,正如我所料(我对Fortran相对较新),双精度变量会自动为双精度。是否有更好的方法来分配双精度变量,或者我必须如上所述明确键入它们吗?
答案 0 :(得分:8)
未标记为双精度的实数将被假定为单精度。只是因为稍后您将其分配给双精度变量,或将其转换为双精度,这并不意味着该值将“神奇地”为双精度。它没有展望未来如何使用该值。
答案 1 :(得分:3)
这里有几个问题链接,所以最好用示例更明确地陈述一些细节,特别是初学者。
正如MRAB在其正确答案中所述,表达总是在没有任何上下文的情况下进行评估,所以
0.12345678901234567890
是默认(单个)精度浮动文字,无论它出现在何处。这同样适用于指数形式的浮点数
0.12345678901234567890E0
它也是默认的精确数字。
如果想要使用双精度常量,可以在上面的表格中使用D
而不是E
。即使将这样的双精度常量赋给默认的精度变量,它首先被视为双精度数,然后转换为默认精度。
你在问题中使用的方式(使用种类符号和几种常量)更通用,更现代,但原理是一样的。
0.12345678901234567890_sp
是一些sp
和
0.12345678901234567890_dp
是多种dp
,它们出现在哪里无关紧要。
正如您的示例所示,它不仅仅与作业有关。在行
c = DBLE(0.12345678901234567890)
首先,数字0.12345678901234567890
是默认精度。然后它被DBLE
转换为双精度,但这是在一些数字已经丢失之后完成的。然后将此新的双精度数分配给c
。