xref: /qemu/include/libdecnumber/decNumber.h (revision 79af3572250352c5eeacdd813b57ad5ba748654c)
172ac97cdSTom Musta /* Decimal number arithmetic module header for the decNumber C Library.
272ac97cdSTom Musta    Copyright (C) 2005, 2007 Free Software Foundation, Inc.
372ac97cdSTom Musta    Contributed by IBM Corporation.  Author Mike Cowlishaw.
472ac97cdSTom Musta 
572ac97cdSTom Musta    This file is part of GCC.
672ac97cdSTom Musta 
772ac97cdSTom Musta    GCC is free software; you can redistribute it and/or modify it under
872ac97cdSTom Musta    the terms of the GNU General Public License as published by the Free
972ac97cdSTom Musta    Software Foundation; either version 2, or (at your option) any later
1072ac97cdSTom Musta    version.
1172ac97cdSTom Musta 
1272ac97cdSTom Musta    In addition to the permissions in the GNU General Public License,
1372ac97cdSTom Musta    the Free Software Foundation gives you unlimited permission to link
1472ac97cdSTom Musta    the compiled version of this file into combinations with other
1572ac97cdSTom Musta    programs, and to distribute those combinations without any
1672ac97cdSTom Musta    restriction coming from the use of this file.  (The General Public
1772ac97cdSTom Musta    License restrictions do apply in other respects; for example, they
1872ac97cdSTom Musta    cover modification of the file, and distribution when not linked
1972ac97cdSTom Musta    into a combine executable.)
2072ac97cdSTom Musta 
2172ac97cdSTom Musta    GCC is distributed in the hope that it will be useful, but WITHOUT ANY
2272ac97cdSTom Musta    WARRANTY; without even the implied warranty of MERCHANTABILITY or
2372ac97cdSTom Musta    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
2472ac97cdSTom Musta    for more details.
2572ac97cdSTom Musta 
2672ac97cdSTom Musta    You should have received a copy of the GNU General Public License
2772ac97cdSTom Musta    along with GCC; see the file COPYING.  If not, write to the Free
2872ac97cdSTom Musta    Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
2972ac97cdSTom Musta    02110-1301, USA.  */
3072ac97cdSTom Musta 
3172ac97cdSTom Musta /* ------------------------------------------------------------------ */
3272ac97cdSTom Musta /* Decimal Number arithmetic module header			      */
3372ac97cdSTom Musta /* ------------------------------------------------------------------ */
3472ac97cdSTom Musta 
3572ac97cdSTom Musta #if !defined(DECNUMBER)
3672ac97cdSTom Musta   #define DECNUMBER
3772ac97cdSTom Musta   #define DECNAME     "decNumber"			/* Short name */
3872ac97cdSTom Musta   #define DECFULLNAME "Decimal Number Module"	      /* Verbose name */
3972ac97cdSTom Musta   #define DECAUTHOR   "Mike Cowlishaw"		      /* Who to blame */
4072ac97cdSTom Musta 
4172ac97cdSTom Musta   #if !defined(DECCONTEXT)
420f2d3732STom Musta     #include "libdecnumber/decContext.h"
4372ac97cdSTom Musta   #endif
4472ac97cdSTom Musta 
4572ac97cdSTom Musta   /* Bit settings for decNumber.bits				      */
4672ac97cdSTom Musta   #define DECNEG    0x80      /* Sign; 1=negative, 0=positive or zero */
4772ac97cdSTom Musta   #define DECINF    0x40      /* 1=Infinity			      */
4872ac97cdSTom Musta   #define DECNAN    0x20      /* 1=NaN				      */
4972ac97cdSTom Musta   #define DECSNAN   0x10      /* 1=sNaN				      */
5072ac97cdSTom Musta   /* The remaining bits are reserved; they must be 0		      */
5172ac97cdSTom Musta   #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
5272ac97cdSTom Musta 
5372ac97cdSTom Musta   /* Define the decNumber data structure.  The size and shape of the  */
5472ac97cdSTom Musta   /* units array in the structure is determined by the following      */
5572ac97cdSTom Musta   /* constant.	This must not be changed without recompiling the      */
5672ac97cdSTom Musta   /* decNumber library modules. */
5772ac97cdSTom Musta 
5872ac97cdSTom Musta   #define DECDPUN 3	      /* DECimal Digits Per UNit [must be >0  */
5972ac97cdSTom Musta 			      /* and <10; 3 or powers of 2 are best]. */
6072ac97cdSTom Musta 
6172ac97cdSTom Musta   /* DECNUMDIGITS is the default number of digits that can be held in */
6272ac97cdSTom Musta   /* the structure.  If undefined, 1 is assumed and it is assumed     */
6372ac97cdSTom Musta   /* that the structure will be immediately followed by extra space,  */
6472ac97cdSTom Musta   /* as required.  DECNUMDIGITS is always >0.			      */
6572ac97cdSTom Musta   #if !defined(DECNUMDIGITS)
6672ac97cdSTom Musta     #define DECNUMDIGITS 1
6772ac97cdSTom Musta   #endif
6872ac97cdSTom Musta 
6972ac97cdSTom Musta   /* The size (integer data type) of each unit is determined by the   */
7072ac97cdSTom Musta   /* number of digits it will hold.				      */
7172ac97cdSTom Musta   #if	DECDPUN<=2
7272ac97cdSTom Musta     #define decNumberUnit uint8_t
7372ac97cdSTom Musta   #elif DECDPUN<=4
7472ac97cdSTom Musta     #define decNumberUnit uint16_t
7572ac97cdSTom Musta   #else
7672ac97cdSTom Musta     #define decNumberUnit uint32_t
7772ac97cdSTom Musta   #endif
7872ac97cdSTom Musta   /* The number of units needed is ceil(DECNUMDIGITS/DECDPUN)	      */
7972ac97cdSTom Musta   #define DECNUMUNITS ((DECNUMDIGITS+DECDPUN-1)/DECDPUN)
8072ac97cdSTom Musta 
8172ac97cdSTom Musta   /* The data structure... */
8272ac97cdSTom Musta   typedef struct {
8372ac97cdSTom Musta     int32_t digits;	 /* Count of digits in the coefficient; >0    */
8472ac97cdSTom Musta     int32_t exponent;	 /* Unadjusted exponent, unbiased, in	      */
8572ac97cdSTom Musta 			 /* range: -1999999997 through 999999999      */
8672ac97cdSTom Musta     uint8_t bits;	 /* Indicator bits (see above)		      */
8772ac97cdSTom Musta 			 /* Coefficient, from least significant unit  */
8872ac97cdSTom Musta     decNumberUnit lsu[DECNUMUNITS];
8972ac97cdSTom Musta     } decNumber;
9072ac97cdSTom Musta 
9172ac97cdSTom Musta   /* Notes:							      */
9272ac97cdSTom Musta   /* 1. If digits is > DECDPUN then there will one or more	      */
9372ac97cdSTom Musta   /*	decNumberUnits immediately following the first element of lsu.*/
9472ac97cdSTom Musta   /*	These contain the remaining (more significant) digits of the  */
9572ac97cdSTom Musta   /*	number, and may be in the lsu array, or may be guaranteed by  */
9672ac97cdSTom Musta   /*	some other mechanism (such as being contained in another      */
9772ac97cdSTom Musta   /*	structure, or being overlaid on dynamically allocated	      */
9872ac97cdSTom Musta   /*	storage).						      */
9972ac97cdSTom Musta   /*								      */
10072ac97cdSTom Musta   /*	Each integer of the coefficient (except potentially the last) */
10172ac97cdSTom Musta   /*	contains DECDPUN digits (e.g., a value in the range 0 through */
10272ac97cdSTom Musta   /*	99999999 if DECDPUN is 8, or 0 through 999 if DECDPUN is 3).  */
10372ac97cdSTom Musta   /*								      */
10472ac97cdSTom Musta   /* 2. A decNumber converted to a string may need up to digits+14    */
10572ac97cdSTom Musta   /*	characters.  The worst cases (non-exponential and exponential */
10672ac97cdSTom Musta   /*	formats) are -0.00000{9...}# and -9.{9...}E+999999999#	      */
10772ac97cdSTom Musta   /*	(where # is '\0')					      */
10872ac97cdSTom Musta 
10972ac97cdSTom Musta 
11072ac97cdSTom Musta   /* ---------------------------------------------------------------- */
11172ac97cdSTom Musta   /* decNumber public functions and macros			      */
11272ac97cdSTom Musta   /* ---------------------------------------------------------------- */
11372ac97cdSTom Musta 
11472ac97cdSTom Musta 
11572ac97cdSTom Musta   /* Conversions						      */
11672ac97cdSTom Musta   decNumber * decNumberFromInt32(decNumber *, int32_t);
11772ac97cdSTom Musta   decNumber * decNumberFromUInt32(decNumber *, uint32_t);
1188e706db2STom Musta   decNumber *decNumberFromInt64(decNumber *, int64_t);
1198e706db2STom Musta   decNumber *decNumberFromUInt64(decNumber *, uint64_t);
12072ac97cdSTom Musta   decNumber * decNumberFromString(decNumber *, const char *, decContext *);
12172ac97cdSTom Musta   char	    * decNumberToString(const decNumber *, char *);
12272ac97cdSTom Musta   char	    * decNumberToEngString(const decNumber *, char *);
12372ac97cdSTom Musta   uint32_t    decNumberToUInt32(const decNumber *, decContext *);
12472ac97cdSTom Musta   int32_t     decNumberToInt32(const decNumber *, decContext *);
125*79af3572STom Musta   int64_t     decNumberIntegralToInt64(const decNumber *dn, decContext *set);
12672ac97cdSTom Musta   uint8_t   * decNumberGetBCD(const decNumber *, uint8_t *);
12772ac97cdSTom Musta   decNumber * decNumberSetBCD(decNumber *, const uint8_t *, uint32_t);
12872ac97cdSTom Musta 
12972ac97cdSTom Musta   /* Operators and elementary functions				      */
13072ac97cdSTom Musta   decNumber * decNumberAbs(decNumber *, const decNumber *, decContext *);
13172ac97cdSTom Musta   decNumber * decNumberAdd(decNumber *, const decNumber *, const decNumber *, decContext *);
13272ac97cdSTom Musta   decNumber * decNumberAnd(decNumber *, const decNumber *, const decNumber *, decContext *);
13372ac97cdSTom Musta   decNumber * decNumberCompare(decNumber *, const decNumber *, const decNumber *, decContext *);
13472ac97cdSTom Musta   decNumber * decNumberCompareSignal(decNumber *, const decNumber *, const decNumber *, decContext *);
13572ac97cdSTom Musta   decNumber * decNumberCompareTotal(decNumber *, const decNumber *, const decNumber *, decContext *);
13672ac97cdSTom Musta   decNumber * decNumberCompareTotalMag(decNumber *, const decNumber *, const decNumber *, decContext *);
13772ac97cdSTom Musta   decNumber * decNumberDivide(decNumber *, const decNumber *, const decNumber *, decContext *);
13872ac97cdSTom Musta   decNumber * decNumberDivideInteger(decNumber *, const decNumber *, const decNumber *, decContext *);
13972ac97cdSTom Musta   decNumber * decNumberExp(decNumber *, const decNumber *, decContext *);
14072ac97cdSTom Musta   decNumber * decNumberFMA(decNumber *, const decNumber *, const decNumber *, const decNumber *, decContext *);
14172ac97cdSTom Musta   decNumber * decNumberInvert(decNumber *, const decNumber *, decContext *);
14272ac97cdSTom Musta   decNumber * decNumberLn(decNumber *, const decNumber *, decContext *);
14372ac97cdSTom Musta   decNumber * decNumberLogB(decNumber *, const decNumber *, decContext *);
14472ac97cdSTom Musta   decNumber * decNumberLog10(decNumber *, const decNumber *, decContext *);
14572ac97cdSTom Musta   decNumber * decNumberMax(decNumber *, const decNumber *, const decNumber *, decContext *);
14672ac97cdSTom Musta   decNumber * decNumberMaxMag(decNumber *, const decNumber *, const decNumber *, decContext *);
14772ac97cdSTom Musta   decNumber * decNumberMin(decNumber *, const decNumber *, const decNumber *, decContext *);
14872ac97cdSTom Musta   decNumber * decNumberMinMag(decNumber *, const decNumber *, const decNumber *, decContext *);
14972ac97cdSTom Musta   decNumber * decNumberMinus(decNumber *, const decNumber *, decContext *);
15072ac97cdSTom Musta   decNumber * decNumberMultiply(decNumber *, const decNumber *, const decNumber *, decContext *);
15172ac97cdSTom Musta   decNumber * decNumberNormalize(decNumber *, const decNumber *, decContext *);
15272ac97cdSTom Musta   decNumber * decNumberOr(decNumber *, const decNumber *, const decNumber *, decContext *);
15372ac97cdSTom Musta   decNumber * decNumberPlus(decNumber *, const decNumber *, decContext *);
15472ac97cdSTom Musta   decNumber * decNumberPower(decNumber *, const decNumber *, const decNumber *, decContext *);
15572ac97cdSTom Musta   decNumber * decNumberQuantize(decNumber *, const decNumber *, const decNumber *, decContext *);
15672ac97cdSTom Musta   decNumber * decNumberReduce(decNumber *, const decNumber *, decContext *);
15772ac97cdSTom Musta   decNumber * decNumberRemainder(decNumber *, const decNumber *, const decNumber *, decContext *);
15872ac97cdSTom Musta   decNumber * decNumberRemainderNear(decNumber *, const decNumber *, const decNumber *, decContext *);
15972ac97cdSTom Musta   decNumber * decNumberRescale(decNumber *, const decNumber *, const decNumber *, decContext *);
16072ac97cdSTom Musta   decNumber * decNumberRotate(decNumber *, const decNumber *, const decNumber *, decContext *);
16172ac97cdSTom Musta   decNumber * decNumberSameQuantum(decNumber *, const decNumber *, const decNumber *);
16272ac97cdSTom Musta   decNumber * decNumberScaleB(decNumber *, const decNumber *, const decNumber *, decContext *);
16372ac97cdSTom Musta   decNumber * decNumberShift(decNumber *, const decNumber *, const decNumber *, decContext *);
16472ac97cdSTom Musta   decNumber * decNumberSquareRoot(decNumber *, const decNumber *, decContext *);
16572ac97cdSTom Musta   decNumber * decNumberSubtract(decNumber *, const decNumber *, const decNumber *, decContext *);
16672ac97cdSTom Musta   decNumber * decNumberToIntegralExact(decNumber *, const decNumber *, decContext *);
16772ac97cdSTom Musta   decNumber * decNumberToIntegralValue(decNumber *, const decNumber *, decContext *);
16872ac97cdSTom Musta   decNumber * decNumberXor(decNumber *, const decNumber *, const decNumber *, decContext *);
16972ac97cdSTom Musta 
17072ac97cdSTom Musta   /* Utilities							      */
17172ac97cdSTom Musta   enum decClass decNumberClass(const decNumber *, decContext *);
17272ac97cdSTom Musta   const char * decNumberClassToString(enum decClass);
17372ac97cdSTom Musta   decNumber  * decNumberCopy(decNumber *, const decNumber *);
17472ac97cdSTom Musta   decNumber  * decNumberCopyAbs(decNumber *, const decNumber *);
17572ac97cdSTom Musta   decNumber  * decNumberCopyNegate(decNumber *, const decNumber *);
17672ac97cdSTom Musta   decNumber  * decNumberCopySign(decNumber *, const decNumber *, const decNumber *);
17772ac97cdSTom Musta   decNumber  * decNumberNextMinus(decNumber *, const decNumber *, decContext *);
17872ac97cdSTom Musta   decNumber  * decNumberNextPlus(decNumber *, const decNumber *, decContext *);
17972ac97cdSTom Musta   decNumber  * decNumberNextToward(decNumber *, const decNumber *, const decNumber *, decContext *);
18072ac97cdSTom Musta   decNumber  * decNumberTrim(decNumber *);
18172ac97cdSTom Musta   const char * decNumberVersion(void);
18272ac97cdSTom Musta   decNumber  * decNumberZero(decNumber *);
18372ac97cdSTom Musta 
18472ac97cdSTom Musta   /* Functions for testing decNumbers (normality depends on context)  */
18572ac97cdSTom Musta   int32_t decNumberIsNormal(const decNumber *, decContext *);
18672ac97cdSTom Musta   int32_t decNumberIsSubnormal(const decNumber *, decContext *);
18772ac97cdSTom Musta 
18872ac97cdSTom Musta   /* Macros for testing decNumber *dn				      */
18972ac97cdSTom Musta   #define decNumberIsCanonical(dn) (1)	/* All decNumbers are saintly */
19072ac97cdSTom Musta   #define decNumberIsFinite(dn)	   (((dn)->bits&DECSPECIAL)==0)
19172ac97cdSTom Musta   #define decNumberIsInfinite(dn)  (((dn)->bits&DECINF)!=0)
19272ac97cdSTom Musta   #define decNumberIsNaN(dn)	   (((dn)->bits&(DECNAN|DECSNAN))!=0)
19372ac97cdSTom Musta   #define decNumberIsNegative(dn)  (((dn)->bits&DECNEG)!=0)
19472ac97cdSTom Musta   #define decNumberIsQNaN(dn)	   (((dn)->bits&(DECNAN))!=0)
19572ac97cdSTom Musta   #define decNumberIsSNaN(dn)	   (((dn)->bits&(DECSNAN))!=0)
19672ac97cdSTom Musta   #define decNumberIsSpecial(dn)   (((dn)->bits&DECSPECIAL)!=0)
19772ac97cdSTom Musta   #define decNumberIsZero(dn)	   (*(dn)->lsu==0 \
19872ac97cdSTom Musta 				    && (dn)->digits==1 \
19972ac97cdSTom Musta 				    && (((dn)->bits&DECSPECIAL)==0))
20072ac97cdSTom Musta   #define decNumberRadix(dn)	   (10)
20172ac97cdSTom Musta 
20272ac97cdSTom Musta #endif
203