|
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
|
|