intl/icu/source/i18n/decNumber.h

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/intl/icu/source/i18n/decNumber.h	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,196 @@
     1.4 +/* ------------------------------------------------------------------ */
     1.5 +/* Decimal Number arithmetic module header                            */
     1.6 +/* ------------------------------------------------------------------ */
     1.7 +/* Copyright (c) IBM Corporation, 2000-2010.   All rights reserved.   */
     1.8 +/*                                                                    */
     1.9 +/* This software is made available under the terms of the             */
    1.10 +/* ICU License -- ICU 1.8.1 and later.                                */
    1.11 +/*                                                                    */
    1.12 +/* The description and User's Guide ("The decNumber C Library") for   */
    1.13 +/* this software is called decNumber.pdf.  This document is           */
    1.14 +/* available, together with arithmetic and format specifications,     */
    1.15 +/* testcases, and Web links, on the General Decimal Arithmetic page.  */
    1.16 +/*                                                                    */
    1.17 +/* Please send comments, suggestions, and corrections to the author:  */
    1.18 +/*   mfc@uk.ibm.com                                                   */
    1.19 +/*   Mike Cowlishaw, IBM Fellow                                       */
    1.20 +/*   IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK         */
    1.21 +/* ------------------------------------------------------------------ */
    1.22 +
    1.23 +/* Modified version, for use from within ICU.
    1.24 + *    Renamed public functions, to avoid an unwanted export of the 
    1.25 + *    standard names from the ICU library.
    1.26 + *
    1.27 + *    Use ICU's uprv_malloc() and uprv_free()
    1.28 + *
    1.29 + *    Revert comment syntax to plain C
    1.30 + *
    1.31 + *    Remove a few compiler warnings.
    1.32 + */
    1.33 +
    1.34 +#if !defined(DECNUMBER)
    1.35 +  #define DECNUMBER
    1.36 +  #define DECNAME     "decNumber"                       /* Short name */
    1.37 +  #define DECFULLNAME "Decimal Number Module"         /* Verbose name */
    1.38 +  #define DECAUTHOR   "Mike Cowlishaw"                /* Who to blame */
    1.39 +
    1.40 +  #if !defined(DECCONTEXT)
    1.41 +    #include "decContext.h"
    1.42 +  #endif
    1.43 +
    1.44 +  /* Bit settings for decNumber.bits                                  */
    1.45 +  #define DECNEG    0x80      /* Sign; 1=negative, 0=positive or zero */
    1.46 +  #define DECINF    0x40      /* 1=Infinity                           */
    1.47 +  #define DECNAN    0x20      /* 1=NaN                                */
    1.48 +  #define DECSNAN   0x10      /* 1=sNaN                               */
    1.49 +  /* The remaining bits are reserved; they must be 0                  */
    1.50 +  #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value     */
    1.51 +
    1.52 +  /* Define the decNumber data structure.  The size and shape of the  */
    1.53 +  /* units array in the structure is determined by the following      */
    1.54 +  /* constant.  This must not be changed without recompiling the      */
    1.55 +  /* decNumber library modules. */
    1.56 +
    1.57 +  /* For ICU, use one digit per byte, to make it easier to emulate the
    1.58 +   * old DigitList interface on top of a decNumber
    1.59 +   */
    1.60 +  #define DECDPUN 1           /* DECimal Digits Per UNit [must be >0  */
    1.61 +                              /* and <10; 3 or powers of 2 are best]. */
    1.62 +
    1.63 +  /* DECNUMDIGITS is the default number of digits that can be held in */
    1.64 +  /* the structure.  If undefined, 1 is assumed and it is assumed     */
    1.65 +  /* that the structure will be immediately followed by extra space,  */
    1.66 +  /* as required.  DECNUMDIGITS is always >0.                         */
    1.67 +  #if !defined(DECNUMDIGITS)
    1.68 +    #define DECNUMDIGITS 1
    1.69 +  #endif
    1.70 +
    1.71 +  /* The size (integer data type) of each unit is determined by the   */
    1.72 +  /* number of digits it will hold.                                   */
    1.73 +  #if   DECDPUN<=2
    1.74 +    #define decNumberUnit uint8_t
    1.75 +  #elif DECDPUN<=4
    1.76 +    #define decNumberUnit uint16_t
    1.77 +  #else
    1.78 +    #define decNumberUnit uint32_t
    1.79 +  #endif
    1.80 +  /* The number of units needed is ceil(DECNUMDIGITS/DECDPUN)         */
    1.81 +  #define DECNUMUNITS ((DECNUMDIGITS+DECDPUN-1)/DECDPUN)
    1.82 +
    1.83 +  /* The data structure... */
    1.84 +  typedef struct {
    1.85 +    int32_t digits;      /* Count of digits in the coefficient; >0    */
    1.86 +    int32_t exponent;    /* Unadjusted exponent, unbiased, in         */
    1.87 +                         /* range: -1999999997 through 999999999      */
    1.88 +    uint8_t bits;        /* Indicator bits (see above)                */
    1.89 +                         /* Coefficient, from least significant unit  */
    1.90 +    decNumberUnit lsu[DECNUMUNITS];
    1.91 +    } decNumber;
    1.92 +
    1.93 +  /* Notes:                                                           */
    1.94 +  /* 1. If digits is > DECDPUN then there will one or more            */
    1.95 +  /*    decNumberUnits immediately following the first element of lsu.*/
    1.96 +  /*    These contain the remaining (more significant) digits of the  */
    1.97 +  /*    number, and may be in the lsu array, or may be guaranteed by  */
    1.98 +  /*    some other mechanism (such as being contained in another      */
    1.99 +  /*    structure, or being overlaid on dynamically allocated         */
   1.100 +  /*    storage).                                                     */
   1.101 +  /*                                                                  */
   1.102 +  /*    Each integer of the coefficient (except potentially the last) */
   1.103 +  /*    contains DECDPUN digits (e.g., a value in the range 0 through */
   1.104 +  /*    99999999 if DECDPUN is 8, or 0 through 999 if DECDPUN is 3).  */
   1.105 +  /*                                                                  */
   1.106 +  /* 2. A decNumber converted to a string may need up to digits+14    */
   1.107 +  /*    characters.  The worst cases (non-exponential and exponential */
   1.108 +  /*    formats) are -0.00000{9...}# and -9.{9...}E+999999999#        */
   1.109 +  /*    (where # is '\0')                                             */
   1.110 +
   1.111 +
   1.112 +  /* ---------------------------------------------------------------- */
   1.113 +  /* decNumber public functions and macros                            */
   1.114 +  /* ---------------------------------------------------------------- */
   1.115 +  /* Conversions                                                      */
   1.116 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberFromInt32(decNumber *, int32_t);
   1.117 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberFromUInt32(decNumber *, uint32_t);
   1.118 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberFromString(decNumber *, const char *, decContext *);
   1.119 +  U_INTERNAL char      * U_EXPORT2 uprv_decNumberToString(const decNumber *, char *);
   1.120 +  U_INTERNAL char      * U_EXPORT2 uprv_decNumberToEngString(const decNumber *, char *);
   1.121 +  U_INTERNAL uint32_t    U_EXPORT2 uprv_decNumberToUInt32(const decNumber *, decContext *);
   1.122 +  U_INTERNAL int32_t     U_EXPORT2 uprv_decNumberToInt32(const decNumber *, decContext *);
   1.123 +  U_INTERNAL uint8_t   * U_EXPORT2 uprv_decNumberGetBCD(const decNumber *, uint8_t *);
   1.124 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberSetBCD(decNumber *, const uint8_t *, uint32_t);
   1.125 +
   1.126 +  /* Operators and elementary functions                               */
   1.127 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberAbs(decNumber *, const decNumber *, decContext *);
   1.128 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberAdd(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.129 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberAnd(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.130 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberCompare(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.131 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberCompareSignal(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.132 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberCompareTotal(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.133 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberCompareTotalMag(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.134 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberDivide(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.135 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberDivideInteger(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.136 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberExp(decNumber *, const decNumber *, decContext *);
   1.137 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberFMA(decNumber *, const decNumber *, const decNumber *, const decNumber *, decContext *);
   1.138 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberInvert(decNumber *, const decNumber *, decContext *);
   1.139 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberLn(decNumber *, const decNumber *, decContext *);
   1.140 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberLogB(decNumber *, const decNumber *, decContext *);
   1.141 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberLog10(decNumber *, const decNumber *, decContext *);
   1.142 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberMax(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.143 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberMaxMag(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.144 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberMin(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.145 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberMinMag(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.146 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberMinus(decNumber *, const decNumber *, decContext *);
   1.147 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberMultiply(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.148 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberNormalize(decNumber *, const decNumber *, decContext *);
   1.149 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberOr(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.150 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberPlus(decNumber *, const decNumber *, decContext *);
   1.151 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberPower(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.152 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberQuantize(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.153 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberReduce(decNumber *, const decNumber *, decContext *);
   1.154 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberRemainder(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.155 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberRemainderNear(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.156 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberRescale(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.157 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberRotate(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.158 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberSameQuantum(decNumber *, const decNumber *, const decNumber *);
   1.159 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberScaleB(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.160 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberShift(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.161 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberSquareRoot(decNumber *, const decNumber *, decContext *);
   1.162 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberSubtract(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.163 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberToIntegralExact(decNumber *, const decNumber *, decContext *);
   1.164 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberToIntegralValue(decNumber *, const decNumber *, decContext *);
   1.165 +  U_INTERNAL decNumber * U_EXPORT2 uprv_decNumberXor(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.166 +
   1.167 +  /* Utilities                                                        */
   1.168 +  enum decClass uprv_decNumberClass(const decNumber *, decContext *);
   1.169 +  U_INTERNAL const char * U_EXPORT2 uprv_decNumberClassToString(enum decClass);
   1.170 +  U_INTERNAL decNumber  * U_EXPORT2 uprv_decNumberCopy(decNumber *, const decNumber *);
   1.171 +  U_INTERNAL decNumber  * U_EXPORT2 uprv_decNumberCopyAbs(decNumber *, const decNumber *);
   1.172 +  U_INTERNAL decNumber  * U_EXPORT2 uprv_decNumberCopyNegate(decNumber *, const decNumber *);
   1.173 +  U_INTERNAL decNumber  * U_EXPORT2 uprv_decNumberCopySign(decNumber *, const decNumber *, const decNumber *);
   1.174 +  U_INTERNAL decNumber  * U_EXPORT2 uprv_decNumberNextMinus(decNumber *, const decNumber *, decContext *);
   1.175 +  U_INTERNAL decNumber  * U_EXPORT2 uprv_decNumberNextPlus(decNumber *, const decNumber *, decContext *);
   1.176 +  U_INTERNAL decNumber  * U_EXPORT2 uprv_decNumberNextToward(decNumber *, const decNumber *, const decNumber *, decContext *);
   1.177 +  U_INTERNAL decNumber  * U_EXPORT2 uprv_decNumberTrim(decNumber *);
   1.178 +  U_INTERNAL const char * U_EXPORT2 uprv_decNumberVersion(void);
   1.179 +  U_INTERNAL decNumber  * U_EXPORT2 uprv_decNumberZero(decNumber *);
   1.180 +
   1.181 +  /* Functions for testing decNumbers (normality depends on context)  */
   1.182 +  U_INTERNAL int32_t U_EXPORT2 uprv_decNumberIsNormal(const decNumber *, decContext *);
   1.183 +  U_INTERNAL int32_t U_EXPORT2 uprv_decNumberIsSubnormal(const decNumber *, decContext *);
   1.184 +
   1.185 +  /* Macros for testing decNumber *dn                                 */
   1.186 +  #define decNumberIsCanonical(dn) (1)  /* All decNumbers are saintly */
   1.187 +  #define decNumberIsFinite(dn)    (((dn)->bits&DECSPECIAL)==0)
   1.188 +  #define decNumberIsInfinite(dn)  (((dn)->bits&DECINF)!=0)
   1.189 +  #define decNumberIsNaN(dn)       (((dn)->bits&(DECNAN|DECSNAN))!=0)
   1.190 +  #define decNumberIsNegative(dn)  (((dn)->bits&DECNEG)!=0)
   1.191 +  #define decNumberIsQNaN(dn)      (((dn)->bits&(DECNAN))!=0)
   1.192 +  #define decNumberIsSNaN(dn)      (((dn)->bits&(DECSNAN))!=0)
   1.193 +  #define decNumberIsSpecial(dn)   (((dn)->bits&DECSPECIAL)!=0)
   1.194 +  #define decNumberIsZero(dn)      (*(dn)->lsu==0 \
   1.195 +                                    && (dn)->digits==1 \
   1.196 +                                    && (((dn)->bits&DECSPECIAL)==0))
   1.197 +  #define decNumberRadix(dn)       (10)
   1.198 +
   1.199 +#endif

mercurial