xref: /qemu/include/libdecnumber/decNumber.h (revision 21d7826f)
1 /* Decimal number arithmetic module header for the decNumber C Library.
2    Copyright (C) 2005, 2007 Free Software Foundation, Inc.
3    Contributed by IBM Corporation.  Author Mike Cowlishaw.
4 
5    This file is part of GCC.
6 
7    GCC is free software; you can redistribute it and/or modify it under
8    the terms of the GNU General Public License as published by the Free
9    Software Foundation; either version 2, or (at your option) any later
10    version.
11 
12    In addition to the permissions in the GNU General Public License,
13    the Free Software Foundation gives you unlimited permission to link
14    the compiled version of this file into combinations with other
15    programs, and to distribute those combinations without any
16    restriction coming from the use of this file.  (The General Public
17    License restrictions do apply in other respects; for example, they
18    cover modification of the file, and distribution when not linked
19    into a combine executable.)
20 
21    GCC is distributed in the hope that it will be useful, but WITHOUT ANY
22    WARRANTY; without even the implied warranty of MERCHANTABILITY or
23    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
24    for more details.
25 
26    You should have received a copy of the GNU General Public License
27    along with GCC; see the file COPYING.  If not, write to the Free
28    Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
29    02110-1301, USA.  */
30 
31 /* ------------------------------------------------------------------ */
32 /* Decimal Number arithmetic module header			      */
33 /* ------------------------------------------------------------------ */
34 
35 #ifndef DECNUMBER_H
36 #define DECNUMBER_H
37 
38   #define DECNAME     "decNumber"			/* Short name */
39   #define DECFULLNAME "Decimal Number Module"	      /* Verbose name */
40   #define DECAUTHOR   "Mike Cowlishaw"		      /* Who to blame */
41 
42   #include "libdecnumber/decContext.h"
43 
44   /* Bit settings for decNumber.bits				      */
45   #define DECNEG    0x80      /* Sign; 1=negative, 0=positive or zero */
46   #define DECINF    0x40      /* 1=Infinity			      */
47   #define DECNAN    0x20      /* 1=NaN				      */
48   #define DECSNAN   0x10      /* 1=sNaN				      */
49   /* The remaining bits are reserved; they must be 0		      */
50   #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
51 
52   /* Define the decNumber data structure.  The size and shape of the  */
53   /* units array in the structure is determined by the following      */
54   /* constant.	This must not be changed without recompiling the      */
55   /* decNumber library modules. */
56 
57   #define DECDPUN 3	      /* DECimal Digits Per UNit [must be >0  */
58 			      /* and <10; 3 or powers of 2 are best]. */
59 
60   /* DECNUMDIGITS is the default number of digits that can be held in */
61   /* the structure.  If undefined, 1 is assumed and it is assumed     */
62   /* that the structure will be immediately followed by extra space,  */
63   /* as required.  DECNUMDIGITS is always >0.			      */
64   #if !defined(DECNUMDIGITS)
65     #define DECNUMDIGITS 1
66   #endif
67 
68   /* The size (integer data type) of each unit is determined by the   */
69   /* number of digits it will hold.				      */
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   /* The number of units needed is ceil(DECNUMDIGITS/DECDPUN)	      */
78   #define DECNUMUNITS ((DECNUMDIGITS+DECDPUN-1)/DECDPUN)
79 
80   /* The data structure... */
81   typedef struct {
82     int32_t digits;	 /* Count of digits in the coefficient; >0    */
83     int32_t exponent;	 /* Unadjusted exponent, unbiased, in	      */
84 			 /* range: -1999999997 through 999999999      */
85     uint8_t bits;	 /* Indicator bits (see above)		      */
86 			 /* Coefficient, from least significant unit  */
87     decNumberUnit lsu[DECNUMUNITS];
88     } decNumber;
89 
90   /* Notes:							      */
91   /* 1. If digits is > DECDPUN then there will one or more	      */
92   /*	decNumberUnits immediately following the first element of lsu.*/
93   /*	These contain the remaining (more significant) digits of the  */
94   /*	number, and may be in the lsu array, or may be guaranteed by  */
95   /*	some other mechanism (such as being contained in another      */
96   /*	structure, or being overlaid on dynamically allocated	      */
97   /*	storage).						      */
98   /*								      */
99   /*	Each integer of the coefficient (except potentially the last) */
100   /*	contains DECDPUN digits (e.g., a value in the range 0 through */
101   /*	99999999 if DECDPUN is 8, or 0 through 999 if DECDPUN is 3).  */
102   /*								      */
103   /* 2. A decNumber converted to a string may need up to digits+14    */
104   /*	characters.  The worst cases (non-exponential and exponential */
105   /*	formats) are -0.00000{9...}# and -9.{9...}E+999999999#	      */
106   /*	(where # is '\0')					      */
107 
108 
109   /* ---------------------------------------------------------------- */
110   /* decNumber public functions and macros			      */
111   /* ---------------------------------------------------------------- */
112 
113 
114   /* Conversions						      */
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   /* Operators and elementary functions				      */
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   /* Utilities							      */
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   /* Functions for testing decNumbers (normality depends on context)  */
188   int32_t decNumberIsNormal(const decNumber *, decContext *);
189   int32_t decNumberIsSubnormal(const decNumber *, decContext *);
190 
191   /* Macros for testing decNumber *dn				      */
192   #define decNumberIsCanonical(dn) (1)	/* All decNumbers are saintly */
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