« Flash Lite 1.xで使えない文字 | メイン | FlashLite: 剰余演算 »

FlashLiteの数値について

FlashとFlashLiteでは、使用されている数値の表現形式が違うようです。

浮動小数点数の仮数部のビット数を求めるには、演算したときの桁落ちを利用します。
変数 v に2のn乗を代入して、別な変数 w に、 w = v + 1という代入をします。
ここで、w - vの値が0になればv + 1の計算が桁落ちしているので、仮数部はnビット以下ということになります。

この方法で調べると、Flashの仮数部は52ビットのようですので、おそらくIEEE754の倍精度浮動小数点数(符号部1ビット・指数部11ビット・仮数部52ビット)なのでしょう。PCで再生するならこれはとても普通です。

FlashLiteではFlashとは別の挙動を示します。
まず、1073741824(2^30です)に2をかけるとInfinityという文字列になります。符号付き32ビット整数っぽい結果です。

さらに、a = 999999999、 b = 0.00000001 としてa+bを計算すると、134217728.00000001が桁落ちなく計算されます。これは、IEEE754 doubleならば桁落ちしてしまう計算です。

2の-9乗は、0.001953125ですが、これは0.00195312と表示されます。9桁目の5が消えています。ただし、この値に2をかけると、正しく0.00390625が計算されます。表示はされませんが、内部的には9桁目を持っているようです。

32ビット整数で情報量を落とさずに表現できる10進数の桁数は9桁であることを考えると、FlashLiteでの数値の表現形式は、整数部と小数部で32ビットずつ使った固定小数点数であるように推測できます。
サイズは同じなのに、なぜ(Liteでない)Flashと同じように普通の倍精度浮動小数点数を使っていないのかはちょっとわかりません。

この手の仕様というのは、FlashLiteのインタプリタを作っている人は当然知っているはずですが、プログラマ向けには公開されていないものなのでしょうか。どなたかご存知の方がいらっしゃいましたら、教えてください。

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/1046

コメント

組み込み系のCPUでは浮動小数点をサポートしていない物が多いからではないでしょうか。

コメントを投稿