ホーム 道しるべ 憩いの広場 濃緑空間 濃緑研の日記

FixedPoint Tool
ホーム ] 上へ ] 概説 ] 固定小数点 除算 ] [ FixedPoint Tool ] Round2に挑戦 ]

 

Float to Fixed
Normalize
Fixed to Float
Adjust Point
座標変換に挑戦

bulletFloat to Fixed
単精度浮動小数点データを固定小数点データと小数点位置に変換

void f2lf(float s,long* d,long* p)

s: 単精度浮動小数点データ
d: 固定小数点データへのポインタ(ポイント先のデータは変更されます)
p: 小数点位置へのポインタ(ポイント先のデータは変更されます)

bulletNormalize
固定小数点データの正規化を行う
正数で1ビットしかonでない数値の負数のノーマライズに不具合があり修正しました(1999/08/05)
たとえば、0xf0000000(小数点位置4の-1.0)を正規化すると、従来0x80000000となっていました。
これでは符号ビットだけonで固定小数点としては不都合がありました。
現在は0xc0000000(小数点位置2の-1.0)となるように修正しています。
正規化については後日説明します。

void norm(long* lf,long* cn)

lf:   固定小数点データへのポインタ(ポイント先のデータは正規化されます)
cn: 小数点位置へのポインタ(ポイント先のデータは変更されます:正規化後の小数点位置を示す)


bulletFixed to Float
正規化された固定小数点データと小数点位置情報を基に、単精度浮動小数点データに変換します。

void lf2f(long s, long p, float* d)

s: 固定小数点データ
p: 小数点位置
d: 単精度浮動小数点データへのポインタ(ポイント先のデータは変更されます)


bulletAdjust to Floating Point(1999/08/05追加)
小数点位置を指定された位置に移動します。

void lfadj(long* lf, long cn, long cnd)

lf:  固定少数点データへのポインタ(ポイント先のデータは変更されます)
cn: 移動前の lf の小数点位置
cnd: 移動後の小数点位置

たとえば、lf が0x40000000(小数点位置2で1.0を示す)の小数点位置を4に移動すると
lf は0x10000000(小数点位置4の1.0)と変更になります。

加算はお互い同じ小数点位置でないと正しい結果が得られません。
主に加算の前に互いの小数点位置を調整するときに使用します。

bullet簡単な掛け算の使用例です。

// lf3 = lf1*lf2;

main()
{
    char    buf[80];
    long    lf1,cn1;
    long    lf2,cn2;
    long    lf3,cn3;
    float    fw;

    f2lf(float(1.41421356),&lf1,&cn1);
    f2lf(float(1.41421356),&lf2,&cn2);
    _asm {
        mov         eax,lf1
        imul    lf2
        mov         lf3,edx
    }

    cn3 = cn1+cn2;
    norm(&lf3,&cn3);
    lf2f(lf3, cn3, &fw);  //必ず固定小数点データは正規化したものを指定してください。
    sprintf(buf,"%d %x\n %f ",cn3,lf3,fw);
    MessageBox(GetDesktopWindow(), buf,"Test FixedPoint",MB_OK);
}

bulletもう一つ、割り算の例


// lf3 = lf1/lf2;

fixed2()
{
    char    buf[80];
    long    lf1,cn1;
    long    lf2,cn2;
    long    lf3,cn3;
    float    fw;

    f2lf(float(-1.0),&lf1,&cn1);
    f2lf(float(25.0),&lf2,&cn2);
    _asm {
//        mov         eax,lf1
//        imul    lf2
//        mov         lf3,edx
        mov         eax,0
        mov         edx,lf1
        sar         edx,1
        sar         edx,1
        idiv    lf2

        mov         lf3,eax
    }

    cn3 = (cn1+2)-cn2;
    norm(&lf3,&cn3);
    lf2f(lf3, cn3, &fw);
    sprintf(buf,"%d %x\n %f ",cn3,lf3,fw);
    MessageBox(GetDesktopWindow(), buf,"Test FixedPoint",MB_OK);
}