Home | History | Annotate | Line # | Download | only in libdecnumber
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