!     0.01 を 10000回足すプログラム
!     
!     1. 単精度で足す
!     2. 倍精度で足す
!     3. 単精度で補助変数を用いて足す
!     
!     履歴
!     2013/07/04 村橋 究理基　新規作成
program sab_val
implicit none

real(8) :: operand      ! 足す数(0.01)

real(4) :: sum_float    ! 単精度の和
real(8) :: sum_double   ! 倍精度の和
real(4) :: sum_sub      ! 補助変数を使った和(あまり意味ない変数)

real(4) :: R1
real(4) :: R2 
real(4) :: R3
real(4) :: T1
real(4) :: T2
real(4) :: S1
real(4) :: S2     ! 補助変数たち

integer :: i      ! ループ変数

! 初期化
sum_float = 0.0e0
sum_double = 0.0d0
sum_sub = 0.0e0

R1 = 0.0e0
S1 = sum_sub

operand = 0.01d0

do i = 1, 10000

   ! 単精度の和
   sum_float = sum_float + real(operand)

   ! 倍精度の和
   sum_double = sum_double + operand

   ! 補助変数を使った和
   R2 = R1 + real(operand)
   T1 = S1
   S2 = S1 + R2
   T2 = S2 - T1
   R3 = R2 - T2
   R1 = R3
   S1 = S2
   T1 = T2

enddo

! 補助変数を使った結果の代入
sum_sub = S2

! 結果の出力
write(*, *) '単精度の和　　　　 = ', sum_float
write(*, *) '倍精度の和　　　　 = ', sum_double
write(*, *) '補助変数を用いた和 = ', sum_sub

endprogram
