root/src/decNumber/decNumber.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


   1 // vim: filetype=c:tabstop=4:ai:expandtab
   2 // SPDX-License-Identifier: ICU
   3 // scspell-id: ca5518dc-f62c-11ec-9785-80ee73e9b8e7
   4 /* ------------------------------------------------------------------- */
   5 /* Decimal Number arithmetic module header                             */
   6 /* ------------------------------------------------------------------- */
   7 /* Copyright (c) IBM Corporation, 2000, 2010.  All rights reserved.    */
   8 /*                                                                     */
   9 /* This software is made available under the terms of the ICU License. */
  10 /*                                                                     */
  11 /* The description and User's Guide ("The decNumber C Library") for    */
  12 /* this software is called decNumber.pdf.  This document is available, */
  13 /* together with arithmetic and format specifications, testcases, and  */
  14 /* Web links, on the General Decimal Arithmetic page.                  */
  15 /*                                                                     */
  16 /* Please send comments, suggestions, and corrections to the author:   */
  17 /*   mfc@uk.ibm.com                                                    */
  18 /*   Mike Cowlishaw, IBM Fellow                                        */
  19 /*   IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK          */
  20 /* ------------------------------------------------------------------- */
  21 
  22 #if !defined(DECNUMBER)
  23 # define DECNUMBER
  24 # define DECNAME     "decNumber"                        /* Short name */
  25 # define DECFULLNAME "Decimal Number Module"          /* Verbose name */
  26 # define DECAUTHOR   "Mike Cowlishaw"                 /* Who to blame */
  27 
  28 # if !defined(DECCONTEXT)
  29 #  include "decContext.h"
  30 # endif
  31 
  32   /* Bit settings for decNumber.bits                                  */
  33 # define DECNEG    0x80      /* Sign; 1=negative, 0=positive or zero  */
  34 # define DECINF    0x40      /* 1=Infinity                            */
  35 # define DECNAN    0x20      /* 1=NaN                                 */
  36 # define DECSNAN   0x10      /* 1=sNaN                                */
  37   /* The remaining bits are reserved; they must be 0                  */
  38 # define DECSPECIAL (DECINF|DECNAN|DECSNAN)  /* any special value     */
  39 
  40   /* Define the decNumber data structure.  The size and shape of the  */
  41   /* units array in the structure is determined by the following      */
  42   /* constant.  This must not be changed without recompiling the      */
  43   /* decNumber library modules. */
  44 
  45   //#define DECDPUN 3         /* DECimal Digits Per UNit [must be >0  */
  46 # define DECDPUN 8            /* DECimal Digits Per UNit [must be >0  */
  47                               /* and <10; 3 or powers of 2 are best]. */
  48 
  49   /* DECNUMDIGITS is the default number of digits that can be held in */
  50   /* the structure.  If undefined, 1 is assumed and it is assumed     */
  51   /* that the structure will be immediately followed by extra space,  */
  52   /* as required.  DECNUMDIGITS is always >0.                         */
  53 # if !defined(DECNUMDIGITS)
  54 #  define DECNUMDIGITS 1
  55 # endif
  56 
  57   /* The size (integer data type) of each unit is determined by the   */
  58   /* number of digits it will hold.                                   */
  59 # if DECDPUN<=2
  60 #  define decNumberUnit uint8_t
  61 # elif DECDPUN<=4
  62 #  define decNumberUnit uint16_t
  63 # else
  64 #  define decNumberUnit uint32_t
  65 # endif
  66   /* The number of units needed is ceil(DECNUMDIGITS/DECDPUN)         */
  67 # define DECNUMUNITS ((DECNUMDIGITS+DECDPUN-1)/DECDPUN)
  68 
  69   /* The data structure... */
  70   typedef struct {
  71     int32_t digits;      /* Count of digits in the coefficient; >0    */
  72     int32_t exponent;    /* Unadjusted exponent, unbiased, in         */
  73                          /* range: -1999999997 through 999999999      */
  74     uint8_t bits;        /* Indicator bits (see above)                */
  75                          /* Coefficient, from least significant unit  */
  76     decNumberUnit lsu[DECNUMUNITS];
  77     } decNumber;
  78 
  79   /* Notes:                                                           */
  80   /* 1. If digits is > DECDPUN then there will one or more            */
  81   /*    decNumberUnits immediately following the first element of lsu.*/
  82   /*    These contain the remaining (more significant) digits of the  */
  83   /*    number, and may be in the lsu array, or may be guaranteed by  */
  84   /*    some other mechanism (such as being contained in another      */
  85   /*    structure, or being overlaid on dynamically allocated         */
  86   /*    storage).                                                     */
  87   /*                                                                  */
  88   /*    Each integer of the coefficient (except potentially the last) */
  89   /*    contains DECDPUN digits (e.g., a value in the range 0 through */
  90   /*    99999999 if DECDPUN is 8, or 0 through 999 if DECDPUN is 3).  */
  91   /*                                                                  */
  92   /* 2. A decNumber converted to a string may need up to digits+14    */
  93   /*    characters.  The worst cases (non-exponential and exponential */
  94   /*    formats) are -0.00000{9...}# and -9.{9...}E+999999999#        */
  95   /*    (where # is '\0')                                             */
  96 
  97   /* ---------------------------------------------------------------- */
  98   /* decNumber public functions and macros                            */
  99   /* ---------------------------------------------------------------- */
 100   /* Conversions                                                      */
 101   decNumber * decNumberFromInt32(decNumber *, int32_t);
 102   decNumber * decNumberFromUInt32(decNumber *, uint32_t);
 103   decNumber * decNumberFromString(decNumber *, const char *, decContext *);
 104   char      * decNumberToString(const decNumber *, char *);
 105   char      * decNumberToEngString(const decNumber *, char *);
 106   uint32_t    decNumberToUInt32(const decNumber *, decContext *);
 107   int32_t     decNumberToInt32(const decNumber *, decContext *);
 108   uint8_t   * decNumberGetBCD(const decNumber *, uint8_t *);
 109   decNumber * decNumberSetBCD(decNumber *, const uint8_t *, uint32_t);
 110 
 111   /* Operators and elementary functions                               */
 112   decNumber * decNumberAbs(decNumber *, const decNumber *, decContext *);
 113   decNumber * decNumberAdd(decNumber *, const decNumber *, const decNumber *, decContext *);
 114   decNumber * decNumberAnd(decNumber *, const decNumber *, const decNumber *, decContext *);
 115   decNumber * decNumberCompare(decNumber *, const decNumber *, const decNumber *, decContext *);
 116   decNumber * decNumberCompareSignal(decNumber *, const decNumber *, const decNumber *, decContext *);
 117   decNumber * decNumberCompareTotal(decNumber *, const decNumber *, const decNumber *, decContext *);
 118   decNumber * decNumberCompareTotalMag(decNumber *, const decNumber *, const decNumber *, decContext *);
 119   decNumber * decNumberDivide(decNumber *, const decNumber *, const decNumber *, decContext *);
 120   decNumber * decNumberDivideInteger(decNumber *, const decNumber *, const decNumber *, decContext *);
 121   decNumber * decNumberExp(decNumber *, const decNumber *, decContext *);
 122   decNumber * decNumberFMA(decNumber *, const decNumber *, const decNumber *, const decNumber *, decContext *);
 123   decNumber * decNumberInvert(decNumber *, const decNumber *, decContext *);
 124   decNumber * decNumberLn(decNumber *, const decNumber *, decContext *);
 125   decNumber * decNumberLogB(decNumber *, const decNumber *, decContext *);
 126   decNumber * decNumberLog10(decNumber *, const decNumber *, decContext *);
 127   decNumber * decNumberMax(decNumber *, const decNumber *, const decNumber *, decContext *);
 128   decNumber * decNumberMaxMag(decNumber *, const decNumber *, const decNumber *, decContext *);
 129   decNumber * decNumberMin(decNumber *, const decNumber *, const decNumber *, decContext *);
 130   decNumber * decNumberMinMag(decNumber *, const decNumber *, const decNumber *, decContext *);
 131   decNumber * decNumberMinus(decNumber *, const decNumber *, decContext *);
 132   decNumber * decNumberMultiply(decNumber *, const decNumber *, const decNumber *, decContext *);
 133   decNumber * decNumberNormalize(decNumber *, const decNumber *, decContext *);
 134   decNumber * decNumberOr(decNumber *, const decNumber *, const decNumber *, decContext *);
 135   decNumber * decNumberPlus(decNumber *, const decNumber *, decContext *);
 136   decNumber * decNumberPower(decNumber *, const decNumber *, const decNumber *, decContext *);
 137   decNumber * decNumberQuantize(decNumber *, const decNumber *, const decNumber *, decContext *);
 138   decNumber * decNumberReduce(decNumber *, const decNumber *, decContext *);
 139   decNumber * decNumberRemainder(decNumber *, const decNumber *, const decNumber *, decContext *);
 140   decNumber * decNumberRemainderNear(decNumber *, const decNumber *, const decNumber *, decContext *);
 141   decNumber * decNumberRescale(decNumber *, const decNumber *, const decNumber *, decContext *);
 142   decNumber * decNumberRotate(decNumber *, const decNumber *, const decNumber *, decContext *);
 143   decNumber * decNumberSameQuantum(decNumber *, const decNumber *, const decNumber *);
 144   decNumber * decNumberScaleB(decNumber *, const decNumber *, const decNumber *, decContext *);
 145   decNumber * decNumberShift(decNumber *, const decNumber *, const decNumber *, decContext *);
 146   decNumber * decNumberSquareRoot(decNumber *, const decNumber *, decContext *);
 147   decNumber * decNumberSubtract(decNumber *, const decNumber *, const decNumber *, decContext *);
 148   decNumber * decNumberToIntegralExact(decNumber *, const decNumber *, decContext *);
 149   decNumber * decNumberToIntegralValue(decNumber *, const decNumber *, decContext *);
 150   decNumber * decNumberXor(decNumber *, const decNumber *, const decNumber *, decContext *);
 151 
 152   /* Utilities                                                        */
 153   enum decClass decNumberClass(const decNumber *, decContext *);
 154   const char * decNumberClassToString(enum decClass);
 155   decNumber  * decNumberCopy(decNumber *, const decNumber *);
 156   decNumber  * decNumberCopyAbs(decNumber *, const decNumber *);
 157   decNumber  * decNumberCopyNegate(decNumber *, const decNumber *);
 158   decNumber  * decNumberCopySign(decNumber *, const decNumber *, const decNumber *);
 159   decNumber  * decNumberNextMinus(decNumber *, const decNumber *, decContext *);
 160   decNumber  * decNumberNextPlus(decNumber *, const decNumber *, decContext *);
 161   decNumber  * decNumberNextToward(decNumber *, const decNumber *, const decNumber *, decContext *);
 162   decNumber  * decNumberTrim(decNumber *);
 163   const char * decNumberVersion(void);
 164   decNumber  * decNumberZero(decNumber *);
 165 
 166   /* Functions for testing decNumbers (normality depends on context)  */
 167   int32_t decNumberIsNormal(const decNumber *, decContext *);
 168   int32_t decNumberIsSubnormal(const decNumber *, decContext *);
 169 
 170   /* Macros for testing decNumber *dn                                 */
 171 # define decNumberIsCanonical(dn) (1)   /* All decNumbers are saintly */
 172 # define decNumberIsFinite(dn)    (((dn)->bits&DECSPECIAL)==0)
 173 # define decNumberIsInfinite(dn)  (((dn)->bits&DECINF)!=0)
 174 # define decNumberIsNaN(dn)       (((dn)->bits&(DECNAN|DECSNAN))!=0)
 175 # define decNumberIsNegative(dn)  (((dn)->bits&DECNEG)!=0)
 176 # define decNumberIsQNaN(dn)      (((dn)->bits&(DECNAN))!=0)
 177 # define decNumberIsSNaN(dn)      (((dn)->bits&(DECSNAN))!=0)
 178 # define decNumberIsSpecial(dn)   (((dn)->bits&DECSPECIAL)!=0)
 179 # define decNumberIsZero(dn)      (*(dn)->lsu==0 \
 180                                     && (dn)->digits==1 \
 181                                     && (((dn)->bits&DECSPECIAL)==0))
 182 # define decNumberRadix(dn)       (10)
 183 
 184 #endif

/* [previous][next][first][last][top][bottom][index][help] */