在 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 比较陌生)双精度变量将自动是双精度的。有没有更好的方法来分配双精度变量,还是我必须像上面那样显式键入它们?