Fortran 90中有更好的双精度分配吗?

时间:2011-05-26 22:50:41

标签: fortran fortran90

在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相对较新),双精度变量会自动为双精度。是否有更好的方法来分配双精度变量,或者我必须如上所述明确键入它们吗?

2 个答案:

答案 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