固定小数点数を double に変換

固定小数点数と呼ばれるものに遭遇したので,取り合えず 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) のように使用します.