投稿者:nagaram
投稿日:2018年 3月30日(金)16時27分45秒
|
|
|
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
|
|
|
投稿者:白石和夫
投稿日:2018年 3月30日(金)18時17分5秒
|
|
|
> No.4541[元記事へ]
ご報告ありがとうございました。
至急,調べてみます。
> 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
|
|
|
投稿者:SHIRAISHI Kazuo
投稿日:2018年 3月31日(土)17時10分22秒
|
|
|
> No.4542[元記事へ]
修正版を作成しました。
完全な解決にはなっていない可能性があります。
不具合が残るようであれば報告をお願いします。
>
>
> > 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
|
|
|
投稿者:nagram
投稿日:2018年 4月 1日(日)18時53分17秒
|
|
|
> No.4543[元記事へ]
SHIRAISHI Kazuoさんへのお返事です。
> 修正版を作成しました。
> 完全な解決にはなっていない可能性があります。
> 不具合が残るようであれば報告をお願いします。
早々に対応していただき、ありがとうございます。
11~16桁の整数を各桁3億個ずつ抽出し調査しましたが、エラーは発見されませんでした。
OPTION ARITHMETIC NATIVE ! [表示桁数を多く]にチェックを入れる
LET z$="."&REPEAT$("0",19)
LET s$=REPEAT$("#",16)&"."&REPEAT$("#",19)
DIM ex(11 TO 16)
FOR i=11 TO 16
LET ex(i)=10^i
NEXT i
RANDOMIZE
PRINT TIME$
LET t=TIME
FOR k=1 TO 3E8
FOR d=11 TO 16
LET a=INT(RND*ex(d))
LET a$=USING$(s$,a)
IF a$(17:36)<>z$ THEN
PRINT a$
PRINT a
END IF
NEXT d
NEXT k
PRINT TIME-t;"sec" ! 約5時間55分
END
|
|
|
戻る