1 /* ------------------------------------------------------------------ */
2 /* Decimal Number arithmetic module */
3 /* ------------------------------------------------------------------ */
4 /* Copyright (c) IBM Corporation, 2000-2010. All rights reserved. */
6 /* This software is made available under the terms of the */
7 /* ICU License -- ICU 1.8.1 and later. */
9 /* The description and User's Guide ("The decNumber C Library") for */
10 /* this software is called decNumber.pdf. This document is */
11 /* available, together with arithmetic and format specifications, */
12 /* testcases, and Web links, on the General Decimal Arithmetic page. */
14 /* Please send comments, suggestions, and corrections to the author: */
16 /* Mike Cowlishaw, IBM Fellow */
17 /* IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK */
18 /* ------------------------------------------------------------------ */
20 /* Modified version, for use from within ICU.
21 * Renamed public functions, to avoid an unwanted export of the
22 * standard names from the ICU library.
24 * Use ICU's uprv_malloc() and uprv_free()
26 * Revert comment syntax to plain C
28 * Remove a few compiler warnings.
31 /* This module comprises the routines for arbitrary-precision General */
32 /* Decimal Arithmetic as defined in the specification which may be */
33 /* found on the General Decimal Arithmetic pages. It implements both */
34 /* the full ('extended') arithmetic and the simpler ('subset') */
39 /* 1. This code is ANSI C89 except: */
41 /* a) C99 line comments (double forward slash) are used. (Most C */
42 /* compilers accept these. If yours does not, a simple script */
43 /* can be used to convert them to ANSI C comments.) */
45 /* b) Types from C99 stdint.h are used. If you do not have this */
46 /* header file, see the User's Guide section of the decNumber */
47 /* documentation; this lists the necessary definitions. */
49 /* c) If DECDPUN>4 or DECUSE64=1, the C99 64-bit int64_t and */
50 /* uint64_t types may be used. To avoid these, set DECUSE64=0 */
51 /* and DECDPUN<=4 (see documentation). */
53 /* The code also conforms to C99 restrictions; in particular, */
54 /* strict aliasing rules are observed. */
56 /* 2. The decNumber format which this library uses is optimized for */
57 /* efficient processing of relatively short numbers; in particular */
58 /* it allows the use of fixed sized structures and minimizes copy */
59 /* and move operations. It does, however, support arbitrary */
60 /* precision (up to 999,999,999 digits) and arbitrary exponent */
61 /* range (Emax in the range 0 through 999,999,999 and Emin in the */
62 /* range -999,999,999 through 0). Mathematical functions (for */
63 /* example decNumberExp) as identified below are restricted more */
64 /* tightly: digits, emax, and -emin in the context must be <= */
65 /* DEC_MAX_MATH (999999), and their operand(s) must be within */
68 /* 3. Logical functions are further restricted; their operands must */
69 /* be finite, positive, have an exponent of zero, and all digits */
70 /* must be either 0 or 1. The result will only contain digits */
71 /* which are 0 or 1 (and will have exponent=0 and a sign of 0). */
73 /* 4. Operands to operator functions are never modified unless they */
74 /* are also specified to be the result number (which is always */
75 /* permitted). Other than that case, operands must not overlap. */
77 /* 5. Error handling: the type of the error is ORed into the status */
78 /* flags in the current context (decContext structure). The */
79 /* SIGFPE signal is then raised if the corresponding trap-enabler */
80 /* flag in the decContext is set (is 1). */
82 /* It is the responsibility of the caller to clear the status */
83 /* flags as required. */
85 /* The result of any routine which returns a number will always */
86 /* be a valid number (which may be a special value, such as an */
87 /* Infinity or NaN). */
89 /* 6. The decNumber format is not an exchangeable concrete */
90 /* representation as it comprises fields which may be machine- */
91 /* dependent (packed or unpacked, or special length, for example). */
92 /* Canonical conversions to and from strings are provided; other */
93 /* conversions are available in separate modules. */
95 /* 7. Normally, input operands are assumed to be valid. Set DECCHECK */
96 /* to 1 for extended operand checking (including NULL operands). */
97 /* Results are undefined if a badly-formed structure (or a NULL */
98 /* pointer to a structure) is provided, though with DECCHECK */
99 /* enabled the operator routines are protected against exceptions. */
100 /* (Except if the result pointer is NULL, which is unrecoverable.) */
102 /* However, the routines will never cause exceptions if they are */
103 /* given well-formed operands, even if the value of the operands */
104 /* is inappropriate for the operation and DECCHECK is not set. */
105 /* (Except for SIGFPE, as and where documented.) */
107 /* 8. Subset arithmetic is available only if DECSUBSET is set to 1. */
108 /* ------------------------------------------------------------------ */
109 /* Implementation notes for maintenance of this module: */
111 /* 1. Storage leak protection: Routines which use malloc are not */
112 /* permitted to use return for fastpath or error exits (i.e., */
113 /* they follow strict structured programming conventions). */
114 /* Instead they have a do{}while(0); construct surrounding the */
115 /* code which is protected -- break may be used to exit this. */
116 /* Other routines can safely use the return statement inline. */
118 /* Storage leak accounting can be enabled using DECALLOC. */
120 /* 2. All loops use the for(;;) construct. Any do construct does */
121 /* not loop; it is for allocation protection as just described. */
123 /* 3. Setting status in the context must always be the very last */
124 /* action in a routine, as non-0 status may raise a trap and hence */
125 /* the call to set status may not return (if the handler uses long */
126 /* jump). Therefore all cleanup must be done first. In general, */
127 /* to achieve this status is accumulated and is only applied just */
128 /* before return by calling decContextSetStatus (via decStatus). */
130 /* Routines which allocate storage cannot, in general, use the */
131 /* 'top level' routines which could cause a non-returning */
132 /* transfer of control. The decXxxxOp routines are safe (do not */
133 /* call decStatus even if traps are set in the context) and should */
134 /* be used instead (they are also a little faster). */
136 /* 4. Exponent checking is minimized by allowing the exponent to */
137 /* grow outside its limits during calculations, provided that */
138 /* the decFinalize function is called later. Multiplication and */
139 /* division, and intermediate calculations in exponentiation, */
140 /* require more careful checks because of the risk of 31-bit */
141 /* overflow (the most negative valid exponent is -1999999997, for */
142 /* a 999999999-digit number with adjusted exponent of -999999999). */
144 /* 5. Rounding is deferred until finalization of results, with any */
145 /* 'off to the right' data being represented as a single digit */
146 /* residue (in the range -1 through 9). This avoids any double- */
147 /* rounding when more than one shortening takes place (for */
148 /* example, when a result is subnormal). */
150 /* 6. The digits count is allowed to rise to a multiple of DECDPUN */
151 /* during many operations, so whole Units are handled and exact */
152 /* accounting of digits is not needed. The correct digits value */
153 /* is found by decGetDigits, which accounts for leading zeros. */
154 /* This must be called before any rounding if the number of digits */
155 /* is not known exactly. */
157 /* 7. The multiply-by-reciprocal 'trick' is used for partitioning */
158 /* numbers up to four digits, using appropriate constants. This */
159 /* is not useful for longer numbers because overflow of 32 bits */
160 /* would lead to 4 multiplies, which is almost as expensive as */
161 /* a divide (unless a floating-point or 64-bit multiply is */
162 /* assumed to be available). */
164 /* 8. Unusual abbreviations that may be used in the commentary: */
165 /* lhs -- left hand side (operand, of an operation) */
166 /* lsd -- least significant digit (of coefficient) */
167 /* lsu -- least significant Unit (of coefficient) */
168 /* msd -- most significant digit (of coefficient) */
169 /* msi -- most significant item (in an array) */
170 /* msu -- most significant Unit (of coefficient) */
171 /* rhs -- right hand side (operand, of an operation) */
172 /* +ve -- positive */
173 /* -ve -- negative */
174 /* ** -- raise to the power */
175 /* ------------------------------------------------------------------ */
177 #include <stdlib.h> /* for malloc, free, etc. */
178 /* #include <stdio.h> */ /* for printf [if needed] */
179 #include <string.h> /* for strcpy */
180 #include <ctype.h> /* for lower */
181 #include "cmemory.h" /* for uprv_malloc, etc., in ICU */
182 #include "decNumber.h" /* base number library */
183 #include "decNumberLocal.h" /* decNumber local types, etc. */
186 /* Public lookup table used by the D2U macro */
187 const uByte d2utable[DECMAXD2U+1]=D2UTABLE;
189 #define DECVERB 1 /* set to 1 for verbose DECCHECK */
190 #define powers DECPOWERS /* old internal name */
192 /* Local constants */
193 #define DIVIDE 0x80 /* Divide operators */
194 #define REMAINDER 0x40 /* .. */
195 #define DIVIDEINT 0x20 /* .. */
196 #define REMNEAR 0x10 /* .. */
197 #define COMPARE 0x01 /* Compare operators */
198 #define COMPMAX 0x02 /* .. */
199 #define COMPMIN 0x03 /* .. */
200 #define COMPTOTAL 0x04 /* .. */
201 #define COMPNAN 0x05 /* .. [NaN processing] */
202 #define COMPSIG 0x06 /* .. [signaling COMPARE] */
203 #define COMPMAXMAG 0x07 /* .. */
204 #define COMPMINMAG 0x08 /* .. */
206 #define DEC_sNaN 0x40000000 /* local status: sNaN signal */
207 #define BADINT (Int)0x80000000 /* most-negative Int; error indicator */
208 /* Next two indicate an integer >= 10**6, and its parity (bottom bit) */
209 #define BIGEVEN (Int)0x80000002
210 #define BIGODD (Int)0x80000003
212 static Unit uarrone[1]={1}; /* Unit array of 1, used for incrementing */
214 /* Granularity-dependent code */
216 #define eInt Int /* extended integer */
217 #define ueInt uInt /* unsigned extended integer */
218 /* Constant multipliers for divide-by-power-of five using reciprocal */
219 /* multiply, after removing powers of 2 by shifting, and final shift */
220 /* of 17 [we only need up to **4] */
221 static const uInt multies[]={131073, 26215, 5243, 1049, 210};
222 /* QUOT10 -- macro to return the quotient of unit u divided by 10**n */
223 #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
225 /* For DECDPUN>4 non-ANSI-89 64-bit types are needed. */
227 #error decNumber.c: DECUSE64 must be 1 when DECDPUN>4
229 #define eInt Long /* extended integer */
230 #define ueInt uLong /* unsigned extended integer */
234 static decNumber * decAddOp(decNumber *, const decNumber *, const decNumber *,
235 decContext *, uByte, uInt *);
236 static Flag decBiStr(const char *, const char *, const char *);
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 *,
249 decContext *, uInt *);
250 static void decFinalize(decNumber *, decContext *, Int *, uInt *);
251 static Int decGetDigits(Unit *, Int);
252 static Int decGetInt(const decNumber *);
253 static decNumber * decLnOp(decNumber *, const decNumber *,
254 decContext *, uInt *);
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(decNumber *, const decNumber *,
261 const decNumber *, decContext *, Flag,
263 static void decReverse(Unit *, Unit *);
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 *);
269 static Int decShiftToLeast(Unit *, Int, Int);
270 static Int decShiftToMost(Unit *, Int, Int);
271 static void decStatus(decNumber *, uInt, decContext *);
272 static void decToString(const decNumber *, char[], Flag);
273 static decNumber * decTrim(decNumber *, decContext *, Flag, Flag, Int *);
274 static Int decUnitAddSub(const Unit *, Int, const Unit *, Int, Int,
276 static Int decUnitCompare(const Unit *, Int, const Unit *, Int, Int);
279 /* decFinish == decFinalize when no subset arithmetic needed */
280 #define decFinish(a,b,c,d) decFinalize(a,b,c,d)
282 static void decFinish(decNumber *, decContext *, Int *, uInt *);
283 static decNumber * decRoundOperand(const decNumber *, decContext *, uInt *);
287 /* masked special-values bits */
288 #define SPECIALARG (rhs->bits & DECSPECIAL)
289 #define SPECIALARGS ((lhs->bits | rhs->bits) & DECSPECIAL)
292 #define malloc(a) uprv_malloc(a)
293 #define free(a) uprv_free(a)
295 /* Diagnostic macros, etc. */
297 /* Handle malloc/free accounting. If enabled, our accountable routines */
298 /* are used; otherwise the code just goes straight to the system malloc */
299 /* and free routines. */
300 #define malloc(a) decMalloc(a)
301 #define free(a) decFree(a)
302 #define DECFENCE 0x5a /* corruption detector */
303 /* 'Our' malloc and free: */
304 static void *decMalloc(size_t);
305 static void decFree(void *);
306 uInt decAllocBytes=0; /* count of bytes allocated */
307 /* Note that DECALLOC code only checks for storage buffer overflow. */
308 /* To check for memory leaks, the decAllocBytes variable must be */
309 /* checked to be 0 at appropriate times (e.g., after the test */
310 /* harness completes a set of tests). This checking may be unreliable */
311 /* if the testing is done in a multi-thread environment. */
315 /* Optional checking routines. Enabling these means that decNumber */
316 /* and decContext operands to operator routines are checked for */
317 /* correctness. This roughly doubles the execution time of the */
318 /* fastest routines (and adds 600+ bytes), so should not normally be */
319 /* used in 'production'. */
320 /* decCheckInexact is used to check that inexact results have a full */
321 /* complement of digits (where appropriate -- this is not the case */
322 /* for Quantize, for example) */
323 #define DECUNRESU ((decNumber *)(void *)0xffffffff)
324 #define DECUNUSED ((const decNumber *)(void *)0xffffffff)
325 #define DECUNCONT ((decContext *)(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 *);
332 #if DECTRACE || DECCHECK
333 /* Optional trace/debugging routines (may or may not be used) */
334 void decNumberShow(const decNumber *); /* displays the components of a number */
335 static void decDumpAr(char, const Unit *, Int);
338 /* ================================================================== */
340 /* ================================================================== */
342 /* ------------------------------------------------------------------ */
343 /* from-int32 -- conversion from Int or uInt */
345 /* dn is the decNumber to receive the integer */
346 /* in or uin is the integer to be converted */
349 /* No error is possible. */
350 /* ------------------------------------------------------------------ */
351 U_CAPI decNumber * U_EXPORT2 uprv_decNumberFromInt32(decNumber *dn, Int in) {
354 else { /* negative (possibly BADINT) */
355 if (in==BADINT) unsig=(uInt)1073741824*2; /* special case */
356 else unsig=-in; /* invert */
358 /* in is now positive */
359 uprv_decNumberFromUInt32(dn, unsig);
360 if (in<0) dn->bits=DECNEG; /* sign needed */
362 } /* decNumberFromInt32 */
364 U_CAPI decNumber * U_EXPORT2 uprv_decNumberFromUInt32(decNumber *dn, uInt uin) {
365 Unit *up; /* work pointer */
366 uprv_decNumberZero(dn); /* clean */
367 if (uin==0) return dn; /* [or decGetDigits bad call] */
368 for (up=dn->lsu; uin>0; up++) {
369 *up=(Unit)(uin%(DECDPUNMAX+1));
370 uin=uin/(DECDPUNMAX+1);
372 dn->digits=decGetDigits(dn->lsu, up-dn->lsu);
374 } /* decNumberFromUInt32 */
376 /* ------------------------------------------------------------------ */
377 /* to-int32 -- conversion to Int or uInt */
379 /* dn is the decNumber to convert */
380 /* set is the context for reporting errors */
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 */
384 /* it is a NaN, Infinite, or out-of-range. */
385 /* ------------------------------------------------------------------ */
386 U_CAPI Int U_EXPORT2 uprv_decNumberToInt32(const decNumber *dn, decContext *set) {
388 if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
391 /* special or too many digits, or bad exponent */
392 if (dn->bits&DECSPECIAL || dn->digits>10 || dn->exponent!=0) ; /* bad */
393 else { /* is a finite integer with 10 or fewer digits */
395 const Unit *up; /* .. */
396 uInt hi=0, lo; /* .. */
397 up=dn->lsu; /* -> lsu */
398 lo=*up; /* get 1 to 9 digits */
399 #if DECDPUN>1 /* split to higher */
404 /* collect remaining Units, if any, into hi */
405 for (d=DECDPUN; d<dn->digits; up++, d+=DECDPUN) hi+=*up*powers[d-1];
406 /* now low has the lsd, hi the remainder */
407 if (hi>214748364 || (hi==214748364 && lo>7)) { /* out of range? */
408 /* most-negative is a reprieve */
409 if (dn->bits&DECNEG && hi==214748364 && lo==8) return 0x80000000;
410 /* bad -- drop through */
412 else { /* in-range always */
414 if (dn->bits&DECNEG) return -i;
418 uprv_decContextSetStatus(set, DEC_Invalid_operation); /* [may not return] */
420 } /* decNumberToInt32 */
422 U_CAPI uInt U_EXPORT2 uprv_decNumberToUInt32(const decNumber *dn, decContext *set) {
424 if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
426 /* special or too many digits, or bad exponent, or negative (<0) */
427 if (dn->bits&DECSPECIAL || dn->digits>10 || dn->exponent!=0
428 || (dn->bits&DECNEG && !ISZERO(dn))); /* bad */
429 else { /* is a finite integer with 10 or fewer digits */
431 const Unit *up; /* .. */
432 uInt hi=0, lo; /* .. */
433 up=dn->lsu; /* -> lsu */
434 lo=*up; /* get 1 to 9 digits */
435 #if DECDPUN>1 /* split to higher */
440 /* collect remaining Units, if any, into hi */
441 for (d=DECDPUN; d<dn->digits; up++, d+=DECDPUN) hi+=*up*powers[d-1];
443 /* now low has the lsd, hi the remainder */
444 if (hi>429496729 || (hi==429496729 && lo>5)) ; /* no reprieve possible */
445 else return X10(hi)+lo;
447 uprv_decContextSetStatus(set, DEC_Invalid_operation); /* [may not return] */
449 } /* decNumberToUInt32 */
451 /* ------------------------------------------------------------------ */
452 /* to-scientific-string -- conversion to numeric string */
453 /* to-engineering-string -- conversion to numeric string */
455 /* decNumberToString(dn, string); */
456 /* decNumberToEngString(dn, string); */
458 /* dn is the decNumber to convert */
459 /* string is the string where the result will be laid out */
461 /* string must be at least dn->digits+14 characters long */
463 /* No error is possible, and no status can be set. */
464 /* ------------------------------------------------------------------ */
465 U_CAPI char * U_EXPORT2 uprv_decNumberToString(const decNumber *dn, char *string){
466 decToString(dn, string, 0);
468 } /* DecNumberToString */
470 U_CAPI char * U_EXPORT2 uprv_decNumberToEngString(const decNumber *dn, char *string){
471 decToString(dn, string, 1);
473 } /* DecNumberToEngString */
475 /* ------------------------------------------------------------------ */
476 /* to-number -- conversion from numeric string */
478 /* decNumberFromString -- convert string to decNumber */
479 /* dn -- the number structure to fill */
480 /* chars[] -- the string to convert ('\0' terminated) */
481 /* set -- the context used for processing any error, */
482 /* determining the maximum precision available */
483 /* (set.digits), determining the maximum and minimum */
484 /* exponent (set.emax and set.emin), determining if */
485 /* extended values are allowed, and checking the */
486 /* rounding mode if overflow occurs or rounding is */
489 /* The length of the coefficient and the size of the exponent are */
490 /* checked by this routine, so the correct error (Underflow or */
491 /* Overflow) can be reported or rounding applied, as necessary. */
493 /* If bad syntax is detected, the result will be a quiet NaN. */
494 /* ------------------------------------------------------------------ */
495 U_CAPI decNumber * U_EXPORT2 uprv_decNumberFromString(decNumber *dn, const char chars[],
497 Int exponent=0; /* working exponent [assume 0] */
498 uByte bits=0; /* working flags [assume +ve] */
499 Unit *res; /* where result will be built */
500 Unit resbuff[SD2U(DECBUFFER+9)];/* local buffer in case need temporary */
501 /* [+9 allows for ln() constants] */
502 Unit *allocres=NULL; /* -> allocated result, iff allocated */
503 Int d=0; /* count of digits found in decimal part */
504 const char *dotchar=NULL; /* where dot was found */
505 const char *cfirst=chars; /* -> first character of decimal part */
506 const char *last=NULL; /* -> last digit of decimal part */
507 const char *c; /* work */
510 Int cut, out; /* .. */
512 Int residue; /* rounding residue */
513 uInt status=0; /* error code */
516 if (decCheckOperands(DECUNRESU, DECUNUSED, DECUNUSED, set))
517 return uprv_decNumberZero(dn);
520 do { /* status & malloc protection */
521 for (c=chars;; c++) { /* -> input character */
522 if (*c>='0' && *c<='9') { /* test for Arabic digit */
524 d++; /* count of real digits */
525 continue; /* still in decimal part */
527 if (*c=='.' && dotchar==NULL) { /* first '.' */
528 dotchar=c; /* record offset into decimal part */
529 if (c==cfirst) cfirst++; /* first digit must follow */
531 if (c==chars) { /* first in string... */
532 if (*c=='-') { /* valid - sign */
536 if (*c=='+') { /* valid + sign */
540 /* *c is not a digit, or a valid +, -, or '.' */
544 if (last==NULL) { /* no digits yet */
545 status=DEC_Conversion_syntax;/* assume the worst */
546 if (*c=='\0') break; /* and no more to come... */
548 /* if subset then infinities and NaNs are not allowed */
549 if (!set->extended) break; /* hopeless */
551 /* Infinities and NaNs are possible, here */
552 if (dotchar!=NULL) break; /* .. unless had a dot */
553 uprv_decNumberZero(dn); /* be optimistic */
554 if (decBiStr(c, "infinity", "INFINITY")
555 || decBiStr(c, "inf", "INF")) {
556 dn->bits=bits | DECINF;
557 status=0; /* is OK */
558 break; /* all done */
561 /* 2003.09.10 NaNs are now permitted to have a sign */
562 dn->bits=bits | DECNAN; /* assume simple NaN */
563 if (*c=='s' || *c=='S') { /* looks like an sNaN */
565 dn->bits=bits | DECSNAN;
567 if (*c!='n' && *c!='N') break; /* check caseless "NaN" */
569 if (*c!='a' && *c!='A') break; /* .. */
571 if (*c!='n' && *c!='N') break; /* .. */
573 /* now either nothing, or nnnn payload, expected */
574 /* -> start of integer and skip leading 0s [including plain 0] */
575 for (cfirst=c; *cfirst=='0';) cfirst++;
576 if (*cfirst=='\0') { /* "NaN" or "sNaN", maybe with all 0s */
577 status=0; /* it's good */
580 /* something other than 0s; setup last and d as usual [no dots] */
581 for (c=cfirst;; c++, d++) {
582 if (*c<'0' || *c>'9') break; /* test for Arabic digit */
585 if (*c!='\0') break; /* not all digits */
586 if (d>set->digits-1) {
587 /* [NB: payload in a decNumber can be full length unless */
588 /* clamped, in which case can only be digits-1] */
589 if (set->clamp) break;
590 if (d>set->digits) break;
591 } /* too many digits? */
592 /* good; drop through to convert the integer to coefficient */
593 status=0; /* syntax is OK */
594 bits=dn->bits; /* for copy-back */
597 else if (*c!='\0') { /* more to process... */
598 /* had some digits; exponent is only valid sequence now */
599 Flag nege; /* 1=negative exponent */
600 const char *firstexp; /* -> first significant exponent digit */
601 status=DEC_Conversion_syntax;/* assume the worst */
602 if (*c!='e' && *c!='E') break;
603 /* Found 'e' or 'E' -- now process explicit exponent */
604 /* 1998.07.11: sign no longer required */
606 c++; /* to (possible) sign */
607 if (*c=='-') {nege=1; c++;}
608 else if (*c=='+') c++;
611 for (; *c=='0' && *(c+1)!='\0';) c++; /* strip insignificant zeros */
612 firstexp=c; /* save exponent digit place */
614 if (*c<'0' || *c>'9') break; /* not a digit */
615 exponent=X10(exponent)+(Int)*c-(Int)'0';
617 /* if not now on a '\0', *c must not be a digit */
620 /* (this next test must be after the syntax checks) */
621 /* if it was too long the exponent may have wrapped, so check */
622 /* carefully and set it to a certain overflow if wrap possible */
623 if (c>=firstexp+9+1) {
624 if (c>firstexp+9+1 || *firstexp>'1') exponent=DECNUMMAXE*2;
625 /* [up to 1999999999 is OK, for example 1E-1000000998] */
627 if (nege) exponent=-exponent; /* was negative */
628 status=0; /* is OK */
629 } /* stuff after digits */
631 /* Here when whole string has been inspected; syntax is good */
632 /* cfirst->first digit (never dot), last->last digit (ditto) */
634 /* strip leading zeros/dot [leave final 0 if all 0's] */
635 if (*cfirst=='0') { /* [cfirst has stepped over .] */
636 for (c=cfirst; c<last; c++, cfirst++) {
637 if (*c=='.') continue; /* ignore dots */
638 if (*c!='0') break; /* non-zero found */
639 d--; /* 0 stripped */
642 /* make a rapid exit for easy zeros if !extended */
643 if (*cfirst=='0' && !set->extended) {
644 uprv_decNumberZero(dn); /* clean result */
645 break; /* [could be return] */
648 } /* at least one leading 0 */
650 /* Handle decimal point... */
651 if (dotchar!=NULL && dotchar<last) /* non-trailing '.' found? */
652 exponent-=(last-dotchar); /* adjust exponent */
653 /* [we can now ignore the .] */
655 /* OK, the digits string is good. Assemble in the decNumber, or in */
656 /* a temporary units array if rounding is needed */
657 if (d<=set->digits) res=dn->lsu; /* fits into supplied decNumber */
658 else { /* rounding needed */
659 Int needbytes=D2U(d)*sizeof(Unit);/* bytes needed */
660 res=resbuff; /* assume use local buffer */
661 if (needbytes>(Int)sizeof(resbuff)) { /* too big for local */
662 allocres=(Unit *)malloc(needbytes);
663 if (allocres==NULL) {status|=DEC_Insufficient_storage; break;}
667 /* res now -> number lsu, buffer, or allocated storage for Unit array */
669 /* Place the coefficient into the selected Unit array */
670 /* [this is often 70% of the cost of this function when DECDPUN>1] */
672 out=0; /* accumulator */
673 up=res+D2U(d)-1; /* -> msu */
674 cut=d-(up-res)*DECDPUN; /* digits in top unit */
675 for (c=cfirst;; c++) { /* along the digits */
676 if (*c=='.') continue; /* ignore '.' [don't decrement cut] */
677 out=X10(out)+(Int)*c-(Int)'0';
678 if (c==last) break; /* done [never get to trailing '.'] */
680 if (cut>0) continue; /* more for this unit */
681 *up=(Unit)out; /* write unit */
682 up--; /* prepare for unit below.. */
683 cut=DECDPUN; /* .. */
686 *up=(Unit)out; /* write lsu */
691 for (c=last; c>=cfirst; c--) { /* over each character, from least */
692 if (*c=='.') continue; /* ignore . [don't step up] */
693 *up=(Unit)((Int)*c-(Int)'0');
699 dn->exponent=exponent;
702 /* if not in number (too long) shorten into the number */
705 decSetCoeff(dn, set, res, d, &residue, &status);
706 /* always check for overflow or subnormal and round as needed */
707 decFinalize(dn, set, &residue, &status);
709 else { /* no rounding, but may still have overflow or subnormal */
710 /* [these tests are just for performance; finalize repeats them] */
711 if ((dn->exponent-1<set->emin-dn->digits)
712 || (dn->exponent-1>set->emax-set->digits)) {
714 decFinalize(dn, set, &residue, &status);
717 /* decNumberShow(dn); */
718 } while(0); /* [for break] */
720 if (allocres!=NULL) free(allocres); /* drop any storage used */
721 if (status!=0) decStatus(dn, status, set);
723 } /* decNumberFromString */
725 /* ================================================================== */
727 /* ================================================================== */
729 /* ------------------------------------------------------------------ */
730 /* decNumberAbs -- absolute value operator */
732 /* This computes C = abs(A) */
734 /* res is C, the result. C may be A */
736 /* set is the context */
738 /* See also decNumberCopyAbs for a quiet bitwise version of this. */
739 /* C must have space for set->digits digits. */
740 /* ------------------------------------------------------------------ */
741 /* This has the same effect as decNumberPlus unless A is negative, */
742 /* in which case it has the same effect as decNumberMinus. */
743 /* ------------------------------------------------------------------ */
744 U_CAPI decNumber * U_EXPORT2 uprv_decNumberAbs(decNumber *res, const decNumber *rhs,
746 decNumber dzero; /* for 0 */
747 uInt status=0; /* accumulator */
750 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
753 uprv_decNumberZero(&dzero); /* set 0 */
754 dzero.exponent=rhs->exponent; /* [no coefficient expansion] */
755 decAddOp(res, &dzero, rhs, set, (uByte)(rhs->bits & DECNEG), &status);
756 if (status!=0) decStatus(res, status, set);
758 decCheckInexact(res, set);
763 /* ------------------------------------------------------------------ */
764 /* decNumberAdd -- add two Numbers */
766 /* This computes C = A + B */
768 /* res is C, the result. C may be A and/or B (e.g., X=X+X) */
771 /* set is the context */
773 /* C must have space for set->digits digits. */
774 /* ------------------------------------------------------------------ */
775 /* This just calls the routine shared with Subtract */
776 U_CAPI decNumber * U_EXPORT2 uprv_decNumberAdd(decNumber *res, const decNumber *lhs,
777 const decNumber *rhs, decContext *set) {
778 uInt status=0; /* accumulator */
779 decAddOp(res, lhs, rhs, set, 0, &status);
780 if (status!=0) decStatus(res, status, set);
782 decCheckInexact(res, set);
787 /* ------------------------------------------------------------------ */
788 /* decNumberAnd -- AND two Numbers, digitwise */
790 /* This computes C = A & B */
792 /* res is C, the result. C may be A and/or B (e.g., X=X&X) */
795 /* set is the context (used for result length and error report) */
797 /* C must have space for set->digits digits. */
799 /* Logical function restrictions apply (see above); a NaN is */
800 /* returned with Invalid_operation if a restriction is violated. */
801 /* ------------------------------------------------------------------ */
802 U_CAPI decNumber * U_EXPORT2 uprv_decNumberAnd(decNumber *res, const decNumber *lhs,
803 const decNumber *rhs, decContext *set) {
804 const Unit *ua, *ub; /* -> operands */
805 const Unit *msua, *msub; /* -> operand msus */
806 Unit *uc, *msuc; /* -> result and its msu */
807 Int msudigs; /* digits in res msu */
809 if (decCheckOperands(res, lhs, rhs, set)) return res;
812 if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
813 || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
814 decStatus(res, DEC_Invalid_operation, set);
818 /* operands are valid */
819 ua=lhs->lsu; /* bottom-up */
820 ub=rhs->lsu; /* .. */
821 uc=res->lsu; /* .. */
822 msua=ua+D2U(lhs->digits)-1; /* -> msu of lhs */
823 msub=ub+D2U(rhs->digits)-1; /* -> msu of rhs */
824 msuc=uc+D2U(set->digits)-1; /* -> msu of result */
825 msudigs=MSUDIGITS(set->digits); /* [faster than remainder] */
826 for (; uc<=msuc; ua++, ub++, uc++) { /* Unit loop */
827 Unit a, b; /* extract units */
832 *uc=0; /* can now write back */
833 if (a|b) { /* maybe 1 bits to examine */
835 *uc=0; /* can now write back */
836 /* This loop could be unrolled and/or use BIN2BCD tables */
837 for (i=0; i<DECDPUN; i++) {
838 if (a&b&1) *uc=*uc+(Unit)powers[i]; /* effect AND */
844 decStatus(res, DEC_Invalid_operation, set);
847 if (uc==msuc && i==msudigs-1) break; /* just did final digit */
851 /* [here uc-1 is the msu of the result] */
852 res->digits=decGetDigits(res->lsu, uc-res->lsu);
853 res->exponent=0; /* integer */
854 res->bits=0; /* sign=0 */
855 return res; /* [no status to set] */
858 /* ------------------------------------------------------------------ */
859 /* decNumberCompare -- compare two Numbers */
861 /* This computes C = A ? B */
863 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
866 /* set is the context */
868 /* C must have space for one digit (or NaN). */
869 /* ------------------------------------------------------------------ */
870 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCompare(decNumber *res, const decNumber *lhs,
871 const decNumber *rhs, decContext *set) {
872 uInt status=0; /* accumulator */
873 decCompareOp(res, lhs, rhs, set, COMPARE, &status);
874 if (status!=0) decStatus(res, status, set);
876 } /* decNumberCompare */
878 /* ------------------------------------------------------------------ */
879 /* decNumberCompareSignal -- compare, signalling on all NaNs */
881 /* This computes C = A ? B */
883 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
886 /* set is the context */
888 /* C must have space for one digit (or NaN). */
889 /* ------------------------------------------------------------------ */
890 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCompareSignal(decNumber *res, const decNumber *lhs,
891 const decNumber *rhs, decContext *set) {
892 uInt status=0; /* accumulator */
893 decCompareOp(res, lhs, rhs, set, COMPSIG, &status);
894 if (status!=0) decStatus(res, status, set);
896 } /* decNumberCompareSignal */
898 /* ------------------------------------------------------------------ */
899 /* decNumberCompareTotal -- compare two Numbers, using total ordering */
901 /* This computes C = A ? B, under total ordering */
903 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
906 /* set is the context */
908 /* C must have space for one digit; the result will always be one of */
910 /* ------------------------------------------------------------------ */
911 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCompareTotal(decNumber *res, const decNumber *lhs,
912 const decNumber *rhs, decContext *set) {
913 uInt status=0; /* accumulator */
914 decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
915 if (status!=0) decStatus(res, status, set);
917 } /* decNumberCompareTotal */
919 /* ------------------------------------------------------------------ */
920 /* decNumberCompareTotalMag -- compare, total ordering of magnitudes */
922 /* This computes C = |A| ? |B|, under total ordering */
924 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
927 /* set is the context */
929 /* C must have space for one digit; the result will always be one of */
931 /* ------------------------------------------------------------------ */
932 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCompareTotalMag(decNumber *res, const decNumber *lhs,
933 const decNumber *rhs, decContext *set) {
934 uInt status=0; /* accumulator */
935 uInt needbytes; /* for space calculations */
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 */
943 if (decCheckOperands(res, lhs, rhs, set)) return res;
946 do { /* protect allocated storage */
947 /* if either is negative, take a copy and absolute */
948 if (decNumberIsNegative(lhs)) { /* lhs<0 */
950 needbytes=sizeof(decNumber)+(D2U(lhs->digits)-1)*sizeof(Unit);
951 if (needbytes>sizeof(bufa)) { /* need malloc space */
952 allocbufa=(decNumber *)malloc(needbytes);
953 if (allocbufa==NULL) { /* hopeless -- abandon */
954 status|=DEC_Insufficient_storage;
956 a=allocbufa; /* use the allocated space */
958 uprv_decNumberCopy(a, lhs); /* copy content */
959 a->bits&=~DECNEG; /* .. and clear the sign */
960 lhs=a; /* use copy from here on */
962 if (decNumberIsNegative(rhs)) { /* rhs<0 */
964 needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
965 if (needbytes>sizeof(bufb)) { /* need malloc space */
966 allocbufb=(decNumber *)malloc(needbytes);
967 if (allocbufb==NULL) { /* hopeless -- abandon */
968 status|=DEC_Insufficient_storage;
970 b=allocbufb; /* use the allocated space */
972 uprv_decNumberCopy(b, rhs); /* copy content */
973 b->bits&=~DECNEG; /* .. and clear the sign */
974 rhs=b; /* use copy from here on */
976 decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
977 } while(0); /* end protected */
979 if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
980 if (allocbufb!=NULL) free(allocbufb); /* .. */
981 if (status!=0) decStatus(res, status, set);
983 } /* decNumberCompareTotalMag */
985 /* ------------------------------------------------------------------ */
986 /* decNumberDivide -- divide one number by another */
988 /* This computes C = A / B */
990 /* res is C, the result. C may be A and/or B (e.g., X=X/X) */
993 /* set is the context */
995 /* C must have space for set->digits digits. */
996 /* ------------------------------------------------------------------ */
997 U_CAPI decNumber * U_EXPORT2 uprv_decNumberDivide(decNumber *res, const decNumber *lhs,
998 const decNumber *rhs, decContext *set) {
999 uInt status=0; /* accumulator */
1000 decDivideOp(res, lhs, rhs, set, DIVIDE, &status);
1001 if (status!=0) decStatus(res, status, set);
1003 decCheckInexact(res, set);
1006 } /* decNumberDivide */
1008 /* ------------------------------------------------------------------ */
1009 /* decNumberDivideInteger -- divide and return integer quotient */
1011 /* This computes C = A # B, where # is the integer divide operator */
1013 /* res is C, the result. C may be A and/or B (e.g., X=X#X) */
1016 /* set is the context */
1018 /* C must have space for set->digits digits. */
1019 /* ------------------------------------------------------------------ */
1020 U_CAPI decNumber * U_EXPORT2 uprv_decNumberDivideInteger(decNumber *res, const decNumber *lhs,
1021 const decNumber *rhs, decContext *set) {
1022 uInt status=0; /* accumulator */
1023 decDivideOp(res, lhs, rhs, set, DIVIDEINT, &status);
1024 if (status!=0) decStatus(res, status, set);
1026 } /* decNumberDivideInteger */
1028 /* ------------------------------------------------------------------ */
1029 /* decNumberExp -- exponentiation */
1031 /* This computes C = exp(A) */
1033 /* res is C, the result. C may be A */
1035 /* set is the context; note that rounding mode has no effect */
1037 /* C must have space for set->digits digits. */
1039 /* Mathematical function restrictions apply (see above); a NaN is */
1040 /* returned with Invalid_operation if a restriction is violated. */
1042 /* Finite results will always be full precision and Inexact, except */
1043 /* when A is a zero or -Infinity (giving 1 or 0 respectively). */
1045 /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will */
1046 /* almost always be correctly rounded, but may be up to 1 ulp in */
1047 /* error in rare cases. */
1048 /* ------------------------------------------------------------------ */
1049 /* This is a wrapper for decExpOp which can handle the slightly wider */
1050 /* (double) range needed by Ln (which has to be able to calculate */
1051 /* exp(-a) where a can be the tiniest number (Ntiny). */
1052 /* ------------------------------------------------------------------ */
1053 U_CAPI decNumber * U_EXPORT2 uprv_decNumberExp(decNumber *res, const decNumber *rhs,
1055 uInt status=0; /* accumulator */
1057 decNumber *allocrhs=NULL; /* non-NULL if rounded rhs allocated */
1061 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1064 /* Check restrictions; these restrictions ensure that if h=8 (see */
1065 /* decExpOp) then the result will either overflow or underflow to 0. */
1066 /* Other math functions restrict the input range, too, for inverses. */
1067 /* If not violated then carry out the operation. */
1068 if (!decCheckMath(rhs, set, &status)) do { /* protect allocation */
1070 if (!set->extended) {
1071 /* reduce operand and set lostDigits status, as needed */
1072 if (rhs->digits>set->digits) {
1073 allocrhs=decRoundOperand(rhs, set, &status);
1074 if (allocrhs==NULL) break;
1079 decExpOp(res, rhs, set, &status);
1080 } while(0); /* end protected */
1083 if (allocrhs !=NULL) free(allocrhs); /* drop any storage used */
1085 /* apply significant status */
1086 if (status!=0) decStatus(res, status, set);
1088 decCheckInexact(res, set);
1091 } /* decNumberExp */
1093 /* ------------------------------------------------------------------ */
1094 /* decNumberFMA -- fused multiply add */
1096 /* This computes D = (A * B) + C with only one rounding */
1098 /* res is D, the result. D may be A or B or C (e.g., X=FMA(X,X,X)) */
1101 /* fhs is C [far hand side] */
1102 /* set is the context */
1104 /* Mathematical function restrictions apply (see above); a NaN is */
1105 /* returned with Invalid_operation if a restriction is violated. */
1107 /* C must have space for set->digits digits. */
1108 /* ------------------------------------------------------------------ */
1109 U_CAPI decNumber * U_EXPORT2 uprv_decNumberFMA(decNumber *res, const decNumber *lhs,
1110 const decNumber *rhs, const decNumber *fhs,
1112 uInt status=0; /* accumulator */
1113 decContext dcmul; /* context for the multiplication */
1114 uInt needbytes; /* for space calculations */
1115 decNumber bufa[D2N(DECBUFFER*2+1)];
1116 decNumber *allocbufa=NULL; /* -> allocated bufa, iff allocated */
1117 decNumber *acc; /* accumulator pointer */
1118 decNumber dzero; /* work */
1121 if (decCheckOperands(res, lhs, rhs, set)) return res;
1122 if (decCheckOperands(res, fhs, DECUNUSED, set)) return res;
1125 do { /* protect allocated storage */
1127 if (!set->extended) { /* [undefined if subset] */
1128 status|=DEC_Invalid_operation;
1131 /* Check math restrictions [these ensure no overflow or underflow] */
1132 if ((!decNumberIsSpecial(lhs) && decCheckMath(lhs, set, &status))
1133 || (!decNumberIsSpecial(rhs) && decCheckMath(rhs, set, &status))
1134 || (!decNumberIsSpecial(fhs) && decCheckMath(fhs, set, &status))) break;
1135 /* set up context for multiply */
1137 dcmul.digits=lhs->digits+rhs->digits; /* just enough */
1138 /* [The above may be an over-estimate for subset arithmetic, but that's OK] */
1139 dcmul.emax=DEC_MAX_EMAX; /* effectively unbounded .. */
1140 dcmul.emin=DEC_MIN_EMIN; /* [thanks to Math restrictions] */
1141 /* set up decNumber space to receive the result of the multiply */
1142 acc=bufa; /* may fit */
1143 needbytes=sizeof(decNumber)+(D2U(dcmul.digits)-1)*sizeof(Unit);
1144 if (needbytes>sizeof(bufa)) { /* need malloc space */
1145 allocbufa=(decNumber *)malloc(needbytes);
1146 if (allocbufa==NULL) { /* hopeless -- abandon */
1147 status|=DEC_Insufficient_storage;
1149 acc=allocbufa; /* use the allocated space */
1151 /* multiply with extended range and necessary precision */
1152 /*printf("emin=%ld\n", dcmul.emin); */
1153 decMultiplyOp(acc, lhs, rhs, &dcmul, &status);
1154 /* Only Invalid operation (from sNaN or Inf * 0) is possible in */
1155 /* status; if either is seen than ignore fhs (in case it is */
1156 /* another sNaN) and set acc to NaN unless we had an sNaN */
1157 /* [decMultiplyOp leaves that to caller] */
1158 /* Note sNaN has to go through addOp to shorten payload if */
1160 if ((status&DEC_Invalid_operation)!=0) {
1161 if (!(status&DEC_sNaN)) { /* but be true invalid */
1162 uprv_decNumberZero(res); /* acc not yet set */
1166 uprv_decNumberZero(&dzero); /* make 0 (any non-NaN would do) */
1167 fhs=&dzero; /* use that */
1170 else { /* multiply was OK */
1171 if (status!=0) printf("Status=%08lx after FMA multiply\n", (LI)status);
1174 /* add the third operand and result -> res, and all is done */
1175 decAddOp(res, acc, fhs, set, 0, &status);
1176 } while(0); /* end protected */
1178 if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
1179 if (status!=0) decStatus(res, status, set);
1181 decCheckInexact(res, set);
1184 } /* decNumberFMA */
1186 /* ------------------------------------------------------------------ */
1187 /* decNumberInvert -- invert a Number, digitwise */
1189 /* This computes C = ~A */
1191 /* res is C, the result. C may be A (e.g., X=~X) */
1193 /* set is the context (used for result length and error report) */
1195 /* C must have space for set->digits digits. */
1197 /* Logical function restrictions apply (see above); a NaN is */
1198 /* returned with Invalid_operation if a restriction is violated. */
1199 /* ------------------------------------------------------------------ */
1200 U_CAPI decNumber * U_EXPORT2 uprv_decNumberInvert(decNumber *res, const decNumber *rhs,
1202 const Unit *ua, *msua; /* -> operand and its msu */
1203 Unit *uc, *msuc; /* -> result and its msu */
1204 Int msudigs; /* digits in res msu */
1206 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1209 if (rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
1210 decStatus(res, DEC_Invalid_operation, set);
1213 /* operand is valid */
1214 ua=rhs->lsu; /* bottom-up */
1215 uc=res->lsu; /* .. */
1216 msua=ua+D2U(rhs->digits)-1; /* -> msu of rhs */
1217 msuc=uc+D2U(set->digits)-1; /* -> msu of result */
1218 msudigs=MSUDIGITS(set->digits); /* [faster than remainder] */
1219 for (; uc<=msuc; ua++, uc++) { /* Unit loop */
1220 Unit a; /* extract unit */
1221 Int i, j; /* work */
1224 *uc=0; /* can now write back */
1225 /* always need to examine all bits in rhs */
1226 /* This loop could be unrolled and/or use BIN2BCD tables */
1227 for (i=0; i<DECDPUN; i++) {
1228 if ((~a)&1) *uc=*uc+(Unit)powers[i]; /* effect INVERT */
1232 decStatus(res, DEC_Invalid_operation, set);
1235 if (uc==msuc && i==msudigs-1) break; /* just did final digit */
1238 /* [here uc-1 is the msu of the result] */
1239 res->digits=decGetDigits(res->lsu, uc-res->lsu);
1240 res->exponent=0; /* integer */
1241 res->bits=0; /* sign=0 */
1242 return res; /* [no status to set] */
1243 } /* decNumberInvert */
1245 /* ------------------------------------------------------------------ */
1246 /* decNumberLn -- natural logarithm */
1248 /* This computes C = ln(A) */
1250 /* res is C, the result. C may be A */
1252 /* set is the context; note that rounding mode has no effect */
1254 /* C must have space for set->digits digits. */
1256 /* Notable cases: */
1257 /* A<0 -> Invalid */
1258 /* A=0 -> -Infinity (Exact) */
1259 /* A=+Infinity -> +Infinity (Exact) */
1260 /* A=1 exactly -> 0 (Exact) */
1262 /* Mathematical function restrictions apply (see above); a NaN is */
1263 /* returned with Invalid_operation if a restriction is violated. */
1265 /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will */
1266 /* almost always be correctly rounded, but may be up to 1 ulp in */
1267 /* error in rare cases. */
1268 /* ------------------------------------------------------------------ */
1269 /* This is a wrapper for decLnOp which can handle the slightly wider */
1270 /* (+11) range needed by Ln, Log10, etc. (which may have to be able */
1271 /* to calculate at p+e+2). */
1272 /* ------------------------------------------------------------------ */
1273 U_CAPI decNumber * U_EXPORT2 uprv_decNumberLn(decNumber *res, const decNumber *rhs,
1275 uInt status=0; /* accumulator */
1277 decNumber *allocrhs=NULL; /* non-NULL if rounded rhs allocated */
1281 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1284 /* Check restrictions; this is a math function; if not violated */
1285 /* then carry out the operation. */
1286 if (!decCheckMath(rhs, set, &status)) do { /* protect allocation */
1288 if (!set->extended) {
1289 /* reduce operand and set lostDigits status, as needed */
1290 if (rhs->digits>set->digits) {
1291 allocrhs=decRoundOperand(rhs, set, &status);
1292 if (allocrhs==NULL) break;
1295 /* special check in subset for rhs=0 */
1296 if (ISZERO(rhs)) { /* +/- zeros -> error */
1297 status|=DEC_Invalid_operation;
1301 decLnOp(res, rhs, set, &status);
1302 } while(0); /* end protected */
1305 if (allocrhs !=NULL) free(allocrhs); /* drop any storage used */
1307 /* apply significant status */
1308 if (status!=0) decStatus(res, status, set);
1310 decCheckInexact(res, set);
1315 /* ------------------------------------------------------------------ */
1316 /* decNumberLogB - get adjusted exponent, by 754 rules */
1318 /* This computes C = adjustedexponent(A) */
1320 /* res is C, the result. C may be A */
1322 /* set is the context, used only for digits and status */
1324 /* C must have space for 10 digits (A might have 10**9 digits and */
1325 /* an exponent of +999999999, or one digit and an exponent of */
1328 /* This returns the adjusted exponent of A after (in theory) padding */
1329 /* with zeros on the right to set->digits digits while keeping the */
1330 /* same value. The exponent is not limited by emin/emax. */
1332 /* Notable cases: */
1333 /* A<0 -> Use |A| */
1334 /* A=0 -> -Infinity (Division by zero) */
1335 /* A=Infinite -> +Infinity (Exact) */
1336 /* A=1 exactly -> 0 (Exact) */
1337 /* NaNs are propagated as usual */
1338 /* ------------------------------------------------------------------ */
1339 U_CAPI decNumber * U_EXPORT2 uprv_decNumberLogB(decNumber *res, const decNumber *rhs,
1341 uInt status=0; /* accumulator */
1344 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1347 /* NaNs as usual; Infinities return +Infinity; 0->oops */
1348 if (decNumberIsNaN(rhs)) decNaNs(res, rhs, NULL, set, &status);
1349 else if (decNumberIsInfinite(rhs)) uprv_decNumberCopyAbs(res, rhs);
1350 else if (decNumberIsZero(rhs)) {
1351 uprv_decNumberZero(res); /* prepare for Infinity */
1352 res->bits=DECNEG|DECINF; /* -Infinity */
1353 status|=DEC_Division_by_zero; /* as per 754 */
1355 else { /* finite non-zero */
1356 Int ae=rhs->exponent+rhs->digits-1; /* adjusted exponent */
1357 uprv_decNumberFromInt32(res, ae); /* lay it out */
1360 if (status!=0) decStatus(res, status, set);
1362 } /* decNumberLogB */
1364 /* ------------------------------------------------------------------ */
1365 /* decNumberLog10 -- logarithm in base 10 */
1367 /* This computes C = log10(A) */
1369 /* res is C, the result. C may be A */
1371 /* set is the context; note that rounding mode has no effect */
1373 /* C must have space for set->digits digits. */
1375 /* Notable cases: */
1376 /* A<0 -> Invalid */
1377 /* A=0 -> -Infinity (Exact) */
1378 /* A=+Infinity -> +Infinity (Exact) */
1379 /* A=10**n (if n is an integer) -> n (Exact) */
1381 /* Mathematical function restrictions apply (see above); a NaN is */
1382 /* returned with Invalid_operation if a restriction is violated. */
1384 /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will */
1385 /* almost always be correctly rounded, but may be up to 1 ulp in */
1386 /* error in rare cases. */
1387 /* ------------------------------------------------------------------ */
1388 /* This calculates ln(A)/ln(10) using appropriate precision. For */
1389 /* ln(A) this is the max(p, rhs->digits + t) + 3, where p is the */
1390 /* requested digits and t is the number of digits in the exponent */
1391 /* (maximum 6). For ln(10) it is p + 3; this is often handled by the */
1392 /* fastpath in decLnOp. The final division is done to the requested */
1394 /* ------------------------------------------------------------------ */
1395 #pragma clang diagnostic push
1396 #pragma clang diagnostic ignored "-Warray-bounds"
1397 U_CAPI decNumber * U_EXPORT2 uprv_decNumberLog10(decNumber *res, const decNumber *rhs,
1399 uInt status=0, ignore=0; /* status accumulators */
1400 uInt needbytes; /* for space calculations */
1401 Int p; /* working precision */
1402 Int t; /* digits in exponent of A */
1404 /* buffers for a and b working decimals */
1405 /* (adjustment calculator, same size) */
1406 decNumber bufa[D2N(DECBUFFER+2)];
1407 decNumber *allocbufa=NULL; /* -> allocated bufa, iff allocated */
1408 decNumber *a=bufa; /* temporary a */
1409 decNumber bufb[D2N(DECBUFFER+2)];
1410 decNumber *allocbufb=NULL; /* -> allocated bufb, iff allocated */
1411 decNumber *b=bufb; /* temporary b */
1412 decNumber bufw[D2N(10)]; /* working 2-10 digit number */
1413 decNumber *w=bufw; /* .. */
1415 decNumber *allocrhs=NULL; /* non-NULL if rounded rhs allocated */
1418 decContext aset; /* working context */
1421 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1424 /* Check restrictions; this is a math function; if not violated */
1425 /* then carry out the operation. */
1426 if (!decCheckMath(rhs, set, &status)) do { /* protect malloc */
1428 if (!set->extended) {
1429 /* reduce operand and set lostDigits status, as needed */
1430 if (rhs->digits>set->digits) {
1431 allocrhs=decRoundOperand(rhs, set, &status);
1432 if (allocrhs==NULL) break;
1435 /* special check in subset for rhs=0 */
1436 if (ISZERO(rhs)) { /* +/- zeros -> error */
1437 status|=DEC_Invalid_operation;
1442 uprv_decContextDefault(&aset, DEC_INIT_DECIMAL64); /* clean context */
1444 /* handle exact powers of 10; only check if +ve finite */
1445 if (!(rhs->bits&(DECNEG|DECSPECIAL)) && !ISZERO(rhs)) {
1446 Int residue=0; /* (no residue) */
1447 uInt copystat=0; /* clean status */
1449 /* round to a single digit... */
1451 decCopyFit(w, rhs, &aset, &residue, ©stat); /* copy & shorten */
1452 /* if exact and the digit is 1, rhs is a power of 10 */
1453 if (!(copystat&DEC_Inexact) && w->lsu[0]==1) {
1454 /* the exponent, conveniently, is the power of 10; making */
1455 /* this the result needs a little care as it might not fit, */
1456 /* so first convert it into the working number, and then move */
1458 uprv_decNumberFromInt32(w, w->exponent);
1460 decCopyFit(res, w, set, &residue, &status); /* copy & round */
1461 decFinish(res, set, &residue, &status); /* cleanup/set flags */
1463 } /* not a power of 10 */
1464 } /* not a candidate for exact */
1466 /* simplify the information-content calculation to use 'total */
1467 /* number of digits in a, including exponent' as compared to the */
1468 /* requested digits, as increasing this will only rarely cost an */
1469 /* iteration in ln(a) anyway */
1470 t=6; /* it can never be >6 */
1472 /* allocate space when needed... */
1473 p=(rhs->digits+t>set->digits?rhs->digits+t:set->digits)+3;
1474 needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
1475 if (needbytes>sizeof(bufa)) { /* need malloc space */
1476 allocbufa=(decNumber *)malloc(needbytes);
1477 if (allocbufa==NULL) { /* hopeless -- abandon */
1478 status|=DEC_Insufficient_storage;
1480 a=allocbufa; /* use the allocated space */
1482 aset.digits=p; /* as calculated */
1483 aset.emax=DEC_MAX_MATH; /* usual bounds */
1484 aset.emin=-DEC_MAX_MATH; /* .. */
1485 aset.clamp=0; /* and no concrete format */
1486 decLnOp(a, rhs, &aset, &status); /* a=ln(rhs) */
1488 /* skip the division if the result so far is infinite, NaN, or */
1489 /* zero, or there was an error; note NaN from sNaN needs copy */
1490 if (status&DEC_NaNs && !(status&DEC_sNaN)) break;
1491 if (a->bits&DECSPECIAL || ISZERO(a)) {
1492 uprv_decNumberCopy(res, a); /* [will fit] */
1495 /* for ln(10) an extra 3 digits of precision are needed */
1497 needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
1498 if (needbytes>sizeof(bufb)) { /* need malloc space */
1499 allocbufb=(decNumber *)malloc(needbytes);
1500 if (allocbufb==NULL) { /* hopeless -- abandon */
1501 status|=DEC_Insufficient_storage;
1503 b=allocbufb; /* use the allocated space */
1505 uprv_decNumberZero(w); /* set up 10... */
1507 w->lsu[1]=1; w->lsu[0]=0; /* .. */
1509 w->lsu[0]=10; /* .. */
1511 w->digits=2; /* .. */
1514 decLnOp(b, w, &aset, &ignore); /* b=ln(10) */
1516 aset.digits=set->digits; /* for final divide */
1517 decDivideOp(res, a, b, &aset, DIVIDE, &status); /* into result */
1518 } while(0); /* [for break] */
1520 if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
1521 if (allocbufb!=NULL) free(allocbufb); /* .. */
1523 if (allocrhs !=NULL) free(allocrhs); /* .. */
1525 /* apply significant status */
1526 if (status!=0) decStatus(res, status, set);
1528 decCheckInexact(res, set);
1531 } /* decNumberLog10 */
1532 #pragma clang diagnostic pop
1534 /* ------------------------------------------------------------------ */
1535 /* decNumberMax -- compare two Numbers and return the maximum */
1537 /* This computes C = A ? B, returning the maximum by 754 rules */
1539 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
1542 /* set is the context */
1544 /* C must have space for set->digits digits. */
1545 /* ------------------------------------------------------------------ */
1546 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMax(decNumber *res, const decNumber *lhs,
1547 const decNumber *rhs, decContext *set) {
1548 uInt status=0; /* accumulator */
1549 decCompareOp(res, lhs, rhs, set, COMPMAX, &status);
1550 if (status!=0) decStatus(res, status, set);
1552 decCheckInexact(res, set);
1555 } /* decNumberMax */
1557 /* ------------------------------------------------------------------ */
1558 /* decNumberMaxMag -- compare and return the maximum by magnitude */
1560 /* This computes C = A ? B, returning the maximum by 754 rules */
1562 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
1565 /* set is the context */
1567 /* C must have space for set->digits digits. */
1568 /* ------------------------------------------------------------------ */
1569 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMaxMag(decNumber *res, const decNumber *lhs,
1570 const decNumber *rhs, decContext *set) {
1571 uInt status=0; /* accumulator */
1572 decCompareOp(res, lhs, rhs, set, COMPMAXMAG, &status);
1573 if (status!=0) decStatus(res, status, set);
1575 decCheckInexact(res, set);
1578 } /* decNumberMaxMag */
1580 /* ------------------------------------------------------------------ */
1581 /* decNumberMin -- compare two Numbers and return the minimum */
1583 /* This computes C = A ? B, returning the minimum by 754 rules */
1585 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
1588 /* set is the context */
1590 /* C must have space for set->digits digits. */
1591 /* ------------------------------------------------------------------ */
1592 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMin(decNumber *res, const decNumber *lhs,
1593 const decNumber *rhs, decContext *set) {
1594 uInt status=0; /* accumulator */
1595 decCompareOp(res, lhs, rhs, set, COMPMIN, &status);
1596 if (status!=0) decStatus(res, status, set);
1598 decCheckInexact(res, set);
1601 } /* decNumberMin */
1603 /* ------------------------------------------------------------------ */
1604 /* decNumberMinMag -- compare and return the minimum by magnitude */
1606 /* This computes C = A ? B, returning the minimum by 754 rules */
1608 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
1611 /* set is the context */
1613 /* C must have space for set->digits digits. */
1614 /* ------------------------------------------------------------------ */
1615 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMinMag(decNumber *res, const decNumber *lhs,
1616 const decNumber *rhs, decContext *set) {
1617 uInt status=0; /* accumulator */
1618 decCompareOp(res, lhs, rhs, set, COMPMINMAG, &status);
1619 if (status!=0) decStatus(res, status, set);
1621 decCheckInexact(res, set);
1624 } /* decNumberMinMag */
1626 /* ------------------------------------------------------------------ */
1627 /* decNumberMinus -- prefix minus operator */
1629 /* This computes C = 0 - A */
1631 /* res is C, the result. C may be A */
1633 /* set is the context */
1635 /* See also decNumberCopyNegate for a quiet bitwise version of this. */
1636 /* C must have space for set->digits digits. */
1637 /* ------------------------------------------------------------------ */
1638 /* Simply use AddOp for the subtract, which will do the necessary. */
1639 /* ------------------------------------------------------------------ */
1640 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMinus(decNumber *res, const decNumber *rhs,
1643 uInt status=0; /* accumulator */
1646 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1649 uprv_decNumberZero(&dzero); /* make 0 */
1650 dzero.exponent=rhs->exponent; /* [no coefficient expansion] */
1651 decAddOp(res, &dzero, rhs, set, DECNEG, &status);
1652 if (status!=0) decStatus(res, status, set);
1654 decCheckInexact(res, set);
1657 } /* decNumberMinus */
1659 /* ------------------------------------------------------------------ */
1660 /* decNumberNextMinus -- next towards -Infinity */
1662 /* This computes C = A - infinitesimal, rounded towards -Infinity */
1664 /* res is C, the result. C may be A */
1666 /* set is the context */
1668 /* This is a generalization of 754 NextDown. */
1669 /* ------------------------------------------------------------------ */
1670 U_CAPI decNumber * U_EXPORT2 uprv_decNumberNextMinus(decNumber *res, const decNumber *rhs,
1672 decNumber dtiny; /* constant */
1673 decContext workset=*set; /* work */
1674 uInt status=0; /* accumulator */
1676 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1679 /* +Infinity is the special case */
1680 if ((rhs->bits&(DECINF|DECNEG))==DECINF) {
1681 decSetMaxValue(res, set); /* is +ve */
1682 /* there is no status to set */
1685 uprv_decNumberZero(&dtiny); /* start with 0 */
1686 dtiny.lsu[0]=1; /* make number that is .. */
1687 dtiny.exponent=DEC_MIN_EMIN-1; /* .. smaller than tiniest */
1688 workset.round=DEC_ROUND_FLOOR;
1689 decAddOp(res, rhs, &dtiny, &workset, DECNEG, &status);
1690 status&=DEC_Invalid_operation|DEC_sNaN; /* only sNaN Invalid please */
1691 if (status!=0) decStatus(res, status, set);
1693 } /* decNumberNextMinus */
1695 /* ------------------------------------------------------------------ */
1696 /* decNumberNextPlus -- next towards +Infinity */
1698 /* This computes C = A + infinitesimal, rounded towards +Infinity */
1700 /* res is C, the result. C may be A */
1702 /* set is the context */
1704 /* This is a generalization of 754 NextUp. */
1705 /* ------------------------------------------------------------------ */
1706 U_CAPI decNumber * U_EXPORT2 uprv_decNumberNextPlus(decNumber *res, const decNumber *rhs,
1708 decNumber dtiny; /* constant */
1709 decContext workset=*set; /* work */
1710 uInt status=0; /* accumulator */
1712 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1715 /* -Infinity is the special case */
1716 if ((rhs->bits&(DECINF|DECNEG))==(DECINF|DECNEG)) {
1717 decSetMaxValue(res, set);
1718 res->bits=DECNEG; /* negative */
1719 /* there is no status to set */
1722 uprv_decNumberZero(&dtiny); /* start with 0 */
1723 dtiny.lsu[0]=1; /* make number that is .. */
1724 dtiny.exponent=DEC_MIN_EMIN-1; /* .. smaller than tiniest */
1725 workset.round=DEC_ROUND_CEILING;
1726 decAddOp(res, rhs, &dtiny, &workset, 0, &status);
1727 status&=DEC_Invalid_operation|DEC_sNaN; /* only sNaN Invalid please */
1728 if (status!=0) decStatus(res, status, set);
1730 } /* decNumberNextPlus */
1732 /* ------------------------------------------------------------------ */
1733 /* decNumberNextToward -- next towards rhs */
1735 /* This computes C = A +/- infinitesimal, rounded towards */
1736 /* +/-Infinity in the direction of B, as per 754-1985 nextafter */
1737 /* modified during revision but dropped from 754-2008. */
1739 /* res is C, the result. C may be A or B. */
1742 /* set is the context */
1744 /* This is a generalization of 754-1985 NextAfter. */
1745 /* ------------------------------------------------------------------ */
1746 U_CAPI decNumber * U_EXPORT2 uprv_decNumberNextToward(decNumber *res, const decNumber *lhs,
1747 const decNumber *rhs, decContext *set) {
1748 decNumber dtiny; /* constant */
1749 decContext workset=*set; /* work */
1750 Int result; /* .. */
1751 uInt status=0; /* accumulator */
1753 if (decCheckOperands(res, lhs, rhs, set)) return res;
1756 if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs)) {
1757 decNaNs(res, lhs, rhs, set, &status);
1759 else { /* Is numeric, so no chance of sNaN Invalid, etc. */
1760 result=decCompare(lhs, rhs, 0); /* sign matters */
1761 if (result==BADINT) status|=DEC_Insufficient_storage; /* rare */
1762 else { /* valid compare */
1763 if (result==0) uprv_decNumberCopySign(res, lhs, rhs); /* easy */
1764 else { /* differ: need NextPlus or NextMinus */
1765 uByte sub; /* add or subtract */
1766 if (result<0) { /* lhs<rhs, do nextplus */
1767 /* -Infinity is the special case */
1768 if ((lhs->bits&(DECINF|DECNEG))==(DECINF|DECNEG)) {
1769 decSetMaxValue(res, set);
1770 res->bits=DECNEG; /* negative */
1771 return res; /* there is no status to set */
1773 workset.round=DEC_ROUND_CEILING;
1774 sub=0; /* add, please */
1776 else { /* lhs>rhs, do nextminus */
1777 /* +Infinity is the special case */
1778 if ((lhs->bits&(DECINF|DECNEG))==DECINF) {
1779 decSetMaxValue(res, set);
1780 return res; /* there is no status to set */
1782 workset.round=DEC_ROUND_FLOOR;
1783 sub=DECNEG; /* subtract, please */
1785 uprv_decNumberZero(&dtiny); /* start with 0 */
1786 dtiny.lsu[0]=1; /* make number that is .. */
1787 dtiny.exponent=DEC_MIN_EMIN-1; /* .. smaller than tiniest */
1788 decAddOp(res, lhs, &dtiny, &workset, sub, &status); /* + or - */
1789 /* turn off exceptions if the result is a normal number */
1790 /* (including Nmin), otherwise let all status through */
1791 if (uprv_decNumberIsNormal(res, set)) status=0;
1795 if (status!=0) decStatus(res, status, set);
1797 } /* decNumberNextToward */
1799 /* ------------------------------------------------------------------ */
1800 /* decNumberOr -- OR two Numbers, digitwise */
1802 /* This computes C = A | B */
1804 /* res is C, the result. C may be A and/or B (e.g., X=X|X) */
1807 /* set is the context (used for result length and error report) */
1809 /* C must have space for set->digits digits. */
1811 /* Logical function restrictions apply (see above); a NaN is */
1812 /* returned with Invalid_operation if a restriction is violated. */
1813 /* ------------------------------------------------------------------ */
1814 U_CAPI decNumber * U_EXPORT2 uprv_decNumberOr(decNumber *res, const decNumber *lhs,
1815 const decNumber *rhs, decContext *set) {
1816 const Unit *ua, *ub; /* -> operands */
1817 const Unit *msua, *msub; /* -> operand msus */
1818 Unit *uc, *msuc; /* -> result and its msu */
1819 Int msudigs; /* digits in res msu */
1821 if (decCheckOperands(res, lhs, rhs, set)) return res;
1824 if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
1825 || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
1826 decStatus(res, DEC_Invalid_operation, set);
1829 /* operands are valid */
1830 ua=lhs->lsu; /* bottom-up */
1831 ub=rhs->lsu; /* .. */
1832 uc=res->lsu; /* .. */
1833 msua=ua+D2U(lhs->digits)-1; /* -> msu of lhs */
1834 msub=ub+D2U(rhs->digits)-1; /* -> msu of rhs */
1835 msuc=uc+D2U(set->digits)-1; /* -> msu of result */
1836 msudigs=MSUDIGITS(set->digits); /* [faster than remainder] */
1837 for (; uc<=msuc; ua++, ub++, uc++) { /* Unit loop */
1838 Unit a, b; /* extract units */
1843 *uc=0; /* can now write back */
1844 if (a|b) { /* maybe 1 bits to examine */
1846 /* This loop could be unrolled and/or use BIN2BCD tables */
1847 for (i=0; i<DECDPUN; i++) {
1848 if ((a|b)&1) *uc=*uc+(Unit)powers[i]; /* effect OR */
1854 decStatus(res, DEC_Invalid_operation, set);
1857 if (uc==msuc && i==msudigs-1) break; /* just did final digit */
1861 /* [here uc-1 is the msu of the result] */
1862 res->digits=decGetDigits(res->lsu, uc-res->lsu);
1863 res->exponent=0; /* integer */
1864 res->bits=0; /* sign=0 */
1865 return res; /* [no status to set] */
1868 /* ------------------------------------------------------------------ */
1869 /* decNumberPlus -- prefix plus operator */
1871 /* This computes C = 0 + A */
1873 /* res is C, the result. C may be A */
1875 /* set is the context */
1877 /* See also decNumberCopy for a quiet bitwise version of this. */
1878 /* C must have space for set->digits digits. */
1879 /* ------------------------------------------------------------------ */
1880 /* This simply uses AddOp; Add will take fast path after preparing A. */
1881 /* Performance is a concern here, as this routine is often used to */
1882 /* check operands and apply rounding and overflow/underflow testing. */
1883 /* ------------------------------------------------------------------ */
1884 U_CAPI decNumber * U_EXPORT2 uprv_decNumberPlus(decNumber *res, const decNumber *rhs,
1887 uInt status=0; /* accumulator */
1889 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1892 uprv_decNumberZero(&dzero); /* make 0 */
1893 dzero.exponent=rhs->exponent; /* [no coefficient expansion] */
1894 decAddOp(res, &dzero, rhs, set, 0, &status);
1895 if (status!=0) decStatus(res, status, set);
1897 decCheckInexact(res, set);
1900 } /* decNumberPlus */
1902 /* ------------------------------------------------------------------ */
1903 /* decNumberMultiply -- multiply two Numbers */
1905 /* This computes C = A x B */
1907 /* res is C, the result. C may be A and/or B (e.g., X=X+X) */
1910 /* set is the context */
1912 /* C must have space for set->digits digits. */
1913 /* ------------------------------------------------------------------ */
1914 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMultiply(decNumber *res, const decNumber *lhs,
1915 const decNumber *rhs, decContext *set) {
1916 uInt status=0; /* accumulator */
1917 decMultiplyOp(res, lhs, rhs, set, &status);
1918 if (status!=0) decStatus(res, status, set);
1920 decCheckInexact(res, set);
1923 } /* decNumberMultiply */
1925 /* ------------------------------------------------------------------ */
1926 /* decNumberPower -- raise a number to a power */
1928 /* This computes C = A ** B */
1930 /* res is C, the result. C may be A and/or B (e.g., X=X**X) */
1933 /* set is the context */
1935 /* C must have space for set->digits digits. */
1937 /* Mathematical function restrictions apply (see above); a NaN is */
1938 /* returned with Invalid_operation if a restriction is violated. */
1940 /* However, if 1999999997<=B<=999999999 and B is an integer then the */
1941 /* restrictions on A and the context are relaxed to the usual bounds, */
1942 /* for compatibility with the earlier (integer power only) version */
1943 /* of this function. */
1945 /* When B is an integer, the result may be exact, even if rounded. */
1947 /* The final result is rounded according to the context; it will */
1948 /* almost always be correctly rounded, but may be up to 1 ulp in */
1949 /* error in rare cases. */
1950 /* ------------------------------------------------------------------ */
1951 U_CAPI decNumber * U_EXPORT2 uprv_decNumberPower(decNumber *res, const decNumber *lhs,
1952 const decNumber *rhs, decContext *set) {
1954 decNumber *alloclhs=NULL; /* non-NULL if rounded lhs allocated */
1955 decNumber *allocrhs=NULL; /* .., rhs */
1957 decNumber *allocdac=NULL; /* -> allocated acc buffer, iff used */
1958 decNumber *allocinv=NULL; /* -> allocated 1/x buffer, iff used */
1959 Int reqdigits=set->digits; /* requested DIGITS */
1960 Int n; /* rhs in binary */
1961 Flag rhsint=0; /* 1 if rhs is an integer */
1962 Flag useint=0; /* 1 if can use integer calculation */
1963 Flag isoddint=0; /* 1 if rhs is an integer and odd */
1966 Int dropped; /* .. */
1968 uInt needbytes; /* buffer size needed */
1969 Flag seenbit; /* seen a bit while powering */
1970 Int residue=0; /* rounding residue */
1971 uInt status=0; /* accumulators */
1972 uByte bits=0; /* result sign if errors */
1973 decContext aset; /* working context */
1974 decNumber dnOne; /* work value 1... */
1975 /* local accumulator buffer [a decNumber, with digits+elength+1 digits] */
1976 decNumber dacbuff[D2N(DECBUFFER+9)];
1977 decNumber *dac=dacbuff; /* -> result accumulator */
1978 /* same again for possible 1/lhs calculation */
1979 decNumber invbuff[D2N(DECBUFFER+9)];
1982 if (decCheckOperands(res, lhs, rhs, set)) return res;
1985 do { /* protect allocated storage */
1987 if (!set->extended) { /* reduce operands and set status, as needed */
1988 if (lhs->digits>reqdigits) {
1989 alloclhs=decRoundOperand(lhs, set, &status);
1990 if (alloclhs==NULL) break;
1993 if (rhs->digits>reqdigits) {
1994 allocrhs=decRoundOperand(rhs, set, &status);
1995 if (allocrhs==NULL) break;
2000 /* [following code does not require input rounding] */
2002 /* handle NaNs and rhs Infinity (lhs infinity is harder) */
2004 if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs)) { /* NaNs */
2005 decNaNs(res, lhs, rhs, set, &status);
2007 if (decNumberIsInfinite(rhs)) { /* rhs Infinity */
2008 Flag rhsneg=rhs->bits&DECNEG; /* save rhs sign */
2009 if (decNumberIsNegative(lhs) /* lhs<0 */
2010 && !decNumberIsZero(lhs)) /* .. */
2011 status|=DEC_Invalid_operation;
2012 else { /* lhs >=0 */
2013 uprv_decNumberZero(&dnOne); /* set up 1 */
2015 uprv_decNumberCompare(dac, lhs, &dnOne, set); /* lhs ? 1 */
2016 uprv_decNumberZero(res); /* prepare for 0/1/Infinity */
2017 if (decNumberIsNegative(dac)) { /* lhs<1 */
2018 if (rhsneg) res->bits|=DECINF; /* +Infinity [else is +0] */
2020 else if (dac->lsu[0]==0) { /* lhs=1 */
2021 /* 1**Infinity is inexact, so return fully-padded 1.0000 */
2022 Int shift=set->digits-1;
2023 *res->lsu=1; /* was 0, make int 1 */
2024 res->digits=decShiftToMost(res->lsu, 1, shift);
2025 res->exponent=-shift; /* make 1.0000... */
2026 status|=DEC_Inexact|DEC_Rounded; /* deemed inexact */
2029 if (!rhsneg) res->bits|=DECINF; /* +Infinity [else is +0] */
2033 /* [lhs infinity drops through] */
2036 /* Original rhs may be an integer that fits and is in range */
2038 if (n!=BADINT) { /* it is an integer */
2039 rhsint=1; /* record the fact for 1**n */
2040 isoddint=(Flag)n&1; /* [works even if big] */
2041 if (n!=BIGEVEN && n!=BIGODD) /* can use integer path? */
2042 useint=1; /* looks good */
2045 if (decNumberIsNegative(lhs) /* -x .. */
2046 && isoddint) bits=DECNEG; /* .. to an odd power */
2048 /* handle LHS infinity */
2049 if (decNumberIsInfinite(lhs)) { /* [NaNs already handled] */
2050 uByte rbits=rhs->bits; /* save */
2051 uprv_decNumberZero(res); /* prepare */
2052 if (n==0) *res->lsu=1; /* [-]Inf**0 => 1 */
2054 /* -Inf**nonint -> error */
2055 if (!rhsint && decNumberIsNegative(lhs)) {
2056 status|=DEC_Invalid_operation; /* -Inf**nonint is error */
2058 if (!(rbits & DECNEG)) bits|=DECINF; /* was not a **-n */
2059 /* [otherwise will be 0 or -0] */
2064 /* similarly handle LHS zero */
2065 if (decNumberIsZero(lhs)) {
2066 if (n==0) { /* 0**0 => Error */
2068 if (!set->extended) { /* [unless subset] */
2069 uprv_decNumberZero(res);
2070 *res->lsu=1; /* return 1 */
2073 status|=DEC_Invalid_operation;
2076 uByte rbits=rhs->bits; /* save */
2077 if (rbits & DECNEG) { /* was a 0**(-n) */
2079 if (!set->extended) { /* [bad if subset] */
2080 status|=DEC_Invalid_operation;
2085 uprv_decNumberZero(res); /* prepare */
2086 /* [otherwise will be 0 or -0] */
2091 /* here both lhs and rhs are finite; rhs==0 is handled in the */
2092 /* integer path. Next handle the non-integer cases */
2093 if (!useint) { /* non-integral rhs */
2094 /* any -ve lhs is bad, as is either operand or context out of */
2096 if (decNumberIsNegative(lhs)) {
2097 status|=DEC_Invalid_operation;
2099 if (decCheckMath(lhs, set, &status)
2100 || decCheckMath(rhs, set, &status)) break; /* variable status */
2102 uprv_decContextDefault(&aset, DEC_INIT_DECIMAL64); /* clean context */
2103 aset.emax=DEC_MAX_MATH; /* usual bounds */
2104 aset.emin=-DEC_MAX_MATH; /* .. */
2105 aset.clamp=0; /* and no concrete format */
2107 /* calculate the result using exp(ln(lhs)*rhs), which can */
2108 /* all be done into the accumulator, dac. The precision needed */
2109 /* is enough to contain the full information in the lhs (which */
2110 /* is the total digits, including exponent), or the requested */
2111 /* precision, if larger, + 4; 6 is used for the exponent */
2112 /* maximum length, and this is also used when it is shorter */
2113 /* than the requested digits as it greatly reduces the >0.5 ulp */
2114 /* cases at little cost (because Ln doubles digits each */
2115 /* iteration so a few extra digits rarely causes an extra */
2117 aset.digits=MAXI(lhs->digits, set->digits)+6+4;
2118 } /* non-integer rhs */
2120 else { /* rhs is in-range integer */
2121 if (n==0) { /* x**0 = 1 */
2122 /* (0**0 was handled above) */
2123 uprv_decNumberZero(res); /* result=1 */
2124 *res->lsu=1; /* .. */
2126 /* rhs is a non-zero integer */
2127 if (n<0) n=-n; /* use abs(n) */
2129 aset=*set; /* clone the context */
2130 aset.round=DEC_ROUND_HALF_EVEN; /* internally use balanced */
2131 /* calculate the working DIGITS */
2132 aset.digits=reqdigits+(rhs->digits+rhs->exponent)+2;
2134 if (!set->extended) aset.digits--; /* use classic precision */
2136 /* it's an error if this is more than can be handled */
2137 if (aset.digits>DECNUMMAXP) {status|=DEC_Invalid_operation; break;}
2138 } /* integer path */
2140 /* aset.digits is the count of digits for the accumulator needed */
2141 /* if accumulator is too long for local storage, then allocate */
2142 needbytes=sizeof(decNumber)+(D2U(aset.digits)-1)*sizeof(Unit);
2143 /* [needbytes also used below if 1/lhs needed] */
2144 if (needbytes>sizeof(dacbuff)) {
2145 allocdac=(decNumber *)malloc(needbytes);
2146 if (allocdac==NULL) { /* hopeless -- abandon */
2147 status|=DEC_Insufficient_storage;
2149 dac=allocdac; /* use the allocated space */
2151 /* here, aset is set up and accumulator is ready for use */
2153 if (!useint) { /* non-integral rhs */
2154 /* x ** y; special-case x=1 here as it will otherwise always */
2155 /* reduce to integer 1; decLnOp has a fastpath which detects */
2156 /* the case of x=1 */
2157 decLnOp(dac, lhs, &aset, &status); /* dac=ln(lhs) */
2158 /* [no error possible, as lhs 0 already handled] */
2159 if (ISZERO(dac)) { /* x==1, 1.0, etc. */
2160 /* need to return fully-padded 1.0000 etc., but rhsint->1 */
2161 *dac->lsu=1; /* was 0, make int 1 */
2162 if (!rhsint) { /* add padding */
2163 Int shift=set->digits-1;
2164 dac->digits=decShiftToMost(dac->lsu, 1, shift);
2165 dac->exponent=-shift; /* make 1.0000... */
2166 status|=DEC_Inexact|DEC_Rounded; /* deemed inexact */
2170 decMultiplyOp(dac, dac, rhs, &aset, &status); /* dac=dac*rhs */
2171 decExpOp(dac, dac, &aset, &status); /* dac=exp(dac) */
2173 /* and drop through for final rounding */
2174 } /* non-integer rhs */
2176 else { /* carry on with integer */
2177 uprv_decNumberZero(dac); /* acc=1 */
2178 *dac->lsu=1; /* .. */
2180 /* if a negative power the constant 1 is needed, and if not subset */
2181 /* invert the lhs now rather than inverting the result later */
2182 if (decNumberIsNegative(rhs)) { /* was a **-n [hence digits>0] */
2183 decNumber *inv=invbuff; /* asssume use fixed buffer */
2184 uprv_decNumberCopy(&dnOne, dac); /* dnOne=1; [needed now or later] */
2186 if (set->extended) { /* need to calculate 1/lhs */
2188 /* divide lhs into 1, putting result in dac [dac=1/dac] */
2189 decDivideOp(dac, &dnOne, lhs, &aset, DIVIDE, &status);
2190 /* now locate or allocate space for the inverted lhs */
2191 if (needbytes>sizeof(invbuff)) {
2192 allocinv=(decNumber *)malloc(needbytes);
2193 if (allocinv==NULL) { /* hopeless -- abandon */
2194 status|=DEC_Insufficient_storage;
2196 inv=allocinv; /* use the allocated space */
2198 /* [inv now points to big-enough buffer or allocated storage] */
2199 uprv_decNumberCopy(inv, dac); /* copy the 1/lhs */
2200 uprv_decNumberCopy(dac, &dnOne); /* restore acc=1 */
2201 lhs=inv; /* .. and go forward with new lhs */
2207 /* Raise-to-the-power loop... */
2208 seenbit=0; /* set once a 1-bit is encountered */
2209 for (i=1;;i++){ /* for each bit [top bit ignored] */
2210 /* abandon if had overflow or terminal underflow */
2211 if (status & (DEC_Overflow|DEC_Underflow)) { /* interesting? */
2212 if (status&DEC_Overflow || ISZERO(dac)) break;
2214 /* [the following two lines revealed an optimizer bug in a C++ */
2215 /* compiler, with symptom: 5**3 -> 25, when n=n+n was used] */
2216 n=n<<1; /* move next bit to testable position */
2217 if (n<0) { /* top bit is set */
2218 seenbit=1; /* OK, significant bit seen */
2219 decMultiplyOp(dac, dac, lhs, &aset, &status); /* dac=dac*x */
2221 if (i==31) break; /* that was the last bit */
2222 if (!seenbit) continue; /* no need to square 1 */
2223 decMultiplyOp(dac, dac, dac, &aset, &status); /* dac=dac*dac [square] */
2224 } /*i*/ /* 32 bits */
2226 /* complete internal overflow or underflow processing */
2227 if (status & (DEC_Overflow|DEC_Underflow)) {
2229 /* If subset, and power was negative, reverse the kind of -erflow */
2230 /* [1/x not yet done] */
2231 if (!set->extended && decNumberIsNegative(rhs)) {
2232 if (status & DEC_Overflow)
2233 status^=DEC_Overflow | DEC_Underflow | DEC_Subnormal;
2234 else { /* trickier -- Underflow may or may not be set */
2235 status&=~(DEC_Underflow | DEC_Subnormal); /* [one or both] */
2236 status|=DEC_Overflow;
2240 dac->bits=(dac->bits & ~DECNEG) | bits; /* force correct sign */
2241 /* round subnormals [to set.digits rather than aset.digits] */
2242 /* or set overflow result similarly as required */
2243 decFinalize(dac, set, &residue, &status);
2244 uprv_decNumberCopy(res, dac); /* copy to result (is now OK length) */
2249 if (!set->extended && /* subset math */
2250 decNumberIsNegative(rhs)) { /* was a **-n [hence digits>0] */
2251 /* so divide result into 1 [dac=1/dac] */
2252 decDivideOp(dac, &dnOne, dac, &aset, DIVIDE, &status);
2255 } /* rhs integer path */
2257 /* reduce result to the requested length and copy to result */
2258 decCopyFit(res, dac, set, &residue, &status);
2259 decFinish(res, set, &residue, &status); /* final cleanup */
2261 if (!set->extended) decTrim(res, set, 0, 1, &dropped); /* trailing zeros */
2263 } while(0); /* end protected */
2265 if (allocdac!=NULL) free(allocdac); /* drop any storage used */
2266 if (allocinv!=NULL) free(allocinv); /* .. */
2268 if (alloclhs!=NULL) free(alloclhs); /* .. */
2269 if (allocrhs!=NULL) free(allocrhs); /* .. */
2271 if (status!=0) decStatus(res, status, set);
2273 decCheckInexact(res, set);
2276 } /* decNumberPower */
2278 /* ------------------------------------------------------------------ */
2279 /* decNumberQuantize -- force exponent to requested value */
2281 /* This computes C = op(A, B), where op adjusts the coefficient */
2282 /* of C (by rounding or shifting) such that the exponent (-scale) */
2283 /* of C has exponent of B. The numerical value of C will equal A, */
2284 /* except for the effects of any rounding that occurred. */
2286 /* res is C, the result. C may be A or B */
2287 /* lhs is A, the number to adjust */
2288 /* rhs is B, the number with exponent to match */
2289 /* set is the context */
2291 /* C must have space for set->digits digits. */
2293 /* Unless there is an error or the result is infinite, the exponent */
2294 /* after the operation is guaranteed to be equal to that of B. */
2295 /* ------------------------------------------------------------------ */
2296 U_CAPI decNumber * U_EXPORT2 uprv_decNumberQuantize(decNumber *res, const decNumber *lhs,
2297 const decNumber *rhs, decContext *set) {
2298 uInt status=0; /* accumulator */
2299 decQuantizeOp(res, lhs, rhs, set, 1, &status);
2300 if (status!=0) decStatus(res, status, set);
2302 } /* decNumberQuantize */
2304 /* ------------------------------------------------------------------ */
2305 /* decNumberReduce -- remove trailing zeros */
2307 /* This computes C = 0 + A, and normalizes the result */
2309 /* res is C, the result. C may be A */
2311 /* set is the context */
2313 /* C must have space for set->digits digits. */
2314 /* ------------------------------------------------------------------ */
2315 /* Previously known as Normalize */
2316 U_CAPI decNumber * U_EXPORT2 uprv_decNumberNormalize(decNumber *res, const decNumber *rhs,
2318 return uprv_decNumberReduce(res, rhs, set);
2319 } /* decNumberNormalize */
2321 U_CAPI decNumber * U_EXPORT2 uprv_decNumberReduce(decNumber *res, const decNumber *rhs,
2324 decNumber *allocrhs=NULL; /* non-NULL if rounded rhs allocated */
2326 uInt status=0; /* as usual */
2327 Int residue=0; /* as usual */
2328 Int dropped; /* work */
2331 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
2334 do { /* protect allocated storage */
2336 if (!set->extended) {
2337 /* reduce operand and set lostDigits status, as needed */
2338 if (rhs->digits>set->digits) {
2339 allocrhs=decRoundOperand(rhs, set, &status);
2340 if (allocrhs==NULL) break;
2345 /* [following code does not require input rounding] */
2347 /* Infinities copy through; NaNs need usual treatment */
2348 if (decNumberIsNaN(rhs)) {
2349 decNaNs(res, rhs, NULL, set, &status);
2353 /* reduce result to the requested length and copy to result */
2354 decCopyFit(res, rhs, set, &residue, &status); /* copy & round */
2355 decFinish(res, set, &residue, &status); /* cleanup/set flags */
2356 decTrim(res, set, 1, 0, &dropped); /* normalize in place */
2358 } while(0); /* end protected */
2361 if (allocrhs !=NULL) free(allocrhs); /* .. */
2363 if (status!=0) decStatus(res, status, set);/* then report status */
2365 } /* decNumberReduce */
2367 /* ------------------------------------------------------------------ */
2368 /* decNumberRescale -- force exponent to requested value */
2370 /* This computes C = op(A, B), where op adjusts the coefficient */
2371 /* of C (by rounding or shifting) such that the exponent (-scale) */
2372 /* of C has the value B. The numerical value of C will equal A, */
2373 /* except for the effects of any rounding that occurred. */
2375 /* res is C, the result. C may be A or B */
2376 /* lhs is A, the number to adjust */
2377 /* rhs is B, the requested exponent */
2378 /* set is the context */
2380 /* C must have space for set->digits digits. */
2382 /* Unless there is an error or the result is infinite, the exponent */
2383 /* after the operation is guaranteed to be equal to B. */
2384 /* ------------------------------------------------------------------ */
2385 U_CAPI decNumber * U_EXPORT2 uprv_decNumberRescale(decNumber *res, const decNumber *lhs,
2386 const decNumber *rhs, decContext *set) {
2387 uInt status=0; /* accumulator */
2388 decQuantizeOp(res, lhs, rhs, set, 0, &status);
2389 if (status!=0) decStatus(res, status, set);
2391 } /* decNumberRescale */
2393 /* ------------------------------------------------------------------ */
2394 /* decNumberRemainder -- divide and return remainder */
2396 /* This computes C = A % B */
2398 /* res is C, the result. C may be A and/or B (e.g., X=X%X) */
2401 /* set is the context */
2403 /* C must have space for set->digits digits. */
2404 /* ------------------------------------------------------------------ */
2405 U_CAPI decNumber * U_EXPORT2 uprv_decNumberRemainder(decNumber *res, const decNumber *lhs,
2406 const decNumber *rhs, decContext *set) {
2407 uInt status=0; /* accumulator */
2408 decDivideOp(res, lhs, rhs, set, REMAINDER, &status);
2409 if (status!=0) decStatus(res, status, set);
2411 decCheckInexact(res, set);
2414 } /* decNumberRemainder */
2416 /* ------------------------------------------------------------------ */
2417 /* decNumberRemainderNear -- divide and return remainder from nearest */
2419 /* This computes C = A % B, where % is the IEEE remainder operator */
2421 /* res is C, the result. C may be A and/or B (e.g., X=X%X) */
2424 /* set is the context */
2426 /* C must have space for set->digits digits. */
2427 /* ------------------------------------------------------------------ */
2428 U_CAPI decNumber * U_EXPORT2 uprv_decNumberRemainderNear(decNumber *res, const decNumber *lhs,
2429 const decNumber *rhs, decContext *set) {
2430 uInt status=0; /* accumulator */
2431 decDivideOp(res, lhs, rhs, set, REMNEAR, &status);
2432 if (status!=0) decStatus(res, status, set);
2434 decCheckInexact(res, set);
2437 } /* decNumberRemainderNear */
2439 /* ------------------------------------------------------------------ */
2440 /* decNumberRotate -- rotate the coefficient of a Number left/right */
2442 /* This computes C = A rot B (in base ten and rotating set->digits */
2445 /* res is C, the result. C may be A and/or B (e.g., X=XrotX) */
2447 /* rhs is B, the number of digits to rotate (-ve to right) */
2448 /* set is the context */
2450 /* The digits of the coefficient of A are rotated to the left (if B */
2451 /* is positive) or to the right (if B is negative) without adjusting */
2452 /* the exponent or the sign of A. If lhs->digits is less than */
2453 /* set->digits the coefficient is padded with zeros on the left */
2454 /* before the rotate. Any leading zeros in the result are removed */
2457 /* B must be an integer (q=0) and in the range -set->digits through */
2459 /* C must have space for set->digits digits. */
2460 /* NaNs are propagated as usual. Infinities are unaffected (but */
2461 /* B must be valid). No status is set unless B is invalid or an */
2462 /* operand is an sNaN. */
2463 /* ------------------------------------------------------------------ */
2464 U_CAPI decNumber * U_EXPORT2 uprv_decNumberRotate(decNumber *res, const decNumber *lhs,
2465 const decNumber *rhs, decContext *set) {
2466 uInt status=0; /* accumulator */
2467 Int rotate; /* rhs as an Int */
2470 if (decCheckOperands(res, lhs, rhs, set)) return res;
2473 /* NaNs propagate as normal */
2474 if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
2475 decNaNs(res, lhs, rhs, set, &status);
2476 /* rhs must be an integer */
2477 else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
2478 status=DEC_Invalid_operation;
2479 else { /* both numeric, rhs is an integer */
2480 rotate=decGetInt(rhs); /* [cannot fail] */
2481 if (rotate==BADINT /* something bad .. */
2482 || rotate==BIGODD || rotate==BIGEVEN /* .. very big .. */
2483 || abs(rotate)>set->digits) /* .. or out of range */
2484 status=DEC_Invalid_operation;
2485 else { /* rhs is OK */
2486 uprv_decNumberCopy(res, lhs);
2487 /* convert -ve rotate to equivalent positive rotation */
2488 if (rotate<0) rotate=set->digits+rotate;
2489 if (rotate!=0 && rotate!=set->digits /* zero or full rotation */
2490 && !decNumberIsInfinite(res)) { /* lhs was infinite */
2491 /* left-rotate to do; 0 < rotate < set->digits */
2492 uInt units, shift; /* work */
2493 uInt msudigits; /* digits in result msu */
2494 Unit *msu=res->lsu+D2U(res->digits)-1; /* current msu */
2495 Unit *msumax=res->lsu+D2U(set->digits)-1; /* rotation msu */
2496 for (msu++; msu<=msumax; msu++) *msu=0; /* ensure high units=0 */
2497 res->digits=set->digits; /* now full-length */
2498 msudigits=MSUDIGITS(res->digits); /* actual digits in msu */
2500 /* rotation here is done in-place, in three steps */
2501 /* 1. shift all to least up to one unit to unit-align final */
2502 /* lsd [any digits shifted out are rotated to the left, */
2503 /* abutted to the original msd (which may require split)] */
2505 /* [if there are no whole units left to rotate, the */
2506 /* rotation is now complete] */
2508 /* 2. shift to least, from below the split point only, so that */
2509 /* the final msd is in the right place in its Unit [any */
2510 /* digits shifted out will fit exactly in the current msu, */
2511 /* left aligned, no split required] */
2513 /* 3. rotate all the units by reversing left part, right */
2514 /* part, and then whole */
2516 /* example: rotate right 8 digits (2 units + 2), DECDPUN=3. */
2518 /* start: 00a bcd efg hij klm npq */
2520 /* 1a 000 0ab cde fgh|ijk lmn [pq saved] */
2521 /* 1b 00p qab cde fgh|ijk lmn */
2523 /* 2a 00p qab cde fgh|00i jkl [mn saved] */
2524 /* 2b mnp qab cde fgh|00i jkl */
2526 /* 3a fgh cde qab mnp|00i jkl */
2527 /* 3b fgh cde qab mnp|jkl 00i */
2528 /* 3c 00i jkl mnp qab cde fgh */
2530 /* Step 1: amount to shift is the partial right-rotate count */
2531 rotate=set->digits-rotate; /* make it right-rotate */
2532 units=rotate/DECDPUN; /* whole units to rotate */
2533 shift=rotate%DECDPUN; /* left-over digits count */
2534 if (shift>0) { /* not an exact number of units */
2535 uInt save=res->lsu[0]%powers[shift]; /* save low digit(s) */
2536 decShiftToLeast(res->lsu, D2U(res->digits), shift);
2537 if (shift>msudigits) { /* msumax-1 needs >0 digits */
2538 uInt rem=save%powers[shift-msudigits];/* split save */
2539 *msumax=(Unit)(save/powers[shift-msudigits]); /* and insert */
2540 *(msumax-1)=*(msumax-1)
2541 +(Unit)(rem*powers[DECDPUN-(shift-msudigits)]); /* .. */
2543 else { /* all fits in msumax */
2544 *msumax=*msumax+(Unit)(save*powers[msudigits-shift]); /* [maybe *1] */
2546 } /* digits shift needed */
2548 /* If whole units to rotate... */
2549 if (units>0) { /* some to do */
2550 /* Step 2: the units to touch are the whole ones in rotate, */
2551 /* if any, and the shift is DECDPUN-msudigits (which may be */
2553 shift=DECDPUN-msudigits;
2554 if (shift>0) { /* not an exact number of units */
2555 uInt save=res->lsu[0]%powers[shift]; /* save low digit(s) */
2556 decShiftToLeast(res->lsu, units, shift);
2557 *msumax=*msumax+(Unit)(save*powers[msudigits]);
2558 } /* partial shift needed */
2560 /* Step 3: rotate the units array using triple reverse */
2561 /* (reversing is easy and fast) */
2562 decReverse(res->lsu+units, msumax); /* left part */
2563 decReverse(res->lsu, res->lsu+units-1); /* right part */
2564 decReverse(res->lsu, msumax); /* whole */
2565 } /* whole units to rotate */
2566 /* the rotation may have left an undetermined number of zeros */
2567 /* on the left, so true length needs to be calculated */
2568 res->digits=decGetDigits(res->lsu, msumax-res->lsu+1);
2569 } /* rotate needed */
2572 if (status!=0) decStatus(res, status, set);
2574 } /* decNumberRotate */
2576 /* ------------------------------------------------------------------ */
2577 /* decNumberSameQuantum -- test for equal exponents */
2579 /* res is the result number, which will contain either 0 or 1 */
2580 /* lhs is a number to test */
2581 /* rhs is the second (usually a pattern) */
2583 /* No errors are possible and no context is needed. */
2584 /* ------------------------------------------------------------------ */
2585 U_CAPI decNumber * U_EXPORT2 uprv_decNumberSameQuantum(decNumber *res, const decNumber *lhs,
2586 const decNumber *rhs) {
2587 Unit ret=0; /* return value */
2590 if (decCheckOperands(res, lhs, rhs, DECUNCONT)) return res;
2594 if (decNumberIsNaN(lhs) && decNumberIsNaN(rhs)) ret=1;
2595 else if (decNumberIsInfinite(lhs) && decNumberIsInfinite(rhs)) ret=1;
2596 /* [anything else with a special gives 0] */
2598 else if (lhs->exponent==rhs->exponent) ret=1;
2600 uprv_decNumberZero(res); /* OK to overwrite an operand now */
2603 } /* decNumberSameQuantum */
2605 /* ------------------------------------------------------------------ */
2606 /* decNumberScaleB -- multiply by a power of 10 */
2608 /* This computes C = A x 10**B where B is an integer (q=0) with */
2609 /* maximum magnitude 2*(emax+digits) */
2611 /* res is C, the result. C may be A or B */
2612 /* lhs is A, the number to adjust */
2613 /* rhs is B, the requested power of ten to use */
2614 /* set is the context */
2616 /* C must have space for set->digits digits. */
2618 /* The result may underflow or overflow. */
2619 /* ------------------------------------------------------------------ */
2620 U_CAPI decNumber * U_EXPORT2 uprv_decNumberScaleB(decNumber *res, const decNumber *lhs,
2621 const decNumber *rhs, decContext *set) {
2622 Int reqexp; /* requested exponent change [B] */
2623 uInt status=0; /* accumulator */
2624 Int residue; /* work */
2627 if (decCheckOperands(res, lhs, rhs, set)) return res;
2630 /* Handle special values except lhs infinite */
2631 if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
2632 decNaNs(res, lhs, rhs, set, &status);
2633 /* rhs must be an integer */
2634 else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
2635 status=DEC_Invalid_operation;
2637 /* lhs is a number; rhs is a finite with q==0 */
2638 reqexp=decGetInt(rhs); /* [cannot fail] */
2639 if (reqexp==BADINT /* something bad .. */
2640 || reqexp==BIGODD || reqexp==BIGEVEN /* .. very big .. */
2641 || abs(reqexp)>(2*(set->digits+set->emax))) /* .. or out of range */
2642 status=DEC_Invalid_operation;
2643 else { /* rhs is OK */
2644 uprv_decNumberCopy(res, lhs); /* all done if infinite lhs */
2645 if (!decNumberIsInfinite(res)) { /* prepare to scale */
2646 res->exponent+=reqexp; /* adjust the exponent */
2648 decFinalize(res, set, &residue, &status); /* .. and check */
2652 if (status!=0) decStatus(res, status, set);
2654 } /* decNumberScaleB */
2656 /* ------------------------------------------------------------------ */
2657 /* decNumberShift -- shift the coefficient of a Number left or right */
2659 /* This computes C = A << B or C = A >> -B (in base ten). */
2661 /* res is C, the result. C may be A and/or B (e.g., X=X<<X) */
2663 /* rhs is B, the number of digits to shift (-ve to right) */
2664 /* set is the context */
2666 /* The digits of the coefficient of A are shifted to the left (if B */
2667 /* is positive) or to the right (if B is negative) without adjusting */
2668 /* the exponent or the sign of A. */
2670 /* B must be an integer (q=0) and in the range -set->digits through */
2672 /* C must have space for set->digits digits. */
2673 /* NaNs are propagated as usual. Infinities are unaffected (but */
2674 /* B must be valid). No status is set unless B is invalid or an */
2675 /* operand is an sNaN. */
2676 /* ------------------------------------------------------------------ */
2677 U_CAPI decNumber * U_EXPORT2 uprv_decNumberShift(decNumber *res, const decNumber *lhs,
2678 const decNumber *rhs, decContext *set) {
2679 uInt status=0; /* accumulator */
2680 Int shift; /* rhs as an Int */
2683 if (decCheckOperands(res, lhs, rhs, set)) return res;
2686 /* NaNs propagate as normal */
2687 if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
2688 decNaNs(res, lhs, rhs, set, &status);
2689 /* rhs must be an integer */
2690 else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
2691 status=DEC_Invalid_operation;
2692 else { /* both numeric, rhs is an integer */
2693 shift=decGetInt(rhs); /* [cannot fail] */
2694 if (shift==BADINT /* something bad .. */
2695 || shift==BIGODD || shift==BIGEVEN /* .. very big .. */
2696 || abs(shift)>set->digits) /* .. or out of range */
2697 status=DEC_Invalid_operation;
2698 else { /* rhs is OK */
2699 uprv_decNumberCopy(res, lhs);
2700 if (shift!=0 && !decNumberIsInfinite(res)) { /* something to do */
2701 if (shift>0) { /* to left */
2702 if (shift==set->digits) { /* removing all */
2703 *res->lsu=0; /* so place 0 */
2704 res->digits=1; /* .. */
2707 /* first remove leading digits if necessary */
2708 if (res->digits+shift>set->digits) {
2709 decDecap(res, res->digits+shift-set->digits);
2710 /* that updated res->digits; may have gone to 1 (for a */
2711 /* single digit or for zero */
2713 if (res->digits>1 || *res->lsu) /* if non-zero.. */
2714 res->digits=decShiftToMost(res->lsu, res->digits, shift);
2715 } /* partial left */
2717 else { /* to right */
2718 if (-shift>=res->digits) { /* discarding all */
2719 *res->lsu=0; /* so place 0 */
2720 res->digits=1; /* .. */
2723 decShiftToLeast(res->lsu, D2U(res->digits), -shift);
2724 res->digits-=(-shift);
2727 } /* non-0 non-Inf shift */
2730 if (status!=0) decStatus(res, status, set);
2732 } /* decNumberShift */
2734 /* ------------------------------------------------------------------ */
2735 /* decNumberSquareRoot -- square root operator */
2737 /* This computes C = squareroot(A) */
2739 /* res is C, the result. C may be A */
2741 /* set is the context; note that rounding mode has no effect */
2743 /* C must have space for set->digits digits. */
2744 /* ------------------------------------------------------------------ */
2745 /* This uses the following varying-precision algorithm in: */
2747 /* Properly Rounded Variable Precision Square Root, T. E. Hull and */
2748 /* A. Abrham, ACM Transactions on Mathematical Software, Vol 11 #3, */
2749 /* pp229-237, ACM, September 1985. */
2751 /* The square-root is calculated using Newton's method, after which */
2752 /* a check is made to ensure the result is correctly rounded. */
2754 /* % [Reformatted original Numerical Turing source code follows.] */
2755 /* function sqrt(x : real) : real */
2756 /* % sqrt(x) returns the properly rounded approximation to the square */
2757 /* % root of x, in the precision of the calling environment, or it */
2758 /* % fails if x < 0. */
2759 /* % t e hull and a abrham, august, 1984 */
2760 /* if x <= 0 then */
2767 /* var f := setexp(x, 0) % fraction part of x [0.1 <= x < 1] */
2768 /* var e := getexp(x) % exponent part of x */
2769 /* var approx : real */
2770 /* if e mod 2 = 0 then */
2771 /* approx := .259 + .819 * f % approx to root of f */
2773 /* f := f/l0 % adjustments */
2774 /* e := e + 1 % for odd */
2775 /* approx := .0819 + 2.59 * f % exponent */
2779 /* const maxp := currentprecision + 2 */
2781 /* p := min(2*p - 2, maxp) % p = 4,6,10, . . . , maxp */
2783 /* approx := .5 * (approx + f/approx) */
2784 /* exit when p = maxp */
2787 /* % approx is now within 1 ulp of the properly rounded square root */
2788 /* % of f; to ensure proper rounding, compare squares of (approx - */
2789 /* % l/2 ulp) and (approx + l/2 ulp) with f. */
2790 /* p := currentprecision */
2792 /* precision p + 2 */
2793 /* const approxsubhalf := approx - setexp(.5, -p) */
2794 /* if mulru(approxsubhalf, approxsubhalf) > f then */
2795 /* approx := approx - setexp(.l, -p + 1) */
2797 /* const approxaddhalf := approx + setexp(.5, -p) */
2798 /* if mulrd(approxaddhalf, approxaddhalf) < f then */
2799 /* approx := approx + setexp(.l, -p + 1) */
2803 /* result setexp(approx, e div 2) % fix exponent */
2805 /* ------------------------------------------------------------------ */
2806 #pragma clang diagnostic push
2807 #pragma clang diagnostic ignored "-Warray-bounds"
2808 U_CAPI decNumber * U_EXPORT2 uprv_decNumberSquareRoot(decNumber *res, const decNumber *rhs,
2810 decContext workset, approxset; /* work contexts */
2811 decNumber dzero; /* used for constant zero */
2812 Int maxp; /* largest working precision */
2813 Int workp; /* working precision */
2814 Int residue=0; /* rounding residue */
2815 uInt status=0, ignore=0; /* status accumulators */
2816 uInt rstatus; /* .. */
2817 Int exp; /* working exponent */
2818 Int ideal; /* ideal (preferred) exponent */
2819 Int needbytes; /* work */
2820 Int dropped; /* .. */
2823 decNumber *allocrhs=NULL; /* non-NULL if rounded rhs allocated */
2825 /* buffer for f [needs +1 in case DECBUFFER 0] */
2826 decNumber buff[D2N(DECBUFFER+1)];
2827 /* buffer for a [needs +2 to match likely maxp] */
2828 decNumber bufa[D2N(DECBUFFER+2)];
2829 /* buffer for temporary, b [must be same size as a] */
2830 decNumber bufb[D2N(DECBUFFER+2)];
2831 decNumber *allocbuff=NULL; /* -> allocated buff, iff allocated */
2832 decNumber *allocbufa=NULL; /* -> allocated bufa, iff allocated */
2833 decNumber *allocbufb=NULL; /* -> allocated bufb, iff allocated */
2834 decNumber *f=buff; /* reduced fraction */
2835 decNumber *a=bufa; /* approximation to result */
2836 decNumber *b=bufb; /* intermediate result */
2837 /* buffer for temporary variable, up to 3 digits */
2838 decNumber buft[D2N(3)];
2839 decNumber *t=buft; /* up-to-3-digit constant or work */
2842 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
2845 do { /* protect allocated storage */
2847 if (!set->extended) {
2848 /* reduce operand and set lostDigits status, as needed */
2849 if (rhs->digits>set->digits) {
2850 allocrhs=decRoundOperand(rhs, set, &status);
2851 if (allocrhs==NULL) break;
2852 /* [Note: 'f' allocation below could reuse this buffer if */
2853 /* used, but as this is rare they are kept separate for clarity.] */
2858 /* [following code does not require input rounding] */
2860 /* handle infinities and NaNs */
2862 if (decNumberIsInfinite(rhs)) { /* an infinity */
2863 if (decNumberIsNegative(rhs)) status|=DEC_Invalid_operation;
2864 else uprv_decNumberCopy(res, rhs); /* +Infinity */
2866 else decNaNs(res, rhs, NULL, set, &status); /* a NaN */
2870 /* calculate the ideal (preferred) exponent [floor(exp/2)] */
2871 /* [It would be nicer to write: ideal=rhs->exponent>>1, but this */
2872 /* generates a compiler warning. Generated code is the same.] */
2873 ideal=(rhs->exponent&~1)/2; /* target */
2877 uprv_decNumberCopy(res, rhs); /* could be 0 or -0 */
2878 res->exponent=ideal; /* use the ideal [safe] */
2879 /* use decFinish to clamp any out-of-range exponent, etc. */
2880 decFinish(res, set, &residue, &status);
2884 /* any other -x is an oops */
2885 if (decNumberIsNegative(rhs)) {
2886 status|=DEC_Invalid_operation;
2890 /* space is needed for three working variables */
2891 /* f -- the same precision as the RHS, reduced to 0.01->0.99... */
2892 /* a -- Hull's approximation -- precision, when assigned, is */
2893 /* currentprecision+1 or the input argument precision, */
2894 /* whichever is larger (+2 for use as temporary) */
2895 /* b -- intermediate temporary result (same size as a) */
2896 /* if any is too long for local storage, then allocate */
2897 workp=MAXI(set->digits+1, rhs->digits); /* actual rounding precision */
2898 workp=MAXI(workp, 7); /* at least 7 for low cases */
2899 maxp=workp+2; /* largest working precision */
2901 needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
2902 if (needbytes>(Int)sizeof(buff)) {
2903 allocbuff=(decNumber *)malloc(needbytes);
2904 if (allocbuff==NULL) { /* hopeless -- abandon */
2905 status|=DEC_Insufficient_storage;
2907 f=allocbuff; /* use the allocated space */
2909 /* a and b both need to be able to hold a maxp-length number */
2910 needbytes=sizeof(decNumber)+(D2U(maxp)-1)*sizeof(Unit);
2911 if (needbytes>(Int)sizeof(bufa)) { /* [same applies to b] */
2912 allocbufa=(decNumber *)malloc(needbytes);
2913 allocbufb=(decNumber *)malloc(needbytes);
2914 if (allocbufa==NULL || allocbufb==NULL) { /* hopeless */
2915 status|=DEC_Insufficient_storage;
2917 a=allocbufa; /* use the allocated spaces */
2918 b=allocbufb; /* .. */
2921 /* copy rhs -> f, save exponent, and reduce so 0.1 <= f < 1 */
2922 uprv_decNumberCopy(f, rhs);
2923 exp=f->exponent+f->digits; /* adjusted to Hull rules */
2924 f->exponent=-(f->digits); /* to range */
2926 /* set up working context */
2927 uprv_decContextDefault(&workset, DEC_INIT_DECIMAL64);
2928 workset.emax=DEC_MAX_EMAX;
2929 workset.emin=DEC_MIN_EMIN;
2931 /* [Until further notice, no error is possible and status bits */
2932 /* (Rounded, etc.) should be ignored, not accumulated.] */
2934 /* Calculate initial approximation, and allow for odd exponent */
2935 workset.digits=workp; /* p for initial calculation */
2936 t->bits=0; t->digits=3;
2937 a->bits=0; a->digits=3;
2938 if ((exp & 1)==0) { /* even exponent */
2939 /* Set t=0.259, a=0.819 */
2946 t->lsu[0]=59; t->lsu[1]=2;
2947 a->lsu[0]=19; a->lsu[1]=8;
2949 t->lsu[0]=9; t->lsu[1]=5; t->lsu[2]=2;
2950 a->lsu[0]=9; a->lsu[1]=1; a->lsu[2]=8;
2953 else { /* odd exponent */
2954 /* Set t=0.0819, a=2.59 */
2955 f->exponent--; /* f=f/10 */
2963 t->lsu[0]=19; t->lsu[1]=8;
2964 a->lsu[0]=59; a->lsu[1]=2;
2966 t->lsu[0]=9; t->lsu[1]=1; t->lsu[2]=8;
2967 a->lsu[0]=9; a->lsu[1]=5; a->lsu[2]=2;
2971 decMultiplyOp(a, a, f, &workset, &ignore); /* a=a*f */
2972 decAddOp(a, a, t, &workset, 0, &ignore); /* ..+t */
2973 /* [a is now the initial approximation for sqrt(f), calculated with */
2974 /* currentprecision, which is also a's precision.] */
2976 /* the main calculation loop */
2977 uprv_decNumberZero(&dzero); /* make 0 */
2978 uprv_decNumberZero(t); /* set t = 0.5 */
2979 t->lsu[0]=5; /* .. */
2980 t->exponent=-1; /* .. */
2981 workset.digits=3; /* initial p */
2982 for (; workset.digits<maxp;) {
2983 /* set p to min(2*p - 2, maxp) [hence 3; or: 4, 6, 10, ... , maxp] */
2984 workset.digits=MINI(workset.digits*2-2, maxp);
2985 /* a = 0.5 * (a + f/a) */
2986 /* [calculated at p then rounded to currentprecision] */
2987 decDivideOp(b, f, a, &workset, DIVIDE, &ignore); /* b=f/a */
2988 decAddOp(b, b, a, &workset, 0, &ignore); /* b=b+a */
2989 decMultiplyOp(a, b, t, &workset, &ignore); /* a=b*0.5 */
2992 /* Here, 0.1 <= a < 1 [Hull], and a has maxp digits */
2993 /* now reduce to length, etc.; this needs to be done with a */
2994 /* having the correct exponent so as to handle subnormals */
2996 approxset=*set; /* get emin, emax, etc. */
2997 approxset.round=DEC_ROUND_HALF_EVEN;
2998 a->exponent+=exp/2; /* set correct exponent */
2999 rstatus=0; /* clear status */
3000 residue=0; /* .. and accumulator */
3001 decCopyFit(a, a, &approxset, &residue, &rstatus); /* reduce (if needed) */
3002 decFinish(a, &approxset, &residue, &rstatus); /* clean and finalize */
3004 /* Overflow was possible if the input exponent was out-of-range, */
3005 /* in which case quit */
3006 if (rstatus&DEC_Overflow) {
3007 status=rstatus; /* use the status as-is */
3008 uprv_decNumberCopy(res, a); /* copy to result */
3012 /* Preserve status except Inexact/Rounded */
3013 status|=(rstatus & ~(DEC_Rounded|DEC_Inexact));
3015 /* Carry out the Hull correction */
3016 a->exponent-=exp/2; /* back to 0.1->1 */
3018 /* a is now at final precision and within 1 ulp of the properly */
3019 /* rounded square root of f; to ensure proper rounding, compare */
3020 /* squares of (a - l/2 ulp) and (a + l/2 ulp) with f. */
3021 /* Here workset.digits=maxp and t=0.5, and a->digits determines */
3023 workset.digits--; /* maxp-1 is OK now */
3024 t->exponent=-a->digits-1; /* make 0.5 ulp */
3025 decAddOp(b, a, t, &workset, DECNEG, &ignore); /* b = a - 0.5 ulp */
3026 workset.round=DEC_ROUND_UP;
3027 decMultiplyOp(b, b, b, &workset, &ignore); /* b = mulru(b, b) */
3028 decCompareOp(b, f, b, &workset, COMPARE, &ignore); /* b ? f, reversed */
3029 if (decNumberIsNegative(b)) { /* f < b [i.e., b > f] */
3030 /* this is the more common adjustment, though both are rare */
3031 t->exponent++; /* make 1.0 ulp */
3032 t->lsu[0]=1; /* .. */
3033 decAddOp(a, a, t, &workset, DECNEG, &ignore); /* a = a - 1 ulp */
3034 /* assign to approx [round to length] */
3035 approxset.emin-=exp/2; /* adjust to match a */
3036 approxset.emax-=exp/2;
3037 decAddOp(a, &dzero, a, &approxset, 0, &ignore);
3040 decAddOp(b, a, t, &workset, 0, &ignore); /* b = a + 0.5 ulp */
3041 workset.round=DEC_ROUND_DOWN;
3042 decMultiplyOp(b, b, b, &workset, &ignore); /* b = mulrd(b, b) */
3043 decCompareOp(b, b, f, &workset, COMPARE, &ignore); /* b ? f */
3044 if (decNumberIsNegative(b)) { /* b < f */
3045 t->exponent++; /* make 1.0 ulp */
3046 t->lsu[0]=1; /* .. */
3047 decAddOp(a, a, t, &workset, 0, &ignore); /* a = a + 1 ulp */
3048 /* assign to approx [round to length] */
3049 approxset.emin-=exp/2; /* adjust to match a */
3050 approxset.emax-=exp/2;
3051 decAddOp(a, &dzero, a, &approxset, 0, &ignore);
3054 /* [no errors are possible in the above, and rounding/inexact during */
3055 /* estimation are irrelevant, so status was not accumulated] */
3057 /* Here, 0.1 <= a < 1 (still), so adjust back */
3058 a->exponent+=exp/2; /* set correct exponent */
3060 /* count droppable zeros [after any subnormal rounding] by */
3061 /* trimming a copy */
3062 uprv_decNumberCopy(b, a);
3063 decTrim(b, set, 1, 1, &dropped); /* [drops trailing zeros] */
3065 /* Set Inexact and Rounded. The answer can only be exact if */
3066 /* it is short enough so that squaring it could fit in workp */
3067 /* digits, so this is the only (relatively rare) condition that */
3068 /* a careful check is needed */
3069 if (b->digits*2-1 > workp) { /* cannot fit */
3070 status|=DEC_Inexact|DEC_Rounded;
3072 else { /* could be exact/unrounded */
3073 uInt mstatus=0; /* local status */
3074 decMultiplyOp(b, b, b, &workset, &mstatus); /* try the multiply */
3075 if (mstatus&DEC_Overflow) { /* result just won't fit */
3076 status|=DEC_Inexact|DEC_Rounded;
3078 else { /* plausible */
3079 decCompareOp(t, b, rhs, &workset, COMPARE, &mstatus); /* b ? rhs */
3080 if (!ISZERO(t)) status|=DEC_Inexact|DEC_Rounded; /* not equal */
3081 else { /* is Exact */
3082 /* here, dropped is the count of trailing zeros in 'a' */
3083 /* use closest exponent to ideal... */
3084 Int todrop=ideal-a->exponent; /* most that can be dropped */
3085 if (todrop<0) status|=DEC_Rounded; /* ideally would add 0s */
3086 else { /* unrounded */
3087 /* there are some to drop, but emax may not allow all */
3088 Int maxexp=set->emax-set->digits+1;
3089 Int maxdrop=maxexp-a->exponent;
3090 if (todrop>maxdrop && set->clamp) { /* apply clamping */
3092 status|=DEC_Clamped;
3094 if (dropped<todrop) { /* clamp to those available */
3096 status|=DEC_Clamped;
3098 if (todrop>0) { /* have some to drop */
3099 decShiftToLeast(a->lsu, D2U(a->digits), todrop);
3100 a->exponent+=todrop; /* maintain numerical value */
3101 a->digits-=todrop; /* new length */
3108 /* double-check Underflow, as perhaps the result could not have */
3109 /* been subnormal (initial argument too big), or it is now Exact */
3110 if (status&DEC_Underflow) {
3111 Int ae=rhs->exponent+rhs->digits-1; /* adjusted exponent */
3112 /* check if truly subnormal */
3113 #if DECEXTFLAG /* DEC_Subnormal too */
3114 if (ae>=set->emin*2) status&=~(DEC_Subnormal|DEC_Underflow);
3116 if (ae>=set->emin*2) status&=~DEC_Underflow;
3118 /* check if truly inexact */
3119 if (!(status&DEC_Inexact)) status&=~DEC_Underflow;
3122 uprv_decNumberCopy(res, a); /* a is now the result */
3123 } while(0); /* end protected */
3125 if (allocbuff!=NULL) free(allocbuff); /* drop any storage used */
3126 if (allocbufa!=NULL) free(allocbufa); /* .. */
3127 if (allocbufb!=NULL) free(allocbufb); /* .. */
3129 if (allocrhs !=NULL) free(allocrhs); /* .. */
3131 if (status!=0) decStatus(res, status, set);/* then report status */
3133 decCheckInexact(res, set);
3136 } /* decNumberSquareRoot */
3137 #pragma clang diagnostic pop
3139 /* ------------------------------------------------------------------ */
3140 /* decNumberSubtract -- subtract two Numbers */
3142 /* This computes C = A - B */
3144 /* res is C, the result. C may be A and/or B (e.g., X=X-X) */
3147 /* set is the context */
3149 /* C must have space for set->digits digits. */
3150 /* ------------------------------------------------------------------ */
3151 U_CAPI decNumber * U_EXPORT2 uprv_decNumberSubtract(decNumber *res, const decNumber *lhs,
3152 const decNumber *rhs, decContext *set) {
3153 uInt status=0; /* accumulator */
3155 decAddOp(res, lhs, rhs, set, DECNEG, &status);
3156 if (status!=0) decStatus(res, status, set);
3158 decCheckInexact(res, set);
3161 } /* decNumberSubtract */
3163 /* ------------------------------------------------------------------ */
3164 /* decNumberToIntegralExact -- round-to-integral-value with InExact */
3165 /* decNumberToIntegralValue -- round-to-integral-value */
3167 /* res is the result */
3168 /* rhs is input number */
3169 /* set is the context */
3171 /* res must have space for any value of rhs. */
3173 /* This implements the IEEE special operators and therefore treats */
3174 /* special values as valid. For finite numbers it returns */
3175 /* rescale(rhs, 0) if rhs->exponent is <0. */
3176 /* Otherwise the result is rhs (so no error is possible, except for */
3179 /* The context is used for rounding mode and status after sNaN, but */
3180 /* the digits setting is ignored. The Exact version will signal */
3181 /* Inexact if the result differs numerically from rhs; the other */
3182 /* never signals Inexact. */
3183 /* ------------------------------------------------------------------ */
3184 U_CAPI decNumber * U_EXPORT2 uprv_decNumberToIntegralExact(decNumber *res, const decNumber *rhs,
3187 decContext workset; /* working context */
3188 uInt status=0; /* accumulator */
3191 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
3194 /* handle infinities and NaNs */
3196 if (decNumberIsInfinite(rhs)) uprv_decNumberCopy(res, rhs); /* an Infinity */
3197 else decNaNs(res, rhs, NULL, set, &status); /* a NaN */
3200 /* have a finite number; no error possible (res must be big enough) */
3201 if (rhs->exponent>=0) return uprv_decNumberCopy(res, rhs);
3202 /* that was easy, but if negative exponent there is work to do... */
3203 workset=*set; /* clone rounding, etc. */
3204 workset.digits=rhs->digits; /* no length rounding */
3205 workset.traps=0; /* no traps */
3206 uprv_decNumberZero(&dn); /* make a number with exponent 0 */
3207 uprv_decNumberQuantize(res, rhs, &dn, &workset);
3208 status|=workset.status;
3210 if (status!=0) decStatus(res, status, set);
3212 } /* decNumberToIntegralExact */
3214 U_CAPI decNumber * U_EXPORT2 uprv_decNumberToIntegralValue(decNumber *res, const decNumber *rhs,
3216 decContext workset=*set; /* working context */
3217 workset.traps=0; /* no traps */
3218 uprv_decNumberToIntegralExact(res, rhs, &workset);
3219 /* this never affects set, except for sNaNs; NaN will have been set */
3220 /* or propagated already, so no need to call decStatus */
3221 set->status|=workset.status&DEC_Invalid_operation;
3223 } /* decNumberToIntegralValue */
3225 /* ------------------------------------------------------------------ */
3226 /* decNumberXor -- XOR two Numbers, digitwise */
3228 /* This computes C = A ^ B */
3230 /* res is C, the result. C may be A and/or B (e.g., X=X^X) */
3233 /* set is the context (used for result length and error report) */
3235 /* C must have space for set->digits digits. */
3237 /* Logical function restrictions apply (see above); a NaN is */
3238 /* returned with Invalid_operation if a restriction is violated. */
3239 /* ------------------------------------------------------------------ */
3240 U_CAPI decNumber * U_EXPORT2 uprv_decNumberXor(decNumber *res, const decNumber *lhs,
3241 const decNumber *rhs, decContext *set) {
3242 const Unit *ua, *ub; /* -> operands */
3243 const Unit *msua, *msub; /* -> operand msus */
3244 Unit *uc, *msuc; /* -> result and its msu */
3245 Int msudigs; /* digits in res msu */
3247 if (decCheckOperands(res, lhs, rhs, set)) return res;
3250 if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
3251 || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
3252 decStatus(res, DEC_Invalid_operation, set);
3255 /* operands are valid */
3256 ua=lhs->lsu; /* bottom-up */
3257 ub=rhs->lsu; /* .. */
3258 uc=res->lsu; /* .. */
3259 msua=ua+D2U(lhs->digits)-1; /* -> msu of lhs */
3260 msub=ub+D2U(rhs->digits)-1; /* -> msu of rhs */
3261 msuc=uc+D2U(set->digits)-1; /* -> msu of result */
3262 msudigs=MSUDIGITS(set->digits); /* [faster than remainder] */
3263 for (; uc<=msuc; ua++, ub++, uc++) { /* Unit loop */
3264 Unit a, b; /* extract units */
3269 *uc=0; /* can now write back */
3270 if (a|b) { /* maybe 1 bits to examine */
3272 /* This loop could be unrolled and/or use BIN2BCD tables */
3273 for (i=0; i<DECDPUN; i++) {
3274 if ((a^b)&1) *uc=*uc+(Unit)powers[i]; /* effect XOR */
3280 decStatus(res, DEC_Invalid_operation, set);
3283 if (uc==msuc && i==msudigs-1) break; /* just did final digit */
3287 /* [here uc-1 is the msu of the result] */
3288 res->digits=decGetDigits(res->lsu, uc-res->lsu);
3289 res->exponent=0; /* integer */
3290 res->bits=0; /* sign=0 */
3291 return res; /* [no status to set] */
3292 } /* decNumberXor */
3295 /* ================================================================== */
3296 /* Utility routines */
3297 /* ================================================================== */
3299 /* ------------------------------------------------------------------ */
3300 /* decNumberClass -- return the decClass of a decNumber */
3301 /* dn -- the decNumber to test */
3302 /* set -- the context to use for Emin */
3303 /* returns the decClass enum */
3304 /* ------------------------------------------------------------------ */
3305 enum decClass uprv_decNumberClass(const decNumber *dn, decContext *set) {
3306 if (decNumberIsSpecial(dn)) {
3307 if (decNumberIsQNaN(dn)) return DEC_CLASS_QNAN;
3308 if (decNumberIsSNaN(dn)) return DEC_CLASS_SNAN;
3309 /* must be an infinity */
3310 if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_INF;
3311 return DEC_CLASS_POS_INF;
3314 if (uprv_decNumberIsNormal(dn, set)) { /* most common */
3315 if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_NORMAL;
3316 return DEC_CLASS_POS_NORMAL;
3318 /* is subnormal or zero */
3319 if (decNumberIsZero(dn)) { /* most common */
3320 if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_ZERO;
3321 return DEC_CLASS_POS_ZERO;
3323 if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_SUBNORMAL;
3324 return DEC_CLASS_POS_SUBNORMAL;
3325 } /* decNumberClass */
3327 /* ------------------------------------------------------------------ */
3328 /* decNumberClassToString -- convert decClass to a string */
3330 /* eclass is a valid decClass */
3331 /* returns a constant string describing the class (max 13+1 chars) */
3332 /* ------------------------------------------------------------------ */
3333 const char *uprv_decNumberClassToString(enum decClass eclass) {
3334 if (eclass==DEC_CLASS_POS_NORMAL) return DEC_ClassString_PN;
3335 if (eclass==DEC_CLASS_NEG_NORMAL) return DEC_ClassString_NN;
3336 if (eclass==DEC_CLASS_POS_ZERO) return DEC_ClassString_PZ;
3337 if (eclass==DEC_CLASS_NEG_ZERO) return DEC_ClassString_NZ;
3338 if (eclass==DEC_CLASS_POS_SUBNORMAL) return DEC_ClassString_PS;
3339 if (eclass==DEC_CLASS_NEG_SUBNORMAL) return DEC_ClassString_NS;
3340 if (eclass==DEC_CLASS_POS_INF) return DEC_ClassString_PI;
3341 if (eclass==DEC_CLASS_NEG_INF) return DEC_ClassString_NI;
3342 if (eclass==DEC_CLASS_QNAN) return DEC_ClassString_QN;
3343 if (eclass==DEC_CLASS_SNAN) return DEC_ClassString_SN;
3344 return DEC_ClassString_UN; /* Unknown */
3345 } /* decNumberClassToString */
3347 /* ------------------------------------------------------------------ */
3348 /* decNumberCopy -- copy a number */
3350 /* dest is the target decNumber */
3351 /* src is the source decNumber */
3354 /* (dest==src is allowed and is a no-op) */
3355 /* All fields are updated as required. This is a utility operation, */
3356 /* so special values are unchanged and no error is possible. */
3357 /* ------------------------------------------------------------------ */
3358 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCopy(decNumber *dest, const decNumber *src) {
3361 if (src==NULL) return uprv_decNumberZero(dest);
3364 if (dest==src) return dest; /* no copy required */
3366 /* Use explicit assignments here as structure assignment could copy */
3367 /* more than just the lsu (for small DECDPUN). This would not affect */
3368 /* the value of the results, but could disturb test harness spill */
3370 dest->bits=src->bits;
3371 dest->exponent=src->exponent;
3372 dest->digits=src->digits;
3373 dest->lsu[0]=src->lsu[0];
3374 if (src->digits>DECDPUN) { /* more Units to come */
3375 const Unit *smsup, *s; /* work */
3377 /* memcpy for the remaining Units would be safe as they cannot */
3378 /* overlap. However, this explicit loop is faster in short cases. */
3379 d=dest->lsu+1; /* -> first destination */
3380 smsup=src->lsu+D2U(src->digits); /* -> source msu+1 */
3381 for (s=src->lsu+1; s<smsup; s++, d++) *d=*s;
3384 } /* decNumberCopy */
3386 /* ------------------------------------------------------------------ */
3387 /* decNumberCopyAbs -- quiet absolute value operator */
3389 /* This sets C = abs(A) */
3391 /* res is C, the result. C may be A */
3394 /* C must have space for set->digits digits. */
3395 /* No exception or error can occur; this is a quiet bitwise operation.*/
3396 /* See also decNumberAbs for a checking version of this. */
3397 /* ------------------------------------------------------------------ */
3398 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCopyAbs(decNumber *res, const decNumber *rhs) {
3400 if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
3402 uprv_decNumberCopy(res, rhs);
3403 res->bits&=~DECNEG; /* turn off sign */
3405 } /* decNumberCopyAbs */
3407 /* ------------------------------------------------------------------ */
3408 /* decNumberCopyNegate -- quiet negate value operator */
3410 /* This sets C = negate(A) */
3412 /* res is C, the result. C may be A */
3415 /* C must have space for set->digits digits. */
3416 /* No exception or error can occur; this is a quiet bitwise operation.*/
3417 /* See also decNumberMinus for a checking version of this. */
3418 /* ------------------------------------------------------------------ */
3419 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCopyNegate(decNumber *res, const decNumber *rhs) {
3421 if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
3423 uprv_decNumberCopy(res, rhs);
3424 res->bits^=DECNEG; /* invert the sign */
3426 } /* decNumberCopyNegate */
3428 /* ------------------------------------------------------------------ */
3429 /* decNumberCopySign -- quiet copy and set sign operator */
3431 /* This sets C = A with the sign of B */
3433 /* res is C, the result. C may be A */
3437 /* C must have space for set->digits digits. */
3438 /* No exception or error can occur; this is a quiet bitwise operation.*/
3439 /* ------------------------------------------------------------------ */
3440 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCopySign(decNumber *res, const decNumber *lhs,
3441 const decNumber *rhs) {
3442 uByte sign; /* rhs sign */
3444 if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
3446 sign=rhs->bits & DECNEG; /* save sign bit */
3447 uprv_decNumberCopy(res, lhs);
3448 res->bits&=~DECNEG; /* clear the sign */
3449 res->bits|=sign; /* set from rhs */
3451 } /* decNumberCopySign */
3453 /* ------------------------------------------------------------------ */
3454 /* decNumberGetBCD -- get the coefficient in BCD8 */
3455 /* dn is the source decNumber */
3456 /* bcd is the uInt array that will receive dn->digits BCD bytes, */
3457 /* most-significant at offset 0 */
3460 /* bcd must have at least dn->digits bytes. No error is possible; if */
3461 /* dn is a NaN or Infinite, digits must be 1 and the coefficient 0. */
3462 /* ------------------------------------------------------------------ */
3463 U_CAPI uByte * U_EXPORT2 uprv_decNumberGetBCD(const decNumber *dn, uByte *bcd) {
3464 uByte *ub=bcd+dn->digits-1; /* -> lsd */
3465 const Unit *up=dn->lsu; /* Unit pointer, -> lsu */
3467 #if DECDPUN==1 /* trivial simple copy */
3468 for (; ub>=bcd; ub--, up++) *ub=*up;
3469 #else /* chopping needed */
3470 uInt u=*up; /* work */
3471 uInt cut=DECDPUN; /* downcounter through unit */
3472 for (; ub>=bcd; ub--) {
3473 *ub=(uByte)(u%10); /* [*6554 trick inhibits, here] */
3476 if (cut>0) continue; /* more in this unit */
3483 } /* decNumberGetBCD */
3485 /* ------------------------------------------------------------------ */
3486 /* decNumberSetBCD -- set (replace) the coefficient from BCD8 */
3487 /* dn is the target decNumber */
3488 /* bcd is the uInt array that will source n BCD bytes, most- */
3489 /* significant at offset 0 */
3490 /* n is the number of digits in the source BCD array (bcd) */
3493 /* dn must have space for at least n digits. No error is possible; */
3494 /* if dn is a NaN, or Infinite, or is to become a zero, n must be 1 */
3495 /* and bcd[0] zero. */
3496 /* ------------------------------------------------------------------ */
3497 U_CAPI decNumber * U_EXPORT2 uprv_decNumberSetBCD(decNumber *dn, const uByte *bcd, uInt n) {
3498 Unit *up=dn->lsu+D2U(dn->digits)-1; /* -> msu [target pointer] */
3499 const uByte *ub=bcd; /* -> source msd */
3501 #if DECDPUN==1 /* trivial simple copy */
3502 for (; ub<bcd+n; ub++, up--) *up=*ub;
3503 #else /* some assembly needed */
3504 /* calculate how many digits in msu, and hence first cut */
3505 Int cut=MSUDIGITS(n); /* [faster than remainder] */
3506 for (;up>=dn->lsu; up--) { /* each Unit from msu */
3507 *up=0; /* will take <=DECDPUN digits */
3508 for (; cut>0; ub++, cut--) *up=X10(*up)+*ub;
3509 cut=DECDPUN; /* next Unit has all digits */
3512 dn->digits=n; /* set digit count */
3514 } /* decNumberSetBCD */
3516 /* ------------------------------------------------------------------ */
3517 /* decNumberIsNormal -- test normality of a decNumber */
3518 /* dn is the decNumber to test */
3519 /* set is the context to use for Emin */
3520 /* returns 1 if |dn| is finite and >=Nmin, 0 otherwise */
3521 /* ------------------------------------------------------------------ */
3522 Int uprv_decNumberIsNormal(const decNumber *dn, decContext *set) {
3523 Int ae; /* adjusted exponent */
3525 if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
3528 if (decNumberIsSpecial(dn)) return 0; /* not finite */
3529 if (decNumberIsZero(dn)) return 0; /* not non-zero */
3531 ae=dn->exponent+dn->digits-1; /* adjusted exponent */
3532 if (ae<set->emin) return 0; /* is subnormal */
3534 } /* decNumberIsNormal */
3536 /* ------------------------------------------------------------------ */
3537 /* decNumberIsSubnormal -- test subnormality of a decNumber */
3538 /* dn is the decNumber to test */
3539 /* set is the context to use for Emin */
3540 /* returns 1 if |dn| is finite, non-zero, and <Nmin, 0 otherwise */
3541 /* ------------------------------------------------------------------ */
3542 Int uprv_decNumberIsSubnormal(const decNumber *dn, decContext *set) {
3543 Int ae; /* adjusted exponent */
3545 if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
3548 if (decNumberIsSpecial(dn)) return 0; /* not finite */
3549 if (decNumberIsZero(dn)) return 0; /* not non-zero */
3551 ae=dn->exponent+dn->digits-1; /* adjusted exponent */
3552 if (ae<set->emin) return 1; /* is subnormal */
3554 } /* decNumberIsSubnormal */
3556 /* ------------------------------------------------------------------ */
3557 /* decNumberTrim -- remove insignificant zeros */
3559 /* dn is the number to trim */
3562 /* All fields are updated as required. This is a utility operation, */
3563 /* so special values are unchanged and no error is possible. The */
3564 /* zeros are removed unconditionally. */
3565 /* ------------------------------------------------------------------ */
3566 U_CAPI decNumber * U_EXPORT2 uprv_decNumberTrim(decNumber *dn) {
3567 Int dropped; /* work */
3568 decContext set; /* .. */
3570 if (decCheckOperands(DECUNRESU, DECUNUSED, dn, DECUNCONT)) return dn;
3572 uprv_decContextDefault(&set, DEC_INIT_BASE); /* clamp=0 */
3573 return decTrim(dn, &set, 0, 1, &dropped);
3574 } /* decNumberTrim */
3576 /* ------------------------------------------------------------------ */
3577 /* decNumberVersion -- return the name and version of this module */
3579 /* No error is possible. */
3580 /* ------------------------------------------------------------------ */
3581 const char * uprv_decNumberVersion(void) {
3583 } /* decNumberVersion */
3585 /* ------------------------------------------------------------------ */
3586 /* decNumberZero -- set a number to 0 */
3588 /* dn is the number to set, with space for one digit */
3591 /* No error is possible. */
3592 /* ------------------------------------------------------------------ */
3593 /* Memset is not used as it is much slower in some environments. */
3594 U_CAPI decNumber * U_EXPORT2 uprv_decNumberZero(decNumber *dn) {
3597 if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
3605 } /* decNumberZero */
3607 /* ================================================================== */
3608 /* Local routines */
3609 /* ================================================================== */
3611 /* ------------------------------------------------------------------ */
3612 /* decToString -- lay out a number into a string */
3614 /* dn is the number to lay out */
3615 /* string is where to lay out the number */
3616 /* eng is 1 if Engineering, 0 if Scientific */
3618 /* string must be at least dn->digits+14 characters long */
3619 /* No error is possible. */
3621 /* Note that this routine can generate a -0 or 0.000. These are */
3622 /* never generated in subset to-number or arithmetic, but can occur */
3623 /* in non-subset arithmetic (e.g., -1*0 or 1.234-1.234). */
3624 /* ------------------------------------------------------------------ */
3625 /* If DECCHECK is enabled the string "?" is returned if a number is */
3627 static void decToString(const decNumber *dn, char *string, Flag eng) {
3628 Int exp=dn->exponent; /* local copy */
3629 Int e; /* E-part value */
3630 Int pre; /* digits before the '.' */
3631 Int cut; /* for counting digits in a Unit */
3632 char *c=string; /* work [output pointer] */
3633 const Unit *up=dn->lsu+D2U(dn->digits)-1; /* -> msu [input pointer] */
3634 uInt u, pow; /* work */
3637 if (decCheckOperands(DECUNRESU, dn, DECUNUSED, DECUNCONT)) {
3638 strcpy(string, "?");
3642 if (decNumberIsNegative(dn)) { /* Negatives get a minus */
3646 if (dn->bits&DECSPECIAL) { /* Is a special value */
3647 if (decNumberIsInfinite(dn)) {
3649 strcpy(c+3, "inity");
3652 if (dn->bits&DECSNAN) { /* signalling NaN */
3657 c+=3; /* step past */
3658 /* if not a clean non-zero coefficient, that's all there is in a */
3660 if (exp!=0 || (*dn->lsu==0 && dn->digits==1)) return;
3661 /* [drop through to add integer] */
3664 /* calculate how many digits in msu, and hence first cut */
3665 cut=MSUDIGITS(dn->digits); /* [faster than remainder] */
3666 cut--; /* power of ten for digit */
3668 if (exp==0) { /* simple integer [common fastpath] */
3669 for (;up>=dn->lsu; up--) { /* each Unit from msu */
3670 u=*up; /* contains DECDPUN digits to lay out */
3671 for (; cut>=0; c++, cut--) TODIGIT(u, cut, c, pow);
3672 cut=DECDPUN-1; /* next Unit has all digits */
3674 *c='\0'; /* terminate the string */
3677 /* non-0 exponent -- assume plain form */
3678 pre=dn->digits+exp; /* digits before '.' */
3680 if ((exp>0) || (pre<-5)) { /* need exponential form */
3681 e=exp+dn->digits-1; /* calculate E value */
3682 pre=1; /* assume one digit before '.' */
3683 if (eng && (e!=0)) { /* engineering: may need to adjust */
3684 Int adj; /* adjustment */
3685 /* The C remainder operator is undefined for negative numbers, so */
3686 /* a positive remainder calculation must be used here */
3689 if (adj!=0) adj=3-adj;
3695 /* if dealing with zero still produce an exponent which is a */
3696 /* multiple of three, as expected, but there will only be the */
3697 /* one zero before the E, still. Otherwise note the padding. */
3698 if (!ISZERO(dn)) pre+=adj;
3699 else { /* is zero */
3700 if (adj!=0) { /* 0.00Esnn needed */
3706 } /* need exponent */
3708 /* lay out the digits of the coefficient, adding 0s and . as needed */
3710 if (pre>0) { /* xxx.xxx or xx00 (engineering) form */
3712 for (; pre>0; pre--, c++, cut--) {
3713 if (cut<0) { /* need new Unit */
3714 if (up==dn->lsu) break; /* out of input digits (pre>digits) */
3719 TODIGIT(u, cut, c, pow);
3721 if (n<dn->digits) { /* more to come, after '.' */
3723 for (;; c++, cut--) {
3724 if (cut<0) { /* need new Unit */
3725 if (up==dn->lsu) break; /* out of input digits */
3730 TODIGIT(u, cut, c, pow);
3733 else for (; pre>0; pre--, c++) *c='0'; /* 0 padding (for engineering) needed */
3735 else { /* 0.xxx or 0.000xxx form */
3738 for (; pre<0; pre++, c++) *c='0'; /* add any 0's after '.' */
3739 for (; ; c++, cut--) {
3740 if (cut<0) { /* need new Unit */
3741 if (up==dn->lsu) break; /* out of input digits */
3746 TODIGIT(u, cut, c, pow);
3750 /* Finally add the E-part, if needed. It will never be 0, has a
3751 base maximum and minimum of +999999999 through -999999999, but
3752 could range down to -1999999998 for anormal numbers */
3754 Flag had=0; /* 1=had non-zero */
3756 *c='+'; c++; /* assume positive */
3759 *(c-1)='-'; /* oops, need - */
3760 u=-e; /* uInt, please */
3762 /* lay out the exponent [_itoa or equivalent is not ANSI C] */
3763 for (cut=9; cut>=0; cut--) {
3764 TODIGIT(u, cut, c, pow);
3765 if (*c=='0' && !had) continue; /* skip leading zeros */
3766 had=1; /* had non-0 */
3767 c++; /* step for next */
3770 *c='\0'; /* terminate the string (all paths) */
3774 /* ------------------------------------------------------------------ */
3775 /* decAddOp -- add/subtract operation */
3777 /* This computes C = A + B */
3779 /* res is C, the result. C may be A and/or B (e.g., X=X+X) */
3782 /* set is the context */
3783 /* negate is DECNEG if rhs should be negated, or 0 otherwise */
3784 /* status accumulates status for the caller */
3786 /* C must have space for set->digits digits. */
3787 /* Inexact in status must be 0 for correct Exact zero sign in result */
3788 /* ------------------------------------------------------------------ */
3789 /* If possible, the coefficient is calculated directly into C. */
3791 /* -- a digits+1 calculation is needed because the numbers are */
3792 /* unaligned and span more than set->digits digits */
3793 /* -- a carry to digits+1 digits looks possible */
3794 /* -- C is the same as A or B, and the result would destructively */
3795 /* overlap the A or B coefficient */
3796 /* then the result must be calculated into a temporary buffer. In */
3797 /* this case a local (stack) buffer is used if possible, and only if */
3798 /* too long for that does malloc become the final resort. */
3800 /* Misalignment is handled as follows: */
3801 /* Apad: (AExp>BExp) Swap operands and proceed as for BExp>AExp. */
3802 /* BPad: Apply the padding by a combination of shifting (whole */
3803 /* units) and multiplication (part units). */
3805 /* Addition, especially x=x+1, is speed-critical. */
3806 /* The static buffer is larger than might be expected to allow for */
3807 /* calls from higher-level funtions (notable exp). */
3808 /* ------------------------------------------------------------------ */
3809 static decNumber * decAddOp(decNumber *res, const decNumber *lhs,
3810 const decNumber *rhs, decContext *set,
3811 uByte negate, uInt *status) {
3813 decNumber *alloclhs=NULL; /* non-NULL if rounded lhs allocated */
3814 decNumber *allocrhs=NULL; /* .., rhs */
3816 Int rhsshift; /* working shift (in Units) */
3817 Int maxdigits; /* longest logical length */
3818 Int mult; /* multiplier */
3819 Int residue; /* rounding accumulator */
3820 uByte bits; /* result bits */
3821 Flag diffsign; /* non-0 if arguments have different sign */
3822 Unit *acc; /* accumulator for result */
3823 Unit accbuff[SD2U(DECBUFFER*2+20)]; /* local buffer [*2+20 reduces many */
3824 /* allocations when called from */
3825 /* other operations, notable exp] */
3826 Unit *allocacc=NULL; /* -> allocated acc buffer, iff allocated */
3827 Int reqdigits=set->digits; /* local copy; requested DIGITS */
3828 Int padding; /* work */
3831 if (decCheckOperands(res, lhs, rhs, set)) return res;
3834 do { /* protect allocated storage */
3836 if (!set->extended) {
3837 /* reduce operands and set lostDigits status, as needed */
3838 if (lhs->digits>reqdigits) {
3839 alloclhs=decRoundOperand(lhs, set, status);
3840 if (alloclhs==NULL) break;
3843 if (rhs->digits>reqdigits) {
3844 allocrhs=decRoundOperand(rhs, set, status);
3845 if (allocrhs==NULL) break;
3850 /* [following code does not require input rounding] */
3852 /* note whether signs differ [used all paths] */
3853 diffsign=(Flag)((lhs->bits^rhs->bits^negate)&DECNEG);
3855 /* handle infinities and NaNs */
3856 if (SPECIALARGS) { /* a special bit set */
3857 if (SPECIALARGS & (DECSNAN | DECNAN)) /* a NaN */
3858 decNaNs(res, lhs, rhs, set, status);
3859 else { /* one or two infinities */
3860 if (decNumberIsInfinite(lhs)) { /* LHS is infinity */
3861 /* two infinities with different signs is invalid */
3862 if (decNumberIsInfinite(rhs) && diffsign) {
3863 *status|=DEC_Invalid_operation;
3866 bits=lhs->bits & DECNEG; /* get sign from LHS */
3868 else bits=(rhs->bits^negate) & DECNEG;/* RHS must be Infinity */
3870 uprv_decNumberZero(res);
3871 res->bits=bits; /* set +/- infinity */
3876 /* Quick exit for add 0s; return the non-0, modified as need be */
3878 Int adjust; /* work */
3879 Int lexp=lhs->exponent; /* save in case LHS==RES */
3880 bits=lhs->bits; /* .. */
3881 residue=0; /* clear accumulator */
3882 decCopyFit(res, rhs, set, &residue, status); /* copy (as needed) */
3883 res->bits^=negate; /* flip if rhs was negated */
3885 if (set->extended) { /* exponents on zeros count */
3887 /* exponent will be the lower of the two */
3888 adjust=lexp-res->exponent; /* adjustment needed [if -ve] */
3889 if (ISZERO(res)) { /* both 0: special IEEE 754 rules */
3890 if (adjust<0) res->exponent=lexp; /* set exponent */
3891 /* 0-0 gives +0 unless rounding to -infinity, and -0-0 gives -0 */
3893 if (set->round!=DEC_ROUND_FLOOR) res->bits=0;
3894 else res->bits=DECNEG; /* preserve 0 sign */
3897 else { /* non-0 res */
3898 if (adjust<0) { /* 0-padding needed */
3899 if ((res->digits-adjust)>set->digits) {
3900 adjust=res->digits-set->digits; /* to fit exactly */
3901 *status|=DEC_Rounded; /* [but exact] */
3903 res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
3904 res->exponent+=adjust; /* set the exponent. */
3910 decFinish(res, set, &residue, status); /* clean and finalize */
3913 if (ISZERO(rhs)) { /* [lhs is non-zero] */
3914 Int adjust; /* work */
3915 Int rexp=rhs->exponent; /* save in case RHS==RES */
3916 bits=rhs->bits; /* be clean */
3917 residue=0; /* clear accumulator */
3918 decCopyFit(res, lhs, set, &residue, status); /* copy (as needed) */
3920 if (set->extended) { /* exponents on zeros count */
3922 /* exponent will be the lower of the two */
3923 /* [0-0 case handled above] */
3924 adjust=rexp-res->exponent; /* adjustment needed [if -ve] */
3925 if (adjust<0) { /* 0-padding needed */
3926 if ((res->digits-adjust)>set->digits) {
3927 adjust=res->digits-set->digits; /* to fit exactly */
3928 *status|=DEC_Rounded; /* [but exact] */
3930 res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
3931 res->exponent+=adjust; /* set the exponent. */
3936 decFinish(res, set, &residue, status); /* clean and finalize */
3939 /* [NB: both fastpath and mainpath code below assume these cases */
3940 /* (notably 0-0) have already been handled] */
3942 /* calculate the padding needed to align the operands */
3943 padding=rhs->exponent-lhs->exponent;
3945 /* Fastpath cases where the numbers are aligned and normal, the RHS */
3946 /* is all in one unit, no operand rounding is needed, and no carry, */
3947 /* lengthening, or borrow is needed */
3949 && rhs->digits<=DECDPUN
3950 && rhs->exponent>=set->emin /* [some normals drop through] */
3951 && rhs->exponent<=set->emax-set->digits+1 /* [could clamp] */
3952 && rhs->digits<=reqdigits
3953 && lhs->digits<=reqdigits) {
3954 Int partial=*lhs->lsu;
3955 if (!diffsign) { /* adding */
3957 if ((partial<=DECDPUNMAX) /* result fits in unit */
3958 && (lhs->digits>=DECDPUN || /* .. and no digits-count change */
3959 partial<(Int)powers[lhs->digits])) { /* .. */
3960 if (res!=lhs) uprv_decNumberCopy(res, lhs); /* not in place */
3961 *res->lsu=(Unit)partial; /* [copy could have overwritten RHS] */
3964 /* else drop out for careful add */
3966 else { /* signs differ */
3968 if (partial>0) { /* no borrow needed, and non-0 result */
3969 if (res!=lhs) uprv_decNumberCopy(res, lhs); /* not in place */
3970 *res->lsu=(Unit)partial;
3971 /* this could have reduced digits [but result>0] */
3972 res->digits=decGetDigits(res->lsu, D2U(res->digits));
3975 /* else drop out for careful subtract */
3979 /* Now align (pad) the lhs or rhs so they can be added or */
3980 /* subtracted, as necessary. If one number is much larger than */
3981 /* the other (that is, if in plain form there is a least one */
3982 /* digit between the lowest digit of one and the highest of the */
3983 /* other) padding with up to DIGITS-1 trailing zeros may be */
3984 /* needed; then apply rounding (as exotic rounding modes may be */
3985 /* affected by the residue). */
3986 rhsshift=0; /* rhs shift to left (padding) in Units */
3987 bits=lhs->bits; /* assume sign is that of LHS */
3988 mult=1; /* likely multiplier */
3990 /* [if padding==0 the operands are aligned; no padding is needed] */
3992 /* some padding needed; always pad the RHS, as any required */
3993 /* padding can then be effected by a simple combination of */
3994 /* shifts and a multiply */
3996 if (padding<0) { /* LHS needs the padding */
3998 padding=-padding; /* will be +ve */
3999 bits=(uByte)(rhs->bits^negate); /* assumed sign is now that of RHS */
4000 t=lhs; lhs=rhs; rhs=t;
4004 /* If, after pad, rhs would be longer than lhs by digits+1 or */
4005 /* more then lhs cannot affect the answer, except as a residue, */
4006 /* so only need to pad up to a length of DIGITS+1. */
4007 if (rhs->digits+padding > lhs->digits+reqdigits+1) {
4008 /* The RHS is sufficient */
4009 /* for residue use the relative sign indication... */
4010 Int shift=reqdigits-rhs->digits; /* left shift needed */
4011 residue=1; /* residue for rounding */
4012 if (diffsign) residue=-residue; /* signs differ */
4013 /* copy, shortening if necessary */
4014 decCopyFit(res, rhs, set, &residue, status);
4015 /* if it was already shorter, then need to pad with zeros */
4017 res->digits=decShiftToMost(res->lsu, res->digits, shift);
4018 res->exponent-=shift; /* adjust the exponent. */
4020 /* flip the result sign if unswapped and rhs was negated */
4021 if (!swapped) res->bits^=negate;
4022 decFinish(res, set, &residue, status); /* done */
4025 /* LHS digits may affect result */
4026 rhsshift=D2U(padding+1)-1; /* this much by Unit shift .. */
4027 mult=powers[padding-(rhsshift*DECDPUN)]; /* .. this by multiplication */
4028 } /* padding needed */
4030 if (diffsign) mult=-mult; /* signs differ */
4032 /* determine the longer operand */
4033 maxdigits=rhs->digits+padding; /* virtual length of RHS */
4034 if (lhs->digits>maxdigits) maxdigits=lhs->digits;
4036 /* Decide on the result buffer to use; if possible place directly */
4038 acc=res->lsu; /* assume add direct to result */
4039 /* If destructive overlap, or the number is too long, or a carry or */
4040 /* borrow to DIGITS+1 might be possible, a buffer must be used. */
4041 /* [Might be worth more sophisticated tests when maxdigits==reqdigits] */
4042 if ((maxdigits>=reqdigits) /* is, or could be, too large */
4043 || (res==rhs && rhsshift>0)) { /* destructive overlap */
4044 /* buffer needed, choose it; units for maxdigits digits will be */
4045 /* needed, +1 Unit for carry or borrow */
4046 Int need=D2U(maxdigits)+1;
4047 acc=accbuff; /* assume use local buffer */
4048 if (need*sizeof(Unit)>sizeof(accbuff)) {
4049 /* printf("malloc add %ld %ld\n", need, sizeof(accbuff)); */
4050 allocacc=(Unit *)malloc(need*sizeof(Unit));
4051 if (allocacc==NULL) { /* hopeless -- abandon */
4052 *status|=DEC_Insufficient_storage;
4058 res->bits=(uByte)(bits&DECNEG); /* it's now safe to overwrite.. */
4059 res->exponent=lhs->exponent; /* .. operands (even if aliased) */
4062 decDumpAr('A', lhs->lsu, D2U(lhs->digits));
4063 decDumpAr('B', rhs->lsu, D2U(rhs->digits));
4064 printf(" :h: %ld %ld\n", rhsshift, mult);
4067 /* add [A+B*m] or subtract [A+B*(-m)] */
4068 res->digits=decUnitAddSub(lhs->lsu, D2U(lhs->digits),
4069 rhs->lsu, D2U(rhs->digits),
4070 rhsshift, acc, mult)
4071 *DECDPUN; /* [units -> digits] */
4072 if (res->digits<0) { /* borrowed... */
4073 res->digits=-res->digits;
4074 res->bits^=DECNEG; /* flip the sign */
4077 decDumpAr('+', acc, D2U(res->digits));
4080 /* If a buffer was used the result must be copied back, possibly */
4081 /* shortening. (If no buffer was used then the result must have */
4082 /* fit, so can't need rounding and residue must be 0.) */
4083 residue=0; /* clear accumulator */
4084 if (acc!=res->lsu) {
4086 if (set->extended) { /* round from first significant digit */
4088 /* remove leading zeros that were added due to rounding up to */
4089 /* integral Units -- before the test for rounding. */
4090 if (res->digits>reqdigits)
4091 res->digits=decGetDigits(acc, D2U(res->digits));
4092 decSetCoeff(res, set, acc, res->digits, &residue, status);
4095 else { /* subset arithmetic rounds from original significant digit */
4096 /* May have an underestimate. This only occurs when both */
4097 /* numbers fit in DECDPUN digits and are padding with a */
4098 /* negative multiple (-10, -100...) and the top digit(s) become */
4099 /* 0. (This only matters when using X3.274 rules where the */
4100 /* leading zero could be included in the rounding.) */
4101 if (res->digits<maxdigits) {
4102 *(acc+D2U(res->digits))=0; /* ensure leading 0 is there */
4103 res->digits=maxdigits;
4106 /* remove leading zeros that added due to rounding up to */
4107 /* integral Units (but only those in excess of the original */
4108 /* maxdigits length, unless extended) before test for rounding. */
4109 if (res->digits>reqdigits) {
4110 res->digits=decGetDigits(acc, D2U(res->digits));
4111 if (res->digits<maxdigits) res->digits=maxdigits;
4114 decSetCoeff(res, set, acc, res->digits, &residue, status);
4115 /* Now apply rounding if needed before removing leading zeros. */
4116 /* This is safe because subnormals are not a possibility */
4118 decApplyRound(res, set, residue, status);
4119 residue=0; /* did what needed to be done */
4125 /* strip leading zeros [these were left on in case of subset subtract] */
4126 res->digits=decGetDigits(res->lsu, D2U(res->digits));
4128 /* apply checks and rounding */
4129 decFinish(res, set, &residue, status);
4131 /* "When the sum of two operands with opposite signs is exactly */
4132 /* zero, the sign of that sum shall be '+' in all rounding modes */
4133 /* except round toward -Infinity, in which mode that sign shall be */
4134 /* '-'." [Subset zeros also never have '-', set by decFinish.] */
4135 if (ISZERO(res) && diffsign
4139 && (*status&DEC_Inexact)==0) {
4140 if (set->round==DEC_ROUND_FLOOR) res->bits|=DECNEG; /* sign - */
4141 else res->bits&=~DECNEG; /* sign + */
4143 } while(0); /* end protected */
4145 if (allocacc!=NULL) free(allocacc); /* drop any storage used */
4147 if (allocrhs!=NULL) free(allocrhs); /* .. */
4148 if (alloclhs!=NULL) free(alloclhs); /* .. */
4153 /* ------------------------------------------------------------------ */
4154 /* decDivideOp -- division operation */
4156 /* This routine performs the calculations for all four division */
4157 /* operators (divide, divideInteger, remainder, remainderNear). */
4161 /* res is C, the result. C may be A and/or B (e.g., X=X/X) */
4164 /* set is the context */
4165 /* op is DIVIDE, DIVIDEINT, REMAINDER, or REMNEAR respectively. */
4166 /* status is the usual accumulator */
4168 /* C must have space for set->digits digits. */
4170 /* ------------------------------------------------------------------ */
4171 /* The underlying algorithm of this routine is the same as in the */
4172 /* 1981 S/370 implementation, that is, non-restoring long division */
4173 /* with bi-unit (rather than bi-digit) estimation for each unit */
4174 /* multiplier. In this pseudocode overview, complications for the */
4175 /* Remainder operators and division residues for exact rounding are */
4176 /* omitted for clarity. */
4178 /* Prepare operands and handle special values */
4179 /* Test for x/0 and then 0/x */
4180 /* Exp =Exp1 - Exp2 */
4181 /* Exp =Exp +len(var1) -len(var2) */
4182 /* Sign=Sign1 * Sign2 */
4183 /* Pad accumulator (Var1) to double-length with 0's (pad1) */
4184 /* Pad Var2 to same length as Var1 */
4185 /* msu2pair/plus=1st 2 or 1 units of var2, +1 to allow for round */
4187 /* Do until (have=digits+1 OR residue=0) */
4188 /* if exp<0 then if integer divide/residue then leave */
4191 /* compare numbers */
4192 /* if <0 then leave inner_loop */
4193 /* if =0 then (* quick exit without subtract *) do */
4194 /* this_unit=this_unit+1; output this_unit */
4195 /* leave outer_loop; end */
4196 /* Compare lengths of numbers (mantissae): */
4197 /* If same then tops2=msu2pair -- {units 1&2 of var2} */
4198 /* else tops2=msu2plus -- {0, unit 1 of var2} */
4199 /* tops1=first_unit_of_Var1*10**DECDPUN +second_unit_of_var1 */
4200 /* mult=tops1/tops2 -- Good and safe guess at divisor */
4201 /* if mult=0 then mult=1 */
4202 /* this_unit=this_unit+mult */
4204 /* end inner_loop */
4205 /* if have\=0 | this_unit\=0 then do */
4206 /* output this_unit */
4207 /* have=have+1; end */
4210 /* end outer_loop */
4211 /* exp=exp+1 -- set the proper exponent */
4212 /* if have=0 then generate answer=0 */
4213 /* Return (Result is defined by Var1) */
4215 /* ------------------------------------------------------------------ */
4216 /* Two working buffers are needed during the division; one (digits+ */
4217 /* 1) to accumulate the result, and the other (up to 2*digits+1) for */
4218 /* long subtractions. These are acc and var1 respectively. */
4219 /* var1 is a copy of the lhs coefficient, var2 is the rhs coefficient.*/
4220 /* The static buffers may be larger than might be expected to allow */
4221 /* for calls from higher-level funtions (notable exp). */
4222 /* ------------------------------------------------------------------ */
4223 static decNumber * decDivideOp(decNumber *res,
4224 const decNumber *lhs, const decNumber *rhs,
4225 decContext *set, Flag op, uInt *status) {
4227 decNumber *alloclhs=NULL; /* non-NULL if rounded lhs allocated */
4228 decNumber *allocrhs=NULL; /* .., rhs */
4230 Unit accbuff[SD2U(DECBUFFER+DECDPUN+10)]; /* local buffer */
4231 Unit *acc=accbuff; /* -> accumulator array for result */
4232 Unit *allocacc=NULL; /* -> allocated buffer, iff allocated */
4233 Unit *accnext; /* -> where next digit will go */
4234 Int acclength; /* length of acc needed [Units] */
4235 Int accunits; /* count of units accumulated */
4236 Int accdigits; /* count of digits accumulated */
4238 Unit varbuff[SD2U(DECBUFFER*2+DECDPUN)]; /* buffer for var1 */
4239 Unit *var1=varbuff; /* -> var1 array for long subtraction */
4240 Unit *varalloc=NULL; /* -> allocated buffer, iff used */
4241 Unit *msu1; /* -> msu of var1 */
4243 const Unit *var2; /* -> var2 array */
4244 const Unit *msu2; /* -> msu of var2 */
4245 Int msu2plus; /* msu2 plus one [does not vary] */
4246 eInt msu2pair; /* msu2 pair plus one [does not vary] */
4248 Int var1units, var2units; /* actual lengths */
4249 Int var2ulen; /* logical length (units) */
4250 Int var1initpad=0; /* var1 initial padding (digits) */
4251 Int maxdigits; /* longest LHS or required acc length */
4252 Int mult; /* multiplier for subtraction */
4253 Unit thisunit; /* current unit being accumulated */
4254 Int residue; /* for rounding */
4255 Int reqdigits=set->digits; /* requested DIGITS */
4256 Int exponent; /* working exponent */
4257 Int maxexponent=0; /* DIVIDE maximum exponent if unrounded */
4258 uByte bits; /* working sign */
4259 Unit *target; /* work */
4260 const Unit *source; /* .. */
4261 uInt const *pow; /* .. */
4262 Int shift, cut; /* .. */
4264 Int dropped; /* work */
4268 if (decCheckOperands(res, lhs, rhs, set)) return res;
4271 do { /* protect allocated storage */
4273 if (!set->extended) {
4274 /* reduce operands and set lostDigits status, as needed */
4275 if (lhs->digits>reqdigits) {
4276 alloclhs=decRoundOperand(lhs, set, status);
4277 if (alloclhs==NULL) break;
4280 if (rhs->digits>reqdigits) {
4281 allocrhs=decRoundOperand(rhs, set, status);
4282 if (allocrhs==NULL) break;
4287 /* [following code does not require input rounding] */
4289 bits=(lhs->bits^rhs->bits)&DECNEG; /* assumed sign for divisions */
4291 /* handle infinities and NaNs */
4292 if (SPECIALARGS) { /* a special bit set */
4293 if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs */
4294 decNaNs(res, lhs, rhs, set, status);
4297 /* one or two infinities */
4298 if (decNumberIsInfinite(lhs)) { /* LHS (dividend) is infinite */
4299 if (decNumberIsInfinite(rhs) || /* two infinities are invalid .. */
4300 op & (REMAINDER | REMNEAR)) { /* as is remainder of infinity */
4301 *status|=DEC_Invalid_operation;
4304 /* [Note that infinity/0 raises no exceptions] */
4305 uprv_decNumberZero(res);
4306 res->bits=bits|DECINF; /* set +/- infinity */
4309 else { /* RHS (divisor) is infinite */
4311 if (op&(REMAINDER|REMNEAR)) {
4312 /* result is [finished clone of] lhs */
4313 decCopyFit(res, lhs, set, &residue, status);
4315 else { /* a division */
4316 uprv_decNumberZero(res);
4317 res->bits=bits; /* set +/- zero */
4318 /* for DIVIDEINT the exponent is always 0. For DIVIDE, result */
4319 /* is a 0 with infinitely negative exponent, clamped to minimum */
4321 res->exponent=set->emin-set->digits+1;
4322 *status|=DEC_Clamped;
4325 decFinish(res, set, &residue, status);
4330 /* handle 0 rhs (x/0) */
4331 if (ISZERO(rhs)) { /* x/0 is always exceptional */
4333 uprv_decNumberZero(res); /* [after lhs test] */
4334 *status|=DEC_Division_undefined;/* 0/0 will become NaN */
4337 uprv_decNumberZero(res);
4338 if (op&(REMAINDER|REMNEAR)) *status|=DEC_Invalid_operation;
4340 *status|=DEC_Division_by_zero; /* x/0 */
4341 res->bits=bits|DECINF; /* .. is +/- Infinity */
4346 /* handle 0 lhs (0/x) */
4347 if (ISZERO(lhs)) { /* 0/x [x!=0] */
4349 if (!set->extended) uprv_decNumberZero(res);
4354 exponent=lhs->exponent-rhs->exponent; /* ideal exponent */
4355 uprv_decNumberCopy(res, lhs); /* [zeros always fit] */
4356 res->bits=bits; /* sign as computed */
4357 res->exponent=exponent; /* exponent, too */
4358 decFinalize(res, set, &residue, status); /* check exponent */
4360 else if (op&DIVIDEINT) {
4361 uprv_decNumberZero(res); /* integer 0 */
4362 res->bits=bits; /* sign as computed */
4364 else { /* a remainder */
4365 exponent=rhs->exponent; /* [save in case overwrite] */
4366 uprv_decNumberCopy(res, lhs); /* [zeros always fit] */
4367 if (exponent<res->exponent) res->exponent=exponent; /* use lower */
4374 /* Precalculate exponent. This starts off adjusted (and hence fits */
4375 /* in 31 bits) and becomes the usual unadjusted exponent as the */
4376 /* division proceeds. The order of evaluation is important, here, */
4377 /* to avoid wrap. */
4378 exponent=(lhs->exponent+lhs->digits)-(rhs->exponent+rhs->digits);
4380 /* If the working exponent is -ve, then some quick exits are */
4381 /* possible because the quotient is known to be <1 */
4382 /* [for REMNEAR, it needs to be < -1, as -0.5 could need work] */
4383 if (exponent<0 && !(op==DIVIDE)) {
4385 uprv_decNumberZero(res); /* integer part is 0 */
4389 res->bits=bits; /* set +/- zero */
4391 /* fastpath remainders so long as the lhs has the smaller */
4392 /* (or equal) exponent */
4393 if (lhs->exponent<=rhs->exponent) {
4394 if (op&REMAINDER || exponent<-1) {
4395 /* It is REMAINDER or safe REMNEAR; result is [finished */
4396 /* clone of] lhs (r = x - 0*y) */
4398 decCopyFit(res, lhs, set, &residue, status);
4399 decFinish(res, set, &residue, status);
4402 /* [unsafe REMNEAR drops through] */
4406 /* Long (slow) division is needed; roll up the sleeves... */
4408 /* The accumulator will hold the quotient of the division. */
4409 /* If it needs to be too long for stack storage, then allocate. */
4410 acclength=D2U(reqdigits+DECDPUN); /* in Units */
4411 if (acclength*sizeof(Unit)>sizeof(accbuff)) {
4412 /* printf("malloc dvacc %ld units\n", acclength); */
4413 allocacc=(Unit *)malloc(acclength*sizeof(Unit));
4414 if (allocacc==NULL) { /* hopeless -- abandon */
4415 *status|=DEC_Insufficient_storage;
4417 acc=allocacc; /* use the allocated space */
4420 /* var1 is the padded LHS ready for subtractions. */
4421 /* If it needs to be too long for stack storage, then allocate. */
4422 /* The maximum units needed for var1 (long subtraction) is: */
4424 /* (rhs->digits+reqdigits-1) -- to allow full slide to right */
4425 /* or (lhs->digits) -- to allow for long lhs */
4426 /* whichever is larger */
4427 /* +1 -- for rounding of slide to right */
4428 /* +1 -- for leading 0s */
4429 /* +1 -- for pre-adjust if a remainder or DIVIDEINT */
4430 /* [Note: unused units do not participate in decUnitAddSub data] */
4431 maxdigits=rhs->digits+reqdigits-1;
4432 if (lhs->digits>maxdigits) maxdigits=lhs->digits;
4433 var1units=D2U(maxdigits)+2;
4434 /* allocate a guard unit above msu1 for REMAINDERNEAR */
4435 if (!(op&DIVIDE)) var1units++;
4436 if ((var1units+1)*sizeof(Unit)>sizeof(varbuff)) {
4437 /* printf("malloc dvvar %ld units\n", var1units+1); */
4438 varalloc=(Unit *)malloc((var1units+1)*sizeof(Unit));
4439 if (varalloc==NULL) { /* hopeless -- abandon */
4440 *status|=DEC_Insufficient_storage;
4442 var1=varalloc; /* use the allocated space */
4445 /* Extend the lhs and rhs to full long subtraction length. The lhs */
4446 /* is truly extended into the var1 buffer, with 0 padding, so a */
4447 /* subtract in place is always possible. The rhs (var2) has */
4448 /* virtual padding (implemented by decUnitAddSub). */
4449 /* One guard unit was allocated above msu1 for rem=rem+rem in */
4450 /* REMAINDERNEAR. */
4451 msu1=var1+var1units-1; /* msu of var1 */
4452 source=lhs->lsu+D2U(lhs->digits)-1; /* msu of input array */
4453 for (target=msu1; source>=lhs->lsu; source--, target--) *target=*source;
4454 for (; target>=var1; target--) *target=0;
4456 /* rhs (var2) is left-aligned with var1 at the start */
4457 var2ulen=var1units; /* rhs logical length (units) */
4458 var2units=D2U(rhs->digits); /* rhs actual length (units) */
4459 var2=rhs->lsu; /* -> rhs array */
4460 msu2=var2+var2units-1; /* -> msu of var2 [never changes] */
4461 /* now set up the variables which will be used for estimating the */
4462 /* multiplication factor. If these variables are not exact, add */
4463 /* 1 to make sure that the multiplier is never overestimated. */
4464 msu2plus=*msu2; /* it's value .. */
4465 if (var2units>1) msu2plus++; /* .. +1 if any more */
4466 msu2pair=(eInt)*msu2*(DECDPUNMAX+1);/* top two pair .. */
4467 if (var2units>1) { /* .. [else treat 2nd as 0] */
4468 msu2pair+=*(msu2-1); /* .. */
4469 if (var2units>2) msu2pair++; /* .. +1 if any more */
4472 /* The calculation is working in units, which may have leading zeros, */
4473 /* but the exponent was calculated on the assumption that they are */
4474 /* both left-aligned. Adjust the exponent to compensate: add the */
4475 /* number of leading zeros in var1 msu and subtract those in var2 msu. */
4476 /* [This is actually done by counting the digits and negating, as */
4477 /* lead1=DECDPUN-digits1, and similarly for lead2.] */
4478 for (pow=&powers[1]; *msu1>=*pow; pow++) exponent--;
4479 for (pow=&powers[1]; *msu2>=*pow; pow++) exponent++;
4481 /* Now, if doing an integer divide or remainder, ensure that */
4482 /* the result will be Unit-aligned. To do this, shift the var1 */
4483 /* accumulator towards least if need be. (It's much easier to */
4484 /* do this now than to reassemble the residue afterwards, if */
4485 /* doing a remainder.) Also ensure the exponent is not negative. */
4488 /* save the initial 'false' padding of var1, in digits */
4489 var1initpad=(var1units-D2U(lhs->digits))*DECDPUN;
4490 /* Determine the shift to do. */
4491 if (exponent<0) cut=-exponent;
4492 else cut=DECDPUN-exponent%DECDPUN;
4493 decShiftToLeast(var1, var1units, cut);
4494 exponent+=cut; /* maintain numerical value */
4495 var1initpad-=cut; /* .. and reduce padding */
4496 /* clean any most-significant units which were just emptied */
4497 for (u=msu1; cut>=DECDPUN; cut-=DECDPUN, u--) *u=0;
4499 else { /* is DIVIDE */
4500 maxexponent=lhs->exponent-rhs->exponent; /* save */
4501 /* optimization: if the first iteration will just produce 0, */
4502 /* preadjust to skip it [valid for DIVIDE only] */
4504 var2ulen--; /* shift down */
4505 exponent-=DECDPUN; /* update the exponent */
4509 /* ---- start the long-division loops ------------------------------ */
4510 accunits=0; /* no units accumulated yet */
4511 accdigits=0; /* .. or digits */
4512 accnext=acc+acclength-1; /* -> msu of acc [NB: allows digits+1] */
4513 for (;;) { /* outer forever loop */
4514 thisunit=0; /* current unit assumed 0 */
4515 /* find the next unit */
4516 for (;;) { /* inner forever loop */
4517 /* strip leading zero units [from either pre-adjust or from */
4518 /* subtract last time around]. Leave at least one unit. */
4519 for (; *msu1==0 && msu1>var1; msu1--) var1units--;
4521 if (var1units<var2ulen) break; /* var1 too low for subtract */
4522 if (var1units==var2ulen) { /* unit-by-unit compare needed */
4523 /* compare the two numbers, from msu */
4524 const Unit *pv1, *pv2;
4525 Unit v2; /* units to compare */
4526 pv2=msu2; /* -> msu */
4527 for (pv1=msu1; ; pv1--, pv2--) {
4528 /* v1=*pv1 -- always OK */
4529 v2=0; /* assume in padding */
4530 if (pv2>=var2) v2=*pv2; /* in range */
4531 if (*pv1!=v2) break; /* no longer the same */
4532 if (pv1==var1) break; /* done; leave pv1 as is */
4534 /* here when all inspected or a difference seen */
4535 if (*pv1<v2) break; /* var1 too low to subtract */
4536 if (*pv1==v2) { /* var1 == var2 */
4537 /* reach here if var1 and var2 are identical; subtraction */
4538 /* would increase digit by one, and the residue will be 0 so */
4539 /* the calculation is done; leave the loop with residue=0. */
4540 thisunit++; /* as though subtracted */
4541 *var1=0; /* set var1 to 0 */
4542 var1units=1; /* .. */
4543 break; /* from inner */
4544 } /* var1 == var2 */
4545 /* *pv1>v2. Prepare for real subtraction; the lengths are equal */
4546 /* Estimate the multiplier (there's always a msu1-1)... */
4547 /* Bring in two units of var2 to provide a good estimate. */
4548 mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2pair);
4549 } /* lengths the same */
4550 else { /* var1units > var2ulen, so subtraction is safe */
4551 /* The var2 msu is one unit towards the lsu of the var1 msu, */
4552 /* so only one unit for var2 can be used. */
4553 mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2plus);
4555 if (mult==0) mult=1; /* must always be at least 1 */
4556 /* subtraction needed; var1 is > var2 */
4557 thisunit=(Unit)(thisunit+mult); /* accumulate */
4558 /* subtract var1-var2, into var1; only the overlap needs */
4559 /* processing, as this is an in-place calculation */
4560 shift=var2ulen-var2units;
4562 decDumpAr('1', &var1[shift], var1units-shift);
4563 decDumpAr('2', var2, var2units);
4564 printf("m=%ld\n", -mult);
4566 decUnitAddSub(&var1[shift], var1units-shift,
4568 &var1[shift], -mult);
4570 decDumpAr('#', &var1[shift], var1units-shift);
4572 /* var1 now probably has leading zeros; these are removed at the */
4573 /* top of the inner loop. */
4576 /* The next unit has been calculated in full; unless it's a */
4577 /* leading zero, add to acc */
4578 if (accunits!=0 || thisunit!=0) { /* is first or non-zero */
4579 *accnext=thisunit; /* store in accumulator */
4580 /* account exactly for the new digits */
4582 accdigits++; /* at least one */
4583 for (pow=&powers[1]; thisunit>=*pow; pow++) accdigits++;
4585 else accdigits+=DECDPUN;
4586 accunits++; /* update count */
4587 accnext--; /* ready for next */
4588 if (accdigits>reqdigits) break; /* have enough digits */
4591 /* if the residue is zero, the operation is done (unless divide */
4592 /* or divideInteger and still not enough digits yet) */
4593 if (*var1==0 && var1units==1) { /* residue is 0 */
4594 if (op&(REMAINDER|REMNEAR)) break;
4595 if ((op&DIVIDE) && (exponent<=maxexponent)) break;
4596 /* [drop through if divideInteger] */
4598 /* also done enough if calculating remainder or integer */
4599 /* divide and just did the last ('units') unit */
4600 if (exponent==0 && !(op&DIVIDE)) break;
4602 /* to get here, var1 is less than var2, so divide var2 by the per- */
4603 /* Unit power of ten and go for the next digit */
4604 var2ulen--; /* shift down */
4605 exponent-=DECDPUN; /* update the exponent */
4608 /* ---- division is complete --------------------------------------- */
4609 /* here: acc has at least reqdigits+1 of good results (or fewer */
4610 /* if early stop), starting at accnext+1 (its lsu) */
4611 /* var1 has any residue at the stopping point */
4612 /* accunits is the number of digits collected in acc */
4613 if (accunits==0) { /* acc is 0 */
4614 accunits=1; /* show have a unit .. */
4615 accdigits=1; /* .. */
4616 *accnext=0; /* .. whose value is 0 */
4618 else accnext++; /* back to last placed */
4619 /* accnext now -> lowest unit of result */
4621 residue=0; /* assume no residue */
4623 /* record the presence of any residue, for rounding */
4624 if (*var1!=0 || var1units>1) residue=1;
4625 else { /* no residue */
4626 /* Had an exact division; clean up spurious trailing 0s. */
4627 /* There will be at most DECDPUN-1, from the final multiply, */
4628 /* and then only if the result is non-0 (and even) and the */
4629 /* exponent is 'loose'. */
4632 if (!(lsu&0x01) && (lsu!=0)) {
4633 /* count the trailing zeros */
4635 for (;; drop++) { /* [will terminate because lsu!=0] */
4636 if (exponent>=maxexponent) break; /* don't chop real 0s */
4638 if ((lsu-QUOT10(lsu, drop+1)
4639 *powers[drop+1])!=0) break; /* found non-0 digit */
4641 if (lsu%powers[drop+1]!=0) break; /* found non-0 digit */
4646 accunits=decShiftToLeast(accnext, accunits, drop);
4647 accdigits=decGetDigits(accnext, accunits);
4648 accunits=D2U(accdigits);
4649 /* [exponent was adjusted in the loop] */
4651 } /* neither odd nor 0 */
4653 } /* exact divide */
4655 else /* op!=DIVIDE */ {
4656 /* check for coefficient overflow */
4657 if (accdigits+exponent>reqdigits) {
4658 *status|=DEC_Division_impossible;
4661 if (op & (REMAINDER|REMNEAR)) {
4662 /* [Here, the exponent will be 0, because var1 was adjusted */
4663 /* appropriately.] */
4664 Int postshift; /* work */
4665 Flag wasodd=0; /* integer was odd */
4666 Unit *quotlsu; /* for save */
4667 Int quotdigits; /* .. */
4669 bits=lhs->bits; /* remainder sign is always as lhs */
4671 /* Fastpath when residue is truly 0 is worthwhile [and */
4672 /* simplifies the code below] */
4673 if (*var1==0 && var1units==1) { /* residue is 0 */
4674 Int exp=lhs->exponent; /* save min(exponents) */
4675 if (rhs->exponent<exp) exp=rhs->exponent;
4676 uprv_decNumberZero(res); /* 0 coefficient */
4680 res->exponent=exp; /* .. with proper exponent */
4681 res->bits=(uByte)(bits&DECNEG); /* [cleaned] */
4682 decFinish(res, set, &residue, status); /* might clamp */
4685 /* note if the quotient was odd */
4686 if (*accnext & 0x01) wasodd=1; /* acc is odd */
4687 quotlsu=accnext; /* save in case need to reinspect */
4688 quotdigits=accdigits; /* .. */
4690 /* treat the residue, in var1, as the value to return, via acc */
4691 /* calculate the unused zero digits. This is the smaller of: */
4692 /* var1 initial padding (saved above) */
4693 /* var2 residual padding, which happens to be given by: */
4694 postshift=var1initpad+exponent-lhs->exponent+rhs->exponent;
4695 /* [the 'exponent' term accounts for the shifts during divide] */
4696 if (var1initpad<postshift) postshift=var1initpad;
4698 /* shift var1 the requested amount, and adjust its digits */
4699 var1units=decShiftToLeast(var1, var1units, postshift);
4701 accdigits=decGetDigits(var1, var1units);
4702 accunits=D2U(accdigits);
4704 exponent=lhs->exponent; /* exponent is smaller of lhs & rhs */
4705 if (rhs->exponent<exponent) exponent=rhs->exponent;
4707 /* Now correct the result if doing remainderNear; if it */
4708 /* (looking just at coefficients) is > rhs/2, or == rhs/2 and */
4709 /* the integer was odd then the result should be rem-rhs. */
4711 Int compare, tarunits; /* work */
4713 /* calculate remainder*2 into the var1 buffer (which has */
4714 /* 'headroom' of an extra unit and hence enough space) */
4715 /* [a dedicated 'double' loop would be faster, here] */
4716 tarunits=decUnitAddSub(accnext, accunits, accnext, accunits,
4718 /* decDumpAr('r', accnext, tarunits); */
4720 /* Here, accnext (var1) holds tarunits Units with twice the */
4721 /* remainder's coefficient, which must now be compared to the */
4722 /* RHS. The remainder's exponent may be smaller than the RHS's. */
4723 compare=decUnitCompare(accnext, tarunits, rhs->lsu, D2U(rhs->digits),
4724 rhs->exponent-exponent);
4725 if (compare==BADINT) { /* deep trouble */
4726 *status|=DEC_Insufficient_storage;
4729 /* now restore the remainder by dividing by two; the lsu */
4730 /* is known to be even. */
4731 for (up=accnext; up<accnext+tarunits; up++) {
4732 Int half; /* half to add to lower unit */
4734 *up/=2; /* [shift] */
4735 if (!half) continue;
4736 *(up-1)+=(DECDPUNMAX+1)/2;
4738 /* [accunits still describes the original remainder length] */
4740 if (compare>0 || (compare==0 && wasodd)) { /* adjustment needed */
4741 Int exp, expunits, exprem; /* work */
4742 /* This is effectively causing round-up of the quotient, */
4743 /* so if it was the rare case where it was full and all */
4744 /* nines, it would overflow and hence division-impossible */
4745 /* should be raised */
4746 Flag allnines=0; /* 1 if quotient all nines */
4747 if (quotdigits==reqdigits) { /* could be borderline */
4748 for (up=quotlsu; ; up++) {
4749 if (quotdigits>DECDPUN) {
4750 if (*up!=DECDPUNMAX) break;/* non-nines */
4752 else { /* this is the last Unit */
4753 if (*up==powers[quotdigits]-1) allnines=1;
4756 quotdigits-=DECDPUN; /* checked those digits */
4758 } /* borderline check */
4760 *status|=DEC_Division_impossible;
4763 /* rem-rhs is needed; the sign will invert. Again, var1 */
4764 /* can safely be used for the working Units array. */
4765 exp=rhs->exponent-exponent; /* RHS padding needed */
4766 /* Calculate units and remainder from exponent. */
4767 expunits=exp/DECDPUN;
4769 /* subtract [A+B*(-m)]; the result will always be negative */
4770 accunits=-decUnitAddSub(accnext, accunits,
4771 rhs->lsu, D2U(rhs->digits),
4772 expunits, accnext, -(Int)powers[exprem]);
4773 accdigits=decGetDigits(accnext, accunits); /* count digits exactly */
4774 accunits=D2U(accdigits); /* and recalculate the units for copy */
4775 /* [exponent is as for original remainder] */
4776 bits^=DECNEG; /* flip the sign */
4779 } /* REMAINDER or REMNEAR */
4782 /* Set exponent and bits */
4783 res->exponent=exponent;
4784 res->bits=(uByte)(bits&DECNEG); /* [cleaned] */
4786 /* Now the coefficient. */
4787 decSetCoeff(res, set, accnext, accdigits, &residue, status);
4789 decFinish(res, set, &residue, status); /* final cleanup */
4792 /* If a divide then strip trailing zeros if subset [after round] */
4793 if (!set->extended && (op==DIVIDE)) decTrim(res, set, 0, 1, &dropped);
4795 } while(0); /* end protected */
4797 if (varalloc!=NULL) free(varalloc); /* drop any storage used */
4798 if (allocacc!=NULL) free(allocacc); /* .. */
4800 if (allocrhs!=NULL) free(allocrhs); /* .. */
4801 if (alloclhs!=NULL) free(alloclhs); /* .. */
4806 /* ------------------------------------------------------------------ */
4807 /* decMultiplyOp -- multiplication operation */
4809 /* This routine performs the multiplication C=A x B. */
4811 /* res is C, the result. C may be A and/or B (e.g., X=X*X) */
4814 /* set is the context */
4815 /* status is the usual accumulator */
4817 /* C must have space for set->digits digits. */
4819 /* ------------------------------------------------------------------ */
4820 /* 'Classic' multiplication is used rather than Karatsuba, as the */
4821 /* latter would give only a minor improvement for the short numbers */
4822 /* expected to be handled most (and uses much more memory). */
4824 /* There are two major paths here: the general-purpose ('old code') */
4825 /* path which handles all DECDPUN values, and a fastpath version */
4826 /* which is used if 64-bit ints are available, DECDPUN<=4, and more */
4827 /* than two calls to decUnitAddSub would be made. */
4829 /* The fastpath version lumps units together into 8-digit or 9-digit */
4830 /* chunks, and also uses a lazy carry strategy to minimise expensive */
4831 /* 64-bit divisions. The chunks are then broken apart again into */
4832 /* units for continuing processing. Despite this overhead, the */
4833 /* fastpath can speed up some 16-digit operations by 10x (and much */
4834 /* more for higher-precision calculations). */
4836 /* A buffer always has to be used for the accumulator; in the */
4837 /* fastpath, buffers are also always needed for the chunked copies of */
4838 /* of the operand coefficients. */
4839 /* Static buffers are larger than needed just for multiply, to allow */
4840 /* for calls from other operations (notably exp). */
4841 /* ------------------------------------------------------------------ */
4842 #define FASTMUL (DECUSE64 && DECDPUN<5)
4843 static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs,
4844 const decNumber *rhs, decContext *set,
4846 Int accunits; /* Units of accumulator in use */
4847 Int exponent; /* work */
4848 Int residue=0; /* rounding residue */
4849 uByte bits; /* result sign */
4850 Unit *acc; /* -> accumulator Unit array */
4851 Int needbytes; /* size calculator */
4852 void *allocacc=NULL; /* -> allocated accumulator, iff allocated */
4853 Unit accbuff[SD2U(DECBUFFER*4+1)]; /* buffer (+1 for DECBUFFER==0, */
4854 /* *4 for calls from other operations) */
4855 const Unit *mer, *mermsup; /* work */
4856 Int madlength; /* Units in multiplicand */
4857 Int shift; /* Units to shift multiplicand by */
4860 /* if DECDPUN is 1 or 3 work in base 10**9, otherwise */
4861 /* (DECDPUN is 2 or 4) then work in base 10**8 */
4862 #if DECDPUN & 1 /* odd */
4863 #define FASTBASE 1000000000 /* base */
4864 #define FASTDIGS 9 /* digits in base */
4865 #define FASTLAZY 18 /* carry resolution point [1->18] */
4867 #define FASTBASE 100000000
4869 #define FASTLAZY 1844 /* carry resolution point [1->1844] */
4871 /* three buffers are used, two for chunked copies of the operands */
4872 /* (base 10**8 or base 10**9) and one base 2**64 accumulator with */
4873 /* lazy carry evaluation */
4874 uInt zlhibuff[(DECBUFFER*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0) */
4875 uInt *zlhi=zlhibuff; /* -> lhs array */
4876 uInt *alloclhi=NULL; /* -> allocated buffer, iff allocated */
4877 uInt zrhibuff[(DECBUFFER*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0) */
4878 uInt *zrhi=zrhibuff; /* -> rhs array */
4879 uInt *allocrhi=NULL; /* -> allocated buffer, iff allocated */
4880 uLong zaccbuff[(DECBUFFER*2+1)/4+2]; /* buffer (+1 for DECBUFFER==0) */
4881 /* [allocacc is shared for both paths, as only one will run] */
4882 uLong *zacc=zaccbuff; /* -> accumulator array for exact result */
4884 Int zoff; /* accumulator offset */
4886 uInt *lip, *rip; /* item pointers */
4887 uInt *lmsi, *rmsi; /* most significant items */
4888 Int ilhs, irhs, iacc; /* item counts in the arrays */
4889 Int lazy; /* lazy carry counter */
4890 uLong lcarry; /* uLong carry */
4891 uInt carry; /* carry (NB not uLong) */
4892 Int count; /* work */
4893 const Unit *cup; /* .. */
4900 decNumber *alloclhs=NULL; /* -> allocated buffer, iff allocated */
4901 decNumber *allocrhs=NULL; /* -> allocated buffer, iff allocated */
4905 if (decCheckOperands(res, lhs, rhs, set)) return res;
4908 /* precalculate result sign */
4909 bits=(uByte)((lhs->bits^rhs->bits)&DECNEG);
4911 /* handle infinities and NaNs */
4912 if (SPECIALARGS) { /* a special bit set */
4913 if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs */
4914 decNaNs(res, lhs, rhs, set, status);
4916 /* one or two infinities; Infinity * 0 is invalid */
4917 if (((lhs->bits & DECINF)==0 && ISZERO(lhs))
4918 ||((rhs->bits & DECINF)==0 && ISZERO(rhs))) {
4919 *status|=DEC_Invalid_operation;
4921 uprv_decNumberZero(res);
4922 res->bits=bits|DECINF; /* infinity */
4925 /* For best speed, as in DMSRCN [the original Rexx numerics */
4926 /* module], use the shorter number as the multiplier (rhs) and */
4927 /* the longer as the multiplicand (lhs) to minimise the number of */
4928 /* adds (partial products) */
4929 if (lhs->digits<rhs->digits) { /* swap... */
4930 const decNumber *hold=lhs;
4935 do { /* protect allocated storage */
4937 if (!set->extended) {
4938 /* reduce operands and set lostDigits status, as needed */
4939 if (lhs->digits>set->digits) {
4940 alloclhs=decRoundOperand(lhs, set, status);
4941 if (alloclhs==NULL) break;
4944 if (rhs->digits>set->digits) {
4945 allocrhs=decRoundOperand(rhs, set, status);
4946 if (allocrhs==NULL) break;
4951 /* [following code does not require input rounding] */
4953 #if FASTMUL /* fastpath can be used */
4954 /* use the fast path if there are enough digits in the shorter */
4955 /* operand to make the setup and takedown worthwhile */
4956 #define NEEDTWO (DECDPUN*2) /* within two decUnitAddSub calls */
4957 if (rhs->digits>NEEDTWO) { /* use fastpath... */
4958 /* calculate the number of elements in each array */
4959 ilhs=(lhs->digits+FASTDIGS-1)/FASTDIGS; /* [ceiling] */
4960 irhs=(rhs->digits+FASTDIGS-1)/FASTDIGS; /* .. */
4963 /* allocate buffers if required, as usual */
4964 needbytes=ilhs*sizeof(uInt);
4965 if (needbytes>(Int)sizeof(zlhibuff)) {
4966 alloclhi=(uInt *)malloc(needbytes);
4968 needbytes=irhs*sizeof(uInt);
4969 if (needbytes>(Int)sizeof(zrhibuff)) {
4970 allocrhi=(uInt *)malloc(needbytes);
4973 /* Allocating the accumulator space needs a special case when */
4974 /* DECDPUN=1 because when converting the accumulator to Units */
4975 /* after the multiplication each 8-byte item becomes 9 1-byte */
4976 /* units. Therefore iacc extra bytes are needed at the front */
4977 /* (rounded up to a multiple of 8 bytes), and the uLong */
4978 /* accumulator starts offset the appropriate number of units */
4979 /* to the right to avoid overwrite during the unchunking. */
4980 needbytes=iacc*sizeof(uLong);
4982 zoff=(iacc+7)/8; /* items to offset by */
4985 if (needbytes>(Int)sizeof(zaccbuff)) {
4986 allocacc=(uLong *)malloc(needbytes);
4987 zacc=(uLong *)allocacc;}
4988 if (zlhi==NULL||zrhi==NULL||zacc==NULL) {
4989 *status|=DEC_Insufficient_storage;
4992 acc=(Unit *)zacc; /* -> target Unit array */
4994 zacc+=zoff; /* start uLong accumulator to right */
4997 /* assemble the chunked copies of the left and right sides */
4998 for (count=lhs->digits, cup=lhs->lsu, lip=zlhi; count>0; lip++)
4999 for (p=0, *lip=0; p<FASTDIGS && count>0;
5000 p+=DECDPUN, cup++, count-=DECDPUN)
5001 *lip+=*cup*powers[p];
5002 lmsi=lip-1; /* save -> msi */
5003 for (count=rhs->digits, cup=rhs->lsu, rip=zrhi; count>0; rip++)
5004 for (p=0, *rip=0; p<FASTDIGS && count>0;
5005 p+=DECDPUN, cup++, count-=DECDPUN)
5006 *rip+=*cup*powers[p];
5007 rmsi=rip-1; /* save -> msi */
5009 /* zero the accumulator */
5010 for (lp=zacc; lp<zacc+iacc; lp++) *lp=0;
5012 /* Start the multiplication */
5013 /* Resolving carries can dominate the cost of accumulating the */
5014 /* partial products, so this is only done when necessary. */
5015 /* Each uLong item in the accumulator can hold values up to */
5016 /* 2**64-1, and each partial product can be as large as */
5017 /* (10**FASTDIGS-1)**2. When FASTDIGS=9, this can be added to */
5018 /* itself 18.4 times in a uLong without overflowing, so during */
5019 /* the main calculation resolution is carried out every 18th */
5020 /* add -- every 162 digits. Similarly, when FASTDIGS=8, the */
5021 /* partial products can be added to themselves 1844.6 times in */
5022 /* a uLong without overflowing, so intermediate carry */
5023 /* resolution occurs only every 14752 digits. Hence for common */
5024 /* short numbers usually only the one final carry resolution */
5026 /* (The count is set via FASTLAZY to simplify experiments to */
5027 /* measure the value of this approach: a 35% improvement on a */
5028 /* [34x34] multiply.) */
5029 lazy=FASTLAZY; /* carry delay count */
5030 for (rip=zrhi; rip<=rmsi; rip++) { /* over each item in rhs */
5031 lp=zacc+(rip-zrhi); /* where to add the lhs */
5032 for (lip=zlhi; lip<=lmsi; lip++, lp++) { /* over each item in lhs */
5033 *lp+=(uLong)(*lip)*(*rip); /* [this should in-line] */
5036 if (lazy>0 && rip!=rmsi) continue;
5037 lazy=FASTLAZY; /* reset delay count */
5038 /* spin up the accumulator resolving overflows */
5039 for (lp=zacc; lp<zacc+iacc; lp++) {
5040 if (*lp<FASTBASE) continue; /* it fits */
5041 lcarry=*lp/FASTBASE; /* top part [slow divide] */
5042 /* lcarry can exceed 2**32-1, so check again; this check */
5043 /* and occasional extra divide (slow) is well worth it, as */
5044 /* it allows FASTLAZY to be increased to 18 rather than 4 */
5045 /* in the FASTDIGS=9 case */
5046 if (lcarry<FASTBASE) carry=(uInt)lcarry; /* [usual] */
5047 else { /* two-place carry [fairly rare] */
5048 uInt carry2=(uInt)(lcarry/FASTBASE); /* top top part */
5049 *(lp+2)+=carry2; /* add to item+2 */
5050 *lp-=((uLong)FASTBASE*FASTBASE*carry2); /* [slow] */
5051 carry=(uInt)(lcarry-((uLong)FASTBASE*carry2)); /* [inline] */
5053 *(lp+1)+=carry; /* add to item above [inline] */
5054 *lp-=((uLong)FASTBASE*carry); /* [inline] */
5055 } /* carry resolution */
5058 /* The multiplication is complete; time to convert back into */
5059 /* units. This can be done in-place in the accumulator and in */
5060 /* 32-bit operations, because carries were resolved after the */
5061 /* final add. This needs N-1 divides and multiplies for */
5062 /* each item in the accumulator (which will become up to N */
5063 /* units, where 2<=N<=9). */
5064 for (lp=zacc, up=acc; lp<zacc+iacc; lp++) {
5065 uInt item=(uInt)*lp; /* decapitate to uInt */
5066 for (p=0; p<FASTDIGS-DECDPUN; p+=DECDPUN, up++) {
5067 uInt part=item/(DECDPUNMAX+1);
5068 *up=(Unit)(item-(part*(DECDPUNMAX+1)));
5071 *up=(Unit)item; up++; /* [final needs no division] */
5073 accunits=up-acc; /* count of units */
5075 else { /* here to use units directly, without chunking ['old code'] */
5078 /* if accumulator will be too long for local storage, then allocate */
5079 acc=accbuff; /* -> assume buffer for accumulator */
5080 needbytes=(D2U(lhs->digits)+D2U(rhs->digits))*sizeof(Unit);
5081 if (needbytes>(Int)sizeof(accbuff)) {
5082 allocacc=(Unit *)malloc(needbytes);
5083 if (allocacc==NULL) {*status|=DEC_Insufficient_storage; break;}
5084 acc=(Unit *)allocacc; /* use the allocated space */
5087 /* Now the main long multiplication loop */
5088 /* Unlike the equivalent in the IBM Java implementation, there */
5089 /* is no advantage in calculating from msu to lsu. So, do it */
5090 /* by the book, as it were. */
5091 /* Each iteration calculates ACC=ACC+MULTAND*MULT */
5092 accunits=1; /* accumulator starts at '0' */
5093 *acc=0; /* .. (lsu=0) */
5094 shift=0; /* no multiplicand shift at first */
5095 madlength=D2U(lhs->digits); /* this won't change */
5096 mermsup=rhs->lsu+D2U(rhs->digits); /* -> msu+1 of multiplier */
5098 for (mer=rhs->lsu; mer<mermsup; mer++) {
5099 /* Here, *mer is the next Unit in the multiplier to use */
5100 /* If non-zero [optimization] add it... */
5101 if (*mer!=0) accunits=decUnitAddSub(&acc[shift], accunits-shift,
5102 lhs->lsu, madlength, 0,
5105 else { /* extend acc with a 0; it will be used shortly */
5106 *(acc+accunits)=0; /* [this avoids length of <=0 later] */
5109 /* multiply multiplicand by 10**DECDPUN for next Unit to left */
5110 shift++; /* add this for 'logical length' */
5113 } /* unchunked units */
5115 /* common end-path */
5117 decDumpAr('*', acc, accunits); /* Show exact result */
5120 /* acc now contains the exact result of the multiplication, */
5121 /* possibly with a leading zero unit; build the decNumber from */
5122 /* it, noting if any residue */
5123 res->bits=bits; /* set sign */
5124 res->digits=decGetDigits(acc, accunits); /* count digits exactly */
5126 /* There can be a 31-bit wrap in calculating the exponent. */
5127 /* This can only happen if both input exponents are negative and */
5128 /* both their magnitudes are large. If there was a wrap, set a */
5129 /* safe very negative exponent, from which decFinalize() will */
5130 /* raise a hard underflow shortly. */
5131 exponent=lhs->exponent+rhs->exponent; /* calculate exponent */
5132 if (lhs->exponent<0 && rhs->exponent<0 && exponent>0)
5133 exponent=-2*DECNUMMAXE; /* force underflow */
5134 res->exponent=exponent; /* OK to overwrite now */
5137 /* Set the coefficient. If any rounding, residue records */
5138 decSetCoeff(res, set, acc, res->digits, &residue, status);
5139 decFinish(res, set, &residue, status); /* final cleanup */
5140 } while(0); /* end protected */
5142 if (allocacc!=NULL) free(allocacc); /* drop any storage used */
5144 if (allocrhs!=NULL) free(allocrhs); /* .. */
5145 if (alloclhs!=NULL) free(alloclhs); /* .. */
5148 if (allocrhi!=NULL) free(allocrhi); /* .. */
5149 if (alloclhi!=NULL) free(alloclhi); /* .. */
5152 } /* decMultiplyOp */
5154 /* ------------------------------------------------------------------ */
5155 /* decExpOp -- effect exponentiation */
5157 /* This computes C = exp(A) */
5159 /* res is C, the result. C may be A */
5161 /* set is the context; note that rounding mode has no effect */
5163 /* C must have space for set->digits digits. status is updated but */
5168 /* digits, emax, and -emin in the context must be less than */
5169 /* 2*DEC_MAX_MATH (1999998), and the rhs must be within these */
5170 /* bounds or a zero. This is an internal routine, so these */
5171 /* restrictions are contractual and not enforced. */
5173 /* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will */
5174 /* almost always be correctly rounded, but may be up to 1 ulp in */
5175 /* error in rare cases. */
5177 /* Finite results will always be full precision and Inexact, except */
5178 /* when A is a zero or -Infinity (giving 1 or 0 respectively). */
5179 /* ------------------------------------------------------------------ */
5180 /* This approach used here is similar to the algorithm described in */
5182 /* Variable Precision Exponential Function, T. E. Hull and */
5183 /* A. Abrham, ACM Transactions on Mathematical Software, Vol 12 #2, */
5184 /* pp79-91, ACM, June 1986. */
5186 /* with the main difference being that the iterations in the series */
5187 /* evaluation are terminated dynamically (which does not require the */
5188 /* extra variable-precision variables which are expensive in this */
5191 /* The error analysis in Hull & Abrham's paper applies except for the */
5192 /* round-off error accumulation during the series evaluation. This */
5193 /* code does not precalculate the number of iterations and so cannot */
5194 /* use Horner's scheme. Instead, the accumulation is done at double- */
5195 /* precision, which ensures that the additions of the terms are exact */
5196 /* and do not accumulate round-off (and any round-off errors in the */
5197 /* terms themselves move 'to the right' faster than they can */
5198 /* accumulate). This code also extends the calculation by allowing, */
5199 /* in the spirit of other decNumber operators, the input to be more */
5200 /* precise than the result (the precision used is based on the more */
5201 /* precise of the input or requested result). */
5203 /* Implementation notes: */
5205 /* 1. This is separated out as decExpOp so it can be called from */
5206 /* other Mathematical functions (notably Ln) with a wider range */
5207 /* than normal. In particular, it can handle the slightly wider */
5208 /* (double) range needed by Ln (which has to be able to calculate */
5209 /* exp(-x) where x can be the tiniest number (Ntiny). */
5211 /* 2. Normalizing x to be <=0.1 (instead of <=1) reduces loop */
5212 /* iterations by appoximately a third with additional (although */
5213 /* diminishing) returns as the range is reduced to even smaller */
5214 /* fractions. However, h (the power of 10 used to correct the */
5215 /* result at the end, see below) must be kept <=8 as otherwise */
5216 /* the final result cannot be computed. Hence the leverage is a */
5217 /* sliding value (8-h), where potentially the range is reduced */
5218 /* more for smaller values. */
5220 /* The leverage that can be applied in this way is severely */
5221 /* limited by the cost of the raise-to-the power at the end, */
5222 /* which dominates when the number of iterations is small (less */
5223 /* than ten) or when rhs is short. As an example, the adjustment */
5224 /* x**10,000,000 needs 31 multiplications, all but one full-width. */
5226 /* 3. The restrictions (especially precision) could be raised with */
5227 /* care, but the full decNumber range seems very hard within the */
5228 /* 32-bit limits. */
5230 /* 4. The working precisions for the static buffers are twice the */
5231 /* obvious size to allow for calls from decNumberPower. */
5232 /* ------------------------------------------------------------------ */
5233 decNumber * decExpOp(decNumber *res, const decNumber *rhs,
5234 decContext *set, uInt *status) {
5235 uInt ignore=0; /* working status */
5236 Int h; /* adjusted exponent for 0.xxxx */
5237 Int p; /* working precision */
5238 Int residue; /* rounding residue */
5239 uInt needbytes; /* for space calculations */
5240 const decNumber *x=rhs; /* (may point to safe copy later) */
5241 decContext aset, tset, dset; /* working contexts */
5242 Int comp; /* work */
5244 /* the argument is often copied to normalize it, so (unusually) it */
5245 /* is treated like other buffers, using DECBUFFER, +1 in case */
5246 /* DECBUFFER is 0 */
5247 decNumber bufr[D2N(DECBUFFER*2+1)];
5248 decNumber *allocrhs=NULL; /* non-NULL if rhs buffer allocated */
5250 /* the working precision will be no more than set->digits+8+1 */
5251 /* so for on-stack buffers DECBUFFER+9 is used, +1 in case DECBUFFER */
5252 /* is 0 (and twice that for the accumulator) */
5254 /* buffer for t, term (working precision plus) */
5255 decNumber buft[D2N(DECBUFFER*2+9+1)];
5256 decNumber *allocbuft=NULL; /* -> allocated buft, iff allocated */
5257 decNumber *t=buft; /* term */
5258 /* buffer for a, accumulator (working precision * 2), at least 9 */
5259 decNumber bufa[D2N(DECBUFFER*4+18+1)];
5260 decNumber *allocbufa=NULL; /* -> allocated bufa, iff allocated */
5261 decNumber *a=bufa; /* accumulator */
5262 /* decNumber for the divisor term; this needs at most 9 digits */
5263 /* and so can be fixed size [16 so can use standard context] */
5264 decNumber bufd[D2N(16)];
5265 decNumber *d=bufd; /* divisor */
5266 decNumber numone; /* constant 1 */
5269 Int iterations=0; /* for later sanity check */
5270 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
5273 do { /* protect allocated storage */
5274 if (SPECIALARG) { /* handle infinities and NaNs */
5275 if (decNumberIsInfinite(rhs)) { /* an infinity */
5276 if (decNumberIsNegative(rhs)) /* -Infinity -> +0 */
5277 uprv_decNumberZero(res);
5278 else uprv_decNumberCopy(res, rhs); /* +Infinity -> self */
5280 else decNaNs(res, rhs, NULL, set, status); /* a NaN */
5283 if (ISZERO(rhs)) { /* zeros -> exact 1 */
5284 uprv_decNumberZero(res); /* make clean 1 */
5285 *res->lsu=1; /* .. */
5286 break;} /* [no status to set] */
5288 /* e**x when 0 < x < 0.66 is < 1+3x/2, hence can fast-path */
5289 /* positive and negative tiny cases which will result in inexact */
5290 /* 1. This also allows the later add-accumulate to always be */
5291 /* exact (because its length will never be more than twice the */
5292 /* working precision). */
5293 /* The comparator (tiny) needs just one digit, so use the */
5294 /* decNumber d for it (reused as the divisor, etc., below); its */
5295 /* exponent is such that if x is positive it will have */
5296 /* set->digits-1 zeros between the decimal point and the digit, */
5297 /* which is 4, and if x is negative one more zero there as the */
5298 /* more precise result will be of the form 0.9999999 rather than */
5299 /* 1.0000001. Hence, tiny will be 0.0000004 if digits=7 and x>0 */
5300 /* or 0.00000004 if digits=7 and x<0. If RHS not larger than */
5301 /* this then the result will be 1.000000 */
5302 uprv_decNumberZero(d); /* clean */
5303 *d->lsu=4; /* set 4 .. */
5304 d->exponent=-set->digits; /* * 10**(-d) */
5305 if (decNumberIsNegative(rhs)) d->exponent--; /* negative case */
5306 comp=decCompare(d, rhs, 1); /* signless compare */
5308 *status|=DEC_Insufficient_storage;
5310 if (comp>=0) { /* rhs < d */
5311 Int shift=set->digits-1;
5312 uprv_decNumberZero(res); /* set 1 */
5313 *res->lsu=1; /* .. */
5314 res->digits=decShiftToMost(res->lsu, 1, shift);
5315 res->exponent=-shift; /* make 1.0000... */
5316 *status|=DEC_Inexact | DEC_Rounded; /* .. inexactly */
5319 /* set up the context to be used for calculating a, as this is */
5320 /* used on both paths below */
5321 uprv_decContextDefault(&aset, DEC_INIT_DECIMAL64);
5322 /* accumulator bounds are as requested (could underflow) */
5323 aset.emax=set->emax; /* usual bounds */
5324 aset.emin=set->emin; /* .. */
5325 aset.clamp=0; /* and no concrete format */
5327 /* calculate the adjusted (Hull & Abrham) exponent (where the */
5328 /* decimal point is just to the left of the coefficient msd) */
5329 h=rhs->exponent+rhs->digits;
5330 /* if h>8 then 10**h cannot be calculated safely; however, when */
5331 /* h=8 then exp(|rhs|) will be at least exp(1E+7) which is at */
5332 /* least 6.59E+4342944, so (due to the restriction on Emax/Emin) */
5333 /* overflow (or underflow to 0) is guaranteed -- so this case can */
5334 /* be handled by simply forcing the appropriate excess */
5335 if (h>8) { /* overflow/underflow */
5336 /* set up here so Power call below will over or underflow to */
5337 /* zero; set accumulator to either 2 or 0.02 */
5338 /* [stack buffer for a is always big enough for this] */
5339 uprv_decNumberZero(a);
5340 *a->lsu=2; /* not 1 but < exp(1) */
5341 if (decNumberIsNegative(rhs)) a->exponent=-2; /* make 0.02 */
5342 h=8; /* clamp so 10**h computable */
5343 p=9; /* set a working precision */
5346 Int maxlever=(rhs->digits>8?1:0);
5347 /* [could/should increase this for precisions >40 or so, too] */
5349 /* if h is 8, cannot normalize to a lower upper limit because */
5350 /* the final result will not be computable (see notes above), */
5351 /* but leverage can be applied whenever h is less than 8. */
5352 /* Apply as much as possible, up to a MAXLEVER digits, which */
5353 /* sets the tradeoff against the cost of the later a**(10**h). */
5354 /* As h is increased, the working precision below also */
5355 /* increases to compensate for the "constant digits at the */
5356 /* front" effect. */
5357 Int lever=MINI(8-h, maxlever); /* leverage attainable */
5358 Int use=-rhs->digits-lever; /* exponent to use for RHS */
5359 h+=lever; /* apply leverage selected */
5360 if (h<0) { /* clamp */
5361 use+=h; /* [may end up subnormal] */
5364 /* Take a copy of RHS if it needs normalization (true whenever x>=1) */
5365 if (rhs->exponent!=use) {
5366 decNumber *newrhs=bufr; /* assume will fit on stack */
5367 needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
5368 if (needbytes>sizeof(bufr)) { /* need malloc space */
5369 allocrhs=(decNumber *)malloc(needbytes);
5370 if (allocrhs==NULL) { /* hopeless -- abandon */
5371 *status|=DEC_Insufficient_storage;
5373 newrhs=allocrhs; /* use the allocated space */
5375 uprv_decNumberCopy(newrhs, rhs); /* copy to safe space */
5376 newrhs->exponent=use; /* normalize; now <1 */
5377 x=newrhs; /* ready for use */
5378 /* decNumberShow(x); */
5381 /* Now use the usual power series to evaluate exp(x). The */
5382 /* series starts as 1 + x + x^2/2 ... so prime ready for the */
5383 /* third term by setting the term variable t=x, the accumulator */
5384 /* a=1, and the divisor d=2. */
5386 /* First determine the working precision. From Hull & Abrham */
5387 /* this is set->digits+h+2. However, if x is 'over-precise' we */
5388 /* need to allow for all its digits to potentially participate */
5389 /* (consider an x where all the excess digits are 9s) so in */
5390 /* this case use x->digits+h+2 */
5391 p=MAXI(x->digits, set->digits)+h+2; /* [h<=8] */
5393 /* a and t are variable precision, and depend on p, so space */
5394 /* must be allocated for them if necessary */
5396 /* the accumulator needs to be able to hold 2p digits so that */
5397 /* the additions on the second and subsequent iterations are */
5398 /* sufficiently exact. */
5399 needbytes=sizeof(decNumber)+(D2U(p*2)-1)*sizeof(Unit);
5400 if (needbytes>sizeof(bufa)) { /* need malloc space */
5401 allocbufa=(decNumber *)malloc(needbytes);
5402 if (allocbufa==NULL) { /* hopeless -- abandon */
5403 *status|=DEC_Insufficient_storage;
5405 a=allocbufa; /* use the allocated space */
5407 /* the term needs to be able to hold p digits (which is */
5408 /* guaranteed to be larger than x->digits, so the initial copy */
5409 /* is safe); it may also be used for the raise-to-power */
5410 /* calculation below, which needs an extra two digits */
5411 needbytes=sizeof(decNumber)+(D2U(p+2)-1)*sizeof(Unit);
5412 if (needbytes>sizeof(buft)) { /* need malloc space */
5413 allocbuft=(decNumber *)malloc(needbytes);
5414 if (allocbuft==NULL) { /* hopeless -- abandon */
5415 *status|=DEC_Insufficient_storage;
5417 t=allocbuft; /* use the allocated space */
5420 uprv_decNumberCopy(t, x); /* term=x */
5421 uprv_decNumberZero(a); *a->lsu=1; /* accumulator=1 */
5422 uprv_decNumberZero(d); *d->lsu=2; /* divisor=2 */
5423 uprv_decNumberZero(&numone); *numone.lsu=1; /* constant 1 for increment */
5425 /* set up the contexts for calculating a, t, and d */
5426 uprv_decContextDefault(&tset, DEC_INIT_DECIMAL64);
5428 /* accumulator bounds are set above, set precision now */
5429 aset.digits=p*2; /* double */
5430 /* term bounds avoid any underflow or overflow */
5432 tset.emin=DEC_MIN_EMIN; /* [emax is plenty] */
5433 /* [dset.digits=16, etc., are sufficient] */
5435 /* finally ready to roll */
5440 /* only the status from the accumulation is interesting */
5441 /* [but it should remain unchanged after first add] */
5442 decAddOp(a, a, t, &aset, 0, status); /* a=a+t */
5443 decMultiplyOp(t, t, x, &tset, &ignore); /* t=t*x */
5444 decDivideOp(t, t, d, &tset, DIVIDE, &ignore); /* t=t/d */
5445 /* the iteration ends when the term cannot affect the result, */
5446 /* if rounded to p digits, which is when its value is smaller */
5447 /* than the accumulator by p+1 digits. There must also be */
5448 /* full precision in a. */
5449 if (((a->digits+a->exponent)>=(t->digits+t->exponent+p+1))
5450 && (a->digits>=p)) break;
5451 decAddOp(d, d, &numone, &dset, 0, &ignore); /* d=d+1 */
5455 /* just a sanity check; comment out test to show always */
5457 printf("Exp iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
5458 (LI)iterations, (LI)*status, (LI)p, (LI)x->digits);
5462 /* apply postconditioning: a=a**(10**h) -- this is calculated */
5463 /* at a slightly higher precision than Hull & Abrham suggest */
5465 Int seenbit=0; /* set once a 1-bit is seen */
5466 Int i; /* counter */
5467 Int n=powers[h]; /* always positive */
5468 aset.digits=p+2; /* sufficient precision */
5469 /* avoid the overhead and many extra digits of decNumberPower */
5470 /* as all that is needed is the short 'multipliers' loop; here */
5471 /* accumulate the answer into t */
5472 uprv_decNumberZero(t); *t->lsu=1; /* acc=1 */
5473 for (i=1;;i++){ /* for each bit [top bit ignored] */
5474 /* abandon if have had overflow or terminal underflow */
5475 if (*status & (DEC_Overflow|DEC_Underflow)) { /* interesting? */
5476 if (*status&DEC_Overflow || ISZERO(t)) break;}
5477 n=n<<1; /* move next bit to testable position */
5478 if (n<0) { /* top bit is set */
5479 seenbit=1; /* OK, have a significant bit */
5480 decMultiplyOp(t, t, a, &aset, status); /* acc=acc*x */
5482 if (i==31) break; /* that was the last bit */
5483 if (!seenbit) continue; /* no need to square 1 */
5484 decMultiplyOp(t, t, t, &aset, status); /* acc=acc*acc [square] */
5485 } /*i*/ /* 32 bits */
5486 /* decNumberShow(t); */
5487 a=t; /* and carry on using t instead of a */
5490 /* Copy and round the result to res */
5491 residue=1; /* indicate dirt to right .. */
5492 if (ISZERO(a)) residue=0; /* .. unless underflowed to 0 */
5493 aset.digits=set->digits; /* [use default rounding] */
5494 decCopyFit(res, a, &aset, &residue, status); /* copy & shorten */
5495 decFinish(res, set, &residue, status); /* cleanup/set flags */
5496 } while(0); /* end protected */
5498 if (allocrhs !=NULL) free(allocrhs); /* drop any storage used */
5499 if (allocbufa!=NULL) free(allocbufa); /* .. */
5500 if (allocbuft!=NULL) free(allocbuft); /* .. */
5501 /* [status is handled by caller] */
5505 /* ------------------------------------------------------------------ */
5506 /* Initial-estimate natural logarithm table */
5508 /* LNnn -- 90-entry 16-bit table for values from .10 through .99. */
5509 /* The result is a 4-digit encode of the coefficient (c=the */
5510 /* top 14 bits encoding 0-9999) and a 2-digit encode of the */
5511 /* exponent (e=the bottom 2 bits encoding 0-3) */
5513 /* The resulting value is given by: */
5515 /* v = -c * 10**(-e-3) */
5517 /* where e and c are extracted from entry k = LNnn[x-10] */
5518 /* where x is truncated (NB) into the range 10 through 99, */
5519 /* and then c = k>>2 and e = k&3. */
5520 /* ------------------------------------------------------------------ */
5521 const uShort LNnn[90]={9016, 8652, 8316, 8008, 7724, 7456, 7208,
5522 6972, 6748, 6540, 6340, 6148, 5968, 5792, 5628, 5464, 5312,
5523 5164, 5020, 4884, 4748, 4620, 4496, 4376, 4256, 4144, 4032,
5524 39233, 38181, 37157, 36157, 35181, 34229, 33297, 32389, 31501, 30629,
5525 29777, 28945, 28129, 27329, 26545, 25777, 25021, 24281, 23553, 22837,
5526 22137, 21445, 20769, 20101, 19445, 18801, 18165, 17541, 16925, 16321,
5527 15721, 15133, 14553, 13985, 13421, 12865, 12317, 11777, 11241, 10717,
5528 10197, 9685, 9177, 8677, 8185, 7697, 7213, 6737, 6269, 5801,
5529 5341, 4889, 4437, 39930, 35534, 31186, 26886, 22630, 18418, 14254,
5530 10130, 6046, 20055};
5532 /* ------------------------------------------------------------------ */
5533 /* decLnOp -- effect natural logarithm */
5535 /* This computes C = ln(A) */
5537 /* res is C, the result. C may be A */
5539 /* set is the context; note that rounding mode has no effect */
5541 /* C must have space for set->digits digits. */
5543 /* Notable cases: */
5544 /* A<0 -> Invalid */
5545 /* A=0 -> -Infinity (Exact) */
5546 /* A=+Infinity -> +Infinity (Exact) */
5547 /* A=1 exactly -> 0 (Exact) */
5549 /* Restrictions (as for Exp): */
5551 /* digits, emax, and -emin in the context must be less than */
5552 /* DEC_MAX_MATH+11 (1000010), and the rhs must be within these */
5553 /* bounds or a zero. This is an internal routine, so these */
5554 /* restrictions are contractual and not enforced. */
5556 /* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will */
5557 /* almost always be correctly rounded, but may be up to 1 ulp in */
5558 /* error in rare cases. */
5559 /* ------------------------------------------------------------------ */
5560 /* The result is calculated using Newton's method, with each */
5561 /* iteration calculating a' = a + x * exp(-a) - 1. See, for example, */
5562 /* Epperson 1989. */
5564 /* The iteration ends when the adjustment x*exp(-a)-1 is tiny enough. */
5565 /* This has to be calculated at the sum of the precision of x and the */
5566 /* working precision. */
5568 /* Implementation notes: */
5570 /* 1. This is separated out as decLnOp so it can be called from */
5571 /* other Mathematical functions (e.g., Log 10) with a wider range */
5572 /* than normal. In particular, it can handle the slightly wider */
5573 /* (+9+2) range needed by a power function. */
5575 /* 2. The speed of this function is about 10x slower than exp, as */
5576 /* it typically needs 4-6 iterations for short numbers, and the */
5577 /* extra precision needed adds a squaring effect, twice. */
5579 /* 3. Fastpaths are included for ln(10) and ln(2), up to length 40, */
5580 /* as these are common requests. ln(10) is used by log10(x). */
5582 /* 4. An iteration might be saved by widening the LNnn table, and */
5583 /* would certainly save at least one if it were made ten times */
5584 /* bigger, too (for truncated fractions 0.100 through 0.999). */
5585 /* However, for most practical evaluations, at least four or five */
5586 /* iterations will be neede -- so this would only speed up by */
5587 /* 20-25% and that probably does not justify increasing the table */
5590 /* 5. The static buffers are larger than might be expected to allow */
5591 /* for calls from decNumberPower. */
5592 /* ------------------------------------------------------------------ */
5593 #pragma clang diagnostic push
5594 #pragma clang diagnostic ignored "-Warray-bounds"
5595 decNumber * decLnOp(decNumber *res, const decNumber *rhs,
5596 decContext *set, uInt *status) {
5597 uInt ignore=0; /* working status accumulator */
5598 uInt needbytes; /* for space calculations */
5599 Int residue; /* rounding residue */
5600 Int r; /* rhs=f*10**r [see below] */
5601 Int p; /* working precision */
5602 Int pp; /* precision for iteration */
5605 /* buffers for a (accumulator, typically precision+2) and b */
5606 /* (adjustment calculator, same size) */
5607 decNumber bufa[D2N(DECBUFFER+12)];
5608 decNumber *allocbufa=NULL; /* -> allocated bufa, iff allocated */
5609 decNumber *a=bufa; /* accumulator/work */
5610 decNumber bufb[D2N(DECBUFFER*2+2)];
5611 decNumber *allocbufb=NULL; /* -> allocated bufa, iff allocated */
5612 decNumber *b=bufb; /* adjustment/work */
5614 decNumber numone; /* constant 1 */
5615 decNumber cmp; /* work */
5616 decContext aset, bset; /* working contexts */
5619 Int iterations=0; /* for later sanity check */
5620 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
5623 do { /* protect allocated storage */
5624 if (SPECIALARG) { /* handle infinities and NaNs */
5625 if (decNumberIsInfinite(rhs)) { /* an infinity */
5626 if (decNumberIsNegative(rhs)) /* -Infinity -> error */
5627 *status|=DEC_Invalid_operation;
5628 else uprv_decNumberCopy(res, rhs); /* +Infinity -> self */
5630 else decNaNs(res, rhs, NULL, set, status); /* a NaN */
5633 if (ISZERO(rhs)) { /* +/- zeros -> -Infinity */
5634 uprv_decNumberZero(res); /* make clean */
5635 res->bits=DECINF|DECNEG; /* set - infinity */
5636 break;} /* [no status to set] */
5638 /* Non-zero negatives are bad... */
5639 if (decNumberIsNegative(rhs)) { /* -x -> error */
5640 *status|=DEC_Invalid_operation;
5643 /* Here, rhs is positive, finite, and in range */
5645 /* lookaside fastpath code for ln(2) and ln(10) at common lengths */
5646 if (rhs->exponent==0 && set->digits<=40) {
5648 if (rhs->lsu[0]==0 && rhs->lsu[1]==1 && rhs->digits==2) { /* ln(10) */
5650 if (rhs->lsu[0]==10 && rhs->digits==2) { /* ln(10) */
5652 aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
5653 #define LN10 "2.302585092994045684017991454684364207601"
5654 uprv_decNumberFromString(res, LN10, &aset);
5655 *status|=(DEC_Inexact | DEC_Rounded); /* is inexact */
5657 if (rhs->lsu[0]==2 && rhs->digits==1) { /* ln(2) */
5658 aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
5659 #define LN2 "0.6931471805599453094172321214581765680755"
5660 uprv_decNumberFromString(res, LN2, &aset);
5661 *status|=(DEC_Inexact | DEC_Rounded);
5663 } /* integer and short */
5665 /* Determine the working precision. This is normally the */
5666 /* requested precision + 2, with a minimum of 9. However, if */
5667 /* the rhs is 'over-precise' then allow for all its digits to */
5668 /* potentially participate (consider an rhs where all the excess */
5669 /* digits are 9s) so in this case use rhs->digits+2. */
5670 p=MAXI(rhs->digits, MAXI(set->digits, 7))+2;
5672 /* Allocate space for the accumulator and the high-precision */
5673 /* adjustment calculator, if necessary. The accumulator must */
5674 /* be able to hold p digits, and the adjustment up to */
5675 /* rhs->digits+p digits. They are also made big enough for 16 */
5676 /* digits so that they can be used for calculating the initial */
5678 needbytes=sizeof(decNumber)+(D2U(MAXI(p,16))-1)*sizeof(Unit);
5679 if (needbytes>sizeof(bufa)) { /* need malloc space */
5680 allocbufa=(decNumber *)malloc(needbytes);
5681 if (allocbufa==NULL) { /* hopeless -- abandon */
5682 *status|=DEC_Insufficient_storage;
5684 a=allocbufa; /* use the allocated space */
5687 needbytes=sizeof(decNumber)+(D2U(MAXI(pp,16))-1)*sizeof(Unit);
5688 if (needbytes>sizeof(bufb)) { /* need malloc space */
5689 allocbufb=(decNumber *)malloc(needbytes);
5690 if (allocbufb==NULL) { /* hopeless -- abandon */
5691 *status|=DEC_Insufficient_storage;
5693 b=allocbufb; /* use the allocated space */
5696 /* Prepare an initial estimate in acc. Calculate this by */
5697 /* considering the coefficient of x to be a normalized fraction, */
5698 /* f, with the decimal point at far left and multiplied by */
5699 /* 10**r. Then, rhs=f*10**r and 0.1<=f<1, and */
5700 /* ln(x) = ln(f) + ln(10)*r */
5701 /* Get the initial estimate for ln(f) from a small lookup */
5702 /* table (see above) indexed by the first two digits of f, */
5705 uprv_decContextDefault(&aset, DEC_INIT_DECIMAL64); /* 16-digit extended */
5706 r=rhs->exponent+rhs->digits; /* 'normalised' exponent */
5707 uprv_decNumberFromInt32(a, r); /* a=r */
5708 uprv_decNumberFromInt32(b, 2302585); /* b=ln(10) (2.302585) */
5709 b->exponent=-6; /* .. */
5710 decMultiplyOp(a, a, b, &aset, &ignore); /* a=a*b */
5711 /* now get top two digits of rhs into b by simple truncate and */
5712 /* force to integer */
5713 residue=0; /* (no residue) */
5714 aset.digits=2; aset.round=DEC_ROUND_DOWN;
5715 decCopyFit(b, rhs, &aset, &residue, &ignore); /* copy & shorten */
5716 b->exponent=0; /* make integer */
5717 t=decGetInt(b); /* [cannot fail] */
5718 if (t<10) t=X10(t); /* adjust single-digit b */
5719 t=LNnn[t-10]; /* look up ln(b) */
5720 uprv_decNumberFromInt32(b, t>>2); /* b=ln(b) coefficient */
5721 b->exponent=-(t&3)-3; /* set exponent */
5722 b->bits=DECNEG; /* ln(0.10)->ln(0.99) always -ve */
5723 aset.digits=16; aset.round=DEC_ROUND_HALF_EVEN; /* restore */
5724 decAddOp(a, a, b, &aset, 0, &ignore); /* acc=a+b */
5725 /* the initial estimate is now in a, with up to 4 digits correct. */
5726 /* When rhs is at or near Nmax the estimate will be low, so we */
5727 /* will approach it from below, avoiding overflow when calling exp. */
5729 uprv_decNumberZero(&numone); *numone.lsu=1; /* constant 1 for adjustment */
5731 /* accumulator bounds are as requested (could underflow, but */
5732 /* cannot overflow) */
5733 aset.emax=set->emax;
5734 aset.emin=set->emin;
5735 aset.clamp=0; /* no concrete format */
5736 /* set up a context to be used for the multiply and subtract */
5738 bset.emax=DEC_MAX_MATH*2; /* use double bounds for the */
5739 bset.emin=-DEC_MAX_MATH*2; /* adjustment calculation */
5740 /* [see decExpOp call below] */
5741 /* for each iteration double the number of digits to calculate, */
5742 /* up to a maximum of p */
5743 pp=9; /* initial precision */
5744 /* [initially 9 as then the sequence starts 7+2, 16+2, and */
5745 /* 34+2, which is ideal for standard-sized numbers] */
5746 aset.digits=pp; /* working context */
5747 bset.digits=pp+rhs->digits; /* wider context */
5748 for (;;) { /* iterate */
5751 if (iterations>24) break; /* consider 9 * 2**24 */
5753 /* calculate the adjustment (exp(-a)*x-1) into b. This is a */
5754 /* catastrophic subtraction but it really is the difference */
5755 /* from 1 that is of interest. */
5756 /* Use the internal entry point to Exp as it allows the double */
5757 /* range for calculating exp(-a) when a is the tiniest subnormal. */
5758 a->bits^=DECNEG; /* make -a */
5759 decExpOp(b, a, &bset, &ignore); /* b=exp(-a) */
5760 a->bits^=DECNEG; /* restore sign of a */
5761 /* now multiply by rhs and subtract 1, at the wider precision */
5762 decMultiplyOp(b, b, rhs, &bset, &ignore); /* b=b*rhs */
5763 decAddOp(b, b, &numone, &bset, DECNEG, &ignore); /* b=b-1 */
5765 /* the iteration ends when the adjustment cannot affect the */
5766 /* result by >=0.5 ulp (at the requested digits), which */
5767 /* is when its value is smaller than the accumulator by */
5768 /* set->digits+1 digits (or it is zero) -- this is a looser */
5769 /* requirement than for Exp because all that happens to the */
5770 /* accumulator after this is the final rounding (but note that */
5771 /* there must also be full precision in a, or a=0). */
5773 if (decNumberIsZero(b) ||
5774 (a->digits+a->exponent)>=(b->digits+b->exponent+set->digits+1)) {
5775 if (a->digits==p) break;
5776 if (decNumberIsZero(a)) {
5777 decCompareOp(&cmp, rhs, &numone, &aset, COMPARE, &ignore); /* rhs=1 ? */
5778 if (cmp.lsu[0]==0) a->exponent=0; /* yes, exact 0 */
5779 else *status|=(DEC_Inexact | DEC_Rounded); /* no, inexact */
5782 /* force padding if adjustment has gone to 0 before full length */
5783 if (decNumberIsZero(b)) b->exponent=a->exponent-p;
5786 /* not done yet ... */
5787 decAddOp(a, a, b, &aset, 0, &ignore); /* a=a+b for next estimate */
5788 if (pp==p) continue; /* precision is at maximum */
5789 /* lengthen the next calculation */
5790 pp=pp*2; /* double precision */
5791 if (pp>p) pp=p; /* clamp to maximum */
5792 aset.digits=pp; /* working context */
5793 bset.digits=pp+rhs->digits; /* wider context */
5794 } /* Newton's iteration */
5797 /* just a sanity check; remove the test to show always */
5799 printf("Ln iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
5800 (LI)iterations, (LI)*status, (LI)p, (LI)rhs->digits);
5803 /* Copy and round the result to res */
5804 residue=1; /* indicate dirt to right */
5805 if (ISZERO(a)) residue=0; /* .. unless underflowed to 0 */
5806 aset.digits=set->digits; /* [use default rounding] */
5807 decCopyFit(res, a, &aset, &residue, status); /* copy & shorten */
5808 decFinish(res, set, &residue, status); /* cleanup/set flags */
5809 } while(0); /* end protected */
5811 if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
5812 if (allocbufb!=NULL) free(allocbufb); /* .. */
5813 /* [status is handled by caller] */
5816 #pragma clang diagnostic pop
5818 /* ------------------------------------------------------------------ */
5819 /* decQuantizeOp -- force exponent to requested value */
5821 /* This computes C = op(A, B), where op adjusts the coefficient */
5822 /* of C (by rounding or shifting) such that the exponent (-scale) */
5823 /* of C has the value B or matches the exponent of B. */
5824 /* The numerical value of C will equal A, except for the effects of */
5825 /* any rounding that occurred. */
5827 /* res is C, the result. C may be A or B */
5828 /* lhs is A, the number to adjust */
5829 /* rhs is B, the requested exponent */
5830 /* set is the context */
5831 /* quant is 1 for quantize or 0 for rescale */
5832 /* status is the status accumulator (this can be called without */
5833 /* risk of control loss) */
5835 /* C must have space for set->digits digits. */
5837 /* Unless there is an error or the result is infinite, the exponent */
5838 /* after the operation is guaranteed to be that requested. */
5839 /* ------------------------------------------------------------------ */
5840 static decNumber * decQuantizeOp(decNumber *res, const decNumber *lhs,
5841 const decNumber *rhs, decContext *set,
5842 Flag quant, uInt *status) {
5844 decNumber *alloclhs=NULL; /* non-NULL if rounded lhs allocated */
5845 decNumber *allocrhs=NULL; /* .., rhs */
5847 const decNumber *inrhs=rhs; /* save original rhs */
5848 Int reqdigits=set->digits; /* requested DIGITS */
5849 Int reqexp; /* requested exponent [-scale] */
5850 Int residue=0; /* rounding residue */
5851 Int etiny=set->emin-(reqdigits-1);
5854 if (decCheckOperands(res, lhs, rhs, set)) return res;
5857 do { /* protect allocated storage */
5859 if (!set->extended) {
5860 /* reduce operands and set lostDigits status, as needed */
5861 if (lhs->digits>reqdigits) {
5862 alloclhs=decRoundOperand(lhs, set, status);
5863 if (alloclhs==NULL) break;
5866 if (rhs->digits>reqdigits) { /* [this only checks lostDigits] */
5867 allocrhs=decRoundOperand(rhs, set, status);
5868 if (allocrhs==NULL) break;
5873 /* [following code does not require input rounding] */
5875 /* Handle special values */
5877 /* NaNs get usual processing */
5878 if (SPECIALARGS & (DECSNAN | DECNAN))
5879 decNaNs(res, lhs, rhs, set, status);
5880 /* one infinity but not both is bad */
5881 else if ((lhs->bits ^ rhs->bits) & DECINF)
5882 *status|=DEC_Invalid_operation;
5883 /* both infinity: return lhs */
5884 else uprv_decNumberCopy(res, lhs); /* [nop if in place] */
5888 /* set requested exponent */
5889 if (quant) reqexp=inrhs->exponent; /* quantize -- match exponents */
5890 else { /* rescale -- use value of rhs */
5891 /* Original rhs must be an integer that fits and is in range, */
5892 /* which could be from -1999999997 to +999999999, thanks to */
5894 reqexp=decGetInt(inrhs); /* [cannot fail] */
5898 if (!set->extended) etiny=set->emin; /* no subnormals */
5901 if (reqexp==BADINT /* bad (rescale only) or .. */
5902 || reqexp==BIGODD || reqexp==BIGEVEN /* very big (ditto) or .. */
5903 || (reqexp<etiny) /* < lowest */
5904 || (reqexp>set->emax)) { /* > emax */
5905 *status|=DEC_Invalid_operation;
5908 /* the RHS has been processed, so it can be overwritten now if necessary */
5909 if (ISZERO(lhs)) { /* zero coefficient unchanged */
5910 uprv_decNumberCopy(res, lhs); /* [nop if in place] */
5911 res->exponent=reqexp; /* .. just set exponent */
5913 if (!set->extended) res->bits=0; /* subset specification; no -0 */
5916 else { /* non-zero lhs */
5917 Int adjust=reqexp-lhs->exponent; /* digit adjustment needed */
5918 /* if adjusted coefficient will definitely not fit, give up now */
5919 if ((lhs->digits-adjust)>reqdigits) {
5920 *status|=DEC_Invalid_operation;
5924 if (adjust>0) { /* increasing exponent */
5925 /* this will decrease the length of the coefficient by adjust */
5926 /* digits, and must round as it does so */
5927 decContext workset; /* work */
5928 workset=*set; /* clone rounding, etc. */
5929 workset.digits=lhs->digits-adjust; /* set requested length */
5930 /* [note that the latter can be <1, here] */
5931 decCopyFit(res, lhs, &workset, &residue, status); /* fit to result */
5932 decApplyRound(res, &workset, residue, status); /* .. and round */
5933 residue=0; /* [used] */
5934 /* If just rounded a 999s case, exponent will be off by one; */
5935 /* adjust back (after checking space), if so. */
5936 if (res->exponent>reqexp) {
5937 /* re-check needed, e.g., for quantize(0.9999, 0.001) under */
5938 /* set->digits==3 */
5939 if (res->digits==reqdigits) { /* cannot shift by 1 */
5940 *status&=~(DEC_Inexact | DEC_Rounded); /* [clean these] */
5941 *status|=DEC_Invalid_operation;
5944 res->digits=decShiftToMost(res->lsu, res->digits, 1); /* shift */
5945 res->exponent--; /* (re)adjust the exponent. */
5948 if (ISZERO(res) && !set->extended) res->bits=0; /* subset; no -0 */
5951 else /* adjust<=0 */ { /* decreasing or = exponent */
5952 /* this will increase the length of the coefficient by -adjust */
5953 /* digits, by adding zero or more trailing zeros; this is */
5954 /* already checked for fit, above */
5955 uprv_decNumberCopy(res, lhs); /* [it will fit] */
5956 /* if padding needed (adjust<0), add it now... */
5958 res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
5959 res->exponent+=adjust; /* adjust the exponent */
5964 /* Check for overflow [do not use Finalize in this case, as an */
5965 /* overflow here is a "don't fit" situation] */
5966 if (res->exponent>set->emax-res->digits+1) { /* too big */
5967 *status|=DEC_Invalid_operation;
5971 decFinalize(res, set, &residue, status); /* set subnormal flags */
5972 *status&=~DEC_Underflow; /* suppress Underflow [as per 754] */
5974 } while(0); /* end protected */
5977 if (allocrhs!=NULL) free(allocrhs); /* drop any storage used */
5978 if (alloclhs!=NULL) free(alloclhs); /* .. */
5981 } /* decQuantizeOp */
5983 /* ------------------------------------------------------------------ */
5984 /* decCompareOp -- compare, min, or max two Numbers */
5986 /* This computes C = A ? B and carries out one of four operations: */
5987 /* COMPARE -- returns the signum (as a number) giving the */
5988 /* result of a comparison unless one or both */
5989 /* operands is a NaN (in which case a NaN results) */
5990 /* COMPSIG -- as COMPARE except that a quiet NaN raises */
5991 /* Invalid operation. */
5992 /* COMPMAX -- returns the larger of the operands, using the */
5993 /* 754 maxnum operation */
5994 /* COMPMAXMAG -- ditto, comparing absolute values */
5995 /* COMPMIN -- the 754 minnum operation */
5996 /* COMPMINMAG -- ditto, comparing absolute values */
5997 /* COMTOTAL -- returns the signum (as a number) giving the */
5998 /* result of a comparison using 754 total ordering */
6000 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
6003 /* set is the context */
6004 /* op is the operation flag */
6005 /* status is the usual accumulator */
6007 /* C must have space for one digit for COMPARE or set->digits for */
6008 /* COMPMAX, COMPMIN, COMPMAXMAG, or COMPMINMAG. */
6009 /* ------------------------------------------------------------------ */
6010 /* The emphasis here is on speed for common cases, and avoiding */
6011 /* coefficient comparison if possible. */
6012 /* ------------------------------------------------------------------ */
6013 static decNumber * decCompareOp(decNumber *res, const decNumber *lhs,
6014 const decNumber *rhs, decContext *set,
6015 Flag op, uInt *status) {
6017 decNumber *alloclhs=NULL; /* non-NULL if rounded lhs allocated */
6018 decNumber *allocrhs=NULL; /* .., rhs */
6020 Int result=0; /* default result value */
6021 uByte merged; /* work */
6024 if (decCheckOperands(res, lhs, rhs, set)) return res;
6027 do { /* protect allocated storage */
6029 if (!set->extended) {
6030 /* reduce operands and set lostDigits status, as needed */
6031 if (lhs->digits>set->digits) {
6032 alloclhs=decRoundOperand(lhs, set, status);
6033 if (alloclhs==NULL) {result=BADINT; break;}
6036 if (rhs->digits>set->digits) {
6037 allocrhs=decRoundOperand(rhs, set, status);
6038 if (allocrhs==NULL) {result=BADINT; break;}
6043 /* [following code does not require input rounding] */
6045 /* If total ordering then handle differing signs 'up front' */
6046 if (op==COMPTOTAL) { /* total ordering */
6047 if (decNumberIsNegative(lhs) & !decNumberIsNegative(rhs)) {
6051 if (!decNumberIsNegative(lhs) & decNumberIsNegative(rhs)) {
6057 /* handle NaNs specially; let infinities drop through */
6058 /* This assumes sNaN (even just one) leads to NaN. */
6059 merged=(lhs->bits | rhs->bits) & (DECSNAN | DECNAN);
6060 if (merged) { /* a NaN bit set */
6061 if (op==COMPARE); /* result will be NaN */
6062 else if (op==COMPSIG) /* treat qNaN as sNaN */
6063 *status|=DEC_Invalid_operation | DEC_sNaN;
6064 else if (op==COMPTOTAL) { /* total ordering, always finite */
6065 /* signs are known to be the same; compute the ordering here */
6066 /* as if the signs are both positive, then invert for negatives */
6067 if (!decNumberIsNaN(lhs)) result=-1;
6068 else if (!decNumberIsNaN(rhs)) result=+1;
6069 /* here if both NaNs */
6070 else if (decNumberIsSNaN(lhs) && decNumberIsQNaN(rhs)) result=-1;
6071 else if (decNumberIsQNaN(lhs) && decNumberIsSNaN(rhs)) result=+1;
6072 else { /* both NaN or both sNaN */
6073 /* now it just depends on the payload */
6074 result=decUnitCompare(lhs->lsu, D2U(lhs->digits),
6075 rhs->lsu, D2U(rhs->digits), 0);
6076 /* [Error not possible, as these are 'aligned'] */
6077 } /* both same NaNs */
6078 if (decNumberIsNegative(lhs)) result=-result;
6082 else if (merged & DECSNAN); /* sNaN -> qNaN */
6083 else { /* here if MIN or MAX and one or two quiet NaNs */
6084 /* min or max -- 754 rules ignore single NaN */
6085 if (!decNumberIsNaN(lhs) || !decNumberIsNaN(rhs)) {
6086 /* just one NaN; force choice to be the non-NaN operand */
6088 if (lhs->bits & DECNAN) result=-1; /* pick rhs */
6089 else result=+1; /* pick lhs */
6093 op=COMPNAN; /* use special path */
6094 decNaNs(res, lhs, rhs, set, status); /* propagate NaN */
6098 if (op==COMPMAXMAG || op==COMPMINMAG) result=decCompare(lhs, rhs, 1);
6099 else result=decCompare(lhs, rhs, 0); /* sign matters */
6100 } while(0); /* end protected */
6102 if (result==BADINT) *status|=DEC_Insufficient_storage; /* rare */
6104 if (op==COMPARE || op==COMPSIG ||op==COMPTOTAL) { /* returning signum */
6105 if (op==COMPTOTAL && result==0) {
6106 /* operands are numerically equal or same NaN (and same sign, */
6107 /* tested first); if identical, leave result 0 */
6108 if (lhs->exponent!=rhs->exponent) {
6109 if (lhs->exponent<rhs->exponent) result=-1;
6111 if (decNumberIsNegative(lhs)) result=-result;
6113 } /* total-order by exponent */
6114 uprv_decNumberZero(res); /* [always a valid result] */
6115 if (result!=0) { /* must be -1 or +1 */
6117 if (result<0) res->bits=DECNEG;
6120 else if (op==COMPNAN); /* special, drop through */
6121 else { /* MAX or MIN, non-NaN result */
6122 Int residue=0; /* rounding accumulator */
6123 /* choose the operand for the result */
6124 const decNumber *choice;
6125 if (result==0) { /* operands are numerically equal */
6126 /* choose according to sign then exponent (see 754) */
6127 uByte slhs=(lhs->bits & DECNEG);
6128 uByte srhs=(rhs->bits & DECNEG);
6130 if (!set->extended) { /* subset: force left-hand */
6136 if (slhs!=srhs) { /* signs differ */
6137 if (slhs) result=-1; /* rhs is max */
6138 else result=+1; /* lhs is max */
6140 else if (slhs && srhs) { /* both negative */
6141 if (lhs->exponent<rhs->exponent) result=+1;
6143 /* [if equal, use lhs, technically identical] */
6145 else { /* both positive */
6146 if (lhs->exponent>rhs->exponent) result=+1;
6150 } /* numerically equal */
6151 /* here result will be non-0; reverse if looking for MIN */
6152 if (op==COMPMIN || op==COMPMINMAG) result=-result;
6153 choice=(result>0 ? lhs : rhs); /* choose */
6154 /* copy chosen to result, rounding if need be */
6155 decCopyFit(res, choice, set, &residue, status);
6156 decFinish(res, set, &residue, status);
6160 if (allocrhs!=NULL) free(allocrhs); /* free any storage used */
6161 if (alloclhs!=NULL) free(alloclhs); /* .. */
6164 } /* decCompareOp */
6166 /* ------------------------------------------------------------------ */
6167 /* decCompare -- compare two decNumbers by numerical value */
6169 /* This routine compares A ? B without altering them. */
6171 /* Arg1 is A, a decNumber which is not a NaN */
6172 /* Arg2 is B, a decNumber which is not a NaN */
6173 /* Arg3 is 1 for a sign-independent compare, 0 otherwise */
6175 /* returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure */
6176 /* (the only possible failure is an allocation error) */
6177 /* ------------------------------------------------------------------ */
6178 static Int decCompare(const decNumber *lhs, const decNumber *rhs,
6180 Int result; /* result value */
6181 Int sigr; /* rhs signum */
6182 Int compare; /* work */
6184 result=1; /* assume signum(lhs) */
6185 if (ISZERO(lhs)) result=0;
6187 if (ISZERO(rhs)) return result; /* LHS wins or both 0 */
6188 /* RHS is non-zero */
6189 if (result==0) return -1; /* LHS is 0; RHS wins */
6190 /* [here, both non-zero, result=1] */
6192 else { /* signs matter */
6193 if (result && decNumberIsNegative(lhs)) result=-1;
6194 sigr=1; /* compute signum(rhs) */
6195 if (ISZERO(rhs)) sigr=0;
6196 else if (decNumberIsNegative(rhs)) sigr=-1;
6197 if (result > sigr) return +1; /* L > R, return 1 */
6198 if (result < sigr) return -1; /* L < R, return -1 */
6199 if (result==0) return 0; /* both 0 */
6202 /* signums are the same; both are non-zero */
6203 if ((lhs->bits | rhs->bits) & DECINF) { /* one or more infinities */
6204 if (decNumberIsInfinite(rhs)) {
6205 if (decNumberIsInfinite(lhs)) result=0;/* both infinite */
6206 else result=-result; /* only rhs infinite */
6210 /* must compare the coefficients, allowing for exponents */
6211 if (lhs->exponent>rhs->exponent) { /* LHS exponent larger */
6212 /* swap sides, and sign */
6213 const decNumber *temp=lhs;
6218 compare=decUnitCompare(lhs->lsu, D2U(lhs->digits),
6219 rhs->lsu, D2U(rhs->digits),
6220 rhs->exponent-lhs->exponent);
6221 if (compare!=BADINT) compare*=result; /* comparison succeeded */
6225 /* ------------------------------------------------------------------ */
6226 /* decUnitCompare -- compare two >=0 integers in Unit arrays */
6228 /* This routine compares A ? B*10**E where A and B are unit arrays */
6229 /* A is a plain integer */
6230 /* B has an exponent of E (which must be non-negative) */
6232 /* Arg1 is A first Unit (lsu) */
6233 /* Arg2 is A length in Units */
6234 /* Arg3 is B first Unit (lsu) */
6235 /* Arg4 is B length in Units */
6236 /* Arg5 is E (0 if the units are aligned) */
6238 /* returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure */
6239 /* (the only possible failure is an allocation error, which can */
6240 /* only occur if E!=0) */
6241 /* ------------------------------------------------------------------ */
6242 static Int decUnitCompare(const Unit *a, Int alength,
6243 const Unit *b, Int blength, Int exp) {
6244 Unit *acc; /* accumulator for result */
6245 Unit accbuff[SD2U(DECBUFFER*2+1)]; /* local buffer */
6246 Unit *allocacc=NULL; /* -> allocated acc buffer, iff allocated */
6247 Int accunits, need; /* units in use or needed for acc */
6248 const Unit *l, *r, *u; /* work */
6249 Int expunits, exprem, result; /* .. */
6251 if (exp==0) { /* aligned; fastpath */
6252 if (alength>blength) return 1;
6253 if (alength<blength) return -1;
6254 /* same number of units in both -- need unit-by-unit compare */
6257 for (;l>=a; l--, r--) {
6258 if (*l>*r) return 1;
6259 if (*l<*r) return -1;
6261 return 0; /* all units match */
6264 /* Unaligned. If one is >1 unit longer than the other, padded */
6265 /* approximately, then can return easily */
6266 if (alength>blength+(Int)D2U(exp)) return 1;
6267 if (alength+1<blength+(Int)D2U(exp)) return -1;
6269 /* Need to do a real subtract. For this, a result buffer is needed */
6270 /* even though only the sign is of interest. Its length needs */
6271 /* to be the larger of alength and padded blength, +2 */
6272 need=blength+D2U(exp); /* maximum real length of B */
6273 if (need<alength) need=alength;
6275 acc=accbuff; /* assume use local buffer */
6276 if (need*sizeof(Unit)>sizeof(accbuff)) {
6277 allocacc=(Unit *)malloc(need*sizeof(Unit));
6278 if (allocacc==NULL) return BADINT; /* hopeless -- abandon */
6281 /* Calculate units and remainder from exponent. */
6282 expunits=exp/DECDPUN;
6284 /* subtract [A+B*(-m)] */
6285 accunits=decUnitAddSub(a, alength, b, blength, expunits, acc,
6286 -(Int)powers[exprem]);
6287 /* [UnitAddSub result may have leading zeros, even on zero] */
6288 if (accunits<0) result=-1; /* negative result */
6289 else { /* non-negative result */
6290 /* check units of the result before freeing any storage */
6291 for (u=acc; u<acc+accunits-1 && *u==0;) u++;
6292 result=(*u==0 ? 0 : +1);
6294 /* clean up and return the result */
6295 if (allocacc!=NULL) free(allocacc); /* drop any storage used */
6297 } /* decUnitCompare */
6299 /* ------------------------------------------------------------------ */
6300 /* decUnitAddSub -- add or subtract two >=0 integers in Unit arrays */
6302 /* This routine performs the calculation: */
6306 /* Where M is in the range -DECDPUNMAX through +DECDPUNMAX. */
6308 /* A may be shorter or longer than B. */
6310 /* Leading zeros are not removed after a calculation. The result is */
6311 /* either the same length as the longer of A and B (adding any */
6312 /* shift), or one Unit longer than that (if a Unit carry occurred). */
6314 /* A and B content are not altered unless C is also A or B. */
6315 /* C may be the same array as A or B, but only if no zero padding is */
6316 /* requested (that is, C may be B only if bshift==0). */
6317 /* C is filled from the lsu; only those units necessary to complete */
6318 /* the calculation are referenced. */
6320 /* Arg1 is A first Unit (lsu) */
6321 /* Arg2 is A length in Units */
6322 /* Arg3 is B first Unit (lsu) */
6323 /* Arg4 is B length in Units */
6324 /* Arg5 is B shift in Units (>=0; pads with 0 units if positive) */
6325 /* Arg6 is C first Unit (lsu) */
6326 /* Arg7 is M, the multiplier */
6328 /* returns the count of Units written to C, which will be non-zero */
6329 /* and negated if the result is negative. That is, the sign of the */
6330 /* returned Int is the sign of the result (positive for zero) and */
6331 /* the absolute value of the Int is the count of Units. */
6333 /* It is the caller's responsibility to make sure that C size is */
6334 /* safe, allowing space if necessary for a one-Unit carry. */
6336 /* This routine is severely performance-critical; *any* change here */
6337 /* must be measured (timed) to assure no performance degradation. */
6338 /* In particular, trickery here tends to be counter-productive, as */
6339 /* increased complexity of code hurts register optimizations on */
6340 /* register-poor architectures. Avoiding divisions is nearly */
6341 /* always a Good Idea, however. */
6343 /* Special thanks to Rick McGuire (IBM Cambridge, MA) and Dave Clark */
6344 /* (IBM Warwick, UK) for some of the ideas used in this routine. */
6345 /* ------------------------------------------------------------------ */
6346 static Int decUnitAddSub(const Unit *a, Int alength,
6347 const Unit *b, Int blength, Int bshift,
6349 const Unit *alsu=a; /* A lsu [need to remember it] */
6350 Unit *clsu=c; /* C ditto */
6351 Unit *minC; /* low water mark for C */
6352 Unit *maxC; /* high water mark for C */
6353 eInt carry=0; /* carry integer (could be Long) */
6355 #if DECDPUN<=4 /* myriadal, millenary, etc. */
6356 Int est; /* estimated quotient */
6360 if (alength<1 || blength<1)
6361 printf("decUnitAddSub: alen blen m %ld %ld [%ld]\n", alength, blength, m);
6364 maxC=c+alength; /* A is usually the longer */
6365 minC=c+blength; /* .. and B the shorter */
6366 if (bshift!=0) { /* B is shifted; low As copy across */
6368 /* if in place [common], skip copy unless there's a gap [rare] */
6369 if (a==c && bshift<=alength) {
6373 else for (; c<clsu+bshift; a++, c++) { /* copy needed */
6374 if (a<alsu+alength) *c=*a;
6378 if (minC>maxC) { /* swap */
6384 /* For speed, do the addition as two loops; the first where both A */
6385 /* and B contribute, and the second (if necessary) where only one or */
6386 /* other of the numbers contribute. */
6387 /* Carry handling is the same (i.e., duplicated) in each case. */
6388 for (; c<minC; c++) {
6391 carry+=((eInt)*b)*m; /* [special-casing m=1/-1 */
6392 b++; /* here is not a win] */
6393 /* here carry is new Unit of digits; it could be +ve or -ve */
6394 if ((ueInt)carry<=DECDPUNMAX) { /* fastpath 0-DECDPUNMAX */
6399 #if DECDPUN==4 /* use divide-by-multiply */
6401 est=(((ueInt)carry>>11)*53687)>>18;
6402 *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6403 carry=est; /* likely quotient [89%] */
6404 if (*c<DECDPUNMAX+1) continue; /* estimate was correct */
6410 carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6411 est=(((ueInt)carry>>11)*53687)>>18;
6412 *c=(Unit)(carry-est*(DECDPUNMAX+1));
6413 carry=est-(DECDPUNMAX+1); /* correctly negative */
6414 if (*c<DECDPUNMAX+1) continue; /* was OK */
6419 est=(((ueInt)carry>>3)*16777)>>21;
6420 *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6421 carry=est; /* likely quotient [99%] */
6422 if (*c<DECDPUNMAX+1) continue; /* estimate was correct */
6428 carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6429 est=(((ueInt)carry>>3)*16777)>>21;
6430 *c=(Unit)(carry-est*(DECDPUNMAX+1));
6431 carry=est-(DECDPUNMAX+1); /* correctly negative */
6432 if (*c<DECDPUNMAX+1) continue; /* was OK */
6436 /* Can use QUOT10 as carry <= 4 digits */
6438 est=QUOT10(carry, DECDPUN);
6439 *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6440 carry=est; /* quotient */
6444 carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6445 est=QUOT10(carry, DECDPUN);
6446 *c=(Unit)(carry-est*(DECDPUNMAX+1));
6447 carry=est-(DECDPUNMAX+1); /* correctly negative */
6449 /* remainder operator is undefined if negative, so must test */
6450 if ((ueInt)carry<(DECDPUNMAX+1)*2) { /* fastpath carry +1 */
6451 *c=(Unit)(carry-(DECDPUNMAX+1)); /* [helps additions] */
6456 *c=(Unit)(carry%(DECDPUNMAX+1));
6457 carry=carry/(DECDPUNMAX+1);
6461 carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6462 *c=(Unit)(carry%(DECDPUNMAX+1));
6463 carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
6467 /* now may have one or other to complete */
6468 /* [pretest to avoid loop setup/shutdown] */
6469 if (c<maxC) for (; c<maxC; c++) {
6470 if (a<alsu+alength) { /* still in A */
6474 else { /* inside B */
6475 carry+=((eInt)*b)*m;
6478 /* here carry is new Unit of digits; it could be +ve or -ve and */
6479 /* magnitude up to DECDPUNMAX squared */
6480 if ((ueInt)carry<=DECDPUNMAX) { /* fastpath 0-DECDPUNMAX */
6485 /* result for this unit is negative or >DECDPUNMAX */
6486 #if DECDPUN==4 /* use divide-by-multiply */
6488 est=(((ueInt)carry>>11)*53687)>>18;
6489 *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6490 carry=est; /* likely quotient [79.7%] */
6491 if (*c<DECDPUNMAX+1) continue; /* estimate was correct */
6497 carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6498 est=(((ueInt)carry>>11)*53687)>>18;
6499 *c=(Unit)(carry-est*(DECDPUNMAX+1));
6500 carry=est-(DECDPUNMAX+1); /* correctly negative */
6501 if (*c<DECDPUNMAX+1) continue; /* was OK */
6506 est=(((ueInt)carry>>3)*16777)>>21;
6507 *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6508 carry=est; /* likely quotient [99%] */
6509 if (*c<DECDPUNMAX+1) continue; /* estimate was correct */
6515 carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6516 est=(((ueInt)carry>>3)*16777)>>21;
6517 *c=(Unit)(carry-est*(DECDPUNMAX+1));
6518 carry=est-(DECDPUNMAX+1); /* correctly negative */
6519 if (*c<DECDPUNMAX+1) continue; /* was OK */
6524 est=QUOT10(carry, DECDPUN);
6525 *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6526 carry=est; /* quotient */
6530 carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6531 est=QUOT10(carry, DECDPUN);
6532 *c=(Unit)(carry-est*(DECDPUNMAX+1));
6533 carry=est-(DECDPUNMAX+1); /* correctly negative */
6535 if ((ueInt)carry<(DECDPUNMAX+1)*2){ /* fastpath carry 1 */
6536 *c=(Unit)(carry-(DECDPUNMAX+1));
6540 /* remainder operator is undefined if negative, so must test */
6542 *c=(Unit)(carry%(DECDPUNMAX+1));
6543 carry=carry/(DECDPUNMAX+1);
6547 carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6548 *c=(Unit)(carry%(DECDPUNMAX+1));
6549 carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
6553 /* OK, all A and B processed; might still have carry or borrow */
6554 /* return number of Units in the result, negated if a borrow */
6555 if (carry==0) return c-clsu; /* no carry, so no more to do */
6556 if (carry>0) { /* positive carry */
6557 *c=(Unit)carry; /* place as new unit */
6561 /* -ve carry: it's a borrow; complement needed */
6562 add=1; /* temporary carry... */
6563 for (c=clsu; c<maxC; c++) {
6564 add=DECDPUNMAX+add-*c;
6565 if (add<=DECDPUNMAX) {
6574 /* add an extra unit iff it would be non-zero */
6576 printf("UAS borrow: add %ld, carry %ld\n", add, carry);
6578 if ((add-carry-1)!=0) {
6579 *c=(Unit)(add-carry-1);
6580 c++; /* interesting, include it */
6582 return clsu-c; /* -ve result indicates borrowed */
6583 } /* decUnitAddSub */
6585 /* ------------------------------------------------------------------ */
6586 /* decTrim -- trim trailing zeros or normalize */
6588 /* dn is the number to trim or normalize */
6589 /* set is the context to use to check for clamp */
6590 /* all is 1 to remove all trailing zeros, 0 for just fraction ones */
6591 /* noclamp is 1 to unconditional (unclamped) trim */
6592 /* dropped returns the number of discarded trailing zeros */
6595 /* If clamp is set in the context then the number of zeros trimmed */
6596 /* may be limited if the exponent is high. */
6597 /* All fields are updated as required. This is a utility operation, */
6598 /* so special values are unchanged and no error is possible. */
6599 /* ------------------------------------------------------------------ */
6600 static decNumber * decTrim(decNumber *dn, decContext *set, Flag all,
6601 Flag noclamp, Int *dropped) {
6602 Int d, exp; /* work */
6604 Unit *up; /* -> current Unit */
6607 if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
6610 *dropped=0; /* assume no zeros dropped */
6611 if ((dn->bits & DECSPECIAL) /* fast exit if special .. */
6612 || (*dn->lsu & 0x01)) return dn; /* .. or odd */
6613 if (ISZERO(dn)) { /* .. or 0 */
6614 dn->exponent=0; /* (sign is preserved) */
6618 /* have a finite number which is even */
6620 cut=1; /* digit (1-DECDPUN) in Unit */
6621 up=dn->lsu; /* -> current Unit */
6622 for (d=0; d<dn->digits-1; d++) { /* [don't strip the final digit] */
6623 /* slice by powers */
6625 uInt quot=QUOT10(*up, cut);
6626 if ((*up-quot*powers[cut])!=0) break; /* found non-0 digit */
6628 if (*up%powers[cut]!=0) break; /* found non-0 digit */
6630 /* have a trailing 0 */
6631 if (!all) { /* trimming */
6632 /* [if exp>0 then all trailing 0s are significant for trim] */
6633 if (exp<=0) { /* if digit might be significant */
6634 if (exp==0) break; /* then quit */
6635 exp++; /* next digit might be significant */
6638 cut++; /* next power */
6639 if (cut>DECDPUN) { /* need new Unit */
6644 if (d==0) return dn; /* none to drop */
6646 /* may need to limit drop if clamping */
6647 if (set->clamp && !noclamp) {
6648 Int maxd=set->emax-set->digits+1-dn->exponent;
6649 if (maxd<=0) return dn; /* nothing possible */
6653 /* effect the drop */
6654 decShiftToLeast(dn->lsu, D2U(dn->digits), d);
6655 dn->exponent+=d; /* maintain numerical value */
6656 dn->digits-=d; /* new length */
6657 *dropped=d; /* report the count */
6661 /* ------------------------------------------------------------------ */
6662 /* decReverse -- reverse a Unit array in place */
6664 /* ulo is the start of the array */
6665 /* uhi is the end of the array (highest Unit to include) */
6667 /* The units ulo through uhi are reversed in place (if the number */
6668 /* of units is odd, the middle one is untouched). Note that the */
6669 /* digit(s) in each unit are unaffected. */
6670 /* ------------------------------------------------------------------ */
6671 static void decReverse(Unit *ulo, Unit *uhi) {
6673 for (; ulo<uhi; ulo++, uhi--) {
6681 /* ------------------------------------------------------------------ */
6682 /* decShiftToMost -- shift digits in array towards most significant */
6684 /* uar is the array */
6685 /* digits is the count of digits in use in the array */
6686 /* shift is the number of zeros to pad with (least significant); */
6687 /* it must be zero or positive */
6689 /* returns the new length of the integer in the array, in digits */
6691 /* No overflow is permitted (that is, the uar array must be known to */
6692 /* be large enough to hold the result, after shifting). */
6693 /* ------------------------------------------------------------------ */
6694 static Int decShiftToMost(Unit *uar, Int digits, Int shift) {
6695 Unit *target, *source, *first; /* work */
6696 Int cut; /* odd 0's to add */
6697 uInt next; /* work */
6699 if (shift==0) return digits; /* [fastpath] nothing to do */
6700 if ((digits+shift)<=DECDPUN) { /* [fastpath] single-unit case */
6701 *uar=(Unit)(*uar*powers[shift]);
6702 return digits+shift;
6705 next=0; /* all paths */
6706 source=uar+D2U(digits)-1; /* where msu comes from */
6707 target=source+D2U(shift); /* where upper part of first cut goes */
6708 cut=DECDPUN-MSUDIGITS(shift); /* where to slice */
6709 if (cut==0) { /* unit-boundary case */
6710 for (; source>=uar; source--, target--) *target=*source;
6713 first=uar+D2U(digits+shift)-1; /* where msu of source will end up */
6714 for (; source>=uar; source--, target--) {
6715 /* split the source Unit and accumulate remainder for next */
6717 uInt quot=QUOT10(*source, cut);
6718 uInt rem=*source-quot*powers[cut];
6721 uInt rem=*source%powers[cut];
6722 next+=*source/powers[cut];
6724 if (target<=first) *target=(Unit)next; /* write to target iff valid */
6725 next=rem*powers[DECDPUN-cut]; /* save remainder for next Unit */
6729 /* propagate any partial unit to one below and clear the rest */
6730 for (; target>=uar; target--) {
6734 return digits+shift;
6735 } /* decShiftToMost */
6737 /* ------------------------------------------------------------------ */
6738 /* decShiftToLeast -- shift digits in array towards least significant */
6740 /* uar is the array */
6741 /* units is length of the array, in units */
6742 /* shift is the number of digits to remove from the lsu end; it */
6743 /* must be zero or positive and <= than units*DECDPUN. */
6745 /* returns the new length of the integer in the array, in units */
6747 /* Removed digits are discarded (lost). Units not required to hold */
6748 /* the final result are unchanged. */
6749 /* ------------------------------------------------------------------ */
6750 static Int decShiftToLeast(Unit *uar, Int units, Int shift) {
6751 Unit *target, *up; /* work */
6752 Int cut, count; /* work */
6753 Int quot, rem; /* for division */
6755 if (shift==0) return units; /* [fastpath] nothing to do */
6756 if (shift==units*DECDPUN) { /* [fastpath] little to do */
6757 *uar=0; /* all digits cleared gives zero */
6758 return 1; /* leaves just the one */
6761 target=uar; /* both paths */
6762 cut=MSUDIGITS(shift);
6763 if (cut==DECDPUN) { /* unit-boundary case; easy */
6765 for (; up<uar+units; target++, up++) *target=*up;
6770 up=uar+D2U(shift-cut); /* source; correct to whole Units */
6771 count=units*DECDPUN-shift; /* the maximum new length */
6773 quot=QUOT10(*up, cut);
6775 quot=*up/powers[cut];
6777 for (; ; target++) {
6779 count-=(DECDPUN-cut);
6780 if (count<=0) break;
6784 quot=QUOT10(quot, cut);
6785 rem=*up-quot*powers[cut];
6787 rem=quot%powers[cut];
6788 quot=quot/powers[cut];
6790 *target=(Unit)(*target+rem*powers[DECDPUN-cut]);
6792 if (count<=0) break;
6794 return target-uar+1;
6795 } /* decShiftToLeast */
6798 /* ------------------------------------------------------------------ */
6799 /* decRoundOperand -- round an operand [used for subset only] */
6801 /* dn is the number to round (dn->digits is > set->digits) */
6802 /* set is the relevant context */
6803 /* status is the status accumulator */
6805 /* returns an allocated decNumber with the rounded result. */
6807 /* lostDigits and other status may be set by this. */
6809 /* Since the input is an operand, it must not be modified. */
6810 /* Instead, return an allocated decNumber, rounded as required. */
6811 /* It is the caller's responsibility to free the allocated storage. */
6813 /* If no storage is available then the result cannot be used, so NULL */
6815 /* ------------------------------------------------------------------ */
6816 static decNumber *decRoundOperand(const decNumber *dn, decContext *set,
6818 decNumber *res; /* result structure */
6819 uInt newstatus=0; /* status from round */
6820 Int residue=0; /* rounding accumulator */
6822 /* Allocate storage for the returned decNumber, big enough for the */
6823 /* length specified by the context */
6824 res=(decNumber *)malloc(sizeof(decNumber)
6825 +(D2U(set->digits)-1)*sizeof(Unit));
6827 *status|=DEC_Insufficient_storage;
6830 decCopyFit(res, dn, set, &residue, &newstatus);
6831 decApplyRound(res, set, residue, &newstatus);
6833 /* If that set Inexact then "lost digits" is raised... */
6834 if (newstatus & DEC_Inexact) newstatus|=DEC_Lost_digits;
6837 } /* decRoundOperand */
6840 /* ------------------------------------------------------------------ */
6841 /* decCopyFit -- copy a number, truncating the coefficient if needed */
6843 /* dest is the target decNumber */
6844 /* src is the source decNumber */
6845 /* set is the context [used for length (digits) and rounding mode] */
6846 /* residue is the residue accumulator */
6847 /* status contains the current status to be updated */
6849 /* (dest==src is allowed and will be a no-op if fits) */
6850 /* All fields are updated as required. */
6851 /* ------------------------------------------------------------------ */
6852 static void decCopyFit(decNumber *dest, const decNumber *src,
6853 decContext *set, Int *residue, uInt *status) {
6854 dest->bits=src->bits;
6855 dest->exponent=src->exponent;
6856 decSetCoeff(dest, set, src->lsu, src->digits, residue, status);
6859 /* ------------------------------------------------------------------ */
6860 /* decSetCoeff -- set the coefficient of a number */
6862 /* dn is the number whose coefficient array is to be set. */
6863 /* It must have space for set->digits digits */
6864 /* set is the context [for size] */
6865 /* lsu -> lsu of the source coefficient [may be dn->lsu] */
6866 /* len is digits in the source coefficient [may be dn->digits] */
6867 /* residue is the residue accumulator. This has values as in */
6868 /* decApplyRound, and will be unchanged unless the */
6869 /* target size is less than len. In this case, the */
6870 /* coefficient is truncated and the residue is updated to */
6871 /* reflect the previous residue and the dropped digits. */
6872 /* status is the status accumulator, as usual */
6874 /* The coefficient may already be in the number, or it can be an */
6875 /* external intermediate array. If it is in the number, lsu must == */
6876 /* dn->lsu and len must == dn->digits. */
6878 /* Note that the coefficient length (len) may be < set->digits, and */
6879 /* in this case this merely copies the coefficient (or is a no-op */
6880 /* if dn->lsu==lsu). */
6882 /* Note also that (only internally, from decQuantizeOp and */
6883 /* decSetSubnormal) the value of set->digits may be less than one, */
6884 /* indicating a round to left. This routine handles that case */
6885 /* correctly; caller ensures space. */
6887 /* dn->digits, dn->lsu (and as required), and dn->exponent are */
6888 /* updated as necessary. dn->bits (sign) is unchanged. */
6890 /* DEC_Rounded status is set if any digits are discarded. */
6891 /* DEC_Inexact status is set if any non-zero digits are discarded, or */
6892 /* incoming residue was non-0 (implies rounded) */
6893 /* ------------------------------------------------------------------ */
6894 /* mapping array: maps 0-9 to canonical residues, so that a residue */
6895 /* can be adjusted in the range [-1, +1] and achieve correct rounding */
6896 /* 0 1 2 3 4 5 6 7 8 9 */
6897 static const uByte resmap[10]={0, 3, 3, 3, 3, 5, 7, 7, 7, 7};
6898 static void decSetCoeff(decNumber *dn, decContext *set, const Unit *lsu,
6899 Int len, Int *residue, uInt *status) {
6900 Int discard; /* number of digits to discard */
6901 uInt cut; /* cut point in Unit */
6902 const Unit *up; /* work */
6903 Unit *target; /* .. */
6909 discard=len-set->digits; /* digits to discard */
6910 if (discard<=0) { /* no digits are being discarded */
6911 if (dn->lsu!=lsu) { /* copy needed */
6912 /* copy the coefficient array to the result number; no shift needed */
6913 count=len; /* avoids D2U */
6915 for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
6917 dn->digits=len; /* set the new length */
6919 /* dn->exponent and residue are unchanged, record any inexactitude */
6920 if (*residue!=0) *status|=(DEC_Inexact | DEC_Rounded);
6924 /* some digits must be discarded ... */
6925 dn->exponent+=discard; /* maintain numerical value */
6926 *status|=DEC_Rounded; /* accumulate Rounded status */
6927 if (*residue>1) *residue=1; /* previous residue now to right, so reduce */
6929 if (discard>len) { /* everything, +1, is being discarded */
6930 /* guard digit is 0 */
6931 /* residue is all the number [NB could be all 0s] */
6932 if (*residue<=0) { /* not already positive */
6933 count=len; /* avoids D2U */
6934 for (up=lsu; count>0; up++, count-=DECDPUN) if (*up!=0) { /* found non-0 */
6936 break; /* no need to check any others */
6939 if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude */
6940 *dn->lsu=0; /* coefficient will now be 0 */
6941 dn->digits=1; /* .. */
6943 } /* total discard */
6945 /* partial discard [most common case] */
6946 /* here, at least the first (most significant) discarded digit exists */
6948 /* spin up the number, noting residue during the spin, until get to */
6949 /* the Unit with the first discarded digit. When reach it, extract */
6950 /* it and remember its position */
6952 for (up=lsu;; up++) {
6954 if (count>=discard) break; /* full ones all checked */
6955 if (*up!=0) *residue=1;
6958 /* here up -> Unit with first discarded digit */
6959 cut=discard-(count-DECDPUN)-1;
6960 if (cut==DECDPUN-1) { /* unit-boundary case (fast) */
6961 Unit half=(Unit)powers[DECDPUN]>>1;
6962 /* set residue directly */
6964 if (*up>half) *residue=7;
6965 else *residue+=5; /* add sticky bit */
6968 if (*up!=0) *residue=3; /* [else is 0, leave as sticky bit] */
6970 if (set->digits<=0) { /* special for Quantize/Subnormal :-( */
6971 *dn->lsu=0; /* .. result is 0 */
6972 dn->digits=1; /* .. */
6974 else { /* shift to least */
6975 count=set->digits; /* now digits to end up with */
6976 dn->digits=count; /* set the new length */
6977 up++; /* move to next */
6978 /* on unit boundary, so shift-down copy loop is simple */
6979 for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
6982 } /* unit-boundary case */
6984 else { /* discard digit is in low digit(s), and not top digit */
6985 uInt discard1; /* first discarded digit */
6986 uInt quot, rem; /* for divisions */
6987 if (cut==0) quot=*up; /* is at bottom of unit */
6988 else /* cut>0 */ { /* it's not at bottom of unit */
6990 quot=QUOT10(*up, cut);
6991 rem=*up-quot*powers[cut];
6993 rem=*up%powers[cut];
6994 quot=*up/powers[cut];
6996 if (rem!=0) *residue=1;
6998 /* discard digit is now at bottom of quot */
7000 temp=(quot*6554)>>16; /* fast /10 */
7001 /* Vowels algorithm here not a win (9 instructions) */
7002 discard1=quot-X10(temp);
7008 /* here, discard1 is the guard digit, and residue is everything */
7009 /* else [use mapping array to accumulate residue safely] */
7010 *residue+=resmap[discard1];
7011 cut++; /* update cut */
7012 /* here: up -> Unit of the array with bottom digit */
7013 /* cut is the division point for each Unit */
7014 /* quot holds the uncut high-order digits for the current unit */
7015 if (set->digits<=0) { /* special for Quantize/Subnormal :-( */
7016 *dn->lsu=0; /* .. result is 0 */
7017 dn->digits=1; /* .. */
7019 else { /* shift to least needed */
7020 count=set->digits; /* now digits to end up with */
7021 dn->digits=count; /* set the new length */
7022 /* shift-copy the coefficient array to the result number */
7023 for (target=dn->lsu; ; target++) {
7025 count-=(DECDPUN-cut);
7026 if (count<=0) break;
7030 quot=QUOT10(quot, cut);
7031 rem=*up-quot*powers[cut];
7033 rem=quot%powers[cut];
7034 quot=quot/powers[cut];
7036 *target=(Unit)(*target+rem*powers[DECDPUN-cut]);
7038 if (count<=0) break;
7039 } /* shift-copy loop */
7040 } /* shift to least */
7041 } /* not unit boundary */
7043 if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude */
7047 /* ------------------------------------------------------------------ */
7048 /* decApplyRound -- apply pending rounding to a number */
7050 /* dn is the number, with space for set->digits digits */
7051 /* set is the context [for size and rounding mode] */
7052 /* residue indicates pending rounding, being any accumulated */
7053 /* guard and sticky information. It may be: */
7054 /* 6-9: rounding digit is >5 */
7055 /* 5: rounding digit is exactly half-way */
7056 /* 1-4: rounding digit is <5 and >0 */
7057 /* 0: the coefficient is exact */
7058 /* -1: as 1, but the hidden digits are subtractive, that */
7059 /* is, of the opposite sign to dn. In this case the */
7060 /* coefficient must be non-0. This case occurs when */
7061 /* subtracting a small number (which can be reduced to */
7062 /* a sticky bit); see decAddOp. */
7063 /* status is the status accumulator, as usual */
7065 /* This routine applies rounding while keeping the length of the */
7066 /* coefficient constant. The exponent and status are unchanged */
7069 /* -- the coefficient was increased and is all nines (in which */
7070 /* case Overflow could occur, and is handled directly here so */
7071 /* the caller does not need to re-test for overflow) */
7073 /* -- the coefficient was decreased and becomes all nines (in which */
7074 /* case Underflow could occur, and is also handled directly). */
7076 /* All fields in dn are updated as required. */
7078 /* ------------------------------------------------------------------ */
7079 static void decApplyRound(decNumber *dn, decContext *set, Int residue,
7081 Int bump; /* 1 if coefficient needs to be incremented */
7082 /* -1 if coefficient needs to be decremented */
7084 if (residue==0) return; /* nothing to apply */
7086 bump=0; /* assume a smooth ride */
7088 /* now decide whether, and how, to round, depending on mode */
7089 switch (set->round) {
7090 case DEC_ROUND_05UP: { /* round zero or five up (for reround) */
7091 /* This is the same as DEC_ROUND_DOWN unless there is a */
7092 /* positive residue and the lsd of dn is 0 or 5, in which case */
7093 /* it is bumped; when residue is <0, the number is therefore */
7094 /* bumped down unless the final digit was 1 or 6 (in which */
7095 /* case it is bumped down and then up -- a no-op) */
7096 Int lsd5=*dn->lsu%5; /* get lsd and quintate */
7097 if (residue<0 && lsd5!=1) bump=-1;
7098 else if (residue>0 && lsd5==0) bump=1;
7099 /* [bump==1 could be applied directly; use common path for clarity] */
7102 case DEC_ROUND_DOWN: {
7103 /* no change, except if negative residue */
7104 if (residue<0) bump=-1;
7107 case DEC_ROUND_HALF_DOWN: {
7108 if (residue>5) bump=1;
7111 case DEC_ROUND_HALF_EVEN: {
7112 if (residue>5) bump=1; /* >0.5 goes up */
7113 else if (residue==5) { /* exactly 0.5000... */
7114 /* 0.5 goes up iff [new] lsd is odd */
7115 if (*dn->lsu & 0x01) bump=1;
7119 case DEC_ROUND_HALF_UP: {
7120 if (residue>=5) bump=1;
7123 case DEC_ROUND_UP: {
7124 if (residue>0) bump=1;
7127 case DEC_ROUND_CEILING: {
7128 /* same as _UP for positive numbers, and as _DOWN for negatives */
7129 /* [negative residue cannot occur on 0] */
7130 if (decNumberIsNegative(dn)) {
7131 if (residue<0) bump=-1;
7134 if (residue>0) bump=1;
7138 case DEC_ROUND_FLOOR: {
7139 /* same as _UP for negative numbers, and as _DOWN for positive */
7140 /* [negative residue cannot occur on 0] */
7141 if (!decNumberIsNegative(dn)) {
7142 if (residue<0) bump=-1;
7145 if (residue>0) bump=1;
7149 default: { /* e.g., DEC_ROUND_MAX */
7150 *status|=DEC_Invalid_context;
7151 #if DECTRACE || (DECCHECK && DECVERB)
7152 printf("Unknown rounding mode: %d\n", set->round);
7157 /* now bump the number, up or down, if need be */
7158 if (bump==0) return; /* no action required */
7160 /* Simply use decUnitAddSub unless bumping up and the number is */
7161 /* all nines. In this special case set to 100... explicitly */
7162 /* and adjust the exponent by one (as otherwise could overflow */
7164 /* Similarly handle all-nines result if bumping down. */
7166 Unit *up; /* work */
7167 uInt count=dn->digits; /* digits to be checked */
7168 for (up=dn->lsu; ; up++) {
7169 if (count<=DECDPUN) {
7170 /* this is the last Unit (the msu) */
7171 if (*up!=powers[count]-1) break; /* not still 9s */
7172 /* here if it, too, is all nines */
7173 *up=(Unit)powers[count-1]; /* here 999 -> 100 etc. */
7174 for (up=up-1; up>=dn->lsu; up--) *up=0; /* others all to 0 */
7175 dn->exponent++; /* and bump exponent */
7176 /* [which, very rarely, could cause Overflow...] */
7177 if ((dn->exponent+dn->digits)>set->emax+1) {
7178 decSetOverflow(dn, set, status);
7182 /* a full unit to check, with more to come */
7183 if (*up!=DECDPUNMAX) break; /* not still 9s */
7188 /* here checking for a pre-bump of 1000... (leading 1, all */
7189 /* other digits zero) */
7190 Unit *up, *sup; /* work */
7191 uInt count=dn->digits; /* digits to be checked */
7192 for (up=dn->lsu; ; up++) {
7193 if (count<=DECDPUN) {
7194 /* this is the last Unit (the msu) */
7195 if (*up!=powers[count-1]) break; /* not 100.. */
7196 /* here if have the 1000... case */
7197 sup=up; /* save msu pointer */
7198 *up=(Unit)powers[count]-1; /* here 100 in msu -> 999 */
7199 /* others all to all-nines, too */
7200 for (up=up-1; up>=dn->lsu; up--) *up=(Unit)powers[DECDPUN]-1;
7201 dn->exponent--; /* and bump exponent */
7203 /* iff the number was at the subnormal boundary (exponent=etiny) */
7204 /* then the exponent is now out of range, so it will in fact get */
7205 /* clamped to etiny and the final 9 dropped. */
7206 /* printf(">> emin=%d exp=%d sdig=%d\n", set->emin, */
7207 /* dn->exponent, set->digits); */
7208 if (dn->exponent+1==set->emin-set->digits+1) {
7209 if (count==1 && dn->digits==1) *sup=0; /* here 9 -> 0[.9] */
7211 *sup=(Unit)powers[count-1]-1; /* here 999.. in msu -> 99.. */
7215 *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
7220 /* a full unit to check, with more to come */
7221 if (*up!=0) break; /* not still 0s */
7227 /* Actual bump needed. Do it. */
7228 decUnitAddSub(dn->lsu, D2U(dn->digits), uarrone, 1, 0, dn->lsu, bump);
7229 } /* decApplyRound */
7232 /* ------------------------------------------------------------------ */
7233 /* decFinish -- finish processing a number */
7235 /* dn is the number */
7236 /* set is the context */
7237 /* residue is the rounding accumulator (as in decApplyRound) */
7238 /* status is the accumulator */
7240 /* This finishes off the current number by: */
7241 /* 1. If not extended: */
7242 /* a. Converting a zero result to clean '0' */
7243 /* b. Reducing positive exponents to 0, if would fit in digits */
7244 /* 2. Checking for overflow and subnormals (always) */
7245 /* Note this is just Finalize when no subset arithmetic. */
7246 /* All fields are updated as required. */
7247 /* ------------------------------------------------------------------ */
7248 static void decFinish(decNumber *dn, decContext *set, Int *residue,
7250 if (!set->extended) {
7251 if ISZERO(dn) { /* value is zero */
7252 dn->exponent=0; /* clean exponent .. */
7253 dn->bits=0; /* .. and sign */
7254 return; /* no error possible */
7256 if (dn->exponent>=0) { /* non-negative exponent */
7257 /* >0; reduce to integer if possible */
7258 if (set->digits >= (dn->exponent+dn->digits)) {
7259 dn->digits=decShiftToMost(dn->lsu, dn->digits, dn->exponent);
7265 decFinalize(dn, set, residue, status);
7269 /* ------------------------------------------------------------------ */
7270 /* decFinalize -- final check, clamp, and round of a number */
7272 /* dn is the number */
7273 /* set is the context */
7274 /* residue is the rounding accumulator (as in decApplyRound) */
7275 /* status is the status accumulator */
7277 /* This finishes off the current number by checking for subnormal */
7278 /* results, applying any pending rounding, checking for overflow, */
7279 /* and applying any clamping. */
7280 /* Underflow and overflow conditions are raised as appropriate. */
7281 /* All fields are updated as required. */
7282 /* ------------------------------------------------------------------ */
7283 static void decFinalize(decNumber *dn, decContext *set, Int *residue,
7285 Int shift; /* shift needed if clamping */
7286 Int tinyexp=set->emin-dn->digits+1; /* precalculate subnormal boundary */
7288 /* Must be careful, here, when checking the exponent as the */
7289 /* adjusted exponent could overflow 31 bits [because it may already */
7290 /* be up to twice the expected]. */
7292 /* First test for subnormal. This must be done before any final */
7293 /* round as the result could be rounded to Nmin or 0. */
7294 if (dn->exponent<=tinyexp) { /* prefilter */
7297 /* A very nasty case here is dn == Nmin and residue<0 */
7298 if (dn->exponent<tinyexp) {
7299 /* Go handle subnormals; this will apply round if needed. */
7300 decSetSubnormal(dn, set, residue, status);
7303 /* Equals case: only subnormal if dn=Nmin and negative residue */
7304 uprv_decNumberZero(&nmin);
7306 nmin.exponent=set->emin;
7307 comp=decCompare(dn, &nmin, 1); /* (signless compare) */
7308 if (comp==BADINT) { /* oops */
7309 *status|=DEC_Insufficient_storage; /* abandon... */
7312 if (*residue<0 && comp==0) { /* neg residue and dn==Nmin */
7313 decApplyRound(dn, set, *residue, status); /* might force down */
7314 decSetSubnormal(dn, set, residue, status);
7319 /* now apply any pending round (this could raise overflow). */
7320 if (*residue!=0) decApplyRound(dn, set, *residue, status);
7322 /* Check for overflow [redundant in the 'rare' case] or clamp */
7323 if (dn->exponent<=set->emax-set->digits+1) return; /* neither needed */
7326 /* here when might have an overflow or clamp to do */
7327 if (dn->exponent>set->emax-dn->digits+1) { /* too big */
7328 decSetOverflow(dn, set, status);
7331 /* here when the result is normal but in clamp range */
7332 if (!set->clamp) return;
7334 /* here when need to apply the IEEE exponent clamp (fold-down) */
7335 shift=dn->exponent-(set->emax-set->digits+1);
7337 /* shift coefficient (if non-zero) */
7339 dn->digits=decShiftToMost(dn->lsu, dn->digits, shift);
7341 dn->exponent-=shift; /* adjust the exponent to match */
7342 *status|=DEC_Clamped; /* and record the dirty deed */
7346 /* ------------------------------------------------------------------ */
7347 /* decSetOverflow -- set number to proper overflow value */
7349 /* dn is the number (used for sign [only] and result) */
7350 /* set is the context [used for the rounding mode, etc.] */
7351 /* status contains the current status to be updated */
7353 /* This sets the sign of a number and sets its value to either */
7354 /* Infinity or the maximum finite value, depending on the sign of */
7355 /* dn and the rounding mode, following IEEE 754 rules. */
7356 /* ------------------------------------------------------------------ */
7357 static void decSetOverflow(decNumber *dn, decContext *set, uInt *status) {
7358 Flag needmax=0; /* result is maximum finite value */
7359 uByte sign=dn->bits&DECNEG; /* clean and save sign bit */
7361 if (ISZERO(dn)) { /* zero does not overflow magnitude */
7362 Int emax=set->emax; /* limit value */
7363 if (set->clamp) emax-=set->digits-1; /* lower if clamping */
7364 if (dn->exponent>emax) { /* clamp required */
7366 *status|=DEC_Clamped;
7371 uprv_decNumberZero(dn);
7372 switch (set->round) {
7373 case DEC_ROUND_DOWN: {
7374 needmax=1; /* never Infinity */
7376 case DEC_ROUND_05UP: {
7377 needmax=1; /* never Infinity */
7379 case DEC_ROUND_CEILING: {
7380 if (sign) needmax=1; /* Infinity if non-negative */
7382 case DEC_ROUND_FLOOR: {
7383 if (!sign) needmax=1; /* Infinity if negative */
7385 default: break; /* Infinity in all other cases */
7388 decSetMaxValue(dn, set);
7389 dn->bits=sign; /* set sign */
7391 else dn->bits=sign|DECINF; /* Value is +/-Infinity */
7392 *status|=DEC_Overflow | DEC_Inexact | DEC_Rounded;
7393 } /* decSetOverflow */
7395 /* ------------------------------------------------------------------ */
7396 /* decSetMaxValue -- set number to +Nmax (maximum normal value) */
7398 /* dn is the number to set */
7399 /* set is the context [used for digits and emax] */
7401 /* This sets the number to the maximum positive value. */
7402 /* ------------------------------------------------------------------ */
7403 static void decSetMaxValue(decNumber *dn, decContext *set) {
7404 Unit *up; /* work */
7405 Int count=set->digits; /* nines to add */
7407 /* fill in all nines to set maximum value */
7408 for (up=dn->lsu; ; up++) {
7409 if (count>DECDPUN) *up=DECDPUNMAX; /* unit full o'nines */
7410 else { /* this is the msu */
7411 *up=(Unit)(powers[count]-1);
7414 count-=DECDPUN; /* filled those digits */
7416 dn->bits=0; /* + sign */
7417 dn->exponent=set->emax-set->digits+1;
7418 } /* decSetMaxValue */
7420 /* ------------------------------------------------------------------ */
7421 /* decSetSubnormal -- process value whose exponent is <Emin */
7423 /* dn is the number (used as input as well as output; it may have */
7424 /* an allowed subnormal value, which may need to be rounded) */
7425 /* set is the context [used for the rounding mode] */
7426 /* residue is any pending residue */
7427 /* status contains the current status to be updated */
7429 /* If subset mode, set result to zero and set Underflow flags. */
7431 /* Value may be zero with a low exponent; this does not set Subnormal */
7432 /* but the exponent will be clamped to Etiny. */
7434 /* Otherwise ensure exponent is not out of range, and round as */
7435 /* necessary. Underflow is set if the result is Inexact. */
7436 /* ------------------------------------------------------------------ */
7437 static void decSetSubnormal(decNumber *dn, decContext *set, Int *residue,
7439 decContext workset; /* work */
7440 Int etiny, adjust; /* .. */
7443 /* simple set to zero and 'hard underflow' for subset */
7444 if (!set->extended) {
7445 uprv_decNumberZero(dn);
7446 /* always full overflow */
7447 *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
7452 /* Full arithmetic -- allow subnormals, rounded to minimum exponent */
7453 /* (Etiny) if needed */
7454 etiny=set->emin-(set->digits-1); /* smallest allowed exponent */
7456 if ISZERO(dn) { /* value is zero */
7457 /* residue can never be non-zero here */
7460 printf("++ Subnormal 0 residue %ld\n", (LI)*residue);
7461 *status|=DEC_Invalid_operation;
7464 if (dn->exponent<etiny) { /* clamp required */
7466 *status|=DEC_Clamped;
7471 *status|=DEC_Subnormal; /* have a non-zero subnormal */
7472 adjust=etiny-dn->exponent; /* calculate digits to remove */
7473 if (adjust<=0) { /* not out of range; unrounded */
7474 /* residue can never be non-zero here, except in the Nmin-residue */
7475 /* case (which is a subnormal result), so can take fast-path here */
7476 /* it may already be inexact (from setting the coefficient) */
7477 if (*status&DEC_Inexact) *status|=DEC_Underflow;
7481 /* adjust>0, so need to rescale the result so exponent becomes Etiny */
7482 /* [this code is similar to that in rescale] */
7483 workset=*set; /* clone rounding, etc. */
7484 workset.digits=dn->digits-adjust; /* set requested length */
7485 workset.emin-=adjust; /* and adjust emin to match */
7486 /* [note that the latter can be <1, here, similar to Rescale case] */
7487 decSetCoeff(dn, &workset, dn->lsu, dn->digits, residue, status);
7488 decApplyRound(dn, &workset, *residue, status);
7490 /* Use 754 default rule: Underflow is set iff Inexact */
7491 /* [independent of whether trapped] */
7492 if (*status&DEC_Inexact) *status|=DEC_Underflow;
7494 /* if rounded up a 999s case, exponent will be off by one; adjust */
7495 /* back if so [it will fit, because it was shortened earlier] */
7496 if (dn->exponent>etiny) {
7497 dn->digits=decShiftToMost(dn->lsu, dn->digits, 1);
7498 dn->exponent--; /* (re)adjust the exponent. */
7501 /* if rounded to zero, it is by definition clamped... */
7502 if (ISZERO(dn)) *status|=DEC_Clamped;
7503 } /* decSetSubnormal */
7505 /* ------------------------------------------------------------------ */
7506 /* decCheckMath - check entry conditions for a math function */
7508 /* This checks the context and the operand */
7510 /* rhs is the operand to check */
7511 /* set is the context to check */
7512 /* status is unchanged if both are good */
7514 /* returns non-zero if status is changed, 0 otherwise */
7516 /* Restrictions enforced: */
7518 /* digits, emax, and -emin in the context must be less than */
7519 /* DEC_MAX_MATH (999999), and A must be within these bounds if */
7520 /* non-zero. Invalid_operation is set in the status if a */
7521 /* restriction is violated. */
7522 /* ------------------------------------------------------------------ */
7523 static uInt decCheckMath(const decNumber *rhs, decContext *set,
7525 uInt save=*status; /* record */
7526 if (set->digits>DEC_MAX_MATH
7527 || set->emax>DEC_MAX_MATH
7528 || -set->emin>DEC_MAX_MATH) *status|=DEC_Invalid_context;
7529 else if ((rhs->digits>DEC_MAX_MATH
7530 || rhs->exponent+rhs->digits>DEC_MAX_MATH+1
7531 || rhs->exponent+rhs->digits<2*(1-DEC_MAX_MATH))
7532 && !ISZERO(rhs)) *status|=DEC_Invalid_operation;
7533 return (*status!=save);
7534 } /* decCheckMath */
7536 /* ------------------------------------------------------------------ */
7537 /* decGetInt -- get integer from a number */
7539 /* dn is the number [which will not be altered] */
7541 /* returns one of: */
7542 /* BADINT if there is a non-zero fraction */
7543 /* the converted integer */
7544 /* BIGEVEN if the integer is even and magnitude > 2*10**9 */
7545 /* BIGODD if the integer is odd and magnitude > 2*10**9 */
7547 /* This checks and gets a whole number from the input decNumber. */
7548 /* The sign can be determined from dn by the caller when BIGEVEN or */
7549 /* BIGODD is returned. */
7550 /* ------------------------------------------------------------------ */
7551 static Int decGetInt(const decNumber *dn) {
7552 Int theInt; /* result accumulator */
7553 const Unit *up; /* work */
7554 Int got; /* digits (real or not) processed */
7555 Int ilength=dn->digits+dn->exponent; /* integral length */
7556 Flag neg=decNumberIsNegative(dn); /* 1 if -ve */
7558 /* The number must be an integer that fits in 10 digits */
7559 /* Assert, here, that 10 is enough for any rescale Etiny */
7560 #if DEC_MAX_EMAX > 999999999
7561 #error GetInt may need updating [for Emax]
7563 #if DEC_MIN_EMIN < -999999999
7564 #error GetInt may need updating [for Emin]
7566 if (ISZERO(dn)) return 0; /* zeros are OK, with any exponent */
7568 up=dn->lsu; /* ready for lsu */
7569 theInt=0; /* ready to accumulate */
7570 if (dn->exponent>=0) { /* relatively easy */
7571 /* no fractional part [usual]; allow for positive exponent */
7574 else { /* -ve exponent; some fractional part to check and discard */
7575 Int count=-dn->exponent; /* digits to discard */
7576 /* spin up whole units until reach the Unit with the unit digit */
7577 for (; count>=DECDPUN; up++) {
7578 if (*up!=0) return BADINT; /* non-zero Unit to discard */
7581 if (count==0) got=0; /* [a multiple of DECDPUN] */
7582 else { /* [not multiple of DECDPUN] */
7584 /* slice off fraction digits and check for non-zero */
7586 theInt=QUOT10(*up, count);
7587 rem=*up-theInt*powers[count];
7589 rem=*up%powers[count]; /* slice off discards */
7590 theInt=*up/powers[count];
7592 if (rem!=0) return BADINT; /* non-zero fraction */
7594 got=DECDPUN-count; /* number of digits so far */
7595 up++; /* ready for next */
7598 /* now it's known there's no fractional part */
7600 /* tricky code now, to accumulate up to 9.3 digits */
7601 if (got==0) {theInt=*up; got+=DECDPUN; up++;} /* ensure lsu is there */
7605 /* collect any remaining unit(s) */
7606 for (; got<ilength; up++) {
7607 theInt+=*up*powers[got];
7610 if (ilength==10) { /* need to check for wrap */
7611 if (theInt/(Int)powers[got-DECDPUN]!=(Int)*(up-1)) ilength=11;
7612 /* [that test also disallows the BADINT result case] */
7613 else if (neg && theInt>1999999997) ilength=11;
7614 else if (!neg && theInt>999999999) ilength=11;
7615 if (ilength==11) theInt=save; /* restore correct low bit */
7619 if (ilength>10) { /* too big */
7620 if (theInt&1) return BIGODD; /* bottom bit 1 */
7621 return BIGEVEN; /* bottom bit 0 */
7624 if (neg) theInt=-theInt; /* apply sign */
7628 /* ------------------------------------------------------------------ */
7629 /* decDecap -- decapitate the coefficient of a number */
7631 /* dn is the number to be decapitated */
7632 /* drop is the number of digits to be removed from the left of dn; */
7633 /* this must be <= dn->digits (if equal, the coefficient is */
7636 /* Returns dn; dn->digits will be <= the initial digits less drop */
7637 /* (after removing drop digits there may be leading zero digits */
7638 /* which will also be removed). Only dn->lsu and dn->digits change. */
7639 /* ------------------------------------------------------------------ */
7640 static decNumber *decDecap(decNumber *dn, Int drop) {
7641 Unit *msu; /* -> target cut point */
7643 if (drop>=dn->digits) { /* losing the whole thing */
7645 if (drop>dn->digits)
7646 printf("decDecap called with drop>digits [%ld>%ld]\n",
7647 (LI)drop, (LI)dn->digits);
7653 msu=dn->lsu+D2U(dn->digits-drop)-1; /* -> likely msu */
7654 cut=MSUDIGITS(dn->digits-drop); /* digits to be in use in msu */
7655 if (cut!=DECDPUN) *msu%=powers[cut]; /* clear left digits */
7656 /* that may have left leading zero digits, so do a proper count... */
7657 dn->digits=decGetDigits(dn->lsu, msu-dn->lsu+1);
7661 /* ------------------------------------------------------------------ */
7662 /* decBiStr -- compare string with pairwise options */
7664 /* targ is the string to compare */
7665 /* str1 is one of the strings to compare against (length may be 0) */
7666 /* str2 is the other; it must be the same length as str1 */
7668 /* returns 1 if strings compare equal, (that is, it is the same */
7669 /* length as str1 and str2, and each character of targ is in either */
7670 /* str1 or str2 in the corresponding position), or 0 otherwise */
7672 /* This is used for generic caseless compare, including the awkward */
7673 /* case of the Turkish dotted and dotless Is. Use as (for example): */
7674 /* if (decBiStr(test, "mike", "MIKE")) ... */
7675 /* ------------------------------------------------------------------ */
7676 static Flag decBiStr(const char *targ, const char *str1, const char *str2) {
7677 for (;;targ++, str1++, str2++) {
7678 if (*targ!=*str1 && *targ!=*str2) return 0;
7679 /* *targ has a match in one (or both, if terminator) */
7680 if (*targ=='\0') break;
7685 /* ------------------------------------------------------------------ */
7686 /* decNaNs -- handle NaN operand or operands */
7688 /* res is the result number */
7689 /* lhs is the first operand */
7690 /* rhs is the second operand, or NULL if none */
7691 /* context is used to limit payload length */
7692 /* status contains the current status */
7693 /* returns res in case convenient */
7695 /* Called when one or both operands is a NaN, and propagates the */
7696 /* appropriate result to res. When an sNaN is found, it is changed */
7697 /* to a qNaN and Invalid operation is set. */
7698 /* ------------------------------------------------------------------ */
7699 static decNumber * decNaNs(decNumber *res, const decNumber *lhs,
7700 const decNumber *rhs, decContext *set,
7702 /* This decision tree ends up with LHS being the source pointer, */
7703 /* and status updated if need be */
7704 if (lhs->bits & DECSNAN)
7705 *status|=DEC_Invalid_operation | DEC_sNaN;
7706 else if (rhs==NULL);
7707 else if (rhs->bits & DECSNAN) {
7709 *status|=DEC_Invalid_operation | DEC_sNaN;
7711 else if (lhs->bits & DECNAN);
7714 /* propagate the payload */
7715 if (lhs->digits<=set->digits) uprv_decNumberCopy(res, lhs); /* easy */
7716 else { /* too long */
7719 /* copy safe number of units, then decapitate */
7720 res->bits=lhs->bits; /* need sign etc. */
7721 uresp1=res->lsu+D2U(set->digits);
7722 for (ur=res->lsu, ul=lhs->lsu; ur<uresp1; ur++, ul++) *ur=*ul;
7723 res->digits=D2U(set->digits)*DECDPUN;
7724 /* maybe still too long */
7725 if (res->digits>set->digits) decDecap(res, res->digits-set->digits);
7728 res->bits&=~DECSNAN; /* convert any sNaN to NaN, while */
7729 res->bits|=DECNAN; /* .. preserving sign */
7730 res->exponent=0; /* clean exponent */
7731 /* [coefficient was copied/decapitated] */
7735 /* ------------------------------------------------------------------ */
7736 /* decStatus -- apply non-zero status */
7738 /* dn is the number to set if error */
7739 /* status contains the current status (not yet in context) */
7740 /* set is the context */
7742 /* If the status is an error status, the number is set to a NaN, */
7743 /* unless the error was an overflow, divide-by-zero, or underflow, */
7744 /* in which case the number will have already been set. */
7746 /* The context status is then updated with the new status. Note that */
7747 /* this may raise a signal, so control may never return from this */
7748 /* routine (hence resources must be recovered before it is called). */
7749 /* ------------------------------------------------------------------ */
7750 static void decStatus(decNumber *dn, uInt status, decContext *set) {
7751 if (status & DEC_NaNs) { /* error status -> NaN */
7752 /* if cause was an sNaN, clear and propagate [NaN is already set up] */
7753 if (status & DEC_sNaN) status&=~DEC_sNaN;
7755 uprv_decNumberZero(dn); /* other error: clean throughout */
7756 dn->bits=DECNAN; /* and make a quiet NaN */
7759 uprv_decContextSetStatus(set, status); /* [may not return] */
7763 /* ------------------------------------------------------------------ */
7764 /* decGetDigits -- count digits in a Units array */
7766 /* uar is the Unit array holding the number (this is often an */
7767 /* accumulator of some sort) */
7768 /* len is the length of the array in units [>=1] */
7770 /* returns the number of (significant) digits in the array */
7772 /* All leading zeros are excluded, except the last if the array has */
7773 /* only zero Units. */
7774 /* ------------------------------------------------------------------ */
7775 /* This may be called twice during some operations. */
7776 static Int decGetDigits(Unit *uar, Int len) {
7777 Unit *up=uar+(len-1); /* -> msu */
7778 Int digits=(len-1)*DECDPUN+1; /* possible digits excluding msu */
7780 uInt const *pow; /* work */
7782 /* (at least 1 in final msu) */
7784 if (len<1) printf("decGetDigits called with len<1 [%ld]\n", (LI)len);
7787 for (; up>=uar; up--) {
7788 if (*up==0) { /* unit is all 0s */
7789 if (digits==1) break; /* a zero has one digit */
7790 digits-=DECDPUN; /* adjust for 0 unit */
7792 /* found the first (most significant) non-zero Unit */
7793 #if DECDPUN>1 /* not done yet */
7794 if (*up<10) break; /* is 1-9 */
7796 #if DECDPUN>2 /* not done yet */
7797 if (*up<100) break; /* is 10-99 */
7799 #if DECDPUN>3 /* not done yet */
7800 if (*up<1000) break; /* is 100-999 */
7802 #if DECDPUN>4 /* count the rest ... */
7803 for (pow=&powers[4]; *up>=*pow; pow++) digits++;
7811 } /* decGetDigits */
7813 #if DECTRACE | DECCHECK
7814 /* ------------------------------------------------------------------ */
7815 /* decNumberShow -- display a number [debug aid] */
7816 /* dn is the number to show */
7818 /* Shows: sign, exponent, coefficient (msu first), digits */
7819 /* or: sign, special-value */
7820 /* ------------------------------------------------------------------ */
7821 /* this is public so other modules can use it */
7822 void uprv_decNumberShow(const decNumber *dn) {
7823 const Unit *up; /* work */
7826 char isign='+'; /* main sign */
7830 if (decNumberIsNegative(dn)) isign='-';
7831 printf(" >> %c ", isign);
7832 if (dn->bits&DECSPECIAL) { /* Is a special value */
7833 if (decNumberIsInfinite(dn)) printf("Infinity");
7835 if (dn->bits&DECSNAN) printf("sNaN"); /* signalling NaN */
7838 /* if coefficient and exponent are 0, no more to do */
7839 if (dn->exponent==0 && dn->digits==1 && *dn->lsu==0) {
7842 /* drop through to report other information */
7846 /* now carefully display the coefficient */
7847 up=dn->lsu+D2U(dn->digits)-1; /* msu */
7848 printf("%ld", (LI)*up);
7849 for (up=up-1; up>=dn->lsu; up--) {
7852 for (cut=DECDPUN-1; cut>=0; cut--) {
7855 printf("%ld", (LI)d);
7858 if (dn->exponent!=0) {
7860 if (dn->exponent<0) esign='-';
7861 printf(" E%c%ld", esign, (LI)abs(dn->exponent));
7863 printf(" [%ld]\n", (LI)dn->digits);
7864 } /* decNumberShow */
7867 #if DECTRACE || DECCHECK
7868 /* ------------------------------------------------------------------ */
7869 /* decDumpAr -- display a unit array [debug/check aid] */
7870 /* name is a single-character tag name */
7871 /* ar is the array to display */
7872 /* len is the length of the array in Units */
7873 /* ------------------------------------------------------------------ */
7874 static void decDumpAr(char name, const Unit *ar, Int len) {
7896 printf(" :%c: ", name);
7897 for (i=len-1; i>=0; i--) {
7898 if (i==len-1) printf("%ld ", (LI)ar[i]);
7899 else printf(spec, ar[i]);
7906 /* ------------------------------------------------------------------ */
7907 /* decCheckOperands -- check operand(s) to a routine */
7908 /* res is the result structure (not checked; it will be set to */
7909 /* quiet NaN if error found (and it is not NULL)) */
7910 /* lhs is the first operand (may be DECUNRESU) */
7911 /* rhs is the second (may be DECUNUSED) */
7912 /* set is the context (may be DECUNCONT) */
7913 /* returns 0 if both operands, and the context are clean, or 1 */
7914 /* otherwise (in which case the context will show an error, */
7915 /* unless NULL). Note that res is not cleaned; caller should */
7916 /* handle this so res=NULL case is safe. */
7917 /* The caller is expected to abandon immediately if 1 is returned. */
7918 /* ------------------------------------------------------------------ */
7919 static Flag decCheckOperands(decNumber *res, const decNumber *lhs,
7920 const decNumber *rhs, decContext *set) {
7922 if (set==NULL) { /* oops; hopeless */
7923 #if DECTRACE || DECVERB
7924 printf("Reference to context is NULL.\n");
7928 else if (set!=DECUNCONT
7929 && (set->digits<1 || set->round>=DEC_ROUND_MAX)) {
7931 #if DECTRACE || DECVERB
7932 printf("Bad context [digits=%ld round=%ld].\n",
7933 (LI)set->digits, (LI)set->round);
7940 /* this one not DECVERB as standard tests include NULL */
7941 printf("Reference to result is NULL.\n");
7944 if (!bad && lhs!=DECUNUSED) bad=(decCheckNumber(lhs));
7945 if (!bad && rhs!=DECUNUSED) bad=(decCheckNumber(rhs));
7948 if (set!=DECUNCONT) uprv_decContextSetStatus(set, DEC_Invalid_operation);
7949 if (res!=DECUNRESU && res!=NULL) {
7950 uprv_decNumberZero(res);
7951 res->bits=DECNAN; /* qNaN */
7955 } /* decCheckOperands */
7957 /* ------------------------------------------------------------------ */
7958 /* decCheckNumber -- check a number */
7959 /* dn is the number to check */
7960 /* returns 0 if the number is clean, or 1 otherwise */
7962 /* The number is considered valid if it could be a result from some */
7963 /* operation in some valid context. */
7964 /* ------------------------------------------------------------------ */
7965 static Flag decCheckNumber(const decNumber *dn) {
7966 const Unit *up; /* work */
7967 uInt maxuint; /* .. */
7968 Int ae, d, digits; /* .. */
7969 Int emin, emax; /* .. */
7971 if (dn==NULL) { /* hopeless */
7973 /* this one not DECVERB as standard tests include NULL */
7974 printf("Reference to decNumber is NULL.\n");
7978 /* check special values */
7979 if (dn->bits & DECSPECIAL) {
7980 if (dn->exponent!=0) {
7981 #if DECTRACE || DECVERB
7982 printf("Exponent %ld (not 0) for a special value [%02x].\n",
7983 (LI)dn->exponent, dn->bits);
7987 /* 2003.09.08: NaNs may now have coefficients, so next tests Inf only */
7988 if (decNumberIsInfinite(dn)) {
7989 if (dn->digits!=1) {
7990 #if DECTRACE || DECVERB
7991 printf("Digits %ld (not 1) for an infinity.\n", (LI)dn->digits);
7995 #if DECTRACE || DECVERB
7996 printf("LSU %ld (not 0) for an infinity.\n", (LI)*dn->lsu);
7998 decDumpAr('I', dn->lsu, D2U(dn->digits));
8001 /* 2002.12.26: negative NaNs can now appear through proposed IEEE */
8002 /* concrete formats (decimal64, etc.). */
8006 /* check the coefficient */
8007 if (dn->digits<1 || dn->digits>DECNUMMAXP) {
8008 #if DECTRACE || DECVERB
8009 printf("Digits %ld in number.\n", (LI)dn->digits);
8015 for (up=dn->lsu; d>0; up++) {
8016 if (d>DECDPUN) maxuint=DECDPUNMAX;
8017 else { /* reached the msu */
8018 maxuint=powers[d]-1;
8019 if (dn->digits>1 && *up<powers[d-1]) {
8020 #if DECTRACE || DECVERB
8021 printf("Leading 0 in number.\n");
8022 uprv_decNumberShow(dn);
8027 #if DECTRACE || DECVERB
8028 printf("Bad Unit [%08lx] in %ld-digit number at offset %ld [maxuint %ld].\n",
8029 (LI)*up, (LI)dn->digits, (LI)(up-dn->lsu), (LI)maxuint);
8035 /* check the exponent. Note that input operands can have exponents */
8036 /* which are out of the set->emin/set->emax and set->digits range */
8037 /* (just as they can have more digits than set->digits). */
8038 ae=dn->exponent+dn->digits-1; /* adjusted exponent */
8042 if (ae<emin-(digits-1)) {
8043 #if DECTRACE || DECVERB
8044 printf("Adjusted exponent underflow [%ld].\n", (LI)ae);
8045 uprv_decNumberShow(dn);
8049 #if DECTRACE || DECVERB
8050 printf("Adjusted exponent overflow [%ld].\n", (LI)ae);
8051 uprv_decNumberShow(dn);
8055 return 0; /* it's OK */
8056 } /* decCheckNumber */
8058 /* ------------------------------------------------------------------ */
8059 /* decCheckInexact -- check a normal finite inexact result has digits */
8060 /* dn is the number to check */
8061 /* set is the context (for status and precision) */
8062 /* sets Invalid operation, etc., if some digits are missing */
8063 /* [this check is not made for DECSUBSET compilation or when */
8064 /* subnormal is not set] */
8065 /* ------------------------------------------------------------------ */
8066 static void decCheckInexact(const decNumber *dn, decContext *set) {
8067 #if !DECSUBSET && DECEXTFLAG
8068 if ((set->status & (DEC_Inexact|DEC_Subnormal))==DEC_Inexact
8069 && (set->digits!=dn->digits) && !(dn->bits & DECSPECIAL)) {
8070 #if DECTRACE || DECVERB
8071 printf("Insufficient digits [%ld] on normal Inexact result.\n",
8073 uprv_decNumberShow(dn);
8075 uprv_decContextSetStatus(set, DEC_Invalid_operation);
8078 /* next is a noop for quiet compiler */
8079 if (dn!=NULL && dn->digits==0) set->status|=DEC_Invalid_operation;
8082 } /* decCheckInexact */
8088 /* ------------------------------------------------------------------ */
8089 /* decMalloc -- accountable allocation routine */
8090 /* n is the number of bytes to allocate */
8092 /* Semantics is the same as the stdlib malloc routine, but bytes */
8093 /* allocated are accounted for globally, and corruption fences are */
8094 /* added before and after the 'actual' storage. */
8095 /* ------------------------------------------------------------------ */
8096 /* This routine allocates storage with an extra twelve bytes; 8 are */
8097 /* at the start and hold: */
8098 /* 0-3 the original length requested */
8099 /* 4-7 buffer corruption detection fence (DECFENCE, x4) */
8100 /* The 4 bytes at the end also hold a corruption fence (DECFENCE, x4) */
8101 /* ------------------------------------------------------------------ */
8102 static void *decMalloc(size_t n) {
8103 uInt size=n+12; /* true size */
8104 void *alloc; /* -> allocated storage */
8105 uByte *b, *b0; /* work */
8106 uInt uiwork; /* for macros */
8108 alloc=malloc(size); /* -> allocated storage */
8109 if (alloc==NULL) return NULL; /* out of strorage */
8110 b0=(uByte *)alloc; /* as bytes */
8111 decAllocBytes+=n; /* account for storage */
8112 UBFROMUI(alloc, n); /* save n */
8113 /* printf(" alloc ++ dAB: %ld (%ld)\n", (LI)decAllocBytes, (LI)n); */
8114 for (b=b0+4; b<b0+8; b++) *b=DECFENCE;
8115 for (b=b0+n+8; b<b0+n+12; b++) *b=DECFENCE;
8116 return b0+8; /* -> play area */
8119 /* ------------------------------------------------------------------ */
8120 /* decFree -- accountable free routine */
8121 /* alloc is the storage to free */
8123 /* Semantics is the same as the stdlib malloc routine, except that */
8124 /* the global storage accounting is updated and the fences are */
8125 /* checked to ensure that no routine has written 'out of bounds'. */
8126 /* ------------------------------------------------------------------ */
8127 /* This routine first checks that the fences have not been corrupted. */
8128 /* It then frees the storage using the 'truw' storage address (that */
8129 /* is, offset by 8). */
8130 /* ------------------------------------------------------------------ */
8131 static void decFree(void *alloc) {
8132 uInt n; /* original length */
8133 uByte *b, *b0; /* work */
8134 uInt uiwork; /* for macros */
8136 if (alloc==NULL) return; /* allowed; it's a nop */
8137 b0=(uByte *)alloc; /* as bytes */
8138 b0-=8; /* -> true start of storage */
8139 n=UBTOUI(b0); /* lift length */
8140 for (b=b0+4; b<b0+8; b++) if (*b!=DECFENCE)
8141 printf("=== Corrupt byte [%02x] at offset %d from %ld ===\n", *b,
8143 for (b=b0+n+8; b<b0+n+12; b++) if (*b!=DECFENCE)
8144 printf("=== Corrupt byte [%02x] at offset +%d from %ld, n=%ld ===\n", *b,
8145 b-b0-8, (LI)b0, (LI)n);
8146 free(b0); /* drop the storage */
8147 decAllocBytes-=n; /* account for storage */
8148 /* printf(" free -- dAB: %d (%d)\n", decAllocBytes, -n); */
8150 #define malloc(a) decMalloc(a)
8151 #define free(a) decFree(a)