9

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 に慣れていません)、これは奇妙に思えます。倍精度変数を割り当てるより良い方法はありますか、または上記のように明示的に入力する必要がありますか?

4

2 に答える 2

11

倍精度としてマークされていない実数は、単精度と見なされます。後で倍精度変数に割り当てるか、倍精度に変換したからといって、値が「魔法のように」倍精度になるとは限りません。値がどのように使用されるかを先読みしません。

于 2011-05-26T23:04:27.473 に答える