49 lines
1.4 KiB
Fortran
49 lines
1.4 KiB
Fortran
program standard_deviation
|
|
implicit none
|
|
integer(kind=4), parameter :: dp = kind(0.0d0)
|
|
|
|
real(kind=dp), dimension(:), allocatable :: vals
|
|
integer(kind=4) :: i
|
|
|
|
real(kind=dp), dimension(8) :: sample_data = (/ 2, 4, 4, 4, 5, 5, 7, 9 /)
|
|
|
|
do i = lbound(sample_data, 1), ubound(sample_data, 1)
|
|
call sample_add(vals, sample_data(i))
|
|
write(*, fmt='(''#'',I1,1X,''value = '',F3.1,1X,''stddev ='',1X,F10.8)') &
|
|
i, sample_data(i), stddev(vals)
|
|
end do
|
|
|
|
if (allocated(vals)) deallocate(vals)
|
|
contains
|
|
! Adds value :val: to array :population: dynamically resizing array
|
|
subroutine sample_add(population, val)
|
|
real(kind=dp), dimension(:), allocatable, intent (inout) :: population
|
|
real(kind=dp), intent (in) :: val
|
|
|
|
real(kind=dp), dimension(:), allocatable :: tmp
|
|
integer(kind=4) :: n
|
|
|
|
if (.not. allocated(population)) then
|
|
allocate(population(1))
|
|
population(1) = val
|
|
else
|
|
n = size(population)
|
|
call move_alloc(population, tmp)
|
|
|
|
allocate(population(n + 1))
|
|
population(1:n) = tmp
|
|
population(n + 1) = val
|
|
endif
|
|
end subroutine sample_add
|
|
|
|
! Calculates standard deviation for given set of values
|
|
real(kind=dp) function stddev(vals)
|
|
real(kind=dp), dimension(:), intent(in) :: vals
|
|
real(kind=dp) :: mean
|
|
integer(kind=4) :: n
|
|
|
|
n = size(vals)
|
|
mean = sum(vals)/n
|
|
stddev = sqrt(sum((vals - mean)**2)/n)
|
|
end function stddev
|
|
end program standard_deviation
|