|
2進モードで書式指定を利用して整数を表示すると、一部の整数が実数で表示されます。
十進BASICのバージョンは7.8.2
調査しましたが、誤表示される最小の整数はおそらく16000000001(=1.6E10+1)です。
OPTION ARITHMETIC NATIVE
FOR a=1.6E10 TO 1.6E10+10
PRINT USING " ###########.###########" : a
NEXT a
END
上記の方法で誤表示される整数の一部は、書式指定を利用しなくとも[オプション][数値][表示桁数を多く]にチェックを入れると、やはり実数で表示されます。
これで誤表示される最小の整数はおそらく64000000001(=6.4E10+1)です。
OPTION ARITHMETIC NATIVE ! [表示桁数を多く]にチェックを入れる
FOR a=6.4E10 TO 6.4E10+20
PRINT USING " ###########.###########" : a
PRINT a
NEXT a
END
誤表示される数値の出現には規則性があり、1.6E10を元にして倍々するごとに出現パターンが変化します。
1.6E10を2の累乗倍し、それより小さな値を50個、大きな値を100個出力させました。
OPTION ARITHMETIC NATIVE ! [表示桁数を多く]にチェックを入れる
LET a0=1.6E10
FOR i=0 TO 5 ! 1.6E10, 3.2E10, 6.4E10, 1.28E11, 2.56E11, 5.12E11
LET a1=2^i*a0
LET d=CEIL(LOG10(a1))
LET u$=USING$("#.##^^^^",a1)
PRINT u$;"(=2^";STR$(i);"*1.6E10) 整数部";STR$(d);"桁"
FOR a=a1-50 TO a1+100
LET a$=USING$(REPEAT$("#",d)&".###########",a)
LET f=VAL(a$(d+1:d+12)) ! 小数部分 VAL(".###########")
IF f=0 THEN
PRINT a ! 問題なし
ELSE
IF POS(STR$(a),".")=0 THEN
PRINT " ";a$ ! 書式指定による誤表示
ELSE
PRINT " ";a$ ; a ! 書式指定と[表示桁数を多く]による誤表示
END IF
END IF
NEXT a
PRINT
NEXT i
END
|
|