2020-09-02
IchigoJamで使えるお手軽浮動小数点数FP15、せっかくなので四則演算を用意します。 有効桁2桁ですが、Googleの語源となったグーゴルシャノン数もカバーする10の127乗から、2022年制定予定のクエクトよりはるかに小さい、小数点以下126コ続く10の-127乗までのダイナミックレンジを、16bit/2byteで表現できます。

使い方は簡単、変数のAとBに、指数を上位に、仮数を下位にセットし、ライブラリを呼び出すと、変数Cに計算結果がセットされます。

10 ?"A=A-A*0.99" 20 A=6<<8|100 30 B=-2<<8|99:GSB@MUL 40 B=C:GSB@SUB:GSB@PUT:? 50 A=C 60 GOTO 30

20行、100x10の8乗、つまり、100億をAにセット。
30行、99x10の-2乗、つまり、0.99をBにセットし、掛け算ルーチン(@MUL)を呼び出し。
40行、計算結果CをBにセットし、A-B、引き算ルーチン(@SUB)を呼び出し。
50行、計算結果CをAにセットし、繰り返し!
→ 100億から小さな小数まで計算できました。

これを実現するプログラムは以下の通り

100 @PUT 110 E=C&#FF00/256:D=C<<8/256 120 IF E=0 ?D;:RTN 130 IF E>0 ?D;:FORI=1TOE:?"0";:NEXT:RTN 135 IF D<0 ?"-";:D=-D 140 IF E=-1 ?D/10;:IF D%10 ?".";D%10;:RTN ELSE RTN 150 IF E=-2 ?D/100;:IF D%100 ?".";:GOTO170 ELSE RTN 160 ?"0.";:IF E<-3 FORI=4TO-E:?"0";:NEXT 165 ?D/100;:IF D%100=0 RTN 170 ?D/10%10;:IF D%10=0 RTN 180 ?D%10;:RTN 200 @MUL 210 C=A&#FF00/256+B&#FF00/256 220 D=A<<8/256*(B<<8/256) 225 F=0:IF D<0 F=1:D=-D 230 IF D>>7 C=C+1:D=D/10:CONT 235 IF F D=-D 240 C=C<<8|D&255:RTN 300 @DIV 310 C=A&#FF00/256-B&#FF00/256 320 D=A<<8/256*100/(B<<8/256):C=C-2 325 GOTO225 400 @ADD 410 C=A&#FF00/256:D=B&#FF00/256:E=C-D 415 F=1:F=1:IF ABS(E)>0 FORI=1TOABS(E):F=F*10:NEXT 420 IF E>=0&&E<3 C=D:D=A<<8/256*F+B<<8/256 421 IF E<0&&E>-3 D=A<<8/256+B<<8/256*F 422 IF E<=-3 C=D:D=B<<8/256 425 GOTO225 500 @SUB 510 B=B&#FF00|(~B+1)&255:GSB@ADD:B=B&#FF00|(~B+1)&255:RTN

@PUT 指数に合わせて0をたくさん並べて、普通の数として表示するプログラム
@MUL 掛け算プログラム、指数は足し算、仮数は掛け算して有効桁を調整
@DIV 割り算プログラム、指数は引き算、仮数は100倍してから割ることで有効桁を確保
@ADD 指数の差を調整して足し算、指数の差が3以上は無視
@SUB 足す数の符号を反転して足し算、再び符号を反転してBの値は元に戻す

昔はよく分かっていなかったMSXの浮動小数点数、改めて仕様を確認すると、指数が10のn乗を使っていて親近感。仮数は4bitで10進法1桁を表現するBCDが使われてました。

有効桁2桁では足りない?配列2つを指数と仮数で使った、浮動小数点数の実現は、IchigoJam BASICでも実装できそうですね(掛け算、割り算に一工夫必要です)。ぜひチャレンジしてみてください!

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS