2005/05/11
64bit なシステムで、64bit 浮動小数点数を即値で扱うとしたら、 どういうふうにして浮動小数点数を区別するのが適切か?
おそらく、(Fixnum が 63bit 整数であるのと同様に) 64bit よりもちょっと小さい浮動小数点を定義することになる。 たぶん指数を削るのが適切だと思うが、他の選択肢はあるか?
「浮動小数点数でNaNになるビットパターンに他の型のオブジェクトを詰め込む」 というLisp処理系があったはず。実装したのはFritz Kunze (Franz Inc.の社長)。 Fritzから聞いたところによれば、浮動小数点数の性能は格段に向上したが、 非常に稀な確率で演算結果が別の型のビットパターンになってしまう可能性が あって使えなかったそうだ (ここんとこ、具体的な話は聞かなかったんだけど)。
ネイティブコンパイラを持つ現在のCL処理系では、型をちゃんとdeclareしとけば コンパイラがboxing/unboxingを避けるコードを出してくれる。 でもインタプリタでうまくやる方法は知らない。 VM上に浮動小数点数レジスタを持っておくなんてことをちらりと考えたんだけど、 継続やクロージャ作成に伴うコンテキストの保存がとても面倒になりそうなんで 試してない。
Tags: Programming, Lisp