平均処理

Fortran 90

データの入った配列を貰って平均するサブルーチン
不良データがあるとそれを避けて平均を求める。不良かどうかは logical function ok で判別する。

平均を取るには、データを全部足してデータ数で割るわけだが、 データの足し算の際には、桁落ちで精度を悪くしないように、 real の足し算なら double precision を使うと言う風にしたほうが良い。 ほかも同様で、多量の足し算や掛け算には有効数字の多い変数を使用するべきである。

プログラム (テスト用メインプログラム付き)

テキストファイルデータの読み込みのサンプルにもなっています。
implicit none

  integer, parameter :: n=300
  real :: x(n), avr
  integer :: i, num, okdatanum, ios

  i=1; ios=0
  do while( i<=n .and. ios==0 )
  read(*,*, iostat=ios, err=990)  x(i)
  i=i+1
 end do
990 continue
 if( i >= n ) then
	num = n
 	write(*,*) 'Only first ', num, 'data are used!'
 else 
	 num=i-2
 end if

!  write(*,*) 'num = ', num
!  do i=1, num
!  write(*,*) i, x(i)
!  end do

 call average( x, num, avr, okdatanum )
 write(*,*) 'Average is ', avr, 'good data number = ', okdatanum
 end

subroutine average( x, num, avr, count )
implicit none
  integer, intent(in) ::  num
  real, intent(in)    :: x(num)
  real, intent(out)   :: avr
  integer             :: count

  integer :: i, baddatanum
  logical :: ok
  double precision :: sum

  sum = 0; count = 0 ; baddatanum = 0
  do i=1, num
    if( ok(x(i), baddatanum)) then
      count = count + 1
      sum = sum + x(i)
    end if
  end do

  avr = (sum/count)
end subroutine


  


logical function ok( x, count )
implicit none
  real :: x
  integer :: count

  if( x < -9900 ) then
        ok = (5<0)
        count = count + 1
  else
        ok = (5>0)
  endif
end function


プログラム例をダウンロードするのはここ

戻る

玉川 2007