21#ifndef ABC__sat__Xdbl__Xdbl_h
22#define ABC__sat__Xdbl__Xdbl_h
51static inline word Xdbl_Exp(
xdbl a ) {
return a >> 48; }
52static inline word Xdbl_Mnt(
xdbl a ) {
return (a << 16) >> 16; }
54static inline xdbl Xdbl_Create(
word Exp,
word Mnt ) {
assert(!(Exp>>16) && (Mnt>>47)==(
word)1);
return (Exp<<48) | Mnt; }
56static inline xdbl Xdbl_Const1() {
return Xdbl_Create( (
word)0, (
word)1 << 47 ); }
57static inline xdbl Xdbl_Const2() {
return Xdbl_Create( (
word)1, (
word)1 << 47 ); }
58static inline xdbl Xdbl_Const3() {
return Xdbl_Create( (
word)1, (
word)3 << 46 ); }
59static inline xdbl Xdbl_Const12() {
return Xdbl_Create( (
word)3, (
word)3 << 46 ); }
60static inline xdbl Xdbl_Const1point5() {
return Xdbl_Create( (
word)0, (
word)3 << 46 ); }
61static inline xdbl Xdbl_Const2point5() {
return Xdbl_Create( (
word)1, (
word)5 << 45 ); }
62static inline xdbl Xdbl_Maximum() {
return ~(
word)0; }
64static inline double Xdbl_ToDouble(
xdbl a ) {
assert(Xdbl_Exp(a) < 1023);
return Abc_Word2Dbl(((Xdbl_Exp(a) + 1023) << 52) | (((a<<17)>>17) << 5)); }
65static inline xdbl Xdbl_FromDouble(
double a ) {
word A = Abc_Dbl2Word(a);
assert(a >= 1.0);
return Xdbl_Create((A >> 52)-1023, (((
word)1) << 47) | ((A << 12) >> 17)); }
85 if ( a < b ) a ^= b, b ^= a, a ^= b;
87 Mnt = Xdbl_Mnt(a) + (Xdbl_Mnt(b) >> (Xdbl_Exp(a) - Xdbl_Exp(b)));
92 return Xdbl_Maximum();
93 return Xdbl_Create( Exp, Mnt );
109 word Exp, Mnt, MntA, MntB, MntAh, MntBh, MntAl, MntBl;
110 if ( a < b ) a ^= b, b ^= a, a ^= b;
116 MntAl = (MntA<<32)>>32;
117 MntBl = (MntB<<32)>>32;
118 Mnt = ((MntAh * MntBh) << 17) + ((MntAl * MntBl) >> 47) + ((MntAl * MntBh) >> 15) + ((MntAh * MntBl) >> 15);
119 Exp = Xdbl_Exp(a) + Xdbl_Exp(b);
123 return Xdbl_Maximum();
124 return Xdbl_Create( Exp, Mnt );
138static inline xdbl Xdbl_Div(
xdbl a,
unsigned Deg2 )
140 if ( Xdbl_Exp(a) >= (
word)Deg2 )
141 return Xdbl_Create( Xdbl_Exp(a) - Deg2, Xdbl_Mnt(a) );
142 return Xdbl_Const1();
156static inline void Xdbl_Test()
158 xdbl c1 = Xdbl_Const1();
159 xdbl c2 = Xdbl_Const2();
160 xdbl c3 = Xdbl_Const3();
161 xdbl c12 = Xdbl_Const12();
162 xdbl c1p5 = Xdbl_Const1point5();
163 xdbl c2p5 = Xdbl_Const2point5();
165 xdbl c1_ = Xdbl_FromDouble(1.0);
166 xdbl c2_ = Xdbl_FromDouble(2.0);
167 xdbl c3_ = Xdbl_FromDouble(3.0);
168 xdbl c12_ = Xdbl_FromDouble(12.0);
169 xdbl c1p5_ = Xdbl_FromDouble(1.5);
170 xdbl c2p5_ = Xdbl_FromDouble(2.5);
172 xdbl sum1 = Xdbl_Add(c1, c1p5);
173 xdbl mul1 = Xdbl_Mul(c2, c1p5);
175 xdbl sum2 = Xdbl_Add(c1p5, c2p5);
176 xdbl mul2 = Xdbl_Mul(c1p5, c2p5);
178 xdbl a = Xdbl_FromDouble(1.2929725);
179 xdbl b = Xdbl_FromDouble(10.28828287);
180 xdbl ab = Xdbl_Mul(a, b);
182 xdbl ten100 = Xdbl_FromDouble( 1e100 );
185 assert( ten100 == ten100_ );
191 printf(
"1 = %lf\n", Xdbl_ToDouble(c1) );
192 printf(
"2 = %lf\n", Xdbl_ToDouble(c2) );
193 printf(
"3 = %lf\n", Xdbl_ToDouble(c3) );
194 printf(
"12 = %lf\n", Xdbl_ToDouble(c12) );
195 printf(
"1.5 = %lf\n", Xdbl_ToDouble(c1p5) );
196 printf(
"2.5 = %lf\n", Xdbl_ToDouble(c2p5) );
198 printf(
"Converted 1 = %lf\n", Xdbl_ToDouble(c1_) );
199 printf(
"Converted 2 = %lf\n", Xdbl_ToDouble(c2_) );
200 printf(
"Converted 3 = %lf\n", Xdbl_ToDouble(c3_) );
201 printf(
"Converted 12 = %lf\n", Xdbl_ToDouble(c12_) );
202 printf(
"Converted 1.5 = %lf\n", Xdbl_ToDouble(c1p5_) );
203 printf(
"Converted 2.5 = %lf\n", Xdbl_ToDouble(c2p5_) );
205 printf(
"1.0 + 1.5 = %lf\n", Xdbl_ToDouble(sum1) );
206 printf(
"2.0 * 1.5 = %lf\n", Xdbl_ToDouble(mul1) );
208 printf(
"1.5 + 2.5 = %lf\n", Xdbl_ToDouble(sum2) );
209 printf(
"1.5 * 2.5 = %lf\n", Xdbl_ToDouble(mul2) );
210 printf(
"12 / 2^2 = %lf\n", Xdbl_ToDouble(Xdbl_Div(c12, 2)) );
212 printf(
"12 / 2^2 = %lf\n", Xdbl_ToDouble(Xdbl_Div(c12, 2)) );
214 printf(
"%.16lf * %.16lf = %.16lf (%.16lf)\n", Xdbl_ToDouble(a), Xdbl_ToDouble(b), Xdbl_ToDouble(ab), 1.2929725 * 10.28828287 );
#define ABC_CONST(number)
PARAMETERS ///.
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
unsigned __int64 word
DECLARATIONS ///.
ABC_NAMESPACE_HEADER_START typedef word xdbl
STRUCTURE DEFINITIONS ///.