ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
sdbl.h
Go to the documentation of this file.
1//===--- sdbl.h -------------------------------------------------------------===
2//
3// satoko: Satisfiability solver
4//
5// This file is distributed under the BSD 2-Clause License.
6// See LICENSE for details.
7//
8//===------------------------------------------------------------------------===
9// by Alan Mishchenko
10#ifndef satoko__utils__sdbl_h
11#define satoko__utils__sdbl_h
12
15/*
16 The sdbl_t floating-point number is represented as a 64-bit unsigned int.
17 The number is (2^expt)*mnt, where expt is a 16-bit exponent and mnt is a
18 48-bit mantissa. The decimal point is located between the MSB of mnt,
19 which is always 1, and the remaining 15 digits of mnt.
20
21 Currently, only positive numbers are represented.
22
23 The range of possible values is [1.0; 2^(2^16-1)*1.111111111111111]
24 that is, the smallest possible number is 1.0 and the largest possible
25 number is 2^(---16 ones---).(1.---47 ones---)
26
27 Comparison of numbers can be done by comparing the underlying unsigned ints.
28
29 Only addition, multiplication, and division by 2^n are currently implemented.
30*/
31
32typedef word sdbl_t;
33
34static sdbl_t SDBL_CONST1 = ABC_CONST(0x0000800000000000);
35static sdbl_t SDBL_MAX = ~(sdbl_t)(0);
36
37union ui64_dbl { word ui64; double dbl; };
38
39static inline word sdbl_exp(sdbl_t a) { return a >> 48; }
40static inline word sdbl_mnt(sdbl_t a) { return (a << 16) >> 16; }
41
42static inline double sdbl2double(sdbl_t a) {
43 union ui64_dbl temp;
44 assert(sdbl_exp(a) < 1023);
45 temp.ui64 = ((sdbl_exp(a) + 1023) << 52) | (((a << 17) >> 17) << 5);
46 return temp.dbl;
47}
48
49static inline sdbl_t double2sdbl(double value)
50{
51 union ui64_dbl temp;
52 sdbl_t expt, mnt;
53 assert(value >= 1.0);
54 temp.dbl = value;
55 expt = (temp.ui64 >> 52) - 1023;
56 mnt = SDBL_CONST1 | ((temp.ui64 << 12) >> 17);
57 return (expt << 48) + mnt;
58}
59
60static inline sdbl_t sdbl_add(sdbl_t a, sdbl_t b)
61{
62 sdbl_t expt, mnt;
63 if (a < b) {
64 a ^= b;
65 b ^= a;
66 a ^= b;
67 }
68 assert(a >= b);
69 expt = sdbl_exp(a);
70 mnt = sdbl_mnt(a) + (sdbl_mnt(b) >> (sdbl_exp(a) - sdbl_exp(b)));
71 /* Check for carry */
72 if (mnt >> 48) {
73 expt++;
74 mnt >>= 1;
75 }
76 if (expt >> 16) /* overflow */
77 return SDBL_MAX;
78 return (expt << 48) + mnt;
79}
80
81static inline sdbl_t sdbl_mult(sdbl_t a, sdbl_t b)
82{
83 sdbl_t expt, mnt;
84 sdbl_t a_mnt, a_mnt_hi, a_mnt_lo;
85 sdbl_t b_mnt, b_mnt_hi, b_mnt_lo;
86 if (a < b) {
87 a ^= b;
88 b ^= a;
89 a ^= b;
90 }
91 assert( a >= b );
92 a_mnt = sdbl_mnt(a);
93 b_mnt = sdbl_mnt(b);
94 a_mnt_hi = a_mnt>>32;
95 b_mnt_hi = b_mnt>>32;
96 a_mnt_lo = (a_mnt<<32)>>32;
97 b_mnt_lo = (b_mnt<<32)>>32;
98 mnt = ((a_mnt_hi * b_mnt_hi) << 17) +
99 ((a_mnt_lo * b_mnt_lo) >> 47) +
100 ((a_mnt_lo * b_mnt_hi) >> 15) +
101 ((a_mnt_hi * b_mnt_lo) >> 15);
102 expt = sdbl_exp(a) + sdbl_exp(b);
103 /* Check for carry */
104 if (mnt >> 48) {
105 expt++;
106 mnt >>= 1;
107 }
108 if (expt >> 16) /* overflow */
109 return SDBL_MAX;
110 return (expt << 48) + mnt;
111}
112
113static inline sdbl_t sdbl_div(sdbl_t a, unsigned deg2)
114{
115 if (sdbl_exp(a) >= (word)deg2)
116 return ((sdbl_exp(a) - deg2) << 48) + sdbl_mnt(a);
117 return SDBL_CONST1;
118}
119
120static inline void sdbl_test()
121{
122 sdbl_t ten100_ = ABC_CONST(0x014c924d692ca61b);
123 printf("%f\n", sdbl2double(ten100_));
124 //printf("%016lX\n", double2sdbl(1 /0.95));
125 //printf("%016lX\n", SDBL_CONST1);
126 printf("%f\n", sdbl2double(SDBL_CONST1));
127 printf("%f\n", sdbl2double(ABC_CONST(0x000086BCA1AF286B)));
128
129}
130
132
133#endif /* satoko__utils__sdbl_h */
#define ABC_CONST(number)
PARAMETERS ///.
Definition abc_global.h:240
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
ABC_NAMESPACE_IMPL_START typedef signed char value
unsigned __int64 word
DECLARATIONS ///.
Definition kitPerm.c:36
ABC_NAMESPACE_HEADER_START typedef word sdbl_t
Definition sdbl.h:32
double dbl
Definition sdbl.h:37
word ui64
Definition sdbl.h:37
#define assert(ex)
Definition util_old.h:213