情報落ち

大きさの極端に違う数字の足し算をする場合にも、計算結果に注意しましょう。

下の例では、a1=250000.0に何回、a2=0.001を足しても和は、sum= 250000.0のままです。

プログラム例(underflow2.f90)

program underflow2
! Description:
!
! Author: am
!
! Host: aofd30
! Directory: /work2/am/12.Work11/21.Climatology/11.jcope_daily_cut/src
!
! Revision history:
!  2011-05-05 10:15
!    Initial Version
  real :: a1=250000.0
  real :: a2=     0.001
  write(*,'(a)')'Program underflow2 starts.'
!  write(*,*)''
  sum=0.0
  print *,'a1=',a1
  print *,'a2=',a2
  sum=a1
  do i=1,100
    sum=sum+a2
    if(mod(i,20) == 0)then
      print *,'i=',i,'  sum=',sum
    endif
  enddo
  write(*,'(a)')'Done program underflow2.'
  write(*,*)
end program underflow2

コンパイル例

$ ifort -o underflow2 underflow2.f90

実行例

$ ./underflow2

Program underflow2 starts.

a1= 250000.0

a2= 1.0000000E-03

i= 20 sum= 250000.0

i= 40 sum= 250000.0

i= 60 sum= 250000.0

i= 80 sum= 250000.0

i= 100 sum= 250000.0

Done program underflow2.