|




| |
 | Float to Fixed
単精度浮動小数点データを固定小数点データと小数点位置に変換
void f2lf(float s,long* d,long* p)
s: 単精度浮動小数点データ
d: 固定小数点データへのポインタ(ポイント先のデータは変更されます)
p: 小数点位置へのポインタ(ポイント先のデータは変更されます)
|
 | Normalize
固定小数点データの正規化を行う
正数で1ビットしかonでない数値の負数のノーマライズに不具合があり修正しました(1999/08/05)
たとえば、0xf0000000(小数点位置4の-1.0)を正規化すると、従来0x80000000となっていました。
これでは符号ビットだけonで固定小数点としては不都合がありました。
現在は0xc0000000(小数点位置2の-1.0)となるように修正しています。
正規化については後日説明します。
void norm(long* lf,long* cn)
lf:
固定小数点データへのポインタ(ポイント先のデータは正規化されます)
cn:
小数点位置へのポインタ(ポイント先のデータは変更されます:正規化後の小数点位置を示す)
|
 | Fixed to Float
正規化された固定小数点データと小数点位置情報を基に、単精度浮動小数点データに変換します。
void lf2f(long s, long p, float* d)
s: 固定小数点データ
p: 小数点位置
d: 単精度浮動小数点データへのポインタ(ポイント先のデータは変更されます)
|
 | Adjust 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)と変更になります。
加算はお互い同じ小数点位置でないと正しい結果が得られません。
主に加算の前に互いの小数点位置を調整するときに使用します。
|

 | 簡単な掛け算の使用例です。 // 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);
}

|
 | もう一つ、割り算の例
// 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);
}
|
|