20#ifndef ABC__sat__xSAT__xsatFloat_h
21#define ABC__sat__xSAT__xsatFloat_h
55static inline unsigned xSat_Float2Uint(
xFloat_t f ) {
union {
xFloat_t f;
unsigned u; } temp; temp.f = f;
return temp.u; }
56static inline xFloat_t xSat_Uint2Float(
unsigned u ) {
union {
xFloat_t f;
unsigned u; } temp; temp.u = u;
return temp.f; }
57static inline int xSat_LessThan(
xFloat_t a,
xFloat_t b ) {
return a.Exp < b.Exp || (a.Exp == b.Exp && a.Mnt < b.Mnt); }
58static inline int xSat_Equal(
xFloat_t a,
xFloat_t b ) {
return a.Exp == b.Exp && a.Mnt == b.Mnt; }
60static inline xFloat_t xSat_FloatCreate(
unsigned Exp,
unsigned Mnt ) {
xFloat_t res; res.Exp = Exp; res.Mnt = Mnt;
return res; }
62static inline xFloat_t xSat_FloatCreateConst1() {
return xSat_FloatCreate( 0, 1 << 15 ); }
63static inline xFloat_t xSat_FloatCreateConst2() {
return xSat_FloatCreate( 1, 1 << 15 ); }
64static inline xFloat_t xSat_FloatCreateConst3() {
return xSat_FloatCreate( 1, 3 << 14 ); }
65static inline xFloat_t xSat_FloatCreateConst12() {
return xSat_FloatCreate( 3, 3 << 14 ); }
66static inline xFloat_t xSat_FloatCreateConst1point5() {
return xSat_FloatCreate( 0, 3 << 14 ); }
67static inline xFloat_t xSat_FloatCreateConst2point5() {
return xSat_FloatCreate( 1, 5 << 13 ); }
68static inline xFloat_t xSat_FloatCreateMaximum() {
return xSat_Uint2Float( 0xFFFFFFFF ); }
70static inline float xSat_Float2Float(
xFloat_t a ) {
assert(a.Exp < 127);
return Abc_Int2Float(((a.Exp + 127) << 23) | ((a.Mnt & 0x7FFF) << 8)); }
71static inline xFloat_t xSat_FloatFromFloat(
float a ) {
int A = Abc_Float2Int(a);
assert(a >= 1.0);
return xSat_FloatCreate((A >> 23)-127, 0x8000 | ((A >> 8) & 0x7FFF)); }
92 return xSat_FloatAdd(b, a);
95 Mnt = a.Mnt + (b.Mnt >> (a.Exp - b.Exp));
99 if ( Mnt & 0xFFFF0000 )
102 if ( Exp & 0xFFFF0000 )
103 return xSat_Uint2Float( 0xFFFFFFFF );
104 assert( (Exp & 0xFFFF0000) == 0 );
105 assert( (Mnt & 0xFFFF0000) == 0 );
106 assert( Mnt & 0x00008000 );
107 return xSat_FloatCreate( Exp, Mnt );
125 return xSat_FloatMul(b, a);
128 Mnt = (a.Mnt * b.Mnt) >> 15;
132 if ( Mnt & 0xFFFF0000 )
135 if ( Exp & 0xFFFF0000 )
136 return xSat_Uint2Float( 0xFFFFFFFF );
137 assert( (Exp & 0xFFFF0000) == 0 );
138 assert( (Mnt & 0xFFFF0000) == 0 );
139 assert( Mnt & 0x00008000 );
140 return xSat_FloatCreate( Exp, Mnt );
158 return xSat_FloatCreate( a.Exp - Deg2, a.Mnt );
159 return xSat_FloatCreateConst1();
173static inline void xSat_FloatTest()
175 xFloat_t c1 = xSat_FloatCreateConst1();
176 xFloat_t c2 = xSat_FloatCreateConst2();
177 xFloat_t c3 = xSat_FloatCreateConst3();
178 xFloat_t c12 = xSat_FloatCreateConst12();
179 xFloat_t c1p5 = xSat_FloatCreateConst1point5();
180 xFloat_t c2p5 = xSat_FloatCreateConst2point5();
182 xFloat_t c1_ = xSat_FloatFromFloat(1.0);
183 xFloat_t c2_ = xSat_FloatFromFloat(2.0);
184 xFloat_t c3_ = xSat_FloatFromFloat(3.0);
185 xFloat_t c12_ = xSat_FloatFromFloat(12.0);
186 xFloat_t c1p5_ = xSat_FloatFromFloat(1.5);
187 xFloat_t c2p5_ = xSat_FloatFromFloat(2.5);
189 xFloat_t sum1 = xSat_FloatAdd(c1, c1p5);
190 xFloat_t mul1 = xSat_FloatMul(c2, c1p5);
192 xFloat_t sum2 = xSat_FloatAdd(c1p5, c2p5);
193 xFloat_t mul2 = xSat_FloatMul(c1p5, c2p5);
199 printf(
"1 = %f\n", xSat_Float2Float(c1) );
200 printf(
"2 = %f\n", xSat_Float2Float(c2) );
201 printf(
"3 = %f\n", xSat_Float2Float(c3) );
202 printf(
"12 = %f\n", xSat_Float2Float(c12) );
203 printf(
"1.5 = %f\n", xSat_Float2Float(c1p5) );
204 printf(
"2.5 = %f\n", xSat_Float2Float(c2p5) );
206 printf(
"Converted 1 = %f\n", xSat_Float2Float(c1_) );
207 printf(
"Converted 2 = %f\n", xSat_Float2Float(c2_) );
208 printf(
"Converted 3 = %f\n", xSat_Float2Float(c3_) );
209 printf(
"Converted 12 = %f\n", xSat_Float2Float(c12_) );
210 printf(
"Converted 1.5 = %f\n", xSat_Float2Float(c1p5_) );
211 printf(
"Converted 2.5 = %f\n", xSat_Float2Float(c2p5_) );
213 printf(
"1.0 + 1.5 = %f\n", xSat_Float2Float(sum1) );
214 printf(
"2.0 * 1.5 = %f\n", xSat_Float2Float(mul1) );
216 printf(
"1.5 + 2.5 = %f\n", xSat_Float2Float(sum2) );
217 printf(
"1.5 * 2.5 = %f\n", xSat_Float2Float(mul2) );
218 printf(
"12 / 2^2 = %f\n", xSat_Float2Float(xSat_FloatDiv(c12, 2)) );
220 assert( xSat_Equal(sum1, c2p5) );
221 assert( xSat_Equal(mul1, c3) );
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
typedefABC_NAMESPACE_HEADER_START struct xFloat_t_ xFloat_t
STRUCTURE DEFINITIONS ///.