program sommatoria
  implicit none

  ! il programma calcola la somma 1+1/2+1/3+....+1/n
  ! in ordine crescente e in ordine decrescente in semplice precisione
  ! calcola la stessa sommatoria in doppia precisione e scrive gli
  ! errori relativi.
  ! Per valori elevati di n si apprezza una sensibile differenza degli
  ! errori algoritmici

  real :: s1, s2
  real(kind(0.d0)) :: ds
  integer :: i, n

  write(*,*)"assegna il numero n di addendi "
  read(*,*) n
  
  s1=0
  s2=0
  ds=0.d0
  
  do i=1,n
     s1=s1+1.0/i
     s2=s2+1.0/(n-i+1)
     ds=ds+1.d0/i
  end do

  write(*,*)"s1=",s1,"err=",(s1-ds)/ds
  write(*,*)"s2=",s2,"err=",(s2-ds)/ds
end program sommatoria
