chibicc compiler を6800向けに改造する (6) IEEE754 float (1)
chibicc 6800 には、IEEE754形式の32bit floatを実装している。オールアセンブラなので、割と速い。
chibicc用のfloatの基本部は2週間ほどで書けて、マンデルブロ集合のASCII Artが、実数計算で動くようになった。
整数計算バージョンに比べて3倍遅いけど、floatを振り回して3倍差なら速い方じゃなかろうか。
Fuzix C Compiler Kit の float library
Fuzix C Compiler Kit にも float があり、Pat Wood氏がCで書いたライブラリが使われている。
Cで書かれていて遅かったので、アセンブラで書き直してissueを送ったのだけど、採用されなかった。メンテナンスコストが上がるから、仕方ない。
chibicc 6800バージョン
chibicc 6800は、Fuzix C compiler と、long/float や引数の扱いが異なるので、fcc用に作ったバージョンは捨てて書き直すことにした。
Cで参考になるライブラリを探したのだが、32bit整数が扱える前提でバリバリ書かれていて、参考にするのは難しかった。
しかたないので規格をもとに書くことにした。
割り切って書けば、それほど難しくない
IEEE754には細かい仕様が山のようにあるが、ある程度の計算ができれば良いと割り切れば、加減乗除を書くのはそれほど難しくない。
まずは、こんなスペックで書いてみた。
- オーバーフローは考えない
- Inf, NaN, -0.0 も考えない
- 非正規化数(Subnormal Number)も考えない
この仕様でも考えないといけないことは山ほどある。最上位bitからの桁上げの対処、アンダーフローの検出。0.0での除算の検出などである。
加減算だと桁合わせのためのシフトが発生する。乗除算を何bitで行うかの判断も難しい(今は素直に24bit*24bit=48bitにしているが、結果32bitぐらいで良いはず)。
加減乗除以外に比較演算も必要だし、比較の結果でどう分岐するかも考えないといけない。
(NaNが絡むと分岐の仕方も変わることにあとで気がついて、これも大変だった)
続く。
参考資料
「浮動小数点数内部表現シミュレーター」は実に便利である。IEEE754の内部表現と、2進・10進・16進表現を相互変換できる。
ディスカッション
コメント一覧
まだ、コメントがありません