負数の丸めに関するバグ報告

 投稿者:nagram  投稿日:2014年12月17日(水)19時51分52秒
  xを整数に丸める関数ROUND(x)を、10進モード・1000桁モードで実行すると誤った値を返すことがあります。
n>=0(整数)、0<d<1E-9、x=n+0.5+d としてROUND(-x)を実行すると、本来は -n-1 が得られるはずですが、上記モードでは -n を返します。
nの桁数にかかわらず 0<d<1E-9 で誤った値を返します(ただし10進モードでは 0<=n<1E5 の範囲)。
十進BASICのバージョンは7.7.6、OSはWindows8.1です。
ROUND(x,n)は問題ありません。dの値が0~0.1でROUND(-x)とROUND(-x,0)を比較しました。

LET n=7
PRINT "x=n+0.5+d のときの ROUND(-x) , ROUND(-x,0)"
PRINT "n=";n;"(>=0,整数)"
CALL rounding(0)               ! 問題なし
CALL rounding(EPS(n+.5))       ! 誤
CALL rounding(1E-10)           ! 誤
CALL rounding(1E-9-EPS(n+.5))  ! 誤
CALL rounding(1E-9)            ! 問題なし
CALL rounding(.1)              ! 問題なし
SUB rounding(d)
   LET x=n+.5+d
   PRINT "d=";d;", ROUND(";STR$(-x);")=";ROUND(-x);", ROUND(";STR$(-x);",0)=";ROUND(-x,0)
END SUB
END

この現象は、内部処理で負数を整数に丸める際にも生じているようです。
例えば、配列の添字や、関数ROUND(x,n)の第2引数nを負の小数で指定すると、上記と同様の結果になります。

DIM M(-4.5000000001 TO 2)  ! 本来は M(-5 TO 2) だが、M(-4 TO 2) となる。
PRINT LBOUND(M)
LET M(-2.5-7E-11)=9        ! 本来は M(-3)=9 だが、M(-2)=9 となる。
PRINT M(-3);M(-2)
PRINT ROUND(87654321.0987,-3.50000000002)  ! 本来は 87650000 だが、87654000 となる。
END
 

Re: 負数の丸めに関するバグ報告

 投稿者:白石和夫  投稿日:2014年12月20日(土)08時14分34秒
  > No.3568[元記事へ]

ご報告ありがとうございました。
的確な指摘で助かりました。
負数に対する内部の丸め処理で小数点以下10桁目以降を見ていなかったのが原因です。
近いうちに修正版を作成します。

 

戻る