xref: /dflybsd-src/contrib/gdb-7/libdecnumber/decNumber.h (revision de8e141f24382815c10a4012d209bbbf7abf1112)
15796c8dcSSimon Schubert /* Decimal number arithmetic module header for the decNumber C Library.
2*ef5ccd6cSJohn Marino    Copyright (C) 2005-2013 Free Software Foundation, Inc.
35796c8dcSSimon Schubert    Contributed by IBM Corporation.  Author Mike Cowlishaw.
45796c8dcSSimon Schubert 
55796c8dcSSimon Schubert    This file is part of GCC.
65796c8dcSSimon Schubert 
75796c8dcSSimon Schubert    GCC is free software; you can redistribute it and/or modify it under
85796c8dcSSimon Schubert    the terms of the GNU General Public License as published by the Free
95796c8dcSSimon Schubert    Software Foundation; either version 3, or (at your option) any later
105796c8dcSSimon Schubert    version.
115796c8dcSSimon Schubert 
125796c8dcSSimon Schubert    GCC is distributed in the hope that it will be useful, but WITHOUT ANY
135796c8dcSSimon Schubert    WARRANTY; without even the implied warranty of MERCHANTABILITY or
145796c8dcSSimon Schubert    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
155796c8dcSSimon Schubert    for more details.
165796c8dcSSimon Schubert 
175796c8dcSSimon Schubert Under Section 7 of GPL version 3, you are granted additional
185796c8dcSSimon Schubert permissions described in the GCC Runtime Library Exception, version
195796c8dcSSimon Schubert 3.1, as published by the Free Software Foundation.
205796c8dcSSimon Schubert 
215796c8dcSSimon Schubert You should have received a copy of the GNU General Public License and
225796c8dcSSimon Schubert a copy of the GCC Runtime Library Exception along with this program;
235796c8dcSSimon Schubert see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
245796c8dcSSimon Schubert <http://www.gnu.org/licenses/>.  */
255796c8dcSSimon Schubert 
265796c8dcSSimon Schubert /* ------------------------------------------------------------------ */
275796c8dcSSimon Schubert /* Decimal Number arithmetic module header			      */
285796c8dcSSimon Schubert /* ------------------------------------------------------------------ */
295796c8dcSSimon Schubert 
305796c8dcSSimon Schubert #if !defined(DECNUMBER)
315796c8dcSSimon Schubert   #define DECNUMBER
325796c8dcSSimon Schubert   #define DECNAME     "decNumber"			/* Short name */
335796c8dcSSimon Schubert   #define DECFULLNAME "Decimal Number Module"	      /* Verbose name */
345796c8dcSSimon Schubert   #define DECAUTHOR   "Mike Cowlishaw"		      /* Who to blame */
355796c8dcSSimon Schubert 
365796c8dcSSimon Schubert   #if !defined(DECCONTEXT)
375796c8dcSSimon Schubert     #include "decContext.h"
385796c8dcSSimon Schubert   #endif
395796c8dcSSimon Schubert 
405796c8dcSSimon Schubert   /* Bit settings for decNumber.bits				      */
415796c8dcSSimon Schubert   #define DECNEG    0x80      /* Sign; 1=negative, 0=positive or zero */
425796c8dcSSimon Schubert   #define DECINF    0x40      /* 1=Infinity			      */
435796c8dcSSimon Schubert   #define DECNAN    0x20      /* 1=NaN				      */
445796c8dcSSimon Schubert   #define DECSNAN   0x10      /* 1=sNaN 			      */
455796c8dcSSimon Schubert   /* The remaining bits are reserved; they must be 0		      */
465796c8dcSSimon Schubert   #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
475796c8dcSSimon Schubert 
485796c8dcSSimon Schubert   /* Define the decNumber data structure.  The size and shape of the  */
495796c8dcSSimon Schubert   /* units array in the structure is determined by the following      */
505796c8dcSSimon Schubert   /* constant.	This must not be changed without recompiling the      */
515796c8dcSSimon Schubert   /* decNumber library modules. */
525796c8dcSSimon Schubert 
535796c8dcSSimon Schubert   #define DECDPUN 3	      /* DECimal Digits Per UNit [must be >0  */
545796c8dcSSimon Schubert 			      /* and <10; 3 or powers of 2 are best]. */
555796c8dcSSimon Schubert 
565796c8dcSSimon Schubert   /* DECNUMDIGITS is the default number of digits that can be held in */
575796c8dcSSimon Schubert   /* the structure.  If undefined, 1 is assumed and it is assumed     */
585796c8dcSSimon Schubert   /* that the structure will be immediately followed by extra space,  */
595796c8dcSSimon Schubert   /* as required.  DECNUMDIGITS is always >0.			      */
605796c8dcSSimon Schubert   #if !defined(DECNUMDIGITS)
615796c8dcSSimon Schubert     #define DECNUMDIGITS 1
625796c8dcSSimon Schubert   #endif
635796c8dcSSimon Schubert 
645796c8dcSSimon Schubert   /* The size (integer data type) of each unit is determined by the   */
655796c8dcSSimon Schubert   /* number of digits it will hold.				      */
665796c8dcSSimon Schubert   #if	DECDPUN<=2
675796c8dcSSimon Schubert     #define decNumberUnit uint8_t
685796c8dcSSimon Schubert   #elif DECDPUN<=4
695796c8dcSSimon Schubert     #define decNumberUnit uint16_t
705796c8dcSSimon Schubert   #else
715796c8dcSSimon Schubert     #define decNumberUnit uint32_t
725796c8dcSSimon Schubert   #endif
735796c8dcSSimon Schubert   /* The number of units needed is ceil(DECNUMDIGITS/DECDPUN)	      */
745796c8dcSSimon Schubert   #define DECNUMUNITS ((DECNUMDIGITS+DECDPUN-1)/DECDPUN)
755796c8dcSSimon Schubert 
765796c8dcSSimon Schubert   /* The data structure... */
775796c8dcSSimon Schubert   typedef struct {
785796c8dcSSimon Schubert     int32_t digits;	 /* Count of digits in the coefficient; >0    */
795796c8dcSSimon Schubert     int32_t exponent;	 /* Unadjusted exponent, unbiased, in	      */
805796c8dcSSimon Schubert 			 /* range: -1999999997 through 999999999      */
815796c8dcSSimon Schubert     uint8_t bits;	 /* Indicator bits (see above)		      */
825796c8dcSSimon Schubert 			 /* Coefficient, from least significant unit  */
835796c8dcSSimon Schubert     decNumberUnit lsu[DECNUMUNITS];
845796c8dcSSimon Schubert     } decNumber;
855796c8dcSSimon Schubert 
865796c8dcSSimon Schubert   /* Notes:							      */
875796c8dcSSimon Schubert   /* 1. If digits is > DECDPUN then there will one or more	      */
885796c8dcSSimon Schubert   /*	decNumberUnits immediately following the first element of lsu.*/
895796c8dcSSimon Schubert   /*	These contain the remaining (more significant) digits of the  */
905796c8dcSSimon Schubert   /*	number, and may be in the lsu array, or may be guaranteed by  */
915796c8dcSSimon Schubert   /*	some other mechanism (such as being contained in another      */
925796c8dcSSimon Schubert   /*	structure, or being overlaid on dynamically allocated	      */
935796c8dcSSimon Schubert   /*	storage).						      */
945796c8dcSSimon Schubert   /*								      */
955796c8dcSSimon Schubert   /*	Each integer of the coefficient (except potentially the last) */
965796c8dcSSimon Schubert   /*	contains DECDPUN digits (e.g., a value in the range 0 through */
975796c8dcSSimon Schubert   /*	99999999 if DECDPUN is 8, or 0 through 999 if DECDPUN is 3).  */
985796c8dcSSimon Schubert   /*								      */
995796c8dcSSimon Schubert   /* 2. A decNumber converted to a string may need up to digits+14    */
1005796c8dcSSimon Schubert   /*	characters.  The worst cases (non-exponential and exponential */
1015796c8dcSSimon Schubert   /*	formats) are -0.00000{9...}# and -9.{9...}E+999999999#	      */
1025796c8dcSSimon Schubert   /*	(where # is '\0')					      */
1035796c8dcSSimon Schubert 
1045796c8dcSSimon Schubert 
1055796c8dcSSimon Schubert   /* ---------------------------------------------------------------- */
1065796c8dcSSimon Schubert   /* decNumber public functions and macros			      */
1075796c8dcSSimon Schubert   /* ---------------------------------------------------------------- */
1085796c8dcSSimon Schubert 
1095796c8dcSSimon Schubert   #include "decNumberSymbols.h"
1105796c8dcSSimon Schubert 
1115796c8dcSSimon Schubert   #ifdef __cplusplus
1125796c8dcSSimon Schubert   extern "C" {
1135796c8dcSSimon Schubert   #endif
1145796c8dcSSimon Schubert 
1155796c8dcSSimon Schubert   /* Conversions						      */
1165796c8dcSSimon Schubert   decNumber * decNumberFromInt32(decNumber *, int32_t);
1175796c8dcSSimon Schubert   decNumber * decNumberFromUInt32(decNumber *, uint32_t);
1185796c8dcSSimon Schubert   decNumber * decNumberFromString(decNumber *, const char *, decContext *);
1195796c8dcSSimon Schubert   char	    * decNumberToString(const decNumber *, char *);
1205796c8dcSSimon Schubert   char	    * decNumberToEngString(const decNumber *, char *);
1215796c8dcSSimon Schubert   uint32_t    decNumberToUInt32(const decNumber *, decContext *);
1225796c8dcSSimon Schubert   int32_t     decNumberToInt32(const decNumber *, decContext *);
1235796c8dcSSimon Schubert   uint8_t   * decNumberGetBCD(const decNumber *, uint8_t *);
1245796c8dcSSimon Schubert   decNumber * decNumberSetBCD(decNumber *, const uint8_t *, uint32_t);
1255796c8dcSSimon Schubert 
1265796c8dcSSimon Schubert   /* Operators and elementary functions 			      */
1275796c8dcSSimon Schubert   decNumber * decNumberAbs(decNumber *, const decNumber *, decContext *);
1285796c8dcSSimon Schubert   decNumber * decNumberAdd(decNumber *, const decNumber *, const decNumber *, decContext *);
1295796c8dcSSimon Schubert   decNumber * decNumberAnd(decNumber *, const decNumber *, const decNumber *, decContext *);
1305796c8dcSSimon Schubert   decNumber * decNumberCompare(decNumber *, const decNumber *, const decNumber *, decContext *);
1315796c8dcSSimon Schubert   decNumber * decNumberCompareSignal(decNumber *, const decNumber *, const decNumber *, decContext *);
1325796c8dcSSimon Schubert   decNumber * decNumberCompareTotal(decNumber *, const decNumber *, const decNumber *, decContext *);
1335796c8dcSSimon Schubert   decNumber * decNumberCompareTotalMag(decNumber *, const decNumber *, const decNumber *, decContext *);
1345796c8dcSSimon Schubert   decNumber * decNumberDivide(decNumber *, const decNumber *, const decNumber *, decContext *);
1355796c8dcSSimon Schubert   decNumber * decNumberDivideInteger(decNumber *, const decNumber *, const decNumber *, decContext *);
1365796c8dcSSimon Schubert   decNumber * decNumberExp(decNumber *, const decNumber *, decContext *);
1375796c8dcSSimon Schubert   decNumber * decNumberFMA(decNumber *, const decNumber *, const decNumber *, const decNumber *, decContext *);
1385796c8dcSSimon Schubert   decNumber * decNumberInvert(decNumber *, const decNumber *, decContext *);
1395796c8dcSSimon Schubert   decNumber * decNumberLn(decNumber *, const decNumber *, decContext *);
1405796c8dcSSimon Schubert   decNumber * decNumberLogB(decNumber *, const decNumber *, decContext *);
1415796c8dcSSimon Schubert   decNumber * decNumberLog10(decNumber *, const decNumber *, decContext *);
1425796c8dcSSimon Schubert   decNumber * decNumberMax(decNumber *, const decNumber *, const decNumber *, decContext *);
1435796c8dcSSimon Schubert   decNumber * decNumberMaxMag(decNumber *, const decNumber *, const decNumber *, decContext *);
1445796c8dcSSimon Schubert   decNumber * decNumberMin(decNumber *, const decNumber *, const decNumber *, decContext *);
1455796c8dcSSimon Schubert   decNumber * decNumberMinMag(decNumber *, const decNumber *, const decNumber *, decContext *);
1465796c8dcSSimon Schubert   decNumber * decNumberMinus(decNumber *, const decNumber *, decContext *);
1475796c8dcSSimon Schubert   decNumber * decNumberMultiply(decNumber *, const decNumber *, const decNumber *, decContext *);
1485796c8dcSSimon Schubert   decNumber * decNumberNormalize(decNumber *, const decNumber *, decContext *);
1495796c8dcSSimon Schubert   decNumber * decNumberOr(decNumber *, const decNumber *, const decNumber *, decContext *);
1505796c8dcSSimon Schubert   decNumber * decNumberPlus(decNumber *, const decNumber *, decContext *);
1515796c8dcSSimon Schubert   decNumber * decNumberPower(decNumber *, const decNumber *, const decNumber *, decContext *);
1525796c8dcSSimon Schubert   decNumber * decNumberQuantize(decNumber *, const decNumber *, const decNumber *, decContext *);
1535796c8dcSSimon Schubert   decNumber * decNumberReduce(decNumber *, const decNumber *, decContext *);
1545796c8dcSSimon Schubert   decNumber * decNumberRemainder(decNumber *, const decNumber *, const decNumber *, decContext *);
1555796c8dcSSimon Schubert   decNumber * decNumberRemainderNear(decNumber *, const decNumber *, const decNumber *, decContext *);
1565796c8dcSSimon Schubert   decNumber * decNumberRescale(decNumber *, const decNumber *, const decNumber *, decContext *);
1575796c8dcSSimon Schubert   decNumber * decNumberRotate(decNumber *, const decNumber *, const decNumber *, decContext *);
1585796c8dcSSimon Schubert   decNumber * decNumberSameQuantum(decNumber *, const decNumber *, const decNumber *);
1595796c8dcSSimon Schubert   decNumber * decNumberScaleB(decNumber *, const decNumber *, const decNumber *, decContext *);
1605796c8dcSSimon Schubert   decNumber * decNumberShift(decNumber *, const decNumber *, const decNumber *, decContext *);
1615796c8dcSSimon Schubert   decNumber * decNumberSquareRoot(decNumber *, const decNumber *, decContext *);
1625796c8dcSSimon Schubert   decNumber * decNumberSubtract(decNumber *, const decNumber *, const decNumber *, decContext *);
1635796c8dcSSimon Schubert   decNumber * decNumberToIntegralExact(decNumber *, const decNumber *, decContext *);
1645796c8dcSSimon Schubert   decNumber * decNumberToIntegralValue(decNumber *, const decNumber *, decContext *);
1655796c8dcSSimon Schubert   decNumber * decNumberXor(decNumber *, const decNumber *, const decNumber *, decContext *);
1665796c8dcSSimon Schubert 
1675796c8dcSSimon Schubert   /* Utilities							      */
1685796c8dcSSimon Schubert   enum decClass decNumberClass(const decNumber *, decContext *);
1695796c8dcSSimon Schubert   const char * decNumberClassToString(enum decClass);
1705796c8dcSSimon Schubert   decNumber  * decNumberCopy(decNumber *, const decNumber *);
1715796c8dcSSimon Schubert   decNumber  * decNumberCopyAbs(decNumber *, const decNumber *);
1725796c8dcSSimon Schubert   decNumber  * decNumberCopyNegate(decNumber *, const decNumber *);
1735796c8dcSSimon Schubert   decNumber  * decNumberCopySign(decNumber *, const decNumber *, const decNumber *);
1745796c8dcSSimon Schubert   decNumber  * decNumberNextMinus(decNumber *, const decNumber *, decContext *);
1755796c8dcSSimon Schubert   decNumber  * decNumberNextPlus(decNumber *, const decNumber *, decContext *);
1765796c8dcSSimon Schubert   decNumber  * decNumberNextToward(decNumber *, const decNumber *, const decNumber *, decContext *);
1775796c8dcSSimon Schubert   decNumber  * decNumberTrim(decNumber *);
1785796c8dcSSimon Schubert   const char * decNumberVersion(void);
1795796c8dcSSimon Schubert   decNumber  * decNumberZero(decNumber *);
1805796c8dcSSimon Schubert 
1815796c8dcSSimon Schubert   /* Functions for testing decNumbers (normality depends on context)  */
1825796c8dcSSimon Schubert   int32_t decNumberIsNormal(const decNumber *, decContext *);
1835796c8dcSSimon Schubert   int32_t decNumberIsSubnormal(const decNumber *, decContext *);
1845796c8dcSSimon Schubert 
1855796c8dcSSimon Schubert   /* Macros for testing decNumber *dn				      */
1865796c8dcSSimon Schubert   #define decNumberIsCanonical(dn) (1)	/* All decNumbers are saintly */
1875796c8dcSSimon Schubert   #define decNumberIsFinite(dn)    (((dn)->bits&DECSPECIAL)==0)
1885796c8dcSSimon Schubert   #define decNumberIsInfinite(dn)  (((dn)->bits&DECINF)!=0)
1895796c8dcSSimon Schubert   #define decNumberIsNaN(dn)	   (((dn)->bits&(DECNAN|DECSNAN))!=0)
1905796c8dcSSimon Schubert   #define decNumberIsNegative(dn)  (((dn)->bits&DECNEG)!=0)
1915796c8dcSSimon Schubert   #define decNumberIsQNaN(dn)	   (((dn)->bits&(DECNAN))!=0)
1925796c8dcSSimon Schubert   #define decNumberIsSNaN(dn)	   (((dn)->bits&(DECSNAN))!=0)
1935796c8dcSSimon Schubert   #define decNumberIsSpecial(dn)   (((dn)->bits&DECSPECIAL)!=0)
1945796c8dcSSimon Schubert   #define decNumberIsZero(dn)	   (*(dn)->lsu==0 \
1955796c8dcSSimon Schubert 				    && (dn)->digits==1 \
1965796c8dcSSimon Schubert 				    && (((dn)->bits&DECSPECIAL)==0))
1975796c8dcSSimon Schubert   #define decNumberRadix(dn)	   (10)
1985796c8dcSSimon Schubert 
1995796c8dcSSimon Schubert   #ifdef __cplusplus
2005796c8dcSSimon Schubert   }
2015796c8dcSSimon Schubert   #endif
2025796c8dcSSimon Schubert 
2035796c8dcSSimon Schubert #endif
204