まったり アイマス2

アイドルマスター2 超ライトユーザーのプレイ日記

3401. 無限精度分数、続き^6

2021年05月13日 | 日記

 つまり、8bitマシンのまともなLISP処理系は、私は見たことがありません。
 私が最初に買ったNEC PC-6001 (オリジナル版)には、純LISPと称する投稿ソフトがあって、動作させてみましたが、今から考えるとdefun特殊形式が無く、lambdaだけしか無く、要するに一時記憶(局所変数)だけで、(internと呼ばれる)LISP内部のデータベース(大域変数)がありません。だから、単に関数(特殊形式を含む)を実行させるだけなので、任意のプログラムが組めるか否か、と言われると、組めると言わざるを得ませんが、チューリング機械のプログラムをしている感じで、特にコンピュータゲームが組めないのは致命的欠陥でした。いや、普通に入出力(とタイマ、つまり組み込みマイコン)を備えれば、チューリング機械だってコンピュータゲームは組めると思うので、それが無かった、ということ。

 ですから、16bitマシン(PC-9801 F2)になった途端にごくまともなLISP処理系(muLISP)が出たのには大変に驚いた記憶があります。もちろん、いろいろ試しましたが、前述のように、つまらない理由で(LISPの)マクロがまともに扱えないので、まあ、普通。専用エディタは重宝しました。
 ちなみに、カシオAI-1000と呼ばれるLISPポケコンはこのあたりがクリアされていて、LISP自体は使えました。こちらの難点は、単にポケコンである、というだけ。電卓の一派生形なので、数値演算は10進浮動小数点しかなく、無限精度の整数/分数とはほとんど関係がありません。

 無限整数/無限分数とLISPで採用されたリスト構造体はとても相性が良いです。現在のC言語や表計算ソフトは、いわゆる32bitや64bitの符号付き整数と、32bitや64bitのIEEE浮動小数点形式、いわゆる実数、がメインと思います。
 たとえば、整数12345678901234567890は、リスト形式にすると、

 (1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0)

の感じの、位取り記数法の1要素、つまり0~9の数字のリストで表現できます。しかし、多分おそらく、加算や乗算のためには逆順が有利で、

 (0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1)

とする方が取り扱いが楽になると思います。印字の時には、リストの要素を逆転するreverse関数を使えばお終いです。
 演算は足し算なら、2数の各要素を先頭から足し算して、要素が10を越えたら桁上がりなので、次の要素の和にさらに1を足します。引き算や掛け算は自明と思います。っと、負数があれば一工夫が必要かも。

 割り算は筆算の割り算アルゴリズムを使用すれば良いと思います(逐次処理)。2進なら単に桁合わせ(シフト操作)と加減算で済みますが、10進のままだと表引き、いわゆる二一天作の五、などの割り算の九九の表が必要となります。これは冗談では無く、実際にCPU内で加速機構としてやっているみたいで、おそらく16進などの計算表が内蔵されているはずです。これのバグが有名な…、この話題は微妙なのでパスします。

 無限精度分数は当然、上述の無限整数のリストを2個、ペアにすればお終いです。分子と分母です、念のため。

 途中ですが、先送りにします。給料のための明日の仕事があるので、休息が必要です。


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 3400. 作図 | トップ | 3402. 対応 »
最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

日記」カテゴリの最新記事