00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #if !defined(DECNUMBER)
00023 #define DECNUMBER
00024 #define DECNAME "decNumber"
00025 #define DECFULLNAME "Decimal Number Module"
00026 #define DECAUTHOR "Mike Cowlishaw"
00027
00028 #if !defined(DECCONTEXT)
00029 #include "decContext.h"
00030 #endif
00031
00032
00033 #define DECNEG 0x80
00034 #define DECINF 0x40
00035 #define DECNAN 0x20
00036 #define DECSNAN 0x10
00037
00038 #define DECSPECIAL (DECINF|DECNAN|DECSNAN)
00039
00040
00041
00042
00043
00044
00045 #define DECDPUN 3
00046
00047
00048
00049
00050
00051
00052 #if !defined(DECNUMDIGITS)
00053 #define DECNUMDIGITS 1
00054 #endif
00055
00056
00057
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
00066 #define DECNUMUNITS ((DECNUMDIGITS+DECDPUN-1)/DECDPUN)
00067
00068
00069 typedef struct {
00070 int32_t digits;
00071 int32_t exponent;
00072
00073 uint8_t bits;
00074
00075 decNumberUnit lsu[DECNUMUNITS];
00076 } decNumber;
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
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
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
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
00167 int32_t decNumberIsNormal(const decNumber *, decContext *);
00168 int32_t decNumberIsSubnormal(const decNumber *, decContext *);
00169
00170
00171 #define decNumberIsCanonical(dn) (1)
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