0か1かで記録し計算するコンピューター。片手で31まで数える指二進法のように、2進法で整数は表現できますが、小数はどうするといいでしょう?

コンピューターにとってはただの0か1、人間がどう捉えるかだけの問題です。123という数を1.23と読み替えて、表示で工夫するだけです。

N=123 ?N/100;".";DEC$(N%100,2) 1.23

常に100倍して、下から2桁目が小数点と固定する方式、これを固定小数点表現と言います。

小数点の位置を数とセットで持っておけば、大きな数から小数点以下0がずっと続く、絶対値が小さな数まで表現できます。 これを浮動小数点表現と言います。

現代の一般的なコンピューターでは32bitの浮動小数点数が多く使われていますが、精度を落とした16bitのfloat16もメモリと時間を節約できるのでAIやCGなどで活躍中。

16bitと言えば、IchigoJamの変数の単位と一緒ですね!ただ、仕様に従って符号1bit、指数(小数点位置)5bit、仮数10bitのfloat16をそのまま実装するの、掛け算時のオーバーフロー処理などちょっと大変なので、指数部と仮数部を8bitずつ、しかも指数部は10進法で扱う「FP15」という勝手な規格で作ってみました。

日本の人口、1.26億人は、126 x 10の6乗なので、上位8bitに指数部6、下位8bitに仮数部126を入れて、6<<8|126 と表現します。仮数部はプラスマイナス127まで使います。(マイナスを入れる時は、A=6<<8|-126&255)と8bitに収めることを忘れずに!)


こちら仮に、人口減少率を大げさに3%(x0.97)として、シミュレーションした結果です。(昨年の実際の減少率は0.22%だったとのこと)

こちらがFP15の掛け算を含む、人口減少シミュレーションプログラム

5 Y=2020 10 A=6<<8|126:N=A:GSB@PN:?" A" 20 B=-2<<8|97:N=B:GSB@PN:?" B" 25 ?"Year ";Y;" P:"; 30 GSB@MULAB 40 N=C:GSB@PN:?" C=A*B" 50 A=C:Y=Y+1 60 GOTO 25 100 @PN:E=N&#FF00/256:M=N<<8/256:?M;"e";E;:RTN 200 @MULAB 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

最近のCPUには、浮動小数点を計算する回路も含まれていて、超高速にやってくれますが、その実態を理解するには、プログラムで作って触ってみるのが一番です!

大人もこどももプログラミングを楽しく優しくオンラインで学べる、福井高専の先輩、ちっひーの講座、スタート!

ちっひー先輩によるオンラインプログラミング教室、開校! こどもも大人も親子でも! 誕生日もおめでとうございますー

福野 泰介さんの投稿 2020年9月1日火曜日

IchigoJam、はじめてのプログラミングから、深く楽しいコンピューターサイエンスまで、いろんな形でご活用ください!

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / RSS