まったり アイマス2

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

3403. 無限精度分数、続き^7

2021年05月14日 | 日記

 意外にも無限整数と無限分数しか無い(つまり浮動小数点数の無い、当時でも8087はありましたからIEEEの64bit倍精度浮動小数点演算は可能だったはずです。もちろん普通のCommon LISPでは使えます) muLISPにも初等関数は用意されていました。当時は私は情報系(さらに生物系)の大学卒業直後でしたから、ふむふむと素直に受け入れていましたが、よく考えてみるとどうやっているのかが気になります。

 まず、数値計算すると頻繁に出てくる平方根(√: ルート)はニュートン法を使えば良いと思います。ものすごい速さで収束(正しい(?)値にぐんぐん近づく)します。それなりの工夫は必要と思います。
 指数関数と対数関数はとっさに以前に調べた資料が出てこないのですが、次の三角関数と双曲線関数と同様と思います。双曲線関数は指数関数のバリエーションなので、多分、間違いないです。

 というのは、なぜか分数と正接関数(tan: タンジェント)の相性が良いのです。なので、関数形式の連分数が最優秀候補として上がるはずです。連分数関数では、tanとtanhの収束が良好で、私ならこれを採用します。tanができたら、sinもcosも簡単に算出できます。双曲線関数も同様。

 ここで精度問題が出てきて、連分数は無限級数の一種ですから、普通に計算すると分数(2整数)の桁数が際限なく増えます、それもかなりの速度で。
 ですから、どこかで計算精度をあきらめないといけません。
 想像になってしまいますが、2進系で分子と分母の桁をはしょっていたのだと思います。十進で言うと、

 12345/6789 ≓ 1234/678

の感じ。多分おそらく実際には四捨五入した方が良いでしょう。2進数なら零捨一入ですが、ここはガードと言って実際の計算機では3bit使うはずです。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする