固定小数点数クラス

BREW浮動小数点数を使うのは速度的にも容量的にももったいないから固定小数点数クラスを作ろうと思ったんだけど、出来る限りの速度とある程度の汎用性を求めるとなかなか難しい。


とりあえず必要になる固定小数点数クラスは、整数部 8bit(1+7bit)、小数部 8bit の 7.8 形式、同じく 15.16 形式、31.32 形式の3つぐらいだろう。
で、それぞれのクラスに対して相互に変換出来る四則演算子を用意して、固定小数点数同士の計算を簡単に行えるようにするのが目的。


イメージとしては、

FP16 fp( 10,5 ); // 10.5f を代入
FP8 fp2 = fp + FP8( 5,1 ); // fp2 = 15.6
FP32 fp3 = fp * fp2; // 10.5 * 15.6 = 163.8

こんな感じで演算出来るようにしたい。


まず考える必要があるのが、小数部の表現形式。
今回の場合は 31.32 形式が最大の大きさなので、小数部は 32bit で表現する。
例えば 0.1 なら、0x19999999 という値になる。
ただし、0.1 という値は小数なので、例えば 0.325 を表現したい場合に 325 と入力すれば 0x60000000 が返されるようなヘルパ関数を作ってみる。

uint32 floatToInt( uint32 n ){
    if( n == 0 ){
        return 0;
    }
    uint32 k = 1;
    while( k <= n ){
        if( k == 1000000000 ){
            n /= 10;
        }else{
            k *= 10;
        }
    }
    int r = 0;
    for( int i = 31 ; i >= 0 ; i-- ){
        n <<= 1;
        if( n >= k ){
            n -= k;
            r |= 1 << i;
            if( n == 0 ){
                break;
            }
        }
    }
    return r;
}

これで uint32 で表現された小数を 32bit で表現することが出来る……んだけど、遅そう(;´Д`)