3 C_ASSERT(sizeof(FIX
) == sizeof(LONG
));
4 #define FIX2LONG(x) (((x) + 8) >> 4)
5 #define LONG2FIX(x) ((x) << 4)
11 _FLOATOBJ_Equal(FLOATOBJ
*pf1
, FLOATOBJ
*pf2
)
13 EFLOAT_S
*pef1
= (EFLOAT_S
*)pf1
;
14 EFLOAT_S
*pef2
= (EFLOAT_S
*)pf2
;
15 return (pef1
->lMant
== pef2
->lMant
&& pef1
->lExp
== pef2
->lExp
);
17 #define FLOATOBJ_Equal _FLOATOBJ_Equal
21 _FLOATOBJ_GetLong(FLOATOBJ
*pf
)
23 EFLOAT_S
*pef
= (EFLOAT_S
*)pf
;
24 return pef
->lMant
>> (32 - pef
->lExp
);
26 #define FLOATOBJ_GetLong _FLOATOBJ_GetLong
29 * \brief Converts a FLOATOBJ into a LONG by truncating the value to integer
31 * \param pf - Pointer to a FLOATOBJ containing the value to convert
33 * \param pl - Pointer to a variable that receives the result
35 * \return TRUE if the function succeeded, FALSE if the result would overflow
41 FLOATOBJ_bConvertToLong(FLOATOBJ
*pf
, PLONG pl
)
43 EFLOAT_S
*pef
= (EFLOAT_S
*)pf
;
44 LONG lShift
= 32 - pef
->lExp
;
49 *pl
= pef
->lMant
>> lShift
;
55 FLOATOBJ_GetFix(FLOATOBJ
*pf
)
57 EFLOAT_S
*pef
= (EFLOAT_S
*)pf
;
58 LONG Shift
= (28 - pef
->lExp
);
59 return (Shift
>= 0 ? pef
->lMant
>> Shift
: pef
->lMant
<< -Shift
);
64 FLOATOBJ_IsLong(FLOATOBJ
*pf
)
66 EFLOAT_S
*pef
= (EFLOAT_S
*)pf
;
67 ULONG ulShift
= pef
->lExp
;
69 return ((pef
->lMant
<< ulShift
) == 0);
71 return (ulShift
== 32);
76 FLOATOBJ_Equal0(FLOATOBJ
*pf
)
78 EFLOAT_S
*pef
= (EFLOAT_S
*)pf
;
79 return (pef
->lMant
== 0 && pef
->lExp
== 0);
84 FLOATOBJ_Equal1(FLOATOBJ
*pf
)
86 EFLOAT_S
*pef
= (EFLOAT_S
*)pf
;
87 return (pef
->lMant
== 0x40000000 && pef
->lExp
== 2);
90 extern const FLOATOBJ gef0
;
91 extern const FLOATOBJ gef1
;
92 extern const FLOATOBJ gef16
;
94 #define FLOATOBJ_0 {0x00000000, 0x00000000}
95 #define FLOATOBJ_1 {0x40000000, 0x00000002}
96 #define FLOATOBJ_16 {0x40000000, 0x00000006}
97 #define FLOATOBJ_1_16 {0x40000000, 0xfffffffe}
99 #define FLOATOBJ_Set0(fo) do { (fo)->ul1 = 0; (fo)->ul2 = 0; } while (0)
100 #define FLOATOBJ_Set1(fo) do { (fo)->ul1 = 0x40000000; (fo)->ul2 = 2; } while (0)
104 #define FLOATOBJ_bConvertToLong(pf, pl) (*pl = (LONG)*pf, TRUE)
105 #define FLOATOBJ_IsLong(pf) ((FLOAT)((LONG)*(pf)) == *(pf))
106 #define FLOATOBJ_Equal0(pf) (*(pf) == 0.)
107 #define FLOATOBJ_Equal1(pf) (*(pf) == 1.)
108 #define FLOATOBJ_GetFix(pf) ((LONG)(*(pf) * 16.))
110 #define FLOATOBJ_0 0.
111 #define FLOATOBJ_1 1.
112 #define FLOATOBJ_16 16.
113 #define FLOATOBJ_1_16 (1./16.)
115 static const FLOATOBJ gef0
= 0.;
116 static const FLOATOBJ gef1
= 1.;
117 static const FLOATOBJ gef16
= 16.;
119 #define FLOATOBJ_Set0(fo) *(fo) = 0;
120 #define FLOATOBJ_Set1(fo) *(fo) = 1;