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. */
240 #error decNumber.c: DECUSE64 must be 1 when DECDPUN>4
247 static decNumber * decAddOp(decNumber *, const decNumber *, const decNumber *,
250 static uInt decCheckMath(const decNumber *, decContext *, uInt *);
251 static void decApplyRound(decNumber *, decContext *, Int, uInt *);
252 static Int decCompare(const decNumber *lhs, const decNumber *rhs, Flag);
253 static decNumber * decCompareOp(decNumber *, const decNumber *,
254 const decNumber *, decContext *,
256 static void decCopyFit(decNumber *, const decNumber *, decContext *,
258 static decNumber * decDecap(decNumber *, Int);
259 static decNumber * decDivideOp(decNumber *, const decNumber *,
260 const decNumber *, decContext *, Flag, uInt *);
261 static decNumber * decExpOp(decNumber *, const decNumber
263 static void decFinalize(decNumber *, decContext *, Int *, uInt *);
265 static Int decGetInt(const decNumber *);
266 static decNumber * decLnOp(decNumber *, const decNumber *,
268 static decNumber * decMultiplyOp(decNumber *, const decNumber *,
269 const decNumber *, decContext *,
271 static decNumber * decNaNs(decNumber *, const decNumber *,
272 const decNumber *, decContext *, uInt *);
273 static decNumber * decQuantizeOp(decNumber *, const decNumber *,
274 const decNumber *, decContext *, Flag,
277 static void decSetCoeff(decNumber *, decContext *, const Unit *,
279 static void decSetMaxValue(decNumber *, decContext *);
280 static void decSetOverflow(decNumber *, decContext *, uInt *);
281 static void decSetSubnormal(decNumber *, decContext *, Int *, uInt *);
284 static void decStatus(decNumber *, uInt, decContext *);
285 static void decToString(const decNumber *, char[], Flag);
286 static decNumber * decTrim(decNumber *, decContext *, Flag, Flag, Int *);
295 static void decFinish(decNumber *, decContext *, Int *, uInt *);
296 static decNumber * decRoundOperand(const decNumber *, decContext *, uInt *);
328 /* Optional checking routines. Enabling these means that decNumber */
336 #define DECUNRESU ((decNumber *)(void *)0xffffffff)
337 #define DECUNUSED ((const decNumber *)(void *)0xffffffff)
339 static Flag decCheckOperands(decNumber *, const decNumber *,
340 const decNumber *, decContext *);
341 static Flag decCheckNumber(const decNumber *);
342 static void decCheckInexact(const decNumber *, decContext *);
347 void decNumberShow(const decNumber *); /* displays the components of a number */
358 /* dn is the decNumber to receive the integer */
364 U_CAPI decNumber * U_EXPORT2 uprv_decNumberFromInt32(decNumber *dn, Int in) {
377 U_CAPI decNumber * U_EXPORT2 uprv_decNumberFromUInt32(decNumber *dn, uInt uin) {
392 /* dn is the decNumber to convert */
394 /* returns the converted decNumber, or 0 if Invalid is set */
396 /* Invalid is set if the decNumber does not have exponent==0 or if */
399 U_CAPI Int U_EXPORT2 uprv_decNumberToInt32(const decNumber *dn, decContext *set) {
435 U_CAPI uInt U_EXPORT2 uprv_decNumberToUInt32(const decNumber *dn, decContext *set) {
471 /* dn is the decNumber to convert */
478 U_CAPI char * U_EXPORT2 uprv_decNumberToString(const decNumber *dn, char *string){
483 U_CAPI char * U_EXPORT2 uprv_decNumberToEngString(const decNumber *dn, char *string){
491 /* decNumberFromString -- convert string to decNumber */
508 U_CAPI decNumber * U_EXPORT2 uprv_decNumberFromString(decNumber *dn, const char chars[],
600 /* [NB: payload in a decNumber can be full length unless */
668 /* OK, the digits string is good. Assemble in the decNumber, or in */
670 if (d<=set->digits) res=dn->lsu; /* fits into supplied decNumber */
757 U_CAPI decNumber * U_EXPORT2 uprv_decNumberAbs(decNumber *res, const decNumber *rhs,
759 decNumber dzero; /* for 0 */
789 U_CAPI decNumber * U_EXPORT2 uprv_decNumberAdd(decNumber *res, const decNumber *lhs,
790 const decNumber *rhs, decContext *set) {
815 U_CAPI decNumber * U_EXPORT2 uprv_decNumberAnd(decNumber *res, const decNumber *lhs,
816 const decNumber *rhs, decContext *set) {
883 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCompare(decNumber *res, const decNumber *lhs,
884 const decNumber *rhs, decContext *set) {
903 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCompareSignal(decNumber *res, const decNumber *lhs,
904 const decNumber *rhs, decContext *set) {
924 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCompareTotal(decNumber *res, const decNumber *lhs,
925 const decNumber *rhs, decContext *set) {
945 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCompareTotalMag(decNumber *res, const decNumber *lhs,
946 const decNumber *rhs, decContext *set) {
949 decNumber bufa[D2N(DECBUFFER+1)];/* +1 in case DECBUFFER=0 */
950 decNumber *allocbufa=NULL; /* -> allocated bufa, iff allocated */
951 decNumber bufb[D2N(DECBUFFER+1)];
952 decNumber *allocbufb=NULL; /* -> allocated bufb, iff allocated */
953 decNumber *a, *b; /* temporary pointers */
963 needbytes=sizeof(decNumber)+(D2U(lhs->digits)-1)*sizeof(Unit);
965 allocbufa=(decNumber *)malloc(needbytes);
977 needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
979 allocbufb=(decNumber *)malloc(needbytes);
1010 U_CAPI decNumber * U_EXPORT2 uprv_decNumberDivide(decNumber *res, const decNumber *lhs,
1011 const decNumber *rhs, decContext *set) {
1033 U_CAPI decNumber * U_EXPORT2 uprv_decNumberDivideInteger(decNumber *res, const decNumber *lhs,
1034 const decNumber *rhs, decContext *set) {
1066 U_CAPI decNumber * U_EXPORT2 uprv_decNumberExp(decNumber *res, const decNumber *rhs,
1070 decNumber *allocrhs=NULL; /* non-NULL if rounded rhs allocated */
1122 U_CAPI decNumber * U_EXPORT2 uprv_decNumberFMA(decNumber *res, const decNumber *lhs,
1123 const decNumber *rhs, const decNumber *fhs,
1128 decNumber bufa[D2N(DECBUFFER*2+1)];
1129 decNumber *allocbufa=NULL; /* -> allocated bufa, iff allocated */
1130 decNumber *acc; /* accumulator pointer */
1131 decNumber dzero; /* work */
1154 /* set up decNumber space to receive the result of the multiply */
1156 needbytes=sizeof(decNumber)+(D2U(dcmul.digits)-1)*sizeof(Unit);
1158 allocbufa=(decNumber *)malloc(needbytes);
1213 U_CAPI decNumber * U_EXPORT2 uprv_decNumberInvert(decNumber *res, const decNumber *rhs,
1286 U_CAPI decNumber * U_EXPORT2 uprv_decNumberLn(decNumber *res, const decNumber *rhs,
1290 decNumber *allocrhs=NULL; /* non-NULL if rounded rhs allocated */
1352 U_CAPI decNumber * U_EXPORT2 uprv_decNumberLogB(decNumber *res, const decNumber *rhs,
1412 U_CAPI decNumber * U_EXPORT2 uprv_decNumberLog10(decNumber *res, const decNumber *rhs,
1421 decNumber bufa[D2N(DECBUFFER+2)];
1422 decNumber *allocbufa=NULL; /* -> allocated bufa, iff allocated */
1423 decNumber *a=bufa; /* temporary a */
1424 decNumber bufb[D2N(DECBUFFER+2)];
1425 decNumber *allocbufb=NULL; /* -> allocated bufb, iff allocated */
1426 decNumber *b=bufb; /* temporary b */
1427 decNumber bufw[D2N(10)]; /* working 2-10 digit number */
1428 decNumber *w=bufw; /* .. */
1430 decNumber *allocrhs=NULL; /* non-NULL if rounded rhs allocated */
1489 needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
1491 allocbufa=(decNumber *)malloc(needbytes);
1512 needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
1514 allocbufb=(decNumber *)malloc(needbytes);
1563 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMax(decNumber *res, const decNumber *lhs,
1564 const decNumber *rhs, decContext *set) {
1586 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMaxMag(decNumber *res, const decNumber *lhs,
1587 const decNumber *rhs, decContext *set) {
1609 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMin(decNumber *res, const decNumber *lhs,
1610 const decNumber *rhs, decContext *set) {
1632 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMinMag(decNumber *res, const decNumber *lhs,
1633 const decNumber *rhs, decContext *set) {
1657 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMinus(decNumber *res, const decNumber *rhs,
1659 decNumber dzero;
1687 U_CAPI decNumber * U_EXPORT2 uprv_decNumberNextMinus(decNumber *res, const decNumber *rhs,
1689 decNumber dtiny; /* constant */
1723 U_CAPI decNumber * U_EXPORT2 uprv_decNumberNextPlus(decNumber *res, const decNumber *rhs,
1725 decNumber dtiny; /* constant */
1763 U_CAPI decNumber * U_EXPORT2 uprv_decNumberNextToward(decNumber *res, const decNumber *lhs,
1764 const decNumber *rhs, decContext *set) {
1765 decNumber dtiny; /* constant */
1831 U_CAPI decNumber * U_EXPORT2 uprv_decNumberOr(decNumber *res, const decNumber *lhs,
1832 const decNumber *rhs, decContext *set) {
1901 U_CAPI decNumber * U_EXPORT2 uprv_decNumberPlus(decNumber *res, const decNumber *rhs,
1903 decNumber dzero;
1931 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMultiply(decNumber *res, const decNumber *lhs,
1932 const decNumber *rhs, decContext *set) {
1968 U_CAPI decNumber * U_EXPORT2 uprv_decNumberPower(decNumber *res, const decNumber *lhs,
1969 const decNumber *rhs, decContext *set) {
1971 decNumber *alloclhs=NULL; /* non-NULL if rounded lhs allocated */
1972 decNumber *allocrhs=NULL; /* .., rhs */
1974 decNumber *allocdac=NULL; /* -> allocated acc buffer, iff used */
1975 decNumber *allocinv=NULL; /* -> allocated 1/x buffer, iff used */
1991 decNumber dnOne; /* work value 1... */
1992 /* local accumulator buffer [a decNumber, with digits+elength+1 digits] */
1993 decNumber dacbuff[D2N(DECBUFFER+9)];
1994 decNumber *dac=dacbuff; /* -> result accumulator */
1996 decNumber invbuff[D2N(DECBUFFER+9)];
2159 needbytes=sizeof(decNumber)+(D2U(aset.digits)-1)*sizeof(Unit);
2162 allocdac=(decNumber *)malloc(needbytes);
2200 decNumber *inv=invbuff; /* asssume use fixed buffer */
2209 allocinv=(decNumber *)malloc(needbytes);
2313 U_CAPI decNumber * U_EXPORT2 uprv_decNumberQuantize(decNumber *res, const decNumber *lhs,
2314 const decNumber *rhs, decContext *set) {
2333 U_CAPI decNumber * U_EXPORT2 uprv_decNumberNormalize(decNumber *res, const decNumber *rhs,
2338 U_CAPI decNumber * U_EXPORT2 uprv_decNumberReduce(decNumber *res, const decNumber *rhs,
2341 decNumber *allocrhs=NULL; /* non-NULL if rounded rhs allocated */
2402 U_CAPI decNumber * U_EXPORT2 uprv_decNumberRescale(decNumber *res, const decNumber *lhs,
2403 const decNumber *rhs, decContext *set) {
2422 U_CAPI decNumber * U_EXPORT2 uprv_decNumberRemainder(decNumber *res, const decNumber *lhs,
2423 const decNumber *rhs, decContext *set) {
2445 U_CAPI decNumber * U_EXPORT2 uprv_decNumberRemainderNear(decNumber *res, const decNumber *lhs,
2446 const decNumber *rhs, decContext *set) {
2481 U_CAPI decNumber * U_EXPORT2 uprv_decNumberRotate(decNumber *res, const decNumber *lhs,
2482 const decNumber *rhs, decContext *set) {
2602 U_CAPI decNumber * U_EXPORT2 uprv_decNumberSameQuantum(decNumber *res, const decNumber *lhs,
2603 const decNumber *rhs) {
2637 U_CAPI decNumber * U_EXPORT2 uprv_decNumberScaleB(decNumber *res, const decNumber *lhs,
2638 const decNumber *rhs, decContext *set) {
2694 U_CAPI decNumber * U_EXPORT2 uprv_decNumberShift(decNumber *res, const decNumber *lhs,
2695 const decNumber *rhs, decContext *set) {
2827 U_CAPI decNumber * U_EXPORT2 uprv_decNumberSquareRoot(decNumber *res, const decNumber *rhs,
2830 decNumber dzero; /* used for constant zero */
2842 decNumber *allocrhs=NULL; /* non-NULL if rounded rhs allocated */
2845 decNumber buff[D2N(DECBUFFER+1)];
2847 decNumber bufa[D2N(DECBUFFER+2)];
2849 decNumber bufb[D2N(DECBUFFER+2)];
2850 decNumber *allocbuff=NULL; /* -> allocated buff, iff allocated */
2851 decNumber *allocbufa=NULL; /* -> allocated bufa, iff allocated */
2852 decNumber *allocbufb=NULL; /* -> allocated bufb, iff allocated */
2853 decNumber *f=buff; /* reduced fraction */
2854 decNumber *a=bufa; /* approximation to result */
2855 decNumber *b=bufb; /* intermediate result */
2857 decNumber buft[D2N(3)];
2858 decNumber *t=buft; /* up-to-3-digit constant or work */
2920 needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
2922 allocbuff=(decNumber *)malloc(needbytes);
2929 needbytes=sizeof(decNumber)+(D2U(maxp)-1)*sizeof(Unit);
2931 allocbufa=(decNumber *)malloc(needbytes);
2932 allocbufb=(decNumber *)malloc(needbytes);
3172 U_CAPI decNumber * U_EXPORT2 uprv_decNumberSubtract(decNumber *res, const decNumber *lhs,
3173 const decNumber *rhs, decContext *set) {
3205 U_CAPI decNumber * U_EXPORT2 uprv_decNumberToIntegralExact(decNumber *res, const decNumber *rhs,
3207 decNumber dn;
3235 U_CAPI decNumber * U_EXPORT2 uprv_decNumberToIntegralValue(decNumber *res, const decNumber *rhs,
3261 U_CAPI decNumber * U_EXPORT2 uprv_decNumberXor(decNumber *res, const decNumber *lhs,
3262 const decNumber *rhs, decContext *set) {
3321 /* decNumberClass -- return the decClass of a decNumber */
3322 /* dn -- the decNumber to test */
3326 enum decClass uprv_decNumberClass(const decNumber *dn, decContext *set) {
3371 /* dest is the target decNumber */
3372 /* src is the source decNumber */
3379 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCopy(decNumber *dest, const decNumber *src) {
3419 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCopyAbs(decNumber *res, const decNumber *rhs) {
3440 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCopyNegate(decNumber *res, const decNumber *rhs) {
3461 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCopySign(decNumber *res, const decNumber *lhs,
3462 const decNumber *rhs) {
3476 /* dn is the source decNumber */
3484 U_CAPI uByte * U_EXPORT2 uprv_decNumberGetBCD(const decNumber *dn, uByte *bcd) {
3508 /* dn is the target decNumber */
3518 U_CAPI decNumber * U_EXPORT2 uprv_decNumberSetBCD(decNumber *dn, const uByte *bcd, uInt n) {
3538 /* decNumberIsNormal -- test normality of a decNumber */
3539 /* dn is the decNumber to test */
3543 Int uprv_decNumberIsNormal(const decNumber *dn, decContext *set) {
3558 /* decNumberIsSubnormal -- test subnormality of a decNumber */
3559 /* dn is the decNumber to test */
3563 Int uprv_decNumberIsSubnormal(const decNumber *dn, decContext *set) {
3587 U_CAPI decNumber * U_EXPORT2 uprv_decNumberTrim(decNumber *dn) {
3615 U_CAPI decNumber * U_EXPORT2 uprv_decNumberZero(decNumber *dn) {
3648 static void decToString(const decNumber *dn, char *string, Flag eng) {
3830 static decNumber * decAddOp(decNumber *res, const decNumber *lhs,
3831 const decNumber *rhs, decContext *set,
3834 decNumber *alloclhs=NULL; /* non-NULL if rounded lhs allocated */
3835 decNumber *allocrhs=NULL; /* .., rhs */
4018 const decNumber *t;
4246 static decNumber * decDivideOp(decNumber *res,
4247 const decNumber *lhs, const decNumber *rhs,
4250 decNumber *alloclhs=NULL; /* non-NULL if rounded lhs allocated */
4251 decNumber *allocrhs=NULL; /* .., rhs */
4866 static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs,
4867 const decNumber *rhs, decContext *set,
4923 decNumber *alloclhs=NULL; /* -> allocated buffer, iff allocated */
4924 decNumber *allocrhs=NULL; /* -> allocated buffer, iff allocated */
4953 const decNumber *hold=lhs;
5148 /* possibly with a leading zero unit; build the decNumber from */
5226 /* in the spirit of other decNumber operators, the input to be more */
5254 /* care, but the full decNumber range seems very hard within the */
5260 decNumber * decExpOp(decNumber *res, const decNumber *rhs,
5267 const decNumber *x=rhs; /* (may point to safe copy later) */
5274 decNumber bufr[D2N(DECBUFFER*2+1)];
5275 decNumber *allocrhs=NULL; /* non-NULL if rhs buffer allocated */
5282 decNumber buft[D2N(DECBUFFER*2+9+1)];
5283 decNumber *allocbuft=NULL; /* -> allocated buft, iff allocated */
5284 decNumber *t=buft; /* term */
5286 decNumber bufa[D2N(DECBUFFER*4+18+1)];
5287 decNumber *allocbufa=NULL; /* -> allocated bufa, iff allocated */
5288 decNumber *a=bufa; /* accumulator */
5289 /* decNumber for the divisor term; this needs at most 9 digits */
5291 decNumber bufd[D2N(16)];
5292 decNumber *d=bufd; /* divisor */
5293 decNumber numone; /* constant 1 */
5321 /* decNumber d for it (reused as the divisor, etc., below); its */
5393 decNumber *newrhs=bufr; /* assume will fit on stack */
5394 needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
5396 allocrhs=(decNumber *)malloc(needbytes);
5426 needbytes=sizeof(decNumber)+(D2U(p*2)-1)*sizeof(Unit);
5428 allocbufa=(decNumber *)malloc(needbytes);
5438 needbytes=sizeof(decNumber)+(D2U(p+2)-1)*sizeof(Unit);
5440 allocbuft=(decNumber *)malloc(needbytes);
5624 decNumber * decLnOp(decNumber *res, const decNumber *rhs,
5636 decNumber bufa[D2N(DECBUFFER+12)];
5637 decNumber *allocbufa=NULL; /* -> allocated bufa, iff allocated */
5638 decNumber *a=bufa; /* accumulator/work */
5639 decNumber bufb[D2N(DECBUFFER*2+2)];
5640 decNumber *allocbufb=NULL; /* -> allocated bufa, iff allocated */
5641 decNumber *b=bufb; /* adjustment/work */
5643 decNumber numone; /* constant 1 */
5644 decNumber cmp; /* work */
5707 needbytes=sizeof(decNumber)+(D2U(MAXI(p,16))-1)*sizeof(Unit);
5709 allocbufa=(decNumber *)malloc(needbytes);
5716 needbytes=sizeof(decNumber)+(D2U(MAXI(pp,16))-1)*sizeof(Unit);
5718 allocbufb=(decNumber *)malloc(needbytes);
5871 static decNumber * decQuantizeOp(decNumber *res, const decNumber *lhs,
5872 const decNumber *rhs, decContext *set,
5875 decNumber *alloclhs=NULL; /* non-NULL if rounded lhs allocated */
5876 decNumber *allocrhs=NULL; /* .., rhs */
5878 const decNumber *inrhs=rhs; /* save original rhs */
6044 static decNumber * decCompareOp(decNumber *res, const decNumber *lhs,
6045 const decNumber *rhs, decContext *set,
6048 decNumber *alloclhs=NULL; /* non-NULL if rounded lhs allocated */
6049 decNumber *allocrhs=NULL; /* .., rhs */
6155 const decNumber *choice;
6202 /* Arg1 is A, a decNumber which is not a NaN */
6203 /* Arg2 is B, a decNumber which is not a NaN */
6209 static Int decCompare(const decNumber *lhs, const decNumber *rhs,
6244 const decNumber *temp=lhs;
6631 static decNumber * decTrim(decNumber *dn, decContext *set, Flag all,
6836 /* returns an allocated decNumber with the rounded result. */
6841 /* Instead, return an allocated decNumber, rounded as required. */
6847 static decNumber *decRoundOperand(const decNumber *dn, decContext *set,
6849 decNumber *res; /* result structure */
6853 decNumber, big enough for the */
6855 res=(decNumber *)malloc(sizeof(decNumber)
6874 /* dest is the target decNumber */
6875 /* src is the source decNumber */
6883 static void decCopyFit(decNumber *dest, const decNumber *src,
6929 static void decSetCoeff(decNumber *dn, decContext *set, const Unit *lsu,
7111 static void decApplyRound(decNumber *dn, decContext *set, Int residue,
7280 static void decFinish(decNumber *dn, decContext *set, Int *residue,
7315 static void decFinalize(decNumber *dn, decContext *set, Int *residue,
7328 decNumber nmin;
7389 static void decSetOverflow(decNumber *dn, decContext *set, uInt *status) {
7435 static void decSetMaxValue(decNumber *dn, decContext *set) {
7469 static void decSetSubnormal(decNumber *dn, decContext *set, Int *residue,
7555 decNumber *rhs, decContext *set,
7579 /* This checks and gets a whole number from the input decNumber. */
7583 static Int decGetInt(const decNumber *dn) {
7672 static decNumber *decDecap(decNumber *dn, Int drop) {
7731 static decNumber * decNaNs(decNumber *res, const decNumber *lhs,
7732 const decNumber *rhs, decContext *set,
7782 static void decStatus(decNumber *dn, uInt status, decContext *set) {
7854 void uprv_decNumberShow(const decNumber *dn) {
7951 static Flag decCheckOperands(decNumber *res, const decNumber *lhs,
7952 const decNumber *rhs, decContext *set) {
7997 static Flag decCheckNumber(const decNumber *dn) {
8006 printf("Reference to decNumber is NULL.\n");
8098 static void decCheckInexact(const decNumber *dn, decContext *set) {