2進モードで整数が実数表示されるバグ報告

 投稿者: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
 

Re: 2進モードで整数が実数表示されるバグ報告

 投稿者:白石和夫  投稿日: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
 

Re: 2進モードで整数が実数表示されるバグ報告

 投稿者: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
 

Re: 2進モードで整数が実数表示されるバグ報告

 投稿者: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
 

戻る