Home | History | Annotate | Download | only in i18n

Lines Matching full:decnumber

9 /* The description and User's Guide ("The decNumber C Library") for   */
10 /* this software is called decNumber.pdf. This document is */
46 /* header file, see the User's Guide section of the decNumber */
56 /* 2. The decNumber format which this library uses is optimized for */
89 /* 6. The decNumber format is not an exchangeable concrete */
182 #include "decNumber.h" /* base number library */
183 #include "decNumberLocal.h" /* decNumber local types, etc. */
227 #error decNumber.c: DECUSE64 must be 1 when DECDPUN>4
234 static decNumber * decAddOp(decNumber *, const decNumber *, const decNumber *,
237 static uInt decCheckMath(const decNumber *, decContext *, uInt *);
238 static void decApplyRound(decNumber *, decContext *, Int, uInt *);
239 static Int decCompare(const decNumber *lhs, const decNumber *rhs, Flag);
240 static decNumber * decCompareOp(decNumber *, const decNumber *,
241 const decNumber *, decContext *,
243 static void decCopyFit(decNumber *, const decNumber *, decContext *,
245 static decNumber * decDecap(decNumber *, Int);
246 static decNumber * decDivideOp(decNumber *, const decNumber *,
247 const decNumber *, decContext *, Flag, uInt *);
248 static decNumber * decExpOp(decNumber *, const decNumber *,
250 static void decFinalize(decNumber *, decContext *, Int *, uInt *);
252 static Int decGetInt(const decNumber *);
253 static decNumber * decLnOp(decNumber *, const decNumber *,
255 static decNumber * decMultiplyOp(decNumber *, const decNumber *,
256 const decNumber *, decContext *,
258 static decNumber * decNaNs(decNumber *, const decNumber *,
259 const decNumber *, decContext *, uInt *);
260 static decNumber * decQuantizeOp(decNumberdecNumber *,
261 const decNumber *, decContext *, Flag,
264 static void decSetCoeff(decNumber *, decContext *, const Unit *,
266 static void decSetMaxValue(decNumber *, decContext *);
267 static void decSetOverflow(decNumber *, decContext *, uInt *);
268 static void decSetSubnormal(decNumber *, decContext *, Int *, uInt *);
271 static void decStatus(decNumber *, uInt, decContext *);
272 static void decToString(const decNumber *, char[], Flag);
273 static decNumber * decTrim(decNumber *, decContext *, Flag, Flag, Int *);
282 static void decFinish(decNumber *, decContext *, Int *, uInt *);
283 static decNumber * decRoundOperand(const decNumber *, decContext *, uInt *);
315 /* Optional checking routines. Enabling these means that decNumber */
323 #define DECUNRESU ((decNumber *)(void *)0xffffffff)
324 #define DECUNUSED ((const decNumber *)(void *)0xffffffff)
326 static Flag decCheckOperands(decNumber *, const decNumber *,
327 const decNumber *, decContext *);
328 static Flag decCheckNumber(const decNumber *);
329 static void decCheckInexact(const decNumber *, decContext *);
334 void decNumberShow(const decNumber *); /* displays the components of a number */
345 /* dn is the decNumber to receive the integer */
351 U_CAPI decNumber * U_EXPORT2 uprv_decNumberFromInt32(decNumber *dn, Int in) {
364 U_CAPI decNumber * U_EXPORT2 uprv_decNumberFromUInt32(decNumber *dn, uInt uin) {
379 /* dn is the decNumber to convert */
381 /* returns the converted decNumber, or 0 if Invalid is set */
383 /* Invalid is set if the decNumber does not have exponent==0 or if */
386 U_CAPI Int U_EXPORT2 uprv_decNumberToInt32(const decNumber *dn, decContext *set) {
422 U_CAPI uInt U_EXPORT2 uprv_decNumberToUInt32(const decNumber *dn, decContext *set) {
458 /* dn is the decNumber to convert */
465 U_CAPI char * U_EXPORT2 uprv_decNumberToString(const decNumber *dn, char *string){
470 U_CAPI char * U_EXPORT2 uprv_decNumberToEngString(const decNumber *dn, char *string){
478 /* decNumberFromString -- convert string to decNumber */
495 U_CAPI decNumber * U_EXPORT2 uprv_decNumberFromString(decNumber *dn, const char chars[],
587 /* [NB: payload in a decNumber can be full length unless */
655 /* OK, the digits string is good. Assemble in the decNumber, or in */
657 if (d<=set->digits) res=dn->lsu; /* fits into supplied decNumber */
744 U_CAPI decNumber * U_EXPORT2 uprv_decNumberAbs(decNumber *res, const decNumber *rhs,
746 decNumber dzero; /* for 0 */
776 U_CAPI decNumber * U_EXPORT2 uprv_decNumberAdd(decNumber *res, const decNumber *lhs,
777 const decNumber *rhs, decContext *set) {
802 U_CAPI decNumber * U_EXPORT2 uprv_decNumberAnd(decNumber *res, const decNumber *lhs,
803 const decNumber *rhs, decContext *set) {
870 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCompare(decNumber *res, const decNumber *lhs,
871 const decNumber *rhs, decContext *set) {
890 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCompareSignal(decNumber *res, const decNumber *lhs,
891 const decNumber *rhs, decContext *set) {
911 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCompareTotal(decNumber *res, const decNumber *lhs,
912 const decNumber *rhs, decContext *set) {
932 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCompareTotalMag(decNumber *res, const decNumber *lhs,
933 const decNumber *rhs, decContext *set) {
936 decNumber bufa[D2N(DECBUFFER+1)];/* +1 in case DECBUFFER=0 */
937 decNumber *allocbufa=NULL; /* -> allocated bufa, iff allocated */
938 decNumber bufb[D2N(DECBUFFER+1)];
939 decNumber *allocbufb=NULL; /* -> allocated bufb, iff allocated */
940 decNumber *a, *b; /* temporary pointers */
950 needbytes=sizeof(decNumber)+(D2U(lhs->digits)-1)*sizeof(Unit);
952 allocbufa=(decNumber *)malloc(needbytes);
964 needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
966 allocbufb=(decNumber *)malloc(needbytes);
997 U_CAPI decNumber * U_EXPORT2 uprv_decNumberDivide(decNumber *res, const decNumber *lhs,
998 const decNumber *rhs, decContext *set) {
1020 U_CAPI decNumber * U_EXPORT2 uprv_decNumberDivideInteger(decNumber *res, const decNumber *lhs,
1021 const decNumber *rhs, decContext *set) {
1053 U_CAPI decNumber * U_EXPORT2 uprv_decNumberExp(decNumber *res, const decNumber *rhs,
1057 decNumber *allocrhs=NULL; /* non-NULL if rounded rhs allocated */
1109 U_CAPI decNumber * U_EXPORT2 uprv_decNumberFMA(decNumber *res, const decNumber *lhs,
1110 const decNumber *rhs, const decNumber *fhs,
1115 decNumber bufa[D2N(DECBUFFER*2+1)];
1116 decNumber *allocbufa=NULL; /* -> allocated bufa, iff allocated */
1117 decNumber *acc; /* accumulator pointer */
1118 decNumber dzero; /* work */
1141 /* set up decNumber space to receive the result of the multiply */
1143 needbytes=sizeof(decNumber)+(D2U(dcmul.digits)-1)*sizeof(Unit);
1145 allocbufa=(decNumber *)malloc(needbytes);
1200 U_CAPI decNumber * U_EXPORT2 uprv_decNumberInvert(decNumber *res, const decNumber *rhs,
1273 U_CAPI decNumber * U_EXPORT2 uprv_decNumberLn(decNumber *res, const decNumber *rhs,
1277 decNumber *allocrhs=NULL; /* non-NULL if rounded rhs allocated */
1339 U_CAPI decNumber * U_EXPORT2 uprv_decNumberLogB(decNumber *res, const decNumber *rhs,
1399 U_CAPI decNumber * U_EXPORT2 uprv_decNumberLog10(decNumber *res, const decNumber *rhs,
1408 decNumber bufa[D2N(DECBUFFER+2)];
1409 decNumber *allocbufa=NULL; /* -> allocated bufa, iff allocated */
1410 decNumber *a=bufa; /* temporary a */
1411 decNumber bufb[D2N(DECBUFFER+2)];
1412 decNumber *allocbufb=NULL; /* -> allocated bufb, iff allocated */
1413 decNumber *b=bufb; /* temporary b */
1414 decNumber bufw[D2N(10)]; /* working 2-10 digit number */
1415 decNumber *w=bufw; /* .. */
1417 decNumber *allocrhs=NULL; /* non-NULL if rounded rhs allocated */
1476 needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
1478 allocbufa=(decNumber *)malloc(needbytes);
1499 needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
1501 allocbufb=(decNumber *)malloc(needbytes);
1550 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMax(decNumber *res, const decNumber *lhs,
1551 const decNumber *rhs, decContext *set) {
1573 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMaxMag(decNumber *res, const decNumber *lhs,
1574 const decNumber
1596 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMin(decNumber *res, const decNumber *lhs,
1597 const decNumber *rhs, decContext *set) {
1619 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMinMag(decNumber *res, const decNumber *lhs,
1620 const decNumber *rhs, decContext *set) {
1644 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMinus(decNumber *res, const decNumber *rhs,
1646 decNumber dzero;
1674 U_CAPI decNumber * U_EXPORT2 uprv_decNumberNextMinus(decNumber *res, const decNumber *rhs,
1676 decNumber dtiny; /* constant */
1710 U_CAPI decNumber * U_EXPORT2 uprv_decNumberNextPlus(decNumber *res, const decNumber *rhs,
1712 decNumber dtiny; /* constant */
1750 U_CAPI decNumber * U_EXPORT2 uprv_decNumberNextToward(decNumber *res, const decNumber *lhs,
1751 const decNumber *rhs, decContext *set) {
1752 decNumber dtiny; /* constant */
1818 U_CAPI decNumber * U_EXPORT2 uprv_decNumberOr(decNumber *res, const decNumber *lhs,
1819 const decNumber *rhs, decContext *set) {
1888 U_CAPI decNumber * U_EXPORT2 uprv_decNumberPlus(decNumber *res, const decNumber *rhs,
1890 decNumber dzero;
1918 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMultiply(decNumber *res, const decNumber *lhs,
1919 const decNumber *rhs, decContext *set) {
1955 U_CAPI decNumber * U_EXPORT2 uprv_decNumberPower(decNumber *res, const decNumber *lhs,
1956 const decNumber *rhs, decContext *set) {
1958 decNumber *alloclhs=NULL; /* non-NULL if rounded lhs allocated */
1959 decNumber *allocrhs=NULL; /* .., rhs */
1961 decNumber *allocdac=NULL; /* -> allocated acc buffer, iff used */
1962 decNumber *allocinv=NULL; /* -> allocated 1/x buffer, iff used */
1978 decNumber dnOne; /* work value 1... */
1979 /* local accumulator buffer [a decNumber, with digits+elength+1 digits] */
1980 decNumber dacbuff[D2N(DECBUFFER+9)];
1981 decNumber *dac=dacbuff; /* -> result accumulator */
1983 decNumber invbuff[D2N(DECBUFFER+9)];
2146 needbytes=sizeof(decNumber)+(D2U(aset.digits)-1)*sizeof(Unit);
2149 allocdac=(decNumber *)malloc(needbytes);
2187 decNumber *inv=invbuff; /* asssume use fixed buffer */
2196 allocinv=(decNumber *)malloc(needbytes);
2300 U_CAPI decNumber * U_EXPORT2 uprv_decNumberQuantize(decNumber *res, const decNumber *lhs,
2301 const decNumber *rhs, decContext *set) {
2320 U_CAPI decNumber * U_EXPORT2 uprv_decNumberNormalize(decNumber *res, const decNumber *rhs,
2325 U_CAPI decNumber * U_EXPORT2 uprv_decNumberReduce(decNumber *res, const decNumber *rhs,
2328 decNumber *allocrhs=NULL; /* non-NULL if rounded rhs allocated */
2389 U_CAPI decNumber * U_EXPORT2 uprv_decNumberRescale(decNumber *res, const decNumber *lhs,
2390 const decNumber *rhs, decContext *set) {
2409 U_CAPI decNumber * U_EXPORT2 uprv_decNumberRemainder(decNumber *res, const decNumber *lhs,
2410 const decNumber *rhs, decContext *set) {
2432 U_CAPI decNumber * U_EXPORT2 uprv_decNumberRemainderNear(decNumber *res, const decNumber *lhs,
2433 const decNumber *rhs, decContext *set) {
2468 U_CAPI decNumber * U_EXPORT2 uprv_decNumberRotate(decNumber *res, const decNumber *lhs,
2469 const decNumber *rhs, decContext *set) {
2589 U_CAPI decNumber * U_EXPORT2 uprv_decNumberSameQuantum(decNumber *res, const decNumber *lhs,
2590 const decNumber *rhs) {
2624 U_CAPI decNumber * U_EXPORT2 uprv_decNumberScaleB(decNumber *res, const decNumber *lhs,
2625 const decNumber *rhs, decContext *set) {
2681 U_CAPI decNumber * U_EXPORT2 uprv_decNumberShift(decNumber *res, const decNumber *lhs,
2682 const decNumber *rhs, decContext *set) {
2814 U_CAPI decNumber * U_EXPORT2 uprv_decNumberSquareRoot(decNumber *res, const decNumber *rhs,
2817 decNumber dzero; /* used for constant zero */
2829 decNumber *allocrhs=NULL; /* non-NULL if rounded rhs allocated */
2832 decNumber buff[D2N(DECBUFFER+1)];
2834 decNumber bufa[D2N(DECBUFFER+2)];
2836 decNumber bufb[D2N(DECBUFFER+2)];
2837 decNumber *allocbuff=NULL; /* -> allocated buff, iff allocated */
2838 decNumber *allocbufa=NULL; /* -> allocated bufa, iff allocated */
2839 decNumber *allocbufb=NULL; /* -> allocated bufb, iff allocated */
2840 decNumber *f=buff; /* reduced fraction */
2841 decNumber *a=bufa; /* approximation to result */
2842 decNumber *b=bufb; /* intermediate result */
2844 decNumber buft[D2N(3)];
2845 decNumber *t=buft; /* up-to-3-digit constant or work */
2907 needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
2909 allocbuff=(decNumber *)malloc(needbytes);
2916 needbytes=sizeof(decNumber)+(D2U(maxp)-1)*sizeof(Unit);
2918 allocbufa=(decNumber *)malloc(needbytes);
2919 allocbufb=(decNumber *)malloc(needbytes);
3159 U_CAPI decNumber * U_EXPORT2 uprv_decNumberSubtract(decNumber *res, const decNumber *lhs,
3160 const decNumber *rhs, decContext *set) {
3192 U_CAPI decNumber * U_EXPORT2 uprv_decNumberToIntegralExact(decNumber *res, const decNumber *rhs,
3194 decNumber dn;
3222 U_CAPI decNumber * U_EXPORT2 uprv_decNumberToIntegralValue(decNumber *res, const decNumber *rhs,
3248 U_CAPI decNumber * U_EXPORT2 uprv_decNumberXor(decNumber *res, const decNumber *lhs,
3249 const decNumber *rhs, decContext *set) {
3308 /* decNumberClass -- return the decClass of a decNumber */
3309 /* dn -- the decNumber to test */
3313 enum decClass uprv_decNumberClass(const decNumber *dn, decContext *set) {
3358 /* dest is the target decNumber */
3359 /* src is the source decNumber */
3366 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCopy(decNumber *dest, const decNumber *src) {
3406 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCopyAbs(decNumber *res, const decNumber *rhs) {
3427 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCopyNegate(decNumber *res, const decNumber *rhs) {
3448 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCopySign(decNumber *res, const decNumber *lhs,
3449 const decNumber *rhs) {
3463 /* dn is the source decNumber */
3471 U_CAPI uByte * U_EXPORT2 uprv_decNumberGetBCD(const decNumber *dn, uByte *bcd) {
3495 /* dn is the target decNumber */
3505 U_CAPI decNumber * U_EXPORT2 uprv_decNumberSetBCD(decNumber *dn, const uByte *bcd, uInt n) {
3525 /* decNumberIsNormal -- test normality of a decNumber */
3526 /* dn is the decNumber to test */
3530 Int uprv_decNumberIsNormal(const decNumber *dn, decContext *set) {
3545 /* decNumberIsSubnormal -- test subnormality of a decNumber */
3546 /* dn is the decNumber to test */
3550 Int uprv_decNumberIsSubnormal(const decNumber *dn, decContext *set) {
3574 U_CAPI decNumber * U_EXPORT2 uprv_decNumberTrim(decNumber *dn) {
3602 U_CAPI decNumber * U_EXPORT2 uprv_decNumberZero(decNumber *dn) {
3635 static void decToString(const decNumber *dn, char *string, Flag eng) {
3817 static decNumber * decAddOp(decNumber *res, const decNumber *lhs,
3818 const decNumber *rhs, decContext *set,
3821 decNumber *alloclhs=NULL; /* non-NULL if rounded lhs allocated */
3822 decNumber *allocrhs=NULL; /* .., rhs */
4005 const decNumber *t;
4231 static decNumber * decDivideOp(decNumber *res,
4232 const decNumber *lhs, const decNumber *rhs,
4235 decNumber *alloclhs=NULL; /* non-NULL if rounded lhs allocated */
4236 decNumber *allocrhs=NULL; /* .., rhs */
4851 static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs,
4852 const decNumber *rhs, decContext *set,
4908 decNumber *alloclhs=NULL; /* -> allocated buffer, iff allocated */
4909 decNumber *allocrhs=NULL; /* -> allocated buffer, iff allocated */
4938 const decNumber *hold=lhs;
5129 /* possibly with a leading zero unit; build the decNumber from */
5207 /* in the spirit of other decNumber operators, the input to be more */
5235 /* care, but the full decNumber range seems very hard within the */
5241 decNumber * decExpOp(decNumber *res, const decNumber *rhs,
5248 const decNumber *x=rhs; /* (may point to safe copy later) */
5255 decNumber bufr[D2N(DECBUFFER*2+1)];
5256 decNumber *allocrhs=NULL; /* non-NULL if rhs buffer allocated */
5263 decNumber buft[D2N(DECBUFFER*2+9+1)];
5264 decNumber *allocbuft=NULL; /* -> allocated buft, iff allocated */
5265 decNumber *t=buft; /* term */
5267 decNumber bufa[D2N(DECBUFFER*4+18+1)];
5268 decNumber *allocbufa=NULL; /* -> allocated bufa, iff allocated */
5269 decNumber *a=bufa; /* accumulator */
5270 /* decNumber for the divisor term; this needs at most 9 digits */
5272 decNumber bufd[D2N(16)];
5273 decNumber *d=bufd; /* divisor */
5274 decNumber numone; /* constant 1 */
5302 /* decNumber d for it (reused as the divisor, etc., below); its */
5374 decNumber *newrhs=bufr; /* assume will fit on stack */
5375 needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
5377 allocrhs=(decNumber *)malloc(needbytes);
5407 needbytes=sizeof(decNumber)+(D2U(p*2)-1)*sizeof(Unit);
5409 allocbufa=(decNumber *)malloc(needbytes);
5419 needbytes=sizeof(decNumber)+(D2U(p+2)-1)*sizeof(Unit);
5421 allocbuft=(decNumber *)malloc(needbytes);
5605 decNumber * decLnOp(decNumber *res, const decNumber *rhs,
5617 decNumber bufa[D2N(DECBUFFER+12)];
5618 decNumber *allocbufa=NULL; /* -> allocated bufa, iff allocated */
5619 decNumber *a=bufa; /* accumulator/work */
5620 decNumber bufb[D2N(DECBUFFER*2+2)];
5621 decNumber *allocbufb=NULL; /* -> allocated bufa, iff allocated */
5622 decNumber *b=bufb; /* adjustment/work */
5624 decNumber numone; /* constant 1 */
5625 decNumber cmp; /* work */
5688 needbytes=sizeof(decNumber)+(D2U(MAXI(p,16))-1)*sizeof(Unit);
5690 allocbufa=(decNumber *)malloc(needbytes);
5697 needbytes=sizeof(decNumber)+(D2U(MAXI(pp,16))-1)*sizeof(Unit);
5699 allocbufb=(decNumber *)malloc(needbytes);
5852 static decNumber * decQuantizeOp(decNumber *res, const decNumber *lhs,
5853 const decNumber *rhs, decContext *set,
5856 decNumber *alloclhs=NULL; /* non-NULL if rounded lhs allocated */
5857 decNumber *allocrhs=NULL; /* .., rhs */
5859 const decNumber *inrhs=rhs; /* save original rhs */
6025 static decNumber * decCompareOp(decNumber *res, const decNumber *lhs,
6026 const decNumber *rhs, decContext *set,
6029 decNumber *alloclhs=NULL; /* non-NULL if rounded lhs allocated */
6030 decNumber *allocrhs=NULL; /* .., rhs */
6136 const decNumber *choice;
6183 /* Arg1 is A, a decNumber which is not a NaN */
6184 /* Arg2 is B, a decNumber which is not a NaN */
6190 static Int decCompare(const decNumber *lhs, const decNumber *rhs,
6225 const decNumber *temp=lhs;
6612 static decNumber * decTrim(decNumber *dn, decContext *set, Flag all,
6817 /* returns an allocated decNumber with the rounded result. */
6822 /* Instead, return an allocated decNumber, rounded as required. */
6828 static decNumber *decRoundOperand(const decNumber *dn, decContext *set,
6830 decNumber *res; /* result structure */
6834 /* Allocate storage for the returned decNumber, big enough for the */
6836 res=(decNumber *)malloc(sizeof(decNumber)
6855 /* dest is the target decNumber */
6856 /* src is the source decNumber */
6864 static void decCopyFit(decNumber *dest, const decNumber *src,
6910 static void decSetCoeff(decNumber *dn, decContext *set, const Unit *lsu,
7091 static void decApplyRound(decNumber *dn, decContext *set, Int residue,
7260 static void decFinish(decNumber *dn, decContext *set, Int *residue,
7295 static void decFinalize(decNumber *dn, decContext *set, Int *residue,
7308 decNumber nmin;
7369 static void decSetOverflow(decNumber *dn, decContext *set, uInt *status) {
7415 static void decSetMaxValue(decNumber *dn, decContext *set) {
7449 static void decSetSubnormal(decNumber *dn, decContext *set, Int *residue,
7535 static uInt decCheckMath(const decNumber *rhs, decContext *set,
7559 /* This checks and gets a whole number from the input decNumber. */
7563 static Int decGetInt(const decNumber *dn) {
7652 static decNumber *decDecap(decNumber *dn, Int drop) {
7711 static decNumber * decNaNs(decNumber *res, const decNumber *lhs,
7712 const decNumber *rhs, decContext *set,
7762 static void decStatus(decNumber *dn, uInt status, decContext *set) {
7834 void uprv_decNumberShow(const decNumber *dn) {
7931 static Flag decCheckOperands(decNumber *res, const decNumber *lhs,
7932 const decNumber *rhs, decContext *set) {
7977 static Flag decCheckNumber(const decNumber *dn) {
7986 printf("Reference to decNumber is NULL.\n");
8078 static void decCheckInexact(const decNumber *dn, decContext *set) {