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