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