固定小数点数と呼ばれるものに遭遇したので,取り合えず double に変換する事を考えます.固定小数点数とは,(short, int や long などの整数型の)下位 N ビットを小数点以下の数値用に使用する方法で,固定と言う名の通り N はあらかじめ固定しておくそうです.小数部は,0.1, 0.01, 0.001 ... ではなくて,1/2, 1/4, 1/8, ... のように 2^(-i) (1 <= i <= N) ごとに値を保持しておくとのこと.
以上のような固定小数点数を double に変換する関数を作成します.
template <int DecimalBits, typename Type> inline double fixed_cast(Type x) { double dest = (x >> DecimalBits); Type mask = 1 << (DecimalBits - 1); double digit = 1 / 2.0; for (int i = 0; i < DecimalBits; ++i) { if (x & mask) dest += digit; mask >>= 1; digit /= 2.0; } return dest; }
例えば,小数部が 16 ビットの場合は,fixed_cast<16>(x) のように使用します.