同じくらいの大きさの数字の引き算をすると、桁落ちが生じます。桁落ちによって、計算精度が著しく落ちるので、注意しましょう。
水温、気温などの勾配を計算する場合、桁落ちが生じやすいです。
例をあげます。
a1 = 12.345672
a2 = 12.345661
を引き算した結果(d=a1-a2)は、
d = 0.000010
となり、dの有効数字は1桁になってしまいます。
d=0.000010の1の前の0は位取りのための数字で、有効数字とは関係ありません。
プログラム例 (underflow.f90)
program underflow
! Description:
!
! Author: am
!
! Host: aofd30
! Directory: /work2/am/12.Work11/21.Climatology/08.Area_Ave/src
!
! Revision history:
! 2011-05-05 08:52
! Initial Version
!
! References
! http://e-words.jp/w/E6A181E890BDE381A1.html
! http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000528.html
! use
! implicit none
real a1,a2
write(*,'(a)')'Program underflow starts.'
! write(*,*)''
a1=12.345672
a2=12.345661
d=a1-a2
print '(a,f12.6)','a1 = ',a1
print '(a,f12.6)','a2 = ',a2
print *
print '(a,f12.6)','d = a1-a2 = ',d
print '(a,e14.6)','d = a1-a2 = ',d
write(*,'(a)')'Done program underflow.'
write(*,*)
end program underflow
コンパイル例
$ ifort -o underflow underflow.f90
実行例
$ underflow
Program underflow starts.
a1 = 12.345672
a2 = 12.345661
d = a1-a2 = 0.000010
d = a1-a2 = 0.104904E-04
Done program underflow.