有効数字(有効桁数)の計算方法

 投稿者:山中和義  投稿日:2009年10月12日(月)10時12分9秒
  精度を落とさない計算方法を検討します。
電卓の機能と同等な関数を定義して、シミュレーションしてみました。
!有効数字(有効桁数)の計算方法
!参考サイト http://ja.wikipedia.org/wiki/%E6%9C%89%E5%8A%B9%E6%95%B0%E5%AD%97

!参考サイト http://hp.vector.co.jp/authors/VA008683/QA_JISROUND.htm
FUNCTION ROUND10(x,n) !最近接偶数への丸めの方法で、xを小数点以下n桁に丸める
   LET x=x*10^n
   IF MOD(x,1)<0.5 THEN
      LET x=INT(x)
   ELSEIF MOD(x,1)>0.5 THEN
      LET x=CEIL(x)
   ELSEIF MOD(INT(x),2)=0 THEN
      LET x=INT(x)
   ELSE
      LET x=CEIL(x)
   END IF
   LET ROUND10=x/10^n
END FUNCTION

!小数点以下桁数固定 FIX(数値,桁数)
DEF FIX(x,n)=ROUND10(x,n)
!DEF FIX(x,n)=ROUND(x,n) !=INT(x*10^n+0.5)/10^n
!DEF FIX(x,n)=TRUNCATE(x,n) !=IP(x*10^n)/10^n

FUNCTION SCI(x,n) !有効桁数指定 SCI(数値,桁数)
   LET m=0
   IF x>1 THEN !##.#なら
      DO UNTIL ABS(x)<1 !0.###形式へ
         LET x=x/10
         LET m=m+1
      LOOP
      LET SCI=FIX(x,n)*10^m !※JIS Z8401『数値の丸め方』、単純な四捨五入、切捨てなど
   ELSE !0.00###なら
      DO UNTIL ABS(x)>=1 !#.##形式へ
         LET x=x*10
         LET m=m+1
      LOOP
      LET SCI=FIX(x,n-1)/10^m
   END IF
   !PRINT "x=";x; "m=";m !debug
END FUNCTION


!例 12.3+50*0.650
PRINT FIX(12.3 + SCI(50*0.650,2), 0) !2=50の有効桁数、0=50の有効桁位置
PRINT 12.3+50*0.650 !べた
PRINT


!例 ( 2.234 * 5.67815 + 100.9049 ) * 4.60
PRINT SCI(FIX( SCI(2.234*5.67815,4) + 100.9049, 2) * 4.60, 3) !毎回丸めると精度が落ちる場合がある
PRINT SCI(FIX( SCI(2.234*5.67815,5) + 100.9049, 3) * 4.60, 3) !そこで有効数字+1桁で計算を進める
PRINT ( 2.234 * 5.67815 + 100.9049 ) * 4.60
PRINT


!例 8桁関数電卓のシミュレーション ※HPはJIS丸め、シャープとカシオは四捨五入

PRINT SCI(2+5E-8,8) !JIS Z8401『数値の丸め方』 2.0000000
PRINT SCI(2+5.1E-8,8) !2.0000001
PRINT SCI(5.0000002*5.0000003,8) !25.000003
PRINT 5.0000002*5.0000003
PRINT SCI(5.0000001*5,8) !25.000000 ※2進モードではNG
PRINT 5.0000001*5


END
 

戻る