decNumber.h revision 1.1.1.1.8.1 1 1.1 mrg /* Decimal number arithmetic module header for the decNumber C Library.
2 1.1.1.1.8.1 tls Copyright (C) 2005-2013 Free Software Foundation, Inc.
3 1.1 mrg Contributed by IBM Corporation. Author Mike Cowlishaw.
4 1.1 mrg
5 1.1 mrg This file is part of GCC.
6 1.1 mrg
7 1.1 mrg GCC is free software; you can redistribute it and/or modify it under
8 1.1 mrg the terms of the GNU General Public License as published by the Free
9 1.1 mrg Software Foundation; either version 3, or (at your option) any later
10 1.1 mrg version.
11 1.1 mrg
12 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 1.1 mrg for more details.
16 1.1 mrg
17 1.1 mrg Under Section 7 of GPL version 3, you are granted additional
18 1.1 mrg permissions described in the GCC Runtime Library Exception, version
19 1.1 mrg 3.1, as published by the Free Software Foundation.
20 1.1 mrg
21 1.1 mrg You should have received a copy of the GNU General Public License and
22 1.1 mrg a copy of the GCC Runtime Library Exception along with this program;
23 1.1 mrg see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24 1.1 mrg <http://www.gnu.org/licenses/>. */
25 1.1 mrg
26 1.1 mrg /* ------------------------------------------------------------------ */
27 1.1 mrg /* Decimal Number arithmetic module header */
28 1.1 mrg /* ------------------------------------------------------------------ */
29 1.1 mrg
30 1.1 mrg #if !defined(DECNUMBER)
31 1.1 mrg #define DECNUMBER
32 1.1 mrg #define DECNAME "decNumber" /* Short name */
33 1.1 mrg #define DECFULLNAME "Decimal Number Module" /* Verbose name */
34 1.1 mrg #define DECAUTHOR "Mike Cowlishaw" /* Who to blame */
35 1.1 mrg
36 1.1 mrg #if !defined(DECCONTEXT)
37 1.1 mrg #include "decContext.h"
38 1.1 mrg #endif
39 1.1 mrg
40 1.1 mrg /* Bit settings for decNumber.bits */
41 1.1 mrg #define DECNEG 0x80 /* Sign; 1=negative, 0=positive or zero */
42 1.1 mrg #define DECINF 0x40 /* 1=Infinity */
43 1.1 mrg #define DECNAN 0x20 /* 1=NaN */
44 1.1 mrg #define DECSNAN 0x10 /* 1=sNaN */
45 1.1 mrg /* The remaining bits are reserved; they must be 0 */
46 1.1 mrg #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value */
47 1.1 mrg
48 1.1 mrg /* Define the decNumber data structure. The size and shape of the */
49 1.1 mrg /* units array in the structure is determined by the following */
50 1.1 mrg /* constant. This must not be changed without recompiling the */
51 1.1 mrg /* decNumber library modules. */
52 1.1 mrg
53 1.1 mrg #define DECDPUN 3 /* DECimal Digits Per UNit [must be >0 */
54 1.1 mrg /* and <10; 3 or powers of 2 are best]. */
55 1.1 mrg
56 1.1 mrg /* DECNUMDIGITS is the default number of digits that can be held in */
57 1.1 mrg /* the structure. If undefined, 1 is assumed and it is assumed */
58 1.1 mrg /* that the structure will be immediately followed by extra space, */
59 1.1 mrg /* as required. DECNUMDIGITS is always >0. */
60 1.1 mrg #if !defined(DECNUMDIGITS)
61 1.1 mrg #define DECNUMDIGITS 1
62 1.1 mrg #endif
63 1.1 mrg
64 1.1 mrg /* The size (integer data type) of each unit is determined by the */
65 1.1 mrg /* number of digits it will hold. */
66 1.1 mrg #if DECDPUN<=2
67 1.1 mrg #define decNumberUnit uint8_t
68 1.1 mrg #elif DECDPUN<=4
69 1.1 mrg #define decNumberUnit uint16_t
70 1.1 mrg #else
71 1.1 mrg #define decNumberUnit uint32_t
72 1.1 mrg #endif
73 1.1 mrg /* The number of units needed is ceil(DECNUMDIGITS/DECDPUN) */
74 1.1 mrg #define DECNUMUNITS ((DECNUMDIGITS+DECDPUN-1)/DECDPUN)
75 1.1 mrg
76 1.1 mrg /* The data structure... */
77 1.1 mrg typedef struct {
78 1.1 mrg int32_t digits; /* Count of digits in the coefficient; >0 */
79 1.1 mrg int32_t exponent; /* Unadjusted exponent, unbiased, in */
80 1.1 mrg /* range: -1999999997 through 999999999 */
81 1.1 mrg uint8_t bits; /* Indicator bits (see above) */
82 1.1 mrg /* Coefficient, from least significant unit */
83 1.1 mrg decNumberUnit lsu[DECNUMUNITS];
84 1.1 mrg } decNumber;
85 1.1 mrg
86 1.1 mrg /* Notes: */
87 1.1 mrg /* 1. If digits is > DECDPUN then there will one or more */
88 1.1 mrg /* decNumberUnits immediately following the first element of lsu.*/
89 1.1 mrg /* These contain the remaining (more significant) digits of the */
90 1.1 mrg /* number, and may be in the lsu array, or may be guaranteed by */
91 1.1 mrg /* some other mechanism (such as being contained in another */
92 1.1 mrg /* structure, or being overlaid on dynamically allocated */
93 1.1 mrg /* storage). */
94 1.1 mrg /* */
95 1.1 mrg /* Each integer of the coefficient (except potentially the last) */
96 1.1 mrg /* contains DECDPUN digits (e.g., a value in the range 0 through */
97 1.1 mrg /* 99999999 if DECDPUN is 8, or 0 through 999 if DECDPUN is 3). */
98 1.1 mrg /* */
99 1.1 mrg /* 2. A decNumber converted to a string may need up to digits+14 */
100 1.1 mrg /* characters. The worst cases (non-exponential and exponential */
101 1.1 mrg /* formats) are -0.00000{9...}# and -9.{9...}E+999999999# */
102 1.1 mrg /* (where # is '\0') */
103 1.1 mrg
104 1.1 mrg
105 1.1 mrg /* ---------------------------------------------------------------- */
106 1.1 mrg /* decNumber public functions and macros */
107 1.1 mrg /* ---------------------------------------------------------------- */
108 1.1 mrg
109 1.1 mrg #include "decNumberSymbols.h"
110 1.1 mrg
111 1.1 mrg #ifdef __cplusplus
112 1.1 mrg extern "C" {
113 1.1 mrg #endif
114 1.1 mrg
115 1.1 mrg /* Conversions */
116 1.1 mrg decNumber * decNumberFromInt32(decNumber *, int32_t);
117 1.1 mrg decNumber * decNumberFromUInt32(decNumber *, uint32_t);
118 1.1 mrg decNumber * decNumberFromString(decNumber *, const char *, decContext *);
119 1.1 mrg char * decNumberToString(const decNumber *, char *);
120 1.1 mrg char * decNumberToEngString(const decNumber *, char *);
121 1.1 mrg uint32_t decNumberToUInt32(const decNumber *, decContext *);
122 1.1 mrg int32_t decNumberToInt32(const decNumber *, decContext *);
123 1.1 mrg uint8_t * decNumberGetBCD(const decNumber *, uint8_t *);
124 1.1 mrg decNumber * decNumberSetBCD(decNumber *, const uint8_t *, uint32_t);
125 1.1 mrg
126 1.1 mrg /* Operators and elementary functions */
127 1.1 mrg decNumber * decNumberAbs(decNumber *, const decNumber *, decContext *);
128 1.1 mrg decNumber * decNumberAdd(decNumber *, const decNumber *, const decNumber *, decContext *);
129 1.1 mrg decNumber * decNumberAnd(decNumber *, const decNumber *, const decNumber *, decContext *);
130 1.1 mrg decNumber * decNumberCompare(decNumber *, const decNumber *, const decNumber *, decContext *);
131 1.1 mrg decNumber * decNumberCompareSignal(decNumber *, const decNumber *, const decNumber *, decContext *);
132 1.1 mrg decNumber * decNumberCompareTotal(decNumber *, const decNumber *, const decNumber *, decContext *);
133 1.1 mrg decNumber * decNumberCompareTotalMag(decNumber *, const decNumber *, const decNumber *, decContext *);
134 1.1 mrg decNumber * decNumberDivide(decNumber *, const decNumber *, const decNumber *, decContext *);
135 1.1 mrg decNumber * decNumberDivideInteger(decNumber *, const decNumber *, const decNumber *, decContext *);
136 1.1 mrg decNumber * decNumberExp(decNumber *, const decNumber *, decContext *);
137 1.1 mrg decNumber * decNumberFMA(decNumber *, const decNumber *, const decNumber *, const decNumber *, decContext *);
138 1.1 mrg decNumber * decNumberInvert(decNumber *, const decNumber *, decContext *);
139 1.1 mrg decNumber * decNumberLn(decNumber *, const decNumber *, decContext *);
140 1.1 mrg decNumber * decNumberLogB(decNumber *, const decNumber *, decContext *);
141 1.1 mrg decNumber * decNumberLog10(decNumber *, const decNumber *, decContext *);
142 1.1 mrg decNumber * decNumberMax(decNumber *, const decNumber *, const decNumber *, decContext *);
143 1.1 mrg decNumber * decNumberMaxMag(decNumber *, const decNumber *, const decNumber *, decContext *);
144 1.1 mrg decNumber * decNumberMin(decNumber *, const decNumber *, const decNumber *, decContext *);
145 1.1 mrg decNumber * decNumberMinMag(decNumber *, const decNumber *, const decNumber *, decContext *);
146 1.1 mrg decNumber * decNumberMinus(decNumber *, const decNumber *, decContext *);
147 1.1 mrg decNumber * decNumberMultiply(decNumber *, const decNumber *, const decNumber *, decContext *);
148 1.1 mrg decNumber * decNumberNormalize(decNumber *, const decNumber *, decContext *);
149 1.1 mrg decNumber * decNumberOr(decNumber *, const decNumber *, const decNumber *, decContext *);
150 1.1 mrg decNumber * decNumberPlus(decNumber *, const decNumber *, decContext *);
151 1.1 mrg decNumber * decNumberPower(decNumber *, const decNumber *, const decNumber *, decContext *);
152 1.1 mrg decNumber * decNumberQuantize(decNumber *, const decNumber *, const decNumber *, decContext *);
153 1.1 mrg decNumber * decNumberReduce(decNumber *, const decNumber *, decContext *);
154 1.1 mrg decNumber * decNumberRemainder(decNumber *, const decNumber *, const decNumber *, decContext *);
155 1.1 mrg decNumber * decNumberRemainderNear(decNumber *, const decNumber *, const decNumber *, decContext *);
156 1.1 mrg decNumber * decNumberRescale(decNumber *, const decNumber *, const decNumber *, decContext *);
157 1.1 mrg decNumber * decNumberRotate(decNumber *, const decNumber *, const decNumber *, decContext *);
158 1.1 mrg decNumber * decNumberSameQuantum(decNumber *, const decNumber *, const decNumber *);
159 1.1 mrg decNumber * decNumberScaleB(decNumber *, const decNumber *, const decNumber *, decContext *);
160 1.1 mrg decNumber * decNumberShift(decNumber *, const decNumber *, const decNumber *, decContext *);
161 1.1 mrg decNumber * decNumberSquareRoot(decNumber *, const decNumber *, decContext *);
162 1.1 mrg decNumber * decNumberSubtract(decNumber *, const decNumber *, const decNumber *, decContext *);
163 1.1 mrg decNumber * decNumberToIntegralExact(decNumber *, const decNumber *, decContext *);
164 1.1 mrg decNumber * decNumberToIntegralValue(decNumber *, const decNumber *, decContext *);
165 1.1 mrg decNumber * decNumberXor(decNumber *, const decNumber *, const decNumber *, decContext *);
166 1.1 mrg
167 1.1 mrg /* Utilities */
168 1.1 mrg enum decClass decNumberClass(const decNumber *, decContext *);
169 1.1 mrg const char * decNumberClassToString(enum decClass);
170 1.1 mrg decNumber * decNumberCopy(decNumber *, const decNumber *);
171 1.1 mrg decNumber * decNumberCopyAbs(decNumber *, const decNumber *);
172 1.1 mrg decNumber * decNumberCopyNegate(decNumber *, const decNumber *);
173 1.1 mrg decNumber * decNumberCopySign(decNumber *, const decNumber *, const decNumber *);
174 1.1 mrg decNumber * decNumberNextMinus(decNumber *, const decNumber *, decContext *);
175 1.1 mrg decNumber * decNumberNextPlus(decNumber *, const decNumber *, decContext *);
176 1.1 mrg decNumber * decNumberNextToward(decNumber *, const decNumber *, const decNumber *, decContext *);
177 1.1 mrg decNumber * decNumberTrim(decNumber *);
178 1.1 mrg const char * decNumberVersion(void);
179 1.1 mrg decNumber * decNumberZero(decNumber *);
180 1.1 mrg
181 1.1 mrg /* Functions for testing decNumbers (normality depends on context) */
182 1.1 mrg int32_t decNumberIsNormal(const decNumber *, decContext *);
183 1.1 mrg int32_t decNumberIsSubnormal(const decNumber *, decContext *);
184 1.1 mrg
185 1.1 mrg /* Macros for testing decNumber *dn */
186 1.1 mrg #define decNumberIsCanonical(dn) (1) /* All decNumbers are saintly */
187 1.1 mrg #define decNumberIsFinite(dn) (((dn)->bits&DECSPECIAL)==0)
188 1.1 mrg #define decNumberIsInfinite(dn) (((dn)->bits&DECINF)!=0)
189 1.1 mrg #define decNumberIsNaN(dn) (((dn)->bits&(DECNAN|DECSNAN))!=0)
190 1.1 mrg #define decNumberIsNegative(dn) (((dn)->bits&DECNEG)!=0)
191 1.1 mrg #define decNumberIsQNaN(dn) (((dn)->bits&(DECNAN))!=0)
192 1.1 mrg #define decNumberIsSNaN(dn) (((dn)->bits&(DECSNAN))!=0)
193 1.1 mrg #define decNumberIsSpecial(dn) (((dn)->bits&DECSPECIAL)!=0)
194 1.1 mrg #define decNumberIsZero(dn) (*(dn)->lsu==0 \
195 1.1 mrg && (dn)->digits==1 \
196 1.1 mrg && (((dn)->bits&DECSPECIAL)==0))
197 1.1 mrg #define decNumberRadix(dn) (10)
198 1.1 mrg
199 1.1 mrg #ifdef __cplusplus
200 1.1 mrg }
201 1.1 mrg #endif
202 1.1 mrg
203 1.1 mrg #endif
204