Hyfaxのこと-整数が足りない

x86リアルモードでモニターを作ろうシリーズです。Windows11+wsl2で構築しています。

皆さんは開発していて整数が足りないと思ったことはないでしょうか?
ない?
そうですか。16Bitリアルモードで開発している変態誰かさんとは違いますか……

気を取り直して。
そう、16ビットのレジスタひとつで扱えるのは、たかだか 65,535 まで。32ビットに拡張したところで、42億。十分大きく見えるけれど、 現代の感覚からすればちょっとした統計計算や、少し精度の高い固定小数点演算で、あっという間にその壁にぶつかってしまいます。

これを何とかしたかった。選択肢として32bitライブラリを自作するってのがあるんですがテクニカルでめんどいうえ桁数も先に述べた通り十分じゃない。んじゃ、64Bitライブラリはといえば輪をかけてめんどいという。
小学生でもわかる簡単な方法で何とかならないものか?

あるんですね、これが。その方法とは『筆算』と呼ばれます。で、64Bitで表現できる10進20桁の筆算ライブラリを作ってみようと思うわけです。

今回、Hyfaxに導入することにしたのが BCD(二進化十進表現) ライブラリです。桁数さえ確保すれば「無限」に近い精度を扱えるBCDです。64Bitどころか128Bitだって怖くはないのです。処理時間さえ気にしなければ。

実装の裏側:PHSとDHS、I64HS

今回のライブラリでは、2つのデータ構造を使い分けています。

  1. PHS (Packed Handle Structure): メモリ効率を重視した形式。1バイトに2桁を詰め込みます。20桁の数値を10バイト程度で保持できる、いわば「保存用」の姿です。
  2. DHS (Digit Handle Structure): 計算効率を重視した形式。1バイトに1桁を贅沢に使い、内部的な演算(加減乗除)はこの形で行います。
  3. I64HS (Integer 64 Handle Structure): いわゆる64Bitバイナリです。外部とのやり取りはこの形式になります。

構造としてはこうですね。

相互変換

まず最初に、I64HSを扱うユーティリティ、I64HSをPHSに変換する処理、PHSをDHSと相互変換する処理を作ります。

I64HS関連処理

I64HS構造体を0クリアする処理です。

I64HS構造体を2の補数表現にする処理です。

I64HSからPHSに変換する処理です。

PHS関連処理

PHSを正規化する処理です。

PHSをDHSに変換する処理です。

DHSをPHSに変換する処理です。

はい。おなか一杯になりました。

導入だけになってしまいましたが、今回はここまでにします。
次回以降、どうなるんでしょう。不安です。

《2026/1/12 01:41:24》

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です