1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35#if !defined(DECNUMBER)
36 #define DECNUMBER
37 #define DECNAME "decNumber"
38 #define DECFULLNAME "Decimal Number Module"
39 #define DECAUTHOR "Mike Cowlishaw"
40
41 #if !defined(DECCONTEXT)
42 #include "libdecnumber/decContext.h"
43 #endif
44
45
46 #define DECNEG 0x80
47 #define DECINF 0x40
48 #define DECNAN 0x20
49 #define DECSNAN 0x10
50
51 #define DECSPECIAL (DECINF|DECNAN|DECSNAN)
52
53
54
55
56
57
58 #define DECDPUN 3
59
60
61
62
63
64
65 #if !defined(DECNUMDIGITS)
66 #define DECNUMDIGITS 1
67 #endif
68
69
70
71 #if DECDPUN<=2
72 #define decNumberUnit uint8_t
73 #elif DECDPUN<=4
74 #define decNumberUnit uint16_t
75 #else
76 #define decNumberUnit uint32_t
77 #endif
78
79 #define DECNUMUNITS ((DECNUMDIGITS+DECDPUN-1)/DECDPUN)
80
81
82 typedef struct {
83 int32_t digits;
84 int32_t exponent;
85
86 uint8_t bits;
87
88 decNumberUnit lsu[DECNUMUNITS];
89 } decNumber;
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116 decNumber * decNumberFromInt32(decNumber *, int32_t);
117 decNumber * decNumberFromUInt32(decNumber *, uint32_t);
118 decNumber *decNumberFromInt64(decNumber *, int64_t);
119 decNumber *decNumberFromUInt64(decNumber *, uint64_t);
120 decNumber * decNumberFromString(decNumber *, const char *, decContext *);
121 char * decNumberToString(const decNumber *, char *);
122 char * decNumberToEngString(const decNumber *, char *);
123 uint32_t decNumberToUInt32(const decNumber *, decContext *);
124 int32_t decNumberToInt32(const decNumber *, decContext *);
125 int64_t decNumberIntegralToInt64(const decNumber *dn, decContext *set);
126 uint8_t * decNumberGetBCD(const decNumber *, uint8_t *);
127 decNumber * decNumberSetBCD(decNumber *, const uint8_t *, uint32_t);
128
129
130 decNumber * decNumberAbs(decNumber *, const decNumber *, decContext *);
131 decNumber * decNumberAdd(decNumber *, const decNumber *, const decNumber *, decContext *);
132 decNumber * decNumberAnd(decNumber *, const decNumber *, const decNumber *, decContext *);
133 decNumber * decNumberCompare(decNumber *, const decNumber *, const decNumber *, decContext *);
134 decNumber * decNumberCompareSignal(decNumber *, const decNumber *, const decNumber *, decContext *);
135 decNumber * decNumberCompareTotal(decNumber *, const decNumber *, const decNumber *, decContext *);
136 decNumber * decNumberCompareTotalMag(decNumber *, const decNumber *, const decNumber *, decContext *);
137 decNumber * decNumberDivide(decNumber *, const decNumber *, const decNumber *, decContext *);
138 decNumber * decNumberDivideInteger(decNumber *, const decNumber *, const decNumber *, decContext *);
139 decNumber * decNumberExp(decNumber *, const decNumber *, decContext *);
140 decNumber * decNumberFMA(decNumber *, const decNumber *, const decNumber *, const decNumber *, decContext *);
141 decNumber * decNumberInvert(decNumber *, const decNumber *, decContext *);
142 decNumber * decNumberLn(decNumber *, const decNumber *, decContext *);
143 decNumber * decNumberLogB(decNumber *, const decNumber *, decContext *);
144 decNumber * decNumberLog10(decNumber *, const decNumber *, decContext *);
145 decNumber * decNumberMax(decNumber *, const decNumber *, const decNumber *, decContext *);
146 decNumber * decNumberMaxMag(decNumber *, const decNumber *, const decNumber *, decContext *);
147 decNumber * decNumberMin(decNumber *, const decNumber *, const decNumber *, decContext *);
148 decNumber * decNumberMinMag(decNumber *, const decNumber *, const decNumber *, decContext *);
149 decNumber * decNumberMinus(decNumber *, const decNumber *, decContext *);
150 decNumber * decNumberMultiply(decNumber *, const decNumber *, const decNumber *, decContext *);
151 decNumber * decNumberNormalize(decNumber *, const decNumber *, decContext *);
152 decNumber * decNumberOr(decNumber *, const decNumber *, const decNumber *, decContext *);
153 decNumber * decNumberPlus(decNumber *, const decNumber *, decContext *);
154 decNumber * decNumberPower(decNumber *, const decNumber *, const decNumber *, decContext *);
155 decNumber * decNumberQuantize(decNumber *, const decNumber *, const decNumber *, decContext *);
156 decNumber * decNumberReduce(decNumber *, const decNumber *, decContext *);
157 decNumber * decNumberRemainder(decNumber *, const decNumber *, const decNumber *, decContext *);
158 decNumber * decNumberRemainderNear(decNumber *, const decNumber *, const decNumber *, decContext *);
159 decNumber * decNumberRescale(decNumber *, const decNumber *, const decNumber *, decContext *);
160 decNumber * decNumberRotate(decNumber *, const decNumber *, const decNumber *, decContext *);
161 decNumber * decNumberSameQuantum(decNumber *, const decNumber *, const decNumber *);
162 decNumber * decNumberScaleB(decNumber *, const decNumber *, const decNumber *, decContext *);
163 decNumber * decNumberShift(decNumber *, const decNumber *, const decNumber *, decContext *);
164 decNumber * decNumberSquareRoot(decNumber *, const decNumber *, decContext *);
165 decNumber * decNumberSubtract(decNumber *, const decNumber *, const decNumber *, decContext *);
166 decNumber * decNumberToIntegralExact(decNumber *, const decNumber *, decContext *);
167 decNumber * decNumberToIntegralValue(decNumber *, const decNumber *, decContext *);
168 decNumber * decNumberXor(decNumber *, const decNumber *, const decNumber *, decContext *);
169
170
171 enum decClass decNumberClass(const decNumber *, decContext *);
172 const char * decNumberClassToString(enum decClass);
173 decNumber * decNumberCopy(decNumber *, const decNumber *);
174 decNumber * decNumberCopyAbs(decNumber *, const decNumber *);
175 decNumber * decNumberCopyNegate(decNumber *, const decNumber *);
176 decNumber * decNumberCopySign(decNumber *, const decNumber *, const decNumber *);
177 decNumber * decNumberNextMinus(decNumber *, const decNumber *, decContext *);
178 decNumber * decNumberNextPlus(decNumber *, const decNumber *, decContext *);
179 decNumber * decNumberNextToward(decNumber *, const decNumber *, const decNumber *, decContext *);
180 decNumber * decNumberTrim(decNumber *);
181 const char * decNumberVersion(void);
182 decNumber * decNumberZero(decNumber *);
183
184
185 int32_t decNumberIsNormal(const decNumber *, decContext *);
186 int32_t decNumberIsSubnormal(const decNumber *, decContext *);
187
188
189 #define decNumberIsCanonical(dn) (1)
190 #define decNumberIsFinite(dn) (((dn)->bits&DECSPECIAL)==0)
191 #define decNumberIsInfinite(dn) (((dn)->bits&DECINF)!=0)
192 #define decNumberIsNaN(dn) (((dn)->bits&(DECNAN|DECSNAN))!=0)
193 #define decNumberIsNegative(dn) (((dn)->bits&DECNEG)!=0)
194 #define decNumberIsQNaN(dn) (((dn)->bits&(DECNAN))!=0)
195 #define decNumberIsSNaN(dn) (((dn)->bits&(DECSNAN))!=0)
196 #define decNumberIsSpecial(dn) (((dn)->bits&DECSPECIAL)!=0)
197 #define decNumberIsZero(dn) (*(dn)->lsu==0 \
198 && (dn)->digits==1 \
199 && (((dn)->bits&DECSPECIAL)==0))
200 #define decNumberRadix(dn) (10)
201
202#endif
203