P:/wx_LIB/Dcml/decNumber.h

Aller à la documentation de ce fichier.
00001 /* ------------------------------------------------------------------ */
00002 /* Decimal Number arithmetic module header                            */
00003 /* ------------------------------------------------------------------ */
00004 /* Copyright (c) IBM Corporation, 2000, 2008.  All rights reserved.   */
00005 /*                                                                    */
00006 /* This software is made available under the terms of the IBM         */
00007 /* alphaWorks License Agreement (distributed with this software as    */
00008 /* alphaWorks-License.txt).  Your use of this software indicates      */
00009 /* your acceptance of the terms and conditions of that Agreement.     */
00010 /*                                                                    */
00011 /* The description and User's Guide ("The decNumber C Library") for   */
00012 /* this software is called decNumber.pdf.  This document is           */
00013 /* available, together with arithmetic and format specifications,     */
00014 /* testcases, and Web links, on the General Decimal Arithmetic page.  */
00015 /*                                                                    */
00016 /* Please send comments, suggestions, and corrections to the author:  */
00017 /*   mfc@uk.ibm.com                                                   */
00018 /*   Mike Cowlishaw, IBM Fellow                                       */
00019 /*   IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK         */
00020 /* ------------------------------------------------------------------ */
00021 
00022 #if !defined(DECNUMBER)
00023   #define DECNUMBER
00024   #define DECNAME     "decNumber"                       /* Short name */
00025   #define DECFULLNAME "Decimal Number Module"         /* Verbose name */
00026   #define DECAUTHOR   "Mike Cowlishaw"                /* Who to blame */
00027 
00028   #if !defined(DECCONTEXT)
00029     #include "decContext.h"
00030   #endif
00031 
00032   /* Bit settings for decNumber.bits                                  */
00033   #define DECNEG    0x80      /* Sign; 1=negative, 0=positive or zero */
00034   #define DECINF    0x40      /* 1=Infinity                           */
00035   #define DECNAN    0x20      /* 1=NaN                                */
00036   #define DECSNAN   0x10      /* 1=sNaN                               */
00037   /* The remaining bits are reserved; they must be 0                  */
00038   #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
00039 
00040   /* Define the decNumber data structure.  The size and shape of the  */
00041   /* units array in the structure is determined by the following      */
00042   /* constant.  This must not be changed without recompiling the      */
00043   /* decNumber library modules. */
00044 
00045   #define DECDPUN 3           /* DECimal Digits Per UNit [must be >0  */
00046                               /* and <10; 3 or powers of 2 are best]. */
00047 
00048   /* DECNUMDIGITS is the default number of digits that can be held in */
00049   /* the structure.  If undefined, 1 is assumed and it is assumed     */
00050   /* that the structure will be immediately followed by extra space,  */
00051   /* as required.  DECNUMDIGITS is always >0.                         */
00052   #if !defined(DECNUMDIGITS)
00053     #define DECNUMDIGITS 1
00054   #endif
00055 
00056   /* The size (integer data type) of each unit is determined by the   */
00057   /* number of digits it will hold.                                   */
00058   #if   DECDPUN<=2
00059     #define decNumberUnit uint8_t
00060   #elif DECDPUN<=4
00061     #define decNumberUnit uint16_t
00062   #else
00063     #define decNumberUnit uint32_t
00064   #endif
00065   /* The number of units needed is ceil(DECNUMDIGITS/DECDPUN)         */
00066   #define DECNUMUNITS ((DECNUMDIGITS+DECDPUN-1)/DECDPUN)
00067 
00068   /* The data structure... */
00069   typedef struct {
00070     int32_t digits;      /* Count of digits in the coefficient; >0    */
00071     int32_t exponent;    /* Unadjusted exponent, unbiased, in         */
00072                          /* range: -1999999997 through 999999999      */
00073     uint8_t bits;        /* Indicator bits (see above)                */
00074                          /* Coefficient, from least significant unit  */
00075     decNumberUnit lsu[DECNUMUNITS];
00076     } decNumber;
00077 
00078   /* Notes:                                                           */
00079   /* 1. If digits is > DECDPUN then there will one or more            */
00080   /*    decNumberUnits immediately following the first element of lsu.*/
00081   /*    These contain the remaining (more significant) digits of the  */
00082   /*    number, and may be in the lsu array, or may be guaranteed by  */
00083   /*    some other mechanism (such as being contained in another      */
00084   /*    structure, or being overlaid on dynamically allocated         */
00085   /*    storage).                                                     */
00086   /*                                                                  */
00087   /*    Each integer of the coefficient (except potentially the last) */
00088   /*    contains DECDPUN digits (e.g., a value in the range 0 through */
00089   /*    99999999 if DECDPUN is 8, or 0 through 999 if DECDPUN is 3).  */
00090   /*                                                                  */
00091   /* 2. A decNumber converted to a string may need up to digits+14    */
00092   /*    characters.  The worst cases (non-exponential and exponential */
00093   /*    formats) are -0.00000{9...}# and -9.{9...}E+999999999#        */
00094   /*    (where # is '\0')                                             */
00095 
00096 
00097   /* ---------------------------------------------------------------- */
00098   /* decNumber public functions and macros                            */
00099   /* ---------------------------------------------------------------- */
00100   /* Conversions                                                      */
00101   decNumber * decNumberFromInt32(decNumber *, int32_t);
00102   decNumber * decNumberFromUInt32(decNumber *, uint32_t);
00103   decNumber * decNumberFromString(decNumber *, const char *, decContext *);
00104   char      * decNumberToString(const decNumber *, char *);
00105   char      * decNumberToEngString(const decNumber *, char *);
00106   uint32_t    decNumberToUInt32(const decNumber *, decContext *);
00107   int32_t     decNumberToInt32(const decNumber *, decContext *);
00108   uint8_t   * decNumberGetBCD(const decNumber *, uint8_t *);
00109   decNumber * decNumberSetBCD(decNumber *, const uint8_t *, uint32_t);
00110 
00111   /* Operators and elementary functions                               */
00112   decNumber * decNumberAbs(decNumber *, const decNumber *, decContext *);
00113   decNumber * decNumberAdd(decNumber *, const decNumber *, const decNumber *, decContext *);
00114   decNumber * decNumberAnd(decNumber *, const decNumber *, const decNumber *, decContext *);
00115   decNumber * decNumberCompare(decNumber *, const decNumber *, const decNumber *, decContext *);
00116   decNumber * decNumberCompareSignal(decNumber *, const decNumber *, const decNumber *, decContext *);
00117   decNumber * decNumberCompareTotal(decNumber *, const decNumber *, const decNumber *, decContext *);
00118   decNumber * decNumberCompareTotalMag(decNumber *, const decNumber *, const decNumber *, decContext *);
00119   decNumber * decNumberDivide(decNumber *, const decNumber *, const decNumber *, decContext *);
00120   decNumber * decNumberDivideInteger(decNumber *, const decNumber *, const decNumber *, decContext *);
00121   decNumber * decNumberExp(decNumber *, const decNumber *, decContext *);
00122   decNumber * decNumberFMA(decNumber *, const decNumber *, const decNumber *, const decNumber *, decContext *);
00123   decNumber * decNumberInvert(decNumber *, const decNumber *, decContext *);
00124   decNumber * decNumberLn(decNumber *, const decNumber *, decContext *);
00125   decNumber * decNumberLogB(decNumber *, const decNumber *, decContext *);
00126   decNumber * decNumberLog10(decNumber *, const decNumber *, decContext *);
00127   decNumber * decNumberMax(decNumber *, const decNumber *, const decNumber *, decContext *);
00128   decNumber * decNumberMaxMag(decNumber *, const decNumber *, const decNumber *, decContext *);
00129   decNumber * decNumberMin(decNumber *, const decNumber *, const decNumber *, decContext *);
00130   decNumber * decNumberMinMag(decNumber *, const decNumber *, const decNumber *, decContext *);
00131   decNumber * decNumberMinus(decNumber *, const decNumber *, decContext *);
00132   decNumber * decNumberMultiply(decNumber *, const decNumber *, const decNumber *, decContext *);
00133   decNumber * decNumberNormalize(decNumber *, const decNumber *, decContext *);
00134   decNumber * decNumberOr(decNumber *, const decNumber *, const decNumber *, decContext *);
00135   decNumber * decNumberPlus(decNumber *, const decNumber *, decContext *);
00136   decNumber * decNumberPower(decNumber *, const decNumber *, const decNumber *, decContext *);
00137   decNumber * decNumberQuantize(decNumber *, const decNumber *, const decNumber *, decContext *);
00138   decNumber * decNumberReduce(decNumber *, const decNumber *, decContext *);
00139   decNumber * decNumberRemainder(decNumber *, const decNumber *, const decNumber *, decContext *);
00140   decNumber * decNumberRemainderNear(decNumber *, const decNumber *, const decNumber *, decContext *);
00141   decNumber * decNumberRescale(decNumber *, const decNumber *, const decNumber *, decContext *);
00142   decNumber * decNumberRotate(decNumber *, const decNumber *, const decNumber *, decContext *);
00143   decNumber * decNumberSameQuantum(decNumber *, const decNumber *, const decNumber *);
00144   decNumber * decNumberScaleB(decNumber *, const decNumber *, const decNumber *, decContext *);
00145   decNumber * decNumberShift(decNumber *, const decNumber *, const decNumber *, decContext *);
00146   decNumber * decNumberSquareRoot(decNumber *, const decNumber *, decContext *);
00147   decNumber * decNumberSubtract(decNumber *, const decNumber *, const decNumber *, decContext *);
00148   decNumber * decNumberToIntegralExact(decNumber *, const decNumber *, decContext *);
00149   decNumber * decNumberToIntegralValue(decNumber *, const decNumber *, decContext *);
00150   decNumber * decNumberXor(decNumber *, const decNumber *, const decNumber *, decContext *);
00151 
00152   /* Utilities                                                        */
00153   enum decClass decNumberClass(const decNumber *, decContext *);
00154   const char * decNumberClassToString(enum decClass);
00155   decNumber  * decNumberCopy(decNumber *, const decNumber *);
00156   decNumber  * decNumberCopyAbs(decNumber *, const decNumber *);
00157   decNumber  * decNumberCopyNegate(decNumber *, const decNumber *);
00158   decNumber  * decNumberCopySign(decNumber *, const decNumber *, const decNumber *);
00159   decNumber  * decNumberNextMinus(decNumber *, const decNumber *, decContext *);
00160   decNumber  * decNumberNextPlus(decNumber *, const decNumber *, decContext *);
00161   decNumber  * decNumberNextToward(decNumber *, const decNumber *, const decNumber *, decContext *);
00162   decNumber  * decNumberTrim(decNumber *);
00163   const char * decNumberVersion(void);
00164   decNumber  * decNumberZero(decNumber *);
00165   decNumber  * decNumberCopy_(decNumber* dst, const decNumber* src);
00166   /* Functions for testing decNumbers (normality depends on context)  */
00167   int32_t decNumberIsNormal(const decNumber *, decContext *);
00168   int32_t decNumberIsSubnormal(const decNumber *, decContext *);
00169 
00170   /* Macros for testing decNumber *dn                                 */
00171   #define decNumberIsCanonical(dn) (1)  /* All decNumbers are saintly */
00172   #define decNumberIsFinite(dn)    (((dn)->bits&DECSPECIAL)==0)
00173   #define decNumberIsInfinite(dn)  (((dn)->bits&DECINF)!=0)
00174   #define decNumberIsNaN(dn)       (((dn)->bits&(DECNAN|DECSNAN))!=0)
00175   #define decNumberIsNegative(dn)  (((dn)->bits&DECNEG)!=0)
00176   #define decNumberIsQNaN(dn)      (((dn)->bits&(DECNAN))!=0)
00177   #define decNumberIsSNaN(dn)      (((dn)->bits&(DECSNAN))!=0)
00178   #define decNumberIsSpecial(dn)   (((dn)->bits&DECSPECIAL)!=0)
00179   #define decNumberIsZero(dn)      (*(dn)->lsu==0 \
00180                                     && (dn)->digits==1 \
00181                                     && (((dn)->bits&DECSPECIAL)==0))
00182   #define decNumberRadix(dn)       (10)
00183 
00184 #endif

Généré le Mon Jul 20 18:22:14 2009 pour Decimal par  doxygen 1.5.1-p1