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