1 /* Decimal Number module for the decNumber C Library
2 Copyright (C) 2005 Free Software Foundation, Inc.
3 Contributed by IBM Corporation. Author Mike Cowlishaw.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
22 /* ------------------------------------------------------------------ */
23 /* This module comprises the routines for Standard Decimal Arithmetic */
24 /* as defined in the specification which may be found on the */
25 /* http://www2.hursley.ibm.com/decimal web pages. It implements both */
26 /* the full ('extended') arithmetic and the simpler ('subset') */
31 /* 1. This code is ANSI C89 except: */
33 /* a) Line comments (double forward slash) are used. (Most C */
34 /* compilers accept these. If yours does not, a simple script */
35 /* can be used to convert them to ANSI C comments.) */
37 /* b) Types from C99 stdint.h are used. If you do not have this */
38 /* header file, see the User's Guide section of the decNumber */
39 /* documentation; this lists the necessary definitions. */
41 /* c) If DECDPUN>4, non-ANSI 64-bit 'long long' types are used. */
42 /* To avoid these, set DECDPUN <= 4 (see documentation). */
44 /* 2. The decNumber format which this library uses is optimized for */
45 /* efficient processing of relatively short numbers; in particular */
46 /* it allows the use of fixed sized structures and minimizes copy */
47 /* and move operations. It does, however, support arbitrary */
48 /* precision (up to 999,999,999 digits) and arbitrary exponent */
49 /* range (Emax in the range 0 through 999,999,999 and Emin in the */
50 /* range -999,999,999 through 0). */
52 /* 3. Operands to operator functions are never modified unless they */
53 /* are also specified to be the result number (which is always */
54 /* permitted). Other than that case, operands may not overlap. */
56 /* 4. Error handling: the type of the error is ORed into the status */
57 /* flags in the current context (decContext structure). The */
58 /* SIGFPE signal is then raised if the corresponding trap-enabler */
59 /* flag in the decContext is set (is 1). */
61 /* It is the responsibility of the caller to clear the status */
62 /* flags as required. */
64 /* The result of any routine which returns a number will always */
65 /* be a valid number (which may be a special value, such as an */
66 /* Infinity or NaN). */
68 /* 5. The decNumber format is not an exchangeable concrete */
69 /* representation as it comprises fields which may be machine- */
70 /* dependent (big-endian or little-endian, for example). */
71 /* Canonical conversions to and from strings are provided; other */
72 /* conversions are available in separate modules. */
74 /* 6. Normally, input operands are assumed to be valid. Set DECCHECK */
75 /* to 1 for extended operand checking (including NULL operands). */
76 /* Results are undefined if a badly-formed structure (or a NULL */
77 /* NULL pointer to a structure) is provided, though with DECCHECK */
78 /* enabled the operator routines are protected against exceptions. */
79 /* (Except if the result pointer is NULL, which is unrecoverable.) */
81 /* However, the routines will never cause exceptions if they are */
82 /* given well-formed operands, even if the value of the operands */
83 /* is inappropriate for the operation and DECCHECK is not set. */
85 /* 7. Subset arithmetic is available only if DECSUBSET is set to 1. */
86 /* ------------------------------------------------------------------ */
87 /* Implementation notes for maintenance of this module: */
89 /* 1. Storage leak protection: Routines which use malloc are not */
90 /* permitted to use return for fastpath or error exits (i.e., */
91 /* they follow strict structured programming conventions). */
92 /* Instead they have a do{}while(0); construct surrounding the */
93 /* code which is protected -- break may be used from this. */
94 /* Other routines are allowed to use the return statement inline. */
96 /* Storage leak accounting can be enabled using DECALLOC. */
98 /* 2. All loops use the for(;;) construct. Any do construct is for */
99 /* protection as just described. */
101 /* 3. Setting status in the context must always be the very last */
102 /* action in a routine, as non-0 status may raise a trap and hence */
103 /* the call to set status may not return (if the handler uses long */
104 /* jump). Therefore all cleanup must be done first. In general, */
105 /* to achieve this we accumulate status and only finally apply it */
106 /* by calling decContextSetStatus (via decStatus). */
108 /* Routines which allocate storage cannot, therefore, use the */
109 /* 'top level' routines which could cause a non-returning */
110 /* transfer of control. The decXxxxOp routines are safe (do not */
111 /* call decStatus even if traps are set in the context) and should */
112 /* be used instead (they are also a little faster). */
114 /* 4. Exponent checking is minimized by allowing the exponent to */
115 /* grow outside its limits during calculations, provided that */
116 /* the decFinalize function is called later. Multiplication and */
117 /* division, and intermediate calculations in exponentiation, */
118 /* require more careful checks because of the risk of 31-bit */
119 /* overflow (the most negative valid exponent is -1999999997, for */
120 /* a 999999999-digit number with adjusted exponent of -999999999). */
122 /* 5. Rounding is deferred until finalization of results, with any */
123 /* 'off to the right' data being represented as a single digit */
124 /* residue (in the range -1 through 9). This avoids any double- */
125 /* rounding when more than one shortening takes place (for */
126 /* example, when a result is subnormal). */
128 /* 6. The digits count is allowed to rise to a multiple of DECDPUN */
129 /* during many operations, so whole Units are handled and exact */
130 /* accounting of digits is not needed. The correct digits value */
131 /* is found by decGetDigits, which accounts for leading zeros. */
132 /* This must be called before any rounding if the number of digits */
133 /* is not known exactly. */
135 /* 7. We use the multiply-by-reciprocal 'trick' for partitioning */
136 /* numbers up to four digits, using appropriate constants. This */
137 /* is not useful for longer numbers because overflow of 32 bits */
138 /* would lead to 4 multiplies, which is almost as expensive as */
139 /* a divide (unless we assumed floating-point multiply available). */
141 /* 8. Unusual abbreviations possibly used in the commentary: */
142 /* lhs -- left hand side (operand, of an operation) */
143 /* lsd -- least significant digit (of coefficient) */
144 /* lsu -- least significant Unit (of coefficient) */
145 /* msd -- most significant digit (of coefficient) */
146 /* msu -- most significant Unit (of coefficient) */
147 /* rhs -- right hand side (operand, of an operation) */
148 /* +ve -- positive */
149 /* -ve -- negative */
150 /* ------------------------------------------------------------------ */
152 /* Some of glibc's string inlines cause warnings. Plus we'd rather
153 rely on (and therefore test) GCC's string builtins. */
154 #define __NO_STRING_INLINES
156 #include <stdlib.h> /* for malloc, free, etc. */
157 #include <stdio.h> /* for printf [if needed] */
158 #include <string.h> /* for strcpy */
159 #include <ctype.h> /* for lower */
161 #include "decNumber.h" /* base number library */
162 #include "decNumberLocal.h" /* decNumber local types, etc. */
165 /* Public constant array: powers of ten (powers[n]==10**n) */
166 const uInt powers[] = { 1, 10, 100, 1000, 10000, 100000, 1000000,
167 10000000, 100000000, 1000000000
170 /* Local constants */
171 #define DIVIDE 0x80 /* Divide operators */
172 #define REMAINDER 0x40 /* .. */
173 #define DIVIDEINT 0x20 /* .. */
174 #define REMNEAR 0x10 /* .. */
175 #define COMPARE 0x01 /* Compare operators */
176 #define COMPMAX 0x02 /* .. */
177 #define COMPMIN 0x03 /* .. */
178 #define COMPNAN 0x04 /* .. [NaN processing] */
180 #define DEC_sNaN 0x40000000 /* local status: sNaN signal */
181 #define BADINT (Int)0x80000000 /* most-negative Int; error indicator */
183 static Unit one[] = { 1 }; /* Unit array of 1, used for incrementing */
185 /* Granularity-dependent code */
187 #define eInt Int /* extended integer */
188 #define ueInt uInt /* unsigned extended integer */
189 /* Constant multipliers for divide-by-power-of five using reciprocal */
190 /* multiply, after removing powers of 2 by shifting, and final shift */
191 /* of 17 [we only need up to **4] */
192 static const uInt multies[] = { 131073, 26215, 5243, 1049, 210 };
194 /* QUOT10 -- macro to return the quotient of unit u divided by 10**n */
195 #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
197 /* For DECDPUN>4 we currently use non-ANSI 64-bit types. These could */
198 /* be replaced by subroutine calls later. */
202 typedef signed long long Long;
203 typedef unsigned long long uLong;
204 #define eInt Long /* extended integer */
205 #define ueInt uLong /* unsigned extended integer */
209 static decNumber *decAddOp (decNumber *, const decNumber *,
210 const decNumber *, decContext *,
212 static void decApplyRound (decNumber *, decContext *, Int, uInt *);
213 static Int decCompare (const decNumber * lhs, const decNumber * rhs);
214 static decNumber *decCompareOp (decNumber *, const decNumber *, const decNumber *,
215 decContext *, Flag, uInt *);
216 static void decCopyFit (decNumber *, const decNumber *, decContext *,
218 static decNumber *decDivideOp (decNumber *, const decNumber *, const decNumber *,
219 decContext *, Flag, uInt *);
220 static void decFinalize (decNumber *, decContext *, Int *, uInt *);
221 static Int decGetDigits (const Unit *, Int);
223 static Int decGetInt (const decNumber *, decContext *);
225 static Int decGetInt (const decNumber *);
227 static decNumber *decMultiplyOp (decNumber *, const decNumber *,
228 const decNumber *, decContext *, uInt *);
229 static decNumber *decNaNs (decNumber *, const decNumber *, const decNumber *, uInt *);
230 static decNumber *decQuantizeOp (decNumber *, const decNumber *,
231 const decNumber *, decContext *, Flag, uInt *);
232 static void decSetCoeff (decNumber *, decContext *, const Unit *,
234 static void decSetOverflow (decNumber *, decContext *, uInt *);
235 static void decSetSubnormal (decNumber *, decContext *, Int *, uInt *);
236 static Int decShiftToLeast (Unit *, Int, Int);
237 static Int decShiftToMost (Unit *, Int, Int);
238 static void decStatus (decNumber *, uInt, decContext *);
239 static Flag decStrEq (const char *, const char *);
240 static void decToString (const decNumber *, char[], Flag);
241 static decNumber *decTrim (decNumber *, Flag, Int *);
242 static Int decUnitAddSub (const Unit *, Int, const Unit *, Int, Int, Unit *, Int);
243 static Int decUnitCompare (const Unit *, Int, const Unit *, Int, Int);
246 /* decFinish == decFinalize when no subset arithmetic needed */
247 #define decFinish(a,b,c,d) decFinalize(a,b,c,d)
249 static void decFinish (decNumber *, decContext *, Int *, uInt *);
250 static decNumber *decRoundOperand (const decNumber *, decContext *, uInt *);
253 /* Diagnostic macros, etc. */
255 /* Handle malloc/free accounting. If enabled, our accountable routines */
256 /* are used; otherwise the code just goes straight to the system malloc */
257 /* and free routines. */
258 #define malloc(a) decMalloc(a)
259 #define free(a) decFree(a)
260 #define DECFENCE 0x5a /* corruption detector */
261 /* 'Our' malloc and free: */
262 static void *decMalloc (size_t);
263 static void decFree (void *);
264 uInt decAllocBytes = 0; /* count of bytes allocated */
265 /* Note that DECALLOC code only checks for storage buffer overflow. */
266 /* To check for memory leaks, the decAllocBytes variable should be */
267 /* checked to be 0 at appropriate times (e.g., after the test */
268 /* harness completes a set of tests). This checking may be unreliable */
269 /* if the testing is done in a multi-thread environment. */
273 /* Optional operand checking routines. Enabling these means that */
274 /* decNumber and decContext operands to operator routines are checked */
275 /* for correctness. This roughly doubles the execution time of the */
276 /* fastest routines (and adds 600+ bytes), so should not normally be */
277 /* used in 'production'. */
278 #define DECUNUSED (void *)(0xffffffff)
279 static Flag decCheckOperands (decNumber *, const decNumber *,
280 const decNumber *, decContext *);
281 static Flag decCheckNumber (const decNumber *, decContext *);
284 #if DECTRACE || DECCHECK
285 /* Optional trace/debugging routines. */
286 void decNumberShow (const decNumber *); /* displays the components of a number */
287 static void decDumpAr (char, const Unit *, Int);
290 /* ================================================================== */
292 /* ================================================================== */
294 /* ------------------------------------------------------------------ */
295 /* to-scientific-string -- conversion to numeric string */
296 /* to-engineering-string -- conversion to numeric string */
298 /* decNumberToString(dn, string); */
299 /* decNumberToEngString(dn, string); */
301 /* dn is the decNumber to convert */
302 /* string is the string where the result will be laid out */
304 /* string must be at least dn->digits+14 characters long */
306 /* No error is possible, and no status can be set. */
307 /* ------------------------------------------------------------------ */
309 decNumberToString (const decNumber * dn, char *string)
311 decToString (dn, string, 0);
316 decNumberToEngString (const decNumber * dn, char *string)
318 decToString (dn, string, 1);
322 /* ------------------------------------------------------------------ */
323 /* to-number -- conversion from numeric string */
325 /* decNumberFromString -- convert string to decNumber */
326 /* dn -- the number structure to fill */
327 /* chars[] -- the string to convert ('\0' terminated) */
328 /* set -- the context used for processing any error, */
329 /* determining the maximum precision available */
330 /* (set.digits), determining the maximum and minimum */
331 /* exponent (set.emax and set.emin), determining if */
332 /* extended values are allowed, and checking the */
333 /* rounding mode if overflow occurs or rounding is */
336 /* The length of the coefficient and the size of the exponent are */
337 /* checked by this routine, so the correct error (Underflow or */
338 /* Overflow) can be reported or rounding applied, as necessary. */
340 /* If bad syntax is detected, the result will be a quiet NaN. */
341 /* ------------------------------------------------------------------ */
343 decNumberFromString (decNumber * dn, const char chars[], decContext * set)
345 Int exponent = 0; /* working exponent [assume 0] */
346 uByte bits = 0; /* working flags [assume +ve] */
347 Unit *res; /* where result will be built */
348 Unit resbuff[D2U (DECBUFFER + 1)]; /* local buffer in case need temporary */
349 Unit *allocres = NULL; /* -> allocated result, iff allocated */
350 Int need; /* units needed for result */
351 Int d = 0; /* count of digits found in decimal part */
352 const char *dotchar = NULL; /* where dot was found */
353 const char *cfirst; /* -> first character of decimal part */
354 const char *last = NULL; /* -> last digit of decimal part */
355 const char *firstexp; /* -> first significant exponent digit */
356 const char *c; /* work */
361 Int residue = 0; /* rounding residue */
362 uInt status = 0; /* error code */
365 if (decCheckOperands (DECUNUSED, DECUNUSED, DECUNUSED, set))
366 return decNumberZero (dn);
370 { /* status & malloc protection */
371 c = chars; /* -> input character */
373 { /* handle leading '-' */
378 c++; /* step over leading '+' */
379 /* We're at the start of the number [we think] */
380 cfirst = c; /* save */
383 if (*c >= '0' && *c <= '9')
384 { /* test for Arabic digit */
386 d++; /* count of real digits */
387 continue; /* still in decimal part */
390 break; /* done with decimal part */
391 /* dot: record, check, and ignore */
394 last = NULL; /* indicate bad */
396 } /* .. and go report */
397 dotchar = c; /* offset into decimal part */
401 { /* no decimal digits, or >1 . */
403 /* If subset then infinities and NaNs are not allowed */
406 status = DEC_Conversion_syntax;
407 break; /* all done */
412 /* Infinities and NaNs are possible, here */
413 decNumberZero (dn); /* be optimistic */
414 if (decStrEq (c, "Infinity") || decStrEq (c, "Inf"))
416 dn->bits = bits | DECINF;
417 break; /* all done */
420 { /* a NaN expected */
421 /* 2003.09.10 NaNs are now permitted to have a sign */
422 status = DEC_Conversion_syntax; /* assume the worst */
423 dn->bits = bits | DECNAN; /* assume simple NaN */
424 if (*c == 's' || *c == 'S')
425 { /* looks like an` sNaN */
427 dn->bits = bits | DECSNAN;
429 if (*c != 'n' && *c != 'N')
430 break; /* check caseless "NaN" */
432 if (*c != 'a' && *c != 'A')
435 if (*c != 'n' && *c != 'N')
438 /* now nothing, or nnnn, expected */
439 /* -> start of integer and skip leading 0s [including plain 0] */
440 for (cfirst = c; *cfirst == '0';)
443 { /* "NaN" or "sNaN", maybe with all 0s */
444 status = 0; /* it's good */
447 /* something other than 0s; setup last and d as usual [no dots] */
448 for (c = cfirst;; c++, d++)
450 if (*c < '0' || *c > '9')
451 break; /* test for Arabic digit */
455 break; /* not all digits */
457 break; /* too many digits */
458 /* good; drop through and convert the integer */
460 bits = dn->bits; /* for copy-back */
468 { /* more there; exponent expected... */
469 Flag nege = 0; /* 1=negative exponent */
470 if (*c != 'e' && *c != 'E')
472 status = DEC_Conversion_syntax;
476 /* Found 'e' or 'E' -- now process explicit exponent */
477 /* 1998.07.11: sign no longer required */
478 c++; /* to (expected) sign */
488 status = DEC_Conversion_syntax;
492 for (; *c == '0' && *(c + 1) != '\0';)
493 c++; /* strip insignificant zeros */
494 firstexp = c; /* save exponent digit place */
497 if (*c < '0' || *c > '9')
498 break; /* not a digit */
499 exponent = X10 (exponent) + (Int) * c - (Int) '0';
501 /* if we didn't end on '\0' must not be a digit */
504 status = DEC_Conversion_syntax;
508 /* (this next test must be after the syntax check) */
509 /* if it was too long the exponent may have wrapped, so check */
510 /* carefully and set it to a certain overflow if wrap possible */
511 if (c >= firstexp + 9 + 1)
513 if (c > firstexp + 9 + 1 || *firstexp > '1')
514 exponent = DECNUMMAXE * 2;
515 /* [up to 1999999999 is OK, for example 1E-1000000998] */
518 exponent = -exponent; /* was negative */
520 /* Here when all inspected; syntax is good */
522 /* Handle decimal point... */
523 if (dotchar != NULL && dotchar < last) /* embedded . found, so */
524 exponent = exponent - (last - dotchar); /* .. adjust exponent */
525 /* [we can now ignore the .] */
527 /* strip leading zeros/dot (leave final if all 0's) */
528 for (c = cfirst; c < last; c++)
531 d--; /* 0 stripped */
534 cfirst++; /* step past leader */
538 /* We can now make a rapid exit for zeros if !extended */
539 if (*cfirst == '0' && !set->extended)
541 decNumberZero (dn); /* clean result */
542 break; /* [could be return] */
546 /* OK, the digits string is good. Copy to the decNumber, or to
547 a temporary decNumber if rounding is needed */
548 if (d <= set->digits)
549 res = dn->lsu; /* fits into given decNumber */
551 { /* rounding needed */
552 need = D2U (d); /* units needed */
553 res = resbuff; /* assume use local buffer */
554 if (need * sizeof (Unit) > sizeof (resbuff))
555 { /* too big for local */
556 allocres = (Unit *) malloc (need * sizeof (Unit));
557 if (allocres == NULL)
559 status |= DEC_Insufficient_storage;
565 /* res now -> number lsu, buffer, or allocated storage for Unit array */
567 /* Place the coefficient into the selected Unit array */
569 i = d % DECDPUN; /* digits in top unit */
572 up = res + D2U (d) - 1; /* -> msu */
574 for (c = cfirst;; c++)
575 { /* along the digits */
577 { /* ignore . [don't decrement i] */
582 *up = (Unit) (X10 (*up) + (Int) * c - (Int) '0');
585 continue; /* more for this unit */
587 break; /* just filled the last unit */
594 up = res; /* -> lsu */
595 for (c = last; c >= cfirst; c--)
596 { /* over each character, from least */
598 continue; /* ignore . [don't step b] */
599 *up = (Unit) ((Int) * c - (Int) '0');
605 dn->exponent = exponent;
608 /* if not in number (too long) shorten into the number */
610 decSetCoeff (dn, set, res, d, &residue, &status);
612 /* Finally check for overflow or subnormal and round as needed */
613 decFinalize (dn, set, &residue, &status);
614 /* decNumberShow(dn); */
616 while (0); /* [for break] */
618 if (allocres != NULL)
619 free (allocres); /* drop any storage we used */
621 decStatus (dn, status, set);
625 /* ================================================================== */
627 /* ================================================================== */
629 /* ------------------------------------------------------------------ */
630 /* decNumberAbs -- absolute value operator */
632 /* This computes C = abs(A) */
634 /* res is C, the result. C may be A */
636 /* set is the context */
638 /* C must have space for set->digits digits. */
639 /* ------------------------------------------------------------------ */
640 /* This has the same effect as decNumberPlus unless A is negative, */
641 /* in which case it has the same effect as decNumberMinus. */
642 /* ------------------------------------------------------------------ */
644 decNumberAbs (decNumber * res, const decNumber * rhs, decContext * set)
646 decNumber dzero; /* for 0 */
647 uInt status = 0; /* accumulator */
650 if (decCheckOperands (res, DECUNUSED, rhs, set))
654 decNumberZero (&dzero); /* set 0 */
655 dzero.exponent = rhs->exponent; /* [no coefficient expansion] */
656 decAddOp (res, &dzero, rhs, set, (uByte) (rhs->bits & DECNEG), &status);
658 decStatus (res, status, set);
662 /* ------------------------------------------------------------------ */
663 /* decNumberAdd -- add two Numbers */
665 /* This computes C = A + B */
667 /* res is C, the result. C may be A and/or B (e.g., X=X+X) */
670 /* set is the context */
672 /* C must have space for set->digits digits. */
673 /* ------------------------------------------------------------------ */
674 /* This just calls the routine shared with Subtract */
676 decNumberAdd (decNumber * res, const decNumber * lhs,
677 const decNumber * rhs, decContext * set)
679 uInt status = 0; /* accumulator */
680 decAddOp (res, lhs, rhs, set, 0, &status);
682 decStatus (res, status, set);
686 /* ------------------------------------------------------------------ */
687 /* decNumberCompare -- compare two Numbers */
689 /* This computes C = A ? B */
691 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
694 /* set is the context */
696 /* C must have space for one digit. */
697 /* ------------------------------------------------------------------ */
699 decNumberCompare (decNumber * res, const decNumber * lhs,
700 const decNumber * rhs, decContext * set)
702 uInt status = 0; /* accumulator */
703 decCompareOp (res, lhs, rhs, set, COMPARE, &status);
705 decStatus (res, status, set);
709 /* ------------------------------------------------------------------ */
710 /* decNumberDivide -- divide one number by another */
712 /* This computes C = A / B */
714 /* res is C, the result. C may be A and/or B (e.g., X=X/X) */
717 /* set is the context */
719 /* C must have space for set->digits digits. */
720 /* ------------------------------------------------------------------ */
722 decNumberDivide (decNumber * res, const decNumber * lhs,
723 const decNumber * rhs, decContext * set)
725 uInt status = 0; /* accumulator */
726 decDivideOp (res, lhs, rhs, set, DIVIDE, &status);
728 decStatus (res, status, set);
732 /* ------------------------------------------------------------------ */
733 /* decNumberDivideInteger -- divide and return integer quotient */
735 /* This computes C = A # B, where # is the integer divide operator */
737 /* res is C, the result. C may be A and/or B (e.g., X=X#X) */
740 /* set is the context */
742 /* C must have space for set->digits digits. */
743 /* ------------------------------------------------------------------ */
745 decNumberDivideInteger (decNumber * res, const decNumber * lhs,
746 const decNumber * rhs, decContext * set)
748 uInt status = 0; /* accumulator */
749 decDivideOp (res, lhs, rhs, set, DIVIDEINT, &status);
751 decStatus (res, status, set);
755 /* ------------------------------------------------------------------ */
756 /* decNumberMax -- compare two Numbers and return the maximum */
758 /* This computes C = A ? B, returning the maximum or A if equal */
760 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
763 /* set is the context */
765 /* C must have space for set->digits digits. */
766 /* ------------------------------------------------------------------ */
768 decNumberMax (decNumber * res, const decNumber * lhs,
769 const decNumber * rhs, decContext * set)
771 uInt status = 0; /* accumulator */
772 decCompareOp (res, lhs, rhs, set, COMPMAX, &status);
774 decStatus (res, status, set);
778 /* ------------------------------------------------------------------ */
779 /* decNumberMin -- compare two Numbers and return the minimum */
781 /* This computes C = A ? B, returning the minimum or A if equal */
783 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
786 /* set is the context */
788 /* C must have space for set->digits digits. */
789 /* ------------------------------------------------------------------ */
791 decNumberMin (decNumber * res, const decNumber * lhs,
792 const decNumber * rhs, decContext * set)
794 uInt status = 0; /* accumulator */
795 decCompareOp (res, lhs, rhs, set, COMPMIN, &status);
797 decStatus (res, status, set);
801 /* ------------------------------------------------------------------ */
802 /* decNumberMinus -- prefix minus operator */
804 /* This computes C = 0 - A */
806 /* res is C, the result. C may be A */
808 /* set is the context */
810 /* C must have space for set->digits digits. */
811 /* ------------------------------------------------------------------ */
812 /* We simply use AddOp for the subtract, which will do the necessary. */
813 /* ------------------------------------------------------------------ */
815 decNumberMinus (decNumber * res, const decNumber * rhs, decContext * set)
818 uInt status = 0; /* accumulator */
821 if (decCheckOperands (res, DECUNUSED, rhs, set))
825 decNumberZero (&dzero); /* make 0 */
826 dzero.exponent = rhs->exponent; /* [no coefficient expansion] */
827 decAddOp (res, &dzero, rhs, set, DECNEG, &status);
829 decStatus (res, status, set);
833 /* ------------------------------------------------------------------ */
834 /* decNumberPlus -- prefix plus operator */
836 /* This computes C = 0 + A */
838 /* res is C, the result. C may be A */
840 /* set is the context */
842 /* C must have space for set->digits digits. */
843 /* ------------------------------------------------------------------ */
844 /* We simply use AddOp; Add will take fast path after preparing A. */
845 /* Performance is a concern here, as this routine is often used to */
846 /* check operands and apply rounding and overflow/underflow testing. */
847 /* ------------------------------------------------------------------ */
849 decNumberPlus (decNumber * res, const decNumber * rhs, decContext * set)
852 uInt status = 0; /* accumulator */
855 if (decCheckOperands (res, DECUNUSED, rhs, set))
859 decNumberZero (&dzero); /* make 0 */
860 dzero.exponent = rhs->exponent; /* [no coefficient expansion] */
861 decAddOp (res, &dzero, rhs, set, 0, &status);
863 decStatus (res, status, set);
867 /* ------------------------------------------------------------------ */
868 /* decNumberMultiply -- multiply two Numbers */
870 /* This computes C = A x B */
872 /* res is C, the result. C may be A and/or B (e.g., X=X+X) */
875 /* set is the context */
877 /* C must have space for set->digits digits. */
878 /* ------------------------------------------------------------------ */
880 decNumberMultiply (decNumber * res, const decNumber * lhs,
881 const decNumber * rhs, decContext * set)
883 uInt status = 0; /* accumulator */
884 decMultiplyOp (res, lhs, rhs, set, &status);
886 decStatus (res, status, set);
890 /* ------------------------------------------------------------------ */
891 /* decNumberNormalize -- remove trailing zeros */
893 /* This computes C = 0 + A, and normalizes the result */
895 /* res is C, the result. C may be A */
897 /* set is the context */
899 /* C must have space for set->digits digits. */
900 /* ------------------------------------------------------------------ */
902 decNumberNormalize (decNumber * res, const decNumber * rhs, decContext * set)
904 decNumber *allocrhs = NULL; /* non-NULL if rounded rhs allocated */
905 uInt status = 0; /* as usual */
906 Int residue = 0; /* as usual */
907 Int dropped; /* work */
910 if (decCheckOperands (res, DECUNUSED, rhs, set))
915 { /* protect allocated storage */
919 /* reduce operand and set lostDigits status, as needed */
920 if (rhs->digits > set->digits)
922 allocrhs = decRoundOperand (rhs, set, &status);
923 if (allocrhs == NULL)
929 /* [following code does not require input rounding] */
931 /* specials copy through, except NaNs need care */
932 if (decNumberIsNaN (rhs))
934 decNaNs (res, rhs, NULL, &status);
938 /* reduce result to the requested length and copy to result */
939 decCopyFit (res, rhs, set, &residue, &status); /* copy & round */
940 decFinish (res, set, &residue, &status); /* cleanup/set flags */
941 decTrim (res, 1, &dropped); /* normalize in place */
943 while (0); /* end protected */
945 if (allocrhs != NULL)
946 free (allocrhs); /* .. */
948 decStatus (res, status, set); /* then report status */
952 /* ------------------------------------------------------------------ */
953 /* decNumberPower -- raise a number to an integer power */
955 /* This computes C = A ** B */
957 /* res is C, the result. C may be A and/or B (e.g., X=X**X) */
960 /* set is the context */
962 /* C must have space for set->digits digits. */
964 /* Specification restriction: abs(n) must be <=999999999 */
965 /* ------------------------------------------------------------------ */
967 decNumberPower (decNumber * res, const decNumber * lhs,
968 const decNumber * rhs, decContext * set)
970 decNumber *alloclhs = NULL; /* non-NULL if rounded lhs allocated */
971 decNumber *allocrhs = NULL; /* .., rhs */
972 decNumber *allocdac = NULL; /* -> allocated acc buffer, iff used */
973 const decNumber *inrhs = rhs; /* save original rhs */
974 Int reqdigits = set->digits; /* requested DIGITS */
975 Int n; /* RHS in binary */
978 Int dropped; /* .. */
980 uInt needbytes; /* buffer size needed */
981 Flag seenbit; /* seen a bit while powering */
982 Int residue = 0; /* rounding residue */
983 uInt status = 0; /* accumulator */
984 uByte bits = 0; /* result sign if errors */
985 decContext workset; /* working context */
986 decNumber dnOne; /* work value 1... */
987 /* local accumulator buffer [a decNumber, with digits+elength+1 digits] */
988 uByte dacbuff[sizeof (decNumber) + D2U (DECBUFFER + 9) * sizeof (Unit)];
989 /* same again for possible 1/lhs calculation */
990 uByte lhsbuff[sizeof (decNumber) + D2U (DECBUFFER + 9) * sizeof (Unit)];
991 decNumber *dac = (decNumber *) dacbuff; /* -> result accumulator */
994 if (decCheckOperands (res, lhs, rhs, set))
999 { /* protect allocated storage */
1003 /* reduce operands and set lostDigits status, as needed */
1004 if (lhs->digits > reqdigits)
1006 alloclhs = decRoundOperand (lhs, set, &status);
1007 if (alloclhs == NULL)
1011 /* rounding won't affect the result, but we might signal lostDigits */
1012 /* as well as the error for non-integer [x**y would need this too] */
1013 if (rhs->digits > reqdigits)
1015 allocrhs = decRoundOperand (rhs, set, &status);
1016 if (allocrhs == NULL)
1022 /* [following code does not require input rounding] */
1024 /* handle rhs Infinity */
1025 if (decNumberIsInfinite (rhs))
1027 status |= DEC_Invalid_operation; /* bad */
1031 if ((lhs->bits | rhs->bits) & (DECNAN | DECSNAN))
1033 decNaNs (res, lhs, rhs, &status);
1037 /* Original rhs must be an integer that fits and is in range */
1039 n = decGetInt (inrhs, set);
1041 n = decGetInt (inrhs);
1043 if (n == BADINT || n > 999999999 || n < -999999999)
1045 status |= DEC_Invalid_operation;
1050 n = -n; /* use the absolute value */
1052 if (decNumberIsNegative (lhs) /* -x .. */
1053 && (n & 0x00000001))
1054 bits = DECNEG; /* .. to an odd power */
1056 /* handle LHS infinity */
1057 if (decNumberIsInfinite (lhs))
1058 { /* [NaNs already handled] */
1059 uByte rbits = rhs->bits; /* save */
1060 decNumberZero (res);
1062 *res->lsu = 1; /* [-]Inf**0 => 1 */
1065 if (!(rbits & DECNEG))
1066 bits |= DECINF; /* was not a **-n */
1067 /* [otherwise will be 0 or -0] */
1073 /* clone the context */
1074 workset = *set; /* copy all fields */
1075 /* calculate the working DIGITS */
1076 workset.digits = reqdigits + (inrhs->digits + inrhs->exponent) + 1;
1077 /* it's an error if this is more than we can handle */
1078 if (workset.digits > DECNUMMAXP)
1080 status |= DEC_Invalid_operation;
1084 /* workset.digits is the count of digits for the accumulator we need */
1085 /* if accumulator is too long for local storage, then allocate */
1087 sizeof (decNumber) + (D2U (workset.digits) - 1) * sizeof (Unit);
1088 /* [needbytes also used below if 1/lhs needed] */
1089 if (needbytes > sizeof (dacbuff))
1091 allocdac = (decNumber *) malloc (needbytes);
1092 if (allocdac == NULL)
1093 { /* hopeless -- abandon */
1094 status |= DEC_Insufficient_storage;
1097 dac = allocdac; /* use the allocated space */
1099 decNumberZero (dac); /* acc=1 */
1100 *dac->lsu = 1; /* .. */
1103 { /* x**0 is usually 1 */
1104 /* 0**0 is bad unless subset, when it becomes 1 */
1110 status |= DEC_Invalid_operation;
1112 decNumberCopy (res, dac); /* copy the 1 */
1116 /* if a negative power we'll need the constant 1, and if not subset */
1117 /* we'll invert the lhs now rather than inverting the result later */
1118 if (decNumberIsNegative (rhs))
1119 { /* was a **-n [hence digits>0] */
1121 decNumberCopy (&dnOne, dac); /* dnOne=1; [needed now or later] */
1124 { /* need to calculate 1/lhs */
1126 /* divide lhs into 1, putting result in dac [dac=1/dac] */
1127 decDivideOp (dac, &dnOne, lhs, &workset, DIVIDE, &status);
1128 if (alloclhs != NULL)
1130 free (alloclhs); /* done with intermediate */
1131 alloclhs = NULL; /* indicate freed */
1133 /* now locate or allocate space for the inverted lhs */
1134 if (needbytes > sizeof (lhsbuff))
1136 alloclhs = (decNumber *) malloc (needbytes);
1137 if (alloclhs == NULL)
1138 { /* hopeless -- abandon */
1139 status |= DEC_Insufficient_storage;
1142 newlhs = alloclhs; /* use the allocated space */
1145 newlhs = (decNumber *) lhsbuff; /* use stack storage */
1146 /* [lhs now points to buffer or allocated storage] */
1147 decNumberCopy (newlhs, dac); /* copy the 1/lhs */
1148 decNumberCopy (dac, &dnOne); /* restore acc=1 */
1155 /* Raise-to-the-power loop... */
1156 seenbit = 0; /* set once we've seen a 1-bit */
1158 { /* for each bit [top bit ignored] */
1159 /* abandon if we have had overflow or terminal underflow */
1160 if (status & (DEC_Overflow | DEC_Underflow))
1161 { /* interesting? */
1162 if (status & DEC_Overflow || ISZERO (dac))
1165 /* [the following two lines revealed an optimizer bug in a C++ */
1166 /* compiler, with symptom: 5**3 -> 25, when n=n+n was used] */
1167 n = n << 1; /* move next bit to testable position */
1169 { /* top bit is set */
1170 seenbit = 1; /* OK, we're off */
1171 decMultiplyOp (dac, dac, lhs, &workset, &status); /* dac=dac*x */
1174 break; /* that was the last bit */
1176 continue; /* we don't have to square 1 */
1177 decMultiplyOp (dac, dac, dac, &workset, &status); /* dac=dac*dac [square] */
1178 } /*i *//* 32 bits */
1180 /* complete internal overflow or underflow processing */
1181 if (status & (DEC_Overflow | DEC_Subnormal))
1184 /* If subset, and power was negative, reverse the kind of -erflow */
1185 /* [1/x not yet done] */
1186 if (!set->extended && decNumberIsNegative (rhs))
1188 if (status & DEC_Overflow)
1189 status ^= DEC_Overflow | DEC_Underflow | DEC_Subnormal;
1191 { /* trickier -- Underflow may or may not be set */
1192 status &= ~(DEC_Underflow | DEC_Subnormal); /* [one or both] */
1193 status |= DEC_Overflow;
1197 dac->bits = (dac->bits & ~DECNEG) | bits; /* force correct sign */
1198 /* round subnormals [to set.digits rather than workset.digits] */
1199 /* or set overflow result similarly as required */
1200 decFinalize (dac, set, &residue, &status);
1201 decNumberCopy (res, dac); /* copy to result (is now OK length) */
1206 if (!set->extended && /* subset math */
1207 decNumberIsNegative (rhs))
1208 { /* was a **-n [hence digits>0] */
1209 /* so divide result into 1 [dac=1/dac] */
1210 decDivideOp (dac, &dnOne, dac, &workset, DIVIDE, &status);
1214 /* reduce result to the requested length and copy to result */
1215 decCopyFit (res, dac, set, &residue, &status);
1216 decFinish (res, set, &residue, &status); /* final cleanup */
1219 decTrim (res, 0, &dropped); /* trailing zeros */
1222 while (0); /* end protected */
1224 if (allocdac != NULL)
1225 free (allocdac); /* drop any storage we used */
1226 if (allocrhs != NULL)
1227 free (allocrhs); /* .. */
1228 if (alloclhs != NULL)
1229 free (alloclhs); /* .. */
1231 decStatus (res, status, set);
1235 /* ------------------------------------------------------------------ */
1236 /* decNumberQuantize -- force exponent to requested value */
1238 /* This computes C = op(A, B), where op adjusts the coefficient */
1239 /* of C (by rounding or shifting) such that the exponent (-scale) */
1240 /* of C has exponent of B. The numerical value of C will equal A, */
1241 /* except for the effects of any rounding that occurred. */
1243 /* res is C, the result. C may be A or B */
1244 /* lhs is A, the number to adjust */
1245 /* rhs is B, the number with exponent to match */
1246 /* set is the context */
1248 /* C must have space for set->digits digits. */
1250 /* Unless there is an error or the result is infinite, the exponent */
1251 /* after the operation is guaranteed to be equal to that of B. */
1252 /* ------------------------------------------------------------------ */
1254 decNumberQuantize (decNumber * res, const decNumber * lhs,
1255 const decNumber * rhs, decContext * set)
1257 uInt status = 0; /* accumulator */
1258 decQuantizeOp (res, lhs, rhs, set, 1, &status);
1260 decStatus (res, status, set);
1264 /* ------------------------------------------------------------------ */
1265 /* decNumberRescale -- force exponent to requested value */
1267 /* This computes C = op(A, B), where op adjusts the coefficient */
1268 /* of C (by rounding or shifting) such that the exponent (-scale) */
1269 /* of C has the value B. The numerical value of C will equal A, */
1270 /* except for the effects of any rounding that occurred. */
1272 /* res is C, the result. C may be A or B */
1273 /* lhs is A, the number to adjust */
1274 /* rhs is B, the requested exponent */
1275 /* set is the context */
1277 /* C must have space for set->digits digits. */
1279 /* Unless there is an error or the result is infinite, the exponent */
1280 /* after the operation is guaranteed to be equal to B. */
1281 /* ------------------------------------------------------------------ */
1283 decNumberRescale (decNumber * res, const decNumber * lhs,
1284 const decNumber * rhs, decContext * set)
1286 uInt status = 0; /* accumulator */
1287 decQuantizeOp (res, lhs, rhs, set, 0, &status);
1289 decStatus (res, status, set);
1293 /* ------------------------------------------------------------------ */
1294 /* decNumberRemainder -- divide and return remainder */
1296 /* This computes C = A % B */
1298 /* res is C, the result. C may be A and/or B (e.g., X=X%X) */
1301 /* set is the context */
1303 /* C must have space for set->digits digits. */
1304 /* ------------------------------------------------------------------ */
1306 decNumberRemainder (decNumber * res, const decNumber * lhs,
1307 const decNumber * rhs, decContext * set)
1309 uInt status = 0; /* accumulator */
1310 decDivideOp (res, lhs, rhs, set, REMAINDER, &status);
1312 decStatus (res, status, set);
1316 /* ------------------------------------------------------------------ */
1317 /* decNumberRemainderNear -- divide and return remainder from nearest */
1319 /* This computes C = A % B, where % is the IEEE remainder operator */
1321 /* res is C, the result. C may be A and/or B (e.g., X=X%X) */
1324 /* set is the context */
1326 /* C must have space for set->digits digits. */
1327 /* ------------------------------------------------------------------ */
1329 decNumberRemainderNear (decNumber * res, const decNumber * lhs,
1330 const decNumber * rhs, decContext * set)
1332 uInt status = 0; /* accumulator */
1333 decDivideOp (res, lhs, rhs, set, REMNEAR, &status);
1335 decStatus (res, status, set);
1339 /* ------------------------------------------------------------------ */
1340 /* decNumberSameQuantum -- test for equal exponents */
1342 /* res is the result number, which will contain either 0 or 1 */
1343 /* lhs is a number to test */
1344 /* rhs is the second (usually a pattern) */
1346 /* No errors are possible and no context is needed. */
1347 /* ------------------------------------------------------------------ */
1349 decNumberSameQuantum (decNumber * res, const decNumber * lhs, const decNumber * rhs)
1351 uByte merged; /* merged flags */
1352 Unit ret = 0; /* return value */
1355 if (decCheckOperands (res, lhs, rhs, DECUNUSED))
1359 merged = (lhs->bits | rhs->bits) & DECSPECIAL;
1362 if (decNumberIsNaN (lhs) && decNumberIsNaN (rhs))
1364 else if (decNumberIsInfinite (lhs) && decNumberIsInfinite (rhs))
1366 /* [anything else with a special gives 0] */
1368 else if (lhs->exponent == rhs->exponent)
1371 decNumberZero (res); /* OK to overwrite an operand */
1376 /* ------------------------------------------------------------------ */
1377 /* decNumberSquareRoot -- square root operator */
1379 /* This computes C = squareroot(A) */
1381 /* res is C, the result. C may be A */
1383 /* set is the context; note that rounding mode has no effect */
1385 /* C must have space for set->digits digits. */
1386 /* ------------------------------------------------------------------ */
1387 /* This uses the following varying-precision algorithm in: */
1389 /* Properly Rounded Variable Precision Square Root, T. E. Hull and */
1390 /* A. Abrham, ACM Transactions on Mathematical Software, Vol 11 #3, */
1391 /* pp229-237, ACM, September 1985. */
1393 /* % [Reformatted original Numerical Turing source code follows.] */
1394 /* function sqrt(x : real) : real */
1395 /* % sqrt(x) returns the properly rounded approximation to the square */
1396 /* % root of x, in the precision of the calling environment, or it */
1397 /* % fails if x < 0. */
1398 /* % t e hull and a abrham, august, 1984 */
1399 /* if x <= 0 then */
1406 /* var f := setexp(x, 0) % fraction part of x [0.1 <= x < 1] */
1407 /* var e := getexp(x) % exponent part of x */
1408 /* var approx : real */
1409 /* if e mod 2 = 0 then */
1410 /* approx := .259 + .819 * f % approx to root of f */
1412 /* f := f/l0 % adjustments */
1413 /* e := e + 1 % for odd */
1414 /* approx := .0819 + 2.59 * f % exponent */
1418 /* const maxp := currentprecision + 2 */
1420 /* p := min(2*p - 2, maxp) % p = 4,6,10, . . . , maxp */
1422 /* approx := .5 * (approx + f/approx) */
1423 /* exit when p = maxp */
1426 /* % approx is now within 1 ulp of the properly rounded square root */
1427 /* % of f; to ensure proper rounding, compare squares of (approx - */
1428 /* % l/2 ulp) and (approx + l/2 ulp) with f. */
1429 /* p := currentprecision */
1431 /* precision p + 2 */
1432 /* const approxsubhalf := approx - setexp(.5, -p) */
1433 /* if mulru(approxsubhalf, approxsubhalf) > f then */
1434 /* approx := approx - setexp(.l, -p + 1) */
1436 /* const approxaddhalf := approx + setexp(.5, -p) */
1437 /* if mulrd(approxaddhalf, approxaddhalf) < f then */
1438 /* approx := approx + setexp(.l, -p + 1) */
1442 /* result setexp(approx, e div 2) % fix exponent */
1444 /* ------------------------------------------------------------------ */
1446 decNumberSquareRoot (decNumber * res, const decNumber * rhs, decContext * set)
1448 decContext workset, approxset; /* work contexts */
1449 decNumber dzero; /* used for constant zero */
1450 Int maxp = set->digits + 2; /* largest working precision */
1451 Int residue = 0; /* rounding residue */
1452 uInt status = 0, ignore = 0; /* status accumulators */
1453 Int exp; /* working exponent */
1454 Int ideal; /* ideal (preferred) exponent */
1455 uInt needbytes; /* work */
1456 Int dropped; /* .. */
1458 decNumber *allocrhs = NULL; /* non-NULL if rounded rhs allocated */
1459 /* buffer for f [needs +1 in case DECBUFFER 0] */
1460 uByte buff[sizeof (decNumber) + (D2U (DECBUFFER + 1) - 1) * sizeof (Unit)];
1461 /* buffer for a [needs +2 to match maxp] */
1462 uByte bufa[sizeof (decNumber) + (D2U (DECBUFFER + 2) - 1) * sizeof (Unit)];
1463 /* buffer for temporary, b [must be same size as a] */
1464 uByte bufb[sizeof (decNumber) + (D2U (DECBUFFER + 2) - 1) * sizeof (Unit)];
1465 decNumber *allocbuff = NULL; /* -> allocated buff, iff allocated */
1466 decNumber *allocbufa = NULL; /* -> allocated bufa, iff allocated */
1467 decNumber *allocbufb = NULL; /* -> allocated bufb, iff allocated */
1468 decNumber *f = (decNumber *) buff; /* reduced fraction */
1469 decNumber *a = (decNumber *) bufa; /* approximation to result */
1470 decNumber *b = (decNumber *) bufb; /* intermediate result */
1471 /* buffer for temporary variable, up to 3 digits */
1472 uByte buft[sizeof (decNumber) + (D2U (3) - 1) * sizeof (Unit)];
1473 decNumber *t = (decNumber *) buft; /* up-to-3-digit constant or work */
1476 if (decCheckOperands (res, DECUNUSED, rhs, set))
1481 { /* protect allocated storage */
1485 /* reduce operand and set lostDigits status, as needed */
1486 if (rhs->digits > set->digits)
1488 allocrhs = decRoundOperand (rhs, set, &status);
1489 if (allocrhs == NULL)
1491 /* [Note: 'f' allocation below could reuse this buffer if */
1492 /* used, but as this is rare we keep them separate for clarity.] */
1497 /* [following code does not require input rounding] */
1499 /* handle infinities and NaNs */
1500 if (rhs->bits & DECSPECIAL)
1502 if (decNumberIsInfinite (rhs))
1504 if (decNumberIsNegative (rhs))
1505 status |= DEC_Invalid_operation;
1507 decNumberCopy (res, rhs); /* +Infinity */
1510 decNaNs (res, rhs, NULL, &status); /* a NaN */
1514 /* calculate the ideal (preferred) exponent [floor(exp/2)] */
1515 /* [We would like to write: ideal=rhs->exponent>>1, but this */
1516 /* generates a compiler warning. Generated code is the same.] */
1517 ideal = (rhs->exponent & ~1) / 2; /* target */
1522 decNumberCopy (res, rhs); /* could be 0 or -0 */
1523 res->exponent = ideal; /* use the ideal [safe] */
1527 /* any other -x is an oops */
1528 if (decNumberIsNegative (rhs))
1530 status |= DEC_Invalid_operation;
1534 /* we need space for three working variables */
1535 /* f -- the same precision as the RHS, reduced to 0.01->0.99... */
1536 /* a -- Hull's approx -- precision, when assigned, is */
1537 /* currentprecision (we allow +2 for use as temporary) */
1538 /* b -- intermediate temporary result */
1539 /* if any is too long for local storage, then allocate */
1541 sizeof (decNumber) + (D2U (rhs->digits) - 1) * sizeof (Unit);
1542 if (needbytes > sizeof (buff))
1544 allocbuff = (decNumber *) malloc (needbytes);
1545 if (allocbuff == NULL)
1546 { /* hopeless -- abandon */
1547 status |= DEC_Insufficient_storage;
1550 f = allocbuff; /* use the allocated space */
1552 /* a and b both need to be able to hold a maxp-length number */
1553 needbytes = sizeof (decNumber) + (D2U (maxp) - 1) * sizeof (Unit);
1554 if (needbytes > sizeof (bufa))
1555 { /* [same applies to b] */
1556 allocbufa = (decNumber *) malloc (needbytes);
1557 allocbufb = (decNumber *) malloc (needbytes);
1558 if (allocbufa == NULL || allocbufb == NULL)
1560 status |= DEC_Insufficient_storage;
1563 a = allocbufa; /* use the allocated space */
1564 b = allocbufb; /* .. */
1567 /* copy rhs -> f, save exponent, and reduce so 0.1 <= f < 1 */
1568 decNumberCopy (f, rhs);
1569 exp = f->exponent + f->digits; /* adjusted to Hull rules */
1570 f->exponent = -(f->digits); /* to range */
1572 /* set up working contexts (the second is used for Numerical */
1573 /* Turing assignment) */
1574 decContextDefault (&workset, DEC_INIT_DECIMAL64);
1575 decContextDefault (&approxset, DEC_INIT_DECIMAL64);
1576 approxset.digits = set->digits; /* approx's length */
1578 /* [Until further notice, no error is possible and status bits */
1579 /* (Rounded, etc.) should be ignored, not accumulated.] */
1581 /* Calculate initial approximation, and allow for odd exponent */
1582 workset.digits = set->digits; /* p for initial calculation */
1588 { /* even exponent */
1589 /* Set t=0.259, a=0.819 */
1610 { /* odd exponent */
1611 /* Set t=0.0819, a=2.59 */
1612 f->exponent--; /* f=f/10 */
1633 decMultiplyOp (a, a, f, &workset, &ignore); /* a=a*f */
1634 decAddOp (a, a, t, &workset, 0, &ignore); /* ..+t */
1635 /* [a is now the initial approximation for sqrt(f), calculated with */
1636 /* currentprecision, which is also a's precision.] */
1638 /* the main calculation loop */
1639 decNumberZero (&dzero); /* make 0 */
1640 decNumberZero (t); /* set t = 0.5 */
1641 t->lsu[0] = 5; /* .. */
1642 t->exponent = -1; /* .. */
1643 workset.digits = 3; /* initial p */
1646 /* set p to min(2*p - 2, maxp) [hence 3; or: 4, 6, 10, ... , maxp] */
1647 workset.digits = workset.digits * 2 - 2;
1648 if (workset.digits > maxp)
1649 workset.digits = maxp;
1650 /* a = 0.5 * (a + f/a) */
1651 /* [calculated at p then rounded to currentprecision] */
1652 decDivideOp (b, f, a, &workset, DIVIDE, &ignore); /* b=f/a */
1653 decAddOp (b, b, a, &workset, 0, &ignore); /* b=b+a */
1654 decMultiplyOp (a, b, t, &workset, &ignore); /* a=b*0.5 */
1655 /* assign to approx [round to length] */
1656 decAddOp (a, &dzero, a, &approxset, 0, &ignore);
1657 if (workset.digits == maxp)
1658 break; /* just did final */
1661 /* a is now at currentprecision and within 1 ulp of the properly */
1662 /* rounded square root of f; to ensure proper rounding, compare */
1663 /* squares of (a - l/2 ulp) and (a + l/2 ulp) with f. */
1664 /* Here workset.digits=maxp and t=0.5 */
1665 workset.digits--; /* maxp-1 is OK now */
1666 t->exponent = -set->digits - 1; /* make 0.5 ulp */
1667 decNumberCopy (b, a);
1668 decAddOp (b, b, t, &workset, DECNEG, &ignore); /* b = a - 0.5 ulp */
1669 workset.round = DEC_ROUND_UP;
1670 decMultiplyOp (b, b, b, &workset, &ignore); /* b = mulru(b, b) */
1671 decCompareOp (b, f, b, &workset, COMPARE, &ignore); /* b ? f, reversed */
1672 if (decNumberIsNegative (b))
1673 { /* f < b [i.e., b > f] */
1674 /* this is the more common adjustment, though both are rare */
1675 t->exponent++; /* make 1.0 ulp */
1676 t->lsu[0] = 1; /* .. */
1677 decAddOp (a, a, t, &workset, DECNEG, &ignore); /* a = a - 1 ulp */
1678 /* assign to approx [round to length] */
1679 decAddOp (a, &dzero, a, &approxset, 0, &ignore);
1683 decNumberCopy (b, a);
1684 decAddOp (b, b, t, &workset, 0, &ignore); /* b = a + 0.5 ulp */
1685 workset.round = DEC_ROUND_DOWN;
1686 decMultiplyOp (b, b, b, &workset, &ignore); /* b = mulrd(b, b) */
1687 decCompareOp (b, b, f, &workset, COMPARE, &ignore); /* b ? f */
1688 if (decNumberIsNegative (b))
1690 t->exponent++; /* make 1.0 ulp */
1691 t->lsu[0] = 1; /* .. */
1692 decAddOp (a, a, t, &workset, 0, &ignore); /* a = a + 1 ulp */
1693 /* assign to approx [round to length] */
1694 decAddOp (a, &dzero, a, &approxset, 0, &ignore);
1697 /* [no errors are possible in the above, and rounding/inexact during */
1698 /* estimation are irrelevant, so status was not accumulated] */
1700 /* Here, 0.1 <= a < 1 [Hull] */
1701 a->exponent += exp / 2; /* set correct exponent */
1703 /* Process Subnormals */
1704 decFinalize (a, set, &residue, &status);
1706 /* count dropable zeros [after any subnormal rounding] */
1707 decNumberCopy (b, a);
1708 decTrim (b, 1, &dropped); /* [drops trailing zeros] */
1710 /* Finally set Inexact and Rounded. The answer can only be exact if */
1711 /* it is short enough so that squaring it could fit in set->digits, */
1712 /* so this is the only (relatively rare) time we have to check */
1714 if (b->digits * 2 - 1 > set->digits)
1716 status |= DEC_Inexact | DEC_Rounded;
1719 { /* could be exact/unrounded */
1720 uInt mstatus = 0; /* local status */
1721 decMultiplyOp (b, b, b, &workset, &mstatus); /* try the multiply */
1723 { /* result won't fit */
1724 status |= DEC_Inexact | DEC_Rounded;
1728 decCompareOp (t, b, rhs, &workset, COMPARE, &mstatus); /* b ? rhs */
1731 status |= DEC_Inexact | DEC_Rounded;
1735 /* here, dropped is the count of trailing zeros in 'a' */
1736 /* use closest exponent to ideal... */
1737 Int todrop = ideal - a->exponent; /* most we can drop */
1740 { /* ideally would add 0s */
1741 status |= DEC_Rounded;
1745 if (dropped < todrop)
1746 todrop = dropped; /* clamp to those available */
1748 { /* OK, some to drop */
1749 decShiftToLeast (a->lsu, D2U (a->digits), todrop);
1750 a->exponent += todrop; /* maintain numerical value */
1751 a->digits -= todrop; /* new length */
1757 decNumberCopy (res, a); /* assume this is the result */
1759 while (0); /* end protected */
1761 if (allocbuff != NULL)
1762 free (allocbuff); /* drop any storage we used */
1763 if (allocbufa != NULL)
1764 free (allocbufa); /* .. */
1765 if (allocbufb != NULL)
1766 free (allocbufb); /* .. */
1767 if (allocrhs != NULL)
1768 free (allocrhs); /* .. */
1770 decStatus (res, status, set); /* then report status */
1774 /* ------------------------------------------------------------------ */
1775 /* decNumberSubtract -- subtract two Numbers */
1777 /* This computes C = A - B */
1779 /* res is C, the result. C may be A and/or B (e.g., X=X-X) */
1782 /* set is the context */
1784 /* C must have space for set->digits digits. */
1785 /* ------------------------------------------------------------------ */
1787 decNumberSubtract (decNumber * res, const decNumber * lhs,
1788 const decNumber * rhs, decContext * set)
1790 uInt status = 0; /* accumulator */
1792 decAddOp (res, lhs, rhs, set, DECNEG, &status);
1794 decStatus (res, status, set);
1798 /* ------------------------------------------------------------------ */
1799 /* decNumberToIntegralValue -- round-to-integral-value */
1801 /* res is the result */
1802 /* rhs is input number */
1803 /* set is the context */
1805 /* res must have space for any value of rhs. */
1807 /* This implements the IEEE special operator and therefore treats */
1808 /* special values as valid, and also never sets Inexact. For finite */
1809 /* numbers it returns rescale(rhs, 0) if rhs->exponent is <0. */
1810 /* Otherwise the result is rhs (so no error is possible). */
1812 /* The context is used for rounding mode and status after sNaN, but */
1813 /* the digits setting is ignored. */
1814 /* ------------------------------------------------------------------ */
1816 decNumberToIntegralValue (decNumber * res, const decNumber * rhs, decContext * set)
1819 decContext workset; /* working context */
1822 if (decCheckOperands (res, DECUNUSED, rhs, set))
1826 /* handle infinities and NaNs */
1827 if (rhs->bits & DECSPECIAL)
1830 if (decNumberIsInfinite (rhs))
1831 decNumberCopy (res, rhs); /* an Infinity */
1833 decNaNs (res, rhs, NULL, &status); /* a NaN */
1835 decStatus (res, status, set);
1839 /* we have a finite number; no error possible */
1840 if (rhs->exponent >= 0)
1841 return decNumberCopy (res, rhs);
1842 /* that was easy, but if negative exponent we have work to do... */
1843 workset = *set; /* clone rounding, etc. */
1844 workset.digits = rhs->digits; /* no length rounding */
1845 workset.traps = 0; /* no traps */
1846 decNumberZero (&dn); /* make a number with exponent 0 */
1847 return decNumberQuantize (res, rhs, &dn, &workset);
1850 /* ================================================================== */
1851 /* Utility routines */
1852 /* ================================================================== */
1854 /* ------------------------------------------------------------------ */
1855 /* decNumberCopy -- copy a number */
1857 /* dest is the target decNumber */
1858 /* src is the source decNumber */
1861 /* (dest==src is allowed and is a no-op) */
1862 /* All fields are updated as required. This is a utility operation, */
1863 /* so special values are unchanged and no error is possible. */
1864 /* ------------------------------------------------------------------ */
1866 decNumberCopy (decNumber * dest, const decNumber * src)
1871 return decNumberZero (dest);
1875 return dest; /* no copy required */
1877 /* We use explicit assignments here as structure assignment can copy */
1878 /* more than just the lsu (for small DECDPUN). This would not affect */
1879 /* the value of the results, but would disturb test harness spill */
1881 dest->bits = src->bits;
1882 dest->exponent = src->exponent;
1883 dest->digits = src->digits;
1884 dest->lsu[0] = src->lsu[0];
1885 if (src->digits > DECDPUN)
1886 { /* more Units to come */
1888 const Unit *s, *smsup; /* work */
1889 /* memcpy for the remaining Units would be safe as they cannot */
1890 /* overlap. However, this explicit loop is faster in short cases. */
1891 d = dest->lsu + 1; /* -> first destination */
1892 smsup = src->lsu + D2U (src->digits); /* -> source msu+1 */
1893 for (s = src->lsu + 1; s < smsup; s++, d++)
1899 /* ------------------------------------------------------------------ */
1900 /* decNumberTrim -- remove insignificant zeros */
1902 /* dn is the number to trim */
1905 /* All fields are updated as required. This is a utility operation, */
1906 /* so special values are unchanged and no error is possible. */
1907 /* ------------------------------------------------------------------ */
1909 decNumberTrim (decNumber * dn)
1911 Int dropped; /* work */
1912 return decTrim (dn, 0, &dropped);
1915 /* ------------------------------------------------------------------ */
1916 /* decNumberVersion -- return the name and version of this module */
1918 /* No error is possible. */
1919 /* ------------------------------------------------------------------ */
1921 decNumberVersion (void)
1926 /* ------------------------------------------------------------------ */
1927 /* decNumberZero -- set a number to 0 */
1929 /* dn is the number to set, with space for one digit */
1932 /* No error is possible. */
1933 /* ------------------------------------------------------------------ */
1934 /* Memset is not used as it is much slower in some environments. */
1936 decNumberZero (decNumber * dn)
1940 if (decCheckOperands (dn, DECUNUSED, DECUNUSED, DECUNUSED))
1951 /* ================================================================== */
1952 /* Local routines */
1953 /* ================================================================== */
1955 /* ------------------------------------------------------------------ */
1956 /* decToString -- lay out a number into a string */
1958 /* dn is the number to lay out */
1959 /* string is where to lay out the number */
1960 /* eng is 1 if Engineering, 0 if Scientific */
1962 /* str must be at least dn->digits+14 characters long */
1963 /* No error is possible. */
1965 /* Note that this routine can generate a -0 or 0.000. These are */
1966 /* never generated in subset to-number or arithmetic, but can occur */
1967 /* in non-subset arithmetic (e.g., -1*0 or 1.234-1.234). */
1968 /* ------------------------------------------------------------------ */
1969 /* If DECCHECK is enabled the string "?" is returned if a number is */
1972 /* TODIGIT -- macro to remove the leading digit from the unsigned */
1973 /* integer u at column cut (counting from the right, LSD=0) and place */
1974 /* it as an ASCII character into the character pointed to by c. Note */
1975 /* that cut must be <= 9, and the maximum value for u is 2,000,000,000 */
1976 /* (as is needed for negative exponents of subnormals). The unsigned */
1977 /* integer pow is used as a temporary variable. */
1978 #define TODIGIT(u, cut, c) { \
1980 pow=powers[cut]*2; \
1983 if ((u)>=pow) {(u)-=pow; *(c)+=8;} \
1985 if ((u)>=pow) {(u)-=pow; *(c)+=4;} \
1988 if ((u)>=pow) {(u)-=pow; *(c)+=2;} \
1990 if ((u)>=pow) {(u)-=pow; *(c)+=1;} \
1994 decToString (const decNumber * dn, char *string, Flag eng)
1996 Int exp = dn->exponent; /* local copy */
1997 Int e; /* E-part value */
1998 Int pre; /* digits before the '.' */
1999 Int cut; /* for counting digits in a Unit */
2000 char *c = string; /* work [output pointer] */
2001 const Unit *up = dn->lsu + D2U (dn->digits) - 1; /* -> msu [input pointer] */
2002 uInt u, pow; /* work */
2005 if (decCheckOperands (DECUNUSED, dn, DECUNUSED, DECUNUSED))
2007 strcpy (string, "?");
2012 if (decNumberIsNegative (dn))
2013 { /* Negatives get a minus (except */
2014 *c = '-'; /* NaNs, which remove the '-' below) */
2017 if (dn->bits & DECSPECIAL)
2018 { /* Is a special value */
2019 if (decNumberIsInfinite (dn))
2021 strcpy (c, "Infinity");
2025 if (dn->bits & DECSNAN)
2026 { /* signalling NaN */
2031 c += 3; /* step past */
2032 /* if not a clean non-zero coefficient, that's all we have in a */
2034 if (exp != 0 || (*dn->lsu == 0 && dn->digits == 1))
2036 /* [drop through to add integer] */
2039 /* calculate how many digits in msu, and hence first cut */
2040 cut = dn->digits % DECDPUN;
2042 cut = DECDPUN; /* msu is full */
2043 cut--; /* power of ten for digit */
2046 { /* simple integer [common fastpath, */
2047 /* used for NaNs, too] */
2048 for (; up >= dn->lsu; up--)
2049 { /* each Unit from msu */
2050 u = *up; /* contains DECDPUN digits to lay out */
2051 for (; cut >= 0; c++, cut--)
2052 TODIGIT (u, cut, c);
2053 cut = DECDPUN - 1; /* next Unit has all digits */
2055 *c = '\0'; /* terminate the string */
2059 /* non-0 exponent -- assume plain form */
2060 pre = dn->digits + exp; /* digits before '.' */
2062 if ((exp > 0) || (pre < -5))
2063 { /* need exponential form */
2064 e = exp + dn->digits - 1; /* calculate E value */
2065 pre = 1; /* assume one digit before '.' */
2066 if (eng && (e != 0))
2067 { /* may need to adjust */
2068 Int adj; /* adjustment */
2069 /* The C remainder operator is undefined for negative numbers, so */
2070 /* we must use positive remainder calculation here */
2082 /* if we are dealing with zero we will use exponent which is a */
2083 /* multiple of three, as expected, but there will only be the */
2084 /* one zero before the E, still. Otherwise note the padding. */
2090 { /* 0.00Esnn needed */
2098 /* lay out the digits of the coefficient, adding 0s and . as needed */
2101 { /* xxx.xxx or xx00 (engineering) form */
2102 for (; pre > 0; pre--, c++, cut--)
2105 { /* need new Unit */
2107 break; /* out of input digits (pre>digits) */
2112 TODIGIT (u, cut, c);
2114 if (up > dn->lsu || (up == dn->lsu && cut >= 0))
2115 { /* more to come, after '.' */
2121 { /* need new Unit */
2123 break; /* out of input digits */
2128 TODIGIT (u, cut, c);
2132 for (; pre > 0; pre--, c++)
2133 *c = '0'; /* 0 padding (for engineering) needed */
2136 { /* 0.xxx or 0.000xxx form */
2141 for (; pre < 0; pre++, c++)
2142 *c = '0'; /* add any 0's after '.' */
2146 { /* need new Unit */
2148 break; /* out of input digits */
2153 TODIGIT (u, cut, c);
2157 /* Finally add the E-part, if needed. It will never be 0, has a
2158 base maximum and minimum of +999999999 through -999999999, but
2159 could range down to -1999999998 for subnormal numbers */
2162 Flag had = 0; /* 1=had non-zero */
2166 c++; /* assume positive */
2170 *(c - 1) = '-'; /* oops, need - */
2171 u = -e; /* uInt, please */
2173 /* layout the exponent (_itoa is not ANSI C) */
2174 for (cut = 9; cut >= 0; cut--)
2176 TODIGIT (u, cut, c);
2177 if (*c == '0' && !had)
2178 continue; /* skip leading zeros */
2179 had = 1; /* had non-0 */
2180 c++; /* step for next */
2183 *c = '\0'; /* terminate the string (all paths) */
2187 /* ------------------------------------------------------------------ */
2188 /* decAddOp -- add/subtract operation */
2190 /* This computes C = A + B */
2192 /* res is C, the result. C may be A and/or B (e.g., X=X+X) */
2195 /* set is the context */
2196 /* negate is DECNEG if rhs should be negated, or 0 otherwise */
2197 /* status accumulates status for the caller */
2199 /* C must have space for set->digits digits. */
2200 /* ------------------------------------------------------------------ */
2201 /* If possible, we calculate the coefficient directly into C. */
2203 /* -- we need a digits+1 calculation because numbers are unaligned */
2204 /* and span more than set->digits digits */
2205 /* -- a carry to digits+1 digits looks possible */
2206 /* -- C is the same as A or B, and the result would destructively */
2207 /* overlap the A or B coefficient */
2208 /* then we must calculate into a temporary buffer. In this latter */
2209 /* case we use the local (stack) buffer if possible, and only if too */
2210 /* long for that do we resort to malloc. */
2212 /* Misalignment is handled as follows: */
2213 /* Apad: (AExp>BExp) Swap operands and proceed as for BExp>AExp. */
2214 /* BPad: Apply the padding by a combination of shifting (whole */
2215 /* units) and multiplication (part units). */
2217 /* Addition, especially x=x+1, is speed-critical, so we take pains */
2218 /* to make returning as fast as possible, by flagging any allocation. */
2219 /* ------------------------------------------------------------------ */
2221 decAddOp (decNumber * res, const decNumber * lhs,
2222 const decNumber * rhs, decContext * set, uByte negate, uInt * status)
2224 decNumber *alloclhs = NULL; /* non-NULL if rounded lhs allocated */
2225 decNumber *allocrhs = NULL; /* .., rhs */
2226 Int rhsshift; /* working shift (in Units) */
2227 Int maxdigits; /* longest logical length */
2228 Int mult; /* multiplier */
2229 Int residue; /* rounding accumulator */
2230 uByte bits; /* result bits */
2231 Flag diffsign; /* non-0 if arguments have different sign */
2232 Unit *acc; /* accumulator for result */
2233 Unit accbuff[D2U (DECBUFFER + 1)]; /* local buffer [+1 is for possible */
2234 /* final carry digit or DECBUFFER=0] */
2235 Unit *allocacc = NULL; /* -> allocated acc buffer, iff allocated */
2236 Flag alloced = 0; /* set non-0 if any allocations */
2237 Int reqdigits = set->digits; /* local copy; requested DIGITS */
2238 uByte merged; /* merged flags */
2239 Int padding; /* work */
2242 if (decCheckOperands (res, lhs, rhs, set))
2247 { /* protect allocated storage */
2251 /* reduce operands and set lostDigits status, as needed */
2252 if (lhs->digits > reqdigits)
2254 alloclhs = decRoundOperand (lhs, set, status);
2255 if (alloclhs == NULL)
2260 if (rhs->digits > reqdigits)
2262 allocrhs = decRoundOperand (rhs, set, status);
2263 if (allocrhs == NULL)
2270 /* [following code does not require input rounding] */
2272 /* note whether signs differ */
2273 diffsign = (Flag) ((lhs->bits ^ rhs->bits ^ negate) & DECNEG);
2275 /* handle infinities and NaNs */
2276 merged = (lhs->bits | rhs->bits) & DECSPECIAL;
2278 { /* a special bit set */
2279 if (merged & (DECSNAN | DECNAN)) /* a NaN */
2280 decNaNs (res, lhs, rhs, status);
2282 { /* one or two infinities */
2283 if (decNumberIsInfinite (lhs))
2284 { /* LHS is infinity */
2285 /* two infinities with different signs is invalid */
2286 if (decNumberIsInfinite (rhs) && diffsign)
2288 *status |= DEC_Invalid_operation;
2291 bits = lhs->bits & DECNEG; /* get sign from LHS */
2294 bits = (rhs->bits ^ negate) & DECNEG; /* RHS must be Infinity */
2296 decNumberZero (res);
2297 res->bits = bits; /* set +/- infinity */
2302 /* Quick exit for add 0s; return the non-0, modified as need be */
2305 Int adjust; /* work */
2306 Int lexp = lhs->exponent; /* save in case LHS==RES */
2307 bits = lhs->bits; /* .. */
2308 residue = 0; /* clear accumulator */
2309 decCopyFit (res, rhs, set, &residue, status); /* copy (as needed) */
2310 res->bits ^= negate; /* flip if rhs was negated */
2313 { /* exponents on zeros count */
2315 /* exponent will be the lower of the two */
2316 adjust = lexp - res->exponent; /* adjustment needed [if -ve] */
2318 { /* both 0: special IEEE 854 rules */
2320 res->exponent = lexp; /* set exponent */
2321 /* 0-0 gives +0 unless rounding to -infinity, and -0-0 gives -0 */
2324 if (set->round != DEC_ROUND_FLOOR)
2327 res->bits = DECNEG; /* preserve 0 sign */
2333 { /* 0-padding needed */
2334 if ((res->digits - adjust) > set->digits)
2336 adjust = res->digits - set->digits; /* to fit exactly */
2337 *status |= DEC_Rounded; /* [but exact] */
2340 decShiftToMost (res->lsu, res->digits, -adjust);
2341 res->exponent += adjust; /* set the exponent. */
2347 decFinish (res, set, &residue, status); /* clean and finalize */
2352 { /* [lhs is non-zero] */
2353 Int adjust; /* work */
2354 Int rexp = rhs->exponent; /* save in case RHS==RES */
2355 bits = rhs->bits; /* be clean */
2356 residue = 0; /* clear accumulator */
2357 decCopyFit (res, lhs, set, &residue, status); /* copy (as needed) */
2360 { /* exponents on zeros count */
2362 /* exponent will be the lower of the two */
2363 /* [0-0 case handled above] */
2364 adjust = rexp - res->exponent; /* adjustment needed [if -ve] */
2366 { /* 0-padding needed */
2367 if ((res->digits - adjust) > set->digits)
2369 adjust = res->digits - set->digits; /* to fit exactly */
2370 *status |= DEC_Rounded; /* [but exact] */
2373 decShiftToMost (res->lsu, res->digits, -adjust);
2374 res->exponent += adjust; /* set the exponent. */
2379 decFinish (res, set, &residue, status); /* clean and finalize */
2382 /* [both fastpath and mainpath code below assume these cases */
2383 /* (notably 0-0) have already been handled] */
2385 /* calculate the padding needed to align the operands */
2386 padding = rhs->exponent - lhs->exponent;
2388 /* Fastpath cases where the numbers are aligned and normal, the RHS */
2389 /* is all in one unit, no operand rounding is needed, and no carry, */
2390 /* lengthening, or borrow is needed */
2391 if (rhs->digits <= DECDPUN && padding == 0 && rhs->exponent >= set->emin /* [some normals drop through] */
2392 && rhs->digits <= reqdigits && lhs->digits <= reqdigits)
2394 Int partial = *lhs->lsu;
2397 Int maxv = DECDPUNMAX; /* highest no-overflow */
2398 if (lhs->digits < DECDPUN)
2399 maxv = powers[lhs->digits] - 1;
2400 partial += *rhs->lsu;
2401 if (partial <= maxv)
2404 decNumberCopy (res, lhs); /* not in place */
2405 *res->lsu = (Unit) partial; /* [copy could have overwritten RHS] */
2408 /* else drop out for careful add */
2411 { /* signs differ */
2412 partial -= *rhs->lsu;
2414 { /* no borrow needed, and non-0 result */
2416 decNumberCopy (res, lhs); /* not in place */
2417 *res->lsu = (Unit) partial;
2418 /* this could have reduced digits [but result>0] */
2419 res->digits = decGetDigits (res->lsu, D2U (res->digits));
2422 /* else drop out for careful subtract */
2426 /* Now align (pad) the lhs or rhs so we can add or subtract them, as
2427 necessary. If one number is much larger than the other (that is,
2428 if in plain form there is a least one digit between the lowest
2429 digit or one and the highest of the other) we need to pad with up
2430 to DIGITS-1 trailing zeros, and then apply rounding (as exotic
2431 rounding modes may be affected by the residue).
2433 rhsshift = 0; /* rhs shift to left (padding) in Units */
2434 bits = lhs->bits; /* assume sign is that of LHS */
2435 mult = 1; /* likely multiplier */
2437 /* if padding==0 the operands are aligned; no padding needed */
2440 /* some padding needed */
2441 /* We always pad the RHS, as we can then effect any required */
2442 /* padding by a combination of shifts and a multiply */
2445 { /* LHS needs the padding */
2447 padding = -padding; /* will be +ve */
2448 bits = (uByte) (rhs->bits ^ negate); /* assumed sign is now that of RHS */
2455 /* If, after pad, rhs would be longer than lhs by digits+1 or */
2456 /* more then lhs cannot affect the answer, except as a residue, */
2457 /* so we only need to pad up to a length of DIGITS+1. */
2458 if (rhs->digits + padding > lhs->digits + reqdigits + 1)
2460 /* The RHS is sufficient */
2461 /* for residue we use the relative sign indication... */
2462 Int shift = reqdigits - rhs->digits; /* left shift needed */
2463 residue = 1; /* residue for rounding */
2465 residue = -residue; /* signs differ */
2466 /* copy, shortening if necessary */
2467 decCopyFit (res, rhs, set, &residue, status);
2468 /* if it was already shorter, then need to pad with zeros */
2471 res->digits = decShiftToMost (res->lsu, res->digits, shift);
2472 res->exponent -= shift; /* adjust the exponent. */
2474 /* flip the result sign if unswapped and rhs was negated */
2476 res->bits ^= negate;
2477 decFinish (res, set, &residue, status); /* done */
2481 /* LHS digits may affect result */
2482 rhsshift = D2U (padding + 1) - 1; /* this much by Unit shift .. */
2483 mult = powers[padding - (rhsshift * DECDPUN)]; /* .. this by multiplication */
2484 } /* padding needed */
2487 mult = -mult; /* signs differ */
2489 /* determine the longer operand */
2490 maxdigits = rhs->digits + padding; /* virtual length of RHS */
2491 if (lhs->digits > maxdigits)
2492 maxdigits = lhs->digits;
2494 /* Decide on the result buffer to use; if possible place directly */
2496 acc = res->lsu; /* assume build direct */
2497 /* If destructive overlap, or the number is too long, or a carry or */
2498 /* borrow to DIGITS+1 might be possible we must use a buffer. */
2499 /* [Might be worth more sophisticated tests when maxdigits==reqdigits] */
2500 if ((maxdigits >= reqdigits) /* is, or could be, too large */
2501 || (res == rhs && rhsshift > 0))
2502 { /* destructive overlap */
2503 /* buffer needed; choose it */
2504 /* we'll need units for maxdigits digits, +1 Unit for carry or borrow */
2505 Int need = D2U (maxdigits) + 1;
2506 acc = accbuff; /* assume use local buffer */
2507 if (need * sizeof (Unit) > sizeof (accbuff))
2509 allocacc = (Unit *) malloc (need * sizeof (Unit));
2510 if (allocacc == NULL)
2511 { /* hopeless -- abandon */
2512 *status |= DEC_Insufficient_storage;
2520 res->bits = (uByte) (bits & DECNEG); /* it's now safe to overwrite.. */
2521 res->exponent = lhs->exponent; /* .. operands (even if aliased) */
2524 decDumpAr ('A', lhs->lsu, D2U (lhs->digits));
2525 decDumpAr ('B', rhs->lsu, D2U (rhs->digits));
2526 printf (" :h: %d %d\n", rhsshift, mult);
2529 /* add [A+B*m] or subtract [A+B*(-m)] */
2530 res->digits = decUnitAddSub (lhs->lsu, D2U (lhs->digits), rhs->lsu, D2U (rhs->digits), rhsshift, acc, mult) * DECDPUN; /* [units -> digits] */
2531 if (res->digits < 0)
2533 res->digits = -res->digits;
2534 res->bits ^= DECNEG; /* flip the sign */
2537 decDumpAr ('+', acc, D2U (res->digits));
2540 /* If we used a buffer we need to copy back, possibly shortening */
2541 /* (If we didn't use buffer it must have fit, so can't need rounding */
2542 /* and residue must be 0.) */
2543 residue = 0; /* clear accumulator */
2544 if (acc != res->lsu)
2548 { /* round from first significant digit */
2550 /* remove leading zeros that we added due to rounding up to */
2551 /* integral Units -- before the test for rounding. */
2552 if (res->digits > reqdigits)
2553 res->digits = decGetDigits (acc, D2U (res->digits));
2554 decSetCoeff (res, set, acc, res->digits, &residue, status);
2558 { /* subset arithmetic rounds from original significant digit */
2559 /* We may have an underestimate. This only occurs when both */
2560 /* numbers fit in DECDPUN digits and we are padding with a */
2561 /* negative multiple (-10, -100...) and the top digit(s) become */
2562 /* 0. (This only matters if we are using X3.274 rules where the */
2563 /* leading zero could be included in the rounding.) */
2564 if (res->digits < maxdigits)
2566 *(acc + D2U (res->digits)) = 0; /* ensure leading 0 is there */
2567 res->digits = maxdigits;
2571 /* remove leading zeros that we added due to rounding up to */
2572 /* integral Units (but only those in excess of the original */
2573 /* maxdigits length, unless extended) before test for rounding. */
2574 if (res->digits > reqdigits)
2576 res->digits = decGetDigits (acc, D2U (res->digits));
2577 if (res->digits < maxdigits)
2578 res->digits = maxdigits;
2581 decSetCoeff (res, set, acc, res->digits, &residue, status);
2582 /* Now apply rounding if needed before removing leading zeros. */
2583 /* This is safe because subnormals are not a possibility */
2586 decApplyRound (res, set, residue, status);
2587 residue = 0; /* we did what we had to do */
2593 /* strip leading zeros [these were left on in case of subset subtract] */
2594 res->digits = decGetDigits (res->lsu, D2U (res->digits));
2596 /* apply checks and rounding */
2597 decFinish (res, set, &residue, status);
2599 /* "When the sum of two operands with opposite signs is exactly */
2600 /* zero, the sign of that sum shall be '+' in all rounding modes */
2601 /* except round toward -Infinity, in which mode that sign shall be */
2602 /* '-'." [Subset zeros also never have '-', set by decFinish.] */
2603 if (ISZERO (res) && diffsign
2607 && (*status & DEC_Inexact) == 0)
2609 if (set->round == DEC_ROUND_FLOOR)
2610 res->bits |= DECNEG; /* sign - */
2612 res->bits &= ~DECNEG; /* sign + */
2615 while (0); /* end protected */
2619 if (allocacc != NULL)
2620 free (allocacc); /* drop any storage we used */
2621 if (allocrhs != NULL)
2622 free (allocrhs); /* .. */
2623 if (alloclhs != NULL)
2624 free (alloclhs); /* .. */
2629 /* ------------------------------------------------------------------ */
2630 /* decDivideOp -- division operation */
2632 /* This routine performs the calculations for all four division */
2633 /* operators (divide, divideInteger, remainder, remainderNear). */
2637 /* res is C, the result. C may be A and/or B (e.g., X=X/X) */
2640 /* set is the context */
2641 /* op is DIVIDE, DIVIDEINT, REMAINDER, or REMNEAR respectively. */
2642 /* status is the usual accumulator */
2644 /* C must have space for set->digits digits. */
2646 /* ------------------------------------------------------------------ */
2647 /* The underlying algorithm of this routine is the same as in the */
2648 /* 1981 S/370 implementation, that is, non-restoring long division */
2649 /* with bi-unit (rather than bi-digit) estimation for each unit */
2650 /* multiplier. In this pseudocode overview, complications for the */
2651 /* Remainder operators and division residues for exact rounding are */
2652 /* omitted for clarity. */
2654 /* Prepare operands and handle special values */
2655 /* Test for x/0 and then 0/x */
2656 /* Exp =Exp1 - Exp2 */
2657 /* Exp =Exp +len(var1) -len(var2) */
2658 /* Sign=Sign1 * Sign2 */
2659 /* Pad accumulator (Var1) to double-length with 0's (pad1) */
2660 /* Pad Var2 to same length as Var1 */
2661 /* msu2pair/plus=1st 2 or 1 units of var2, +1 to allow for round */
2663 /* Do until (have=digits+1 OR residue=0) */
2664 /* if exp<0 then if integer divide/residue then leave */
2667 /* compare numbers */
2668 /* if <0 then leave inner_loop */
2669 /* if =0 then (* quick exit without subtract *) do */
2670 /* this_unit=this_unit+1; output this_unit */
2671 /* leave outer_loop; end */
2672 /* Compare lengths of numbers (mantissae): */
2673 /* If same then tops2=msu2pair -- {units 1&2 of var2} */
2674 /* else tops2=msu2plus -- {0, unit 1 of var2} */
2675 /* tops1=first_unit_of_Var1*10**DECDPUN +second_unit_of_var1 */
2676 /* mult=tops1/tops2 -- Good and safe guess at divisor */
2677 /* if mult=0 then mult=1 */
2678 /* this_unit=this_unit+mult */
2680 /* end inner_loop */
2681 /* if have\=0 | this_unit\=0 then do */
2682 /* output this_unit */
2683 /* have=have+1; end */
2686 /* end outer_loop */
2687 /* exp=exp+1 -- set the proper exponent */
2688 /* if have=0 then generate answer=0 */
2689 /* Return (Result is defined by Var1) */
2691 /* ------------------------------------------------------------------ */
2692 /* We need two working buffers during the long division; one (digits+ */
2693 /* 1) to accumulate the result, and the other (up to 2*digits+1) for */
2694 /* long subtractions. These are acc and var1 respectively. */
2695 /* var1 is a copy of the lhs coefficient, var2 is the rhs coefficient.*/
2696 /* ------------------------------------------------------------------ */
2698 decDivideOp (decNumber * res,
2699 const decNumber * lhs, const decNumber * rhs,
2700 decContext * set, Flag op, uInt * status)
2702 decNumber *alloclhs = NULL; /* non-NULL if rounded lhs allocated */
2703 decNumber *allocrhs = NULL; /* .., rhs */
2704 Unit accbuff[D2U (DECBUFFER + DECDPUN)]; /* local buffer */
2705 Unit *acc = accbuff; /* -> accumulator array for result */
2706 Unit *allocacc = NULL; /* -> allocated buffer, iff allocated */
2707 Unit *accnext; /* -> where next digit will go */
2708 Int acclength; /* length of acc needed [Units] */
2709 Int accunits; /* count of units accumulated */
2710 Int accdigits; /* count of digits accumulated */
2712 Unit varbuff[D2U (DECBUFFER * 2 + DECDPUN) * sizeof (Unit)]; /* buffer for var1 */
2713 Unit *var1 = varbuff; /* -> var1 array for long subtraction */
2714 Unit *varalloc = NULL; /* -> allocated buffer, iff used */
2716 const Unit *var2; /* -> var2 array */
2718 Int var1units, var2units; /* actual lengths */
2719 Int var2ulen; /* logical length (units) */
2720 Int var1initpad = 0; /* var1 initial padding (digits) */
2721 Unit *msu1; /* -> msu of each var */
2722 const Unit *msu2; /* -> msu of each var */
2723 Int msu2plus; /* msu2 plus one [does not vary] */
2724 eInt msu2pair; /* msu2 pair plus one [does not vary] */
2725 Int maxdigits; /* longest LHS or required acc length */
2726 Int mult; /* multiplier for subtraction */
2727 Unit thisunit; /* current unit being accumulated */
2728 Int residue; /* for rounding */
2729 Int reqdigits = set->digits; /* requested DIGITS */
2730 Int exponent; /* working exponent */
2731 Int maxexponent = 0; /* DIVIDE maximum exponent if unrounded */
2732 uByte bits; /* working sign */
2733 uByte merged; /* merged flags */
2734 Unit *target; /* work */
2735 const Unit *source; /* work */
2736 uInt const *pow; /* .. */
2737 Int shift, cut; /* .. */
2739 Int dropped; /* work */
2743 if (decCheckOperands (res, lhs, rhs, set))
2748 { /* protect allocated storage */
2752 /* reduce operands and set lostDigits status, as needed */
2753 if (lhs->digits > reqdigits)
2755 alloclhs = decRoundOperand (lhs, set, status);
2756 if (alloclhs == NULL)
2760 if (rhs->digits > reqdigits)
2762 allocrhs = decRoundOperand (rhs, set, status);
2763 if (allocrhs == NULL)
2769 /* [following code does not require input rounding] */
2771 bits = (lhs->bits ^ rhs->bits) & DECNEG; /* assumed sign for divisions */
2773 /* handle infinities and NaNs */
2774 merged = (lhs->bits | rhs->bits) & DECSPECIAL;
2776 { /* a special bit set */
2777 if (merged & (DECSNAN | DECNAN))
2778 { /* one or two NaNs */
2779 decNaNs (res, lhs, rhs, status);
2782 /* one or two infinities */
2783 if (decNumberIsInfinite (lhs))
2784 { /* LHS (dividend) is infinite */
2785 if (decNumberIsInfinite (rhs) || /* two infinities are invalid .. */
2786 op & (REMAINDER | REMNEAR))
2787 { /* as is remainder of infinity */
2788 *status |= DEC_Invalid_operation;
2791 /* [Note that infinity/0 raises no exceptions] */
2792 decNumberZero (res);
2793 res->bits = bits | DECINF; /* set +/- infinity */
2797 { /* RHS (divisor) is infinite */
2799 if (op & (REMAINDER | REMNEAR))
2801 /* result is [finished clone of] lhs */
2802 decCopyFit (res, lhs, set, &residue, status);
2806 decNumberZero (res);
2807 res->bits = bits; /* set +/- zero */
2808 /* for DIVIDEINT the exponent is always 0. For DIVIDE, result */
2809 /* is a 0 with infinitely negative exponent, clamped to minimum */
2812 res->exponent = set->emin - set->digits + 1;
2813 *status |= DEC_Clamped;
2816 decFinish (res, set, &residue, status);
2821 /* handle 0 rhs (x/0) */
2823 { /* x/0 is always exceptional */
2826 decNumberZero (res); /* [after lhs test] */
2827 *status |= DEC_Division_undefined; /* 0/0 will become NaN */
2831 decNumberZero (res);
2832 if (op & (REMAINDER | REMNEAR))
2833 *status |= DEC_Invalid_operation;
2836 *status |= DEC_Division_by_zero; /* x/0 */
2837 res->bits = bits | DECINF; /* .. is +/- Infinity */
2843 /* handle 0 lhs (0/x) */
2848 decNumberZero (res);
2855 exponent = lhs->exponent - rhs->exponent; /* ideal exponent */
2856 decNumberCopy (res, lhs); /* [zeros always fit] */
2857 res->bits = bits; /* sign as computed */
2858 res->exponent = exponent; /* exponent, too */
2859 decFinalize (res, set, &residue, status); /* check exponent */
2861 else if (op & DIVIDEINT)
2863 decNumberZero (res); /* integer 0 */
2864 res->bits = bits; /* sign as computed */
2868 exponent = rhs->exponent; /* [save in case overwrite] */
2869 decNumberCopy (res, lhs); /* [zeros always fit] */
2870 if (exponent < res->exponent)
2871 res->exponent = exponent; /* use lower */
2879 /* Precalculate exponent. This starts off adjusted (and hence fits */
2880 /* in 31 bits) and becomes the usual unadjusted exponent as the */
2881 /* division proceeds. The order of evaluation is important, here, */
2882 /* to avoid wrap. */
2884 (lhs->exponent + lhs->digits) - (rhs->exponent + rhs->digits);
2886 /* If the working exponent is -ve, then some quick exits are */
2887 /* possible because the quotient is known to be <1 */
2888 /* [for REMNEAR, it needs to be < -1, as -0.5 could need work] */
2889 if (exponent < 0 && !(op == DIVIDE))
2893 decNumberZero (res); /* integer part is 0 */
2897 res->bits = bits; /* set +/- zero */
2900 /* we can fastpath remainders so long as the lhs has the */
2901 /* smaller (or equal) exponent */
2902 if (lhs->exponent <= rhs->exponent)
2904 if (op & REMAINDER || exponent < -1)
2906 /* It is REMAINDER or safe REMNEAR; result is [finished */
2907 /* clone of] lhs (r = x - 0*y) */
2909 decCopyFit (res, lhs, set, &residue, status);
2910 decFinish (res, set, &residue, status);
2913 /* [unsafe REMNEAR drops through] */
2917 /* We need long (slow) division; roll up the sleeves... */
2919 /* The accumulator will hold the quotient of the division. */
2920 /* If it needs to be too long for stack storage, then allocate. */
2921 acclength = D2U (reqdigits + DECDPUN); /* in Units */
2922 if (acclength * sizeof (Unit) > sizeof (accbuff))
2924 allocacc = (Unit *) malloc (acclength * sizeof (Unit));
2925 if (allocacc == NULL)
2926 { /* hopeless -- abandon */
2927 *status |= DEC_Insufficient_storage;
2930 acc = allocacc; /* use the allocated space */
2933 /* var1 is the padded LHS ready for subtractions. */
2934 /* If it needs to be too long for stack storage, then allocate. */
2935 /* The maximum units we need for var1 (long subtraction) is: */
2937 /* (rhs->digits+reqdigits-1) -- to allow full slide to right */
2938 /* or (lhs->digits) -- to allow for long lhs */
2939 /* whichever is larger */
2940 /* +1 -- for rounding of slide to right */
2941 /* +1 -- for leading 0s */
2942 /* +1 -- for pre-adjust if a remainder or DIVIDEINT */
2943 /* [Note: unused units do not participate in decUnitAddSub data] */
2944 maxdigits = rhs->digits + reqdigits - 1;
2945 if (lhs->digits > maxdigits)
2946 maxdigits = lhs->digits;
2947 var1units = D2U (maxdigits) + 2;
2948 /* allocate a guard unit above msu1 for REMAINDERNEAR */
2951 if ((var1units + 1) * sizeof (Unit) > sizeof (varbuff))
2953 varalloc = (Unit *) malloc ((var1units + 1) * sizeof (Unit));
2954 if (varalloc == NULL)
2955 { /* hopeless -- abandon */
2956 *status |= DEC_Insufficient_storage;
2959 var1 = varalloc; /* use the allocated space */
2962 /* Extend the lhs and rhs to full long subtraction length. The lhs */
2963 /* is truly extended into the var1 buffer, with 0 padding, so we can */
2964 /* subtract in place. The rhs (var2) has virtual padding */
2965 /* (implemented by decUnitAddSub). */
2966 /* We allocated one guard unit above msu1 for rem=rem+rem in REMAINDERNEAR */
2967 msu1 = var1 + var1units - 1; /* msu of var1 */
2968 source = lhs->lsu + D2U (lhs->digits) - 1; /* msu of input array */
2969 for (target = msu1; source >= lhs->lsu; source--, target--)
2971 for (; target >= var1; target--)
2974 /* rhs (var2) is left-aligned with var1 at the start */
2975 var2ulen = var1units; /* rhs logical length (units) */
2976 var2units = D2U (rhs->digits); /* rhs actual length (units) */
2977 var2 = rhs->lsu; /* -> rhs array */
2978 msu2 = var2 + var2units - 1; /* -> msu of var2 [never changes] */
2979 /* now set up the variables which we'll use for estimating the */
2980 /* multiplication factor. If these variables are not exact, we add */
2981 /* 1 to make sure that we never overestimate the multiplier. */
2982 msu2plus = *msu2; /* it's value .. */
2984 msu2plus++; /* .. +1 if any more */
2985 msu2pair = (eInt) * msu2 * (DECDPUNMAX + 1); /* top two pair .. */
2987 { /* .. [else treat 2nd as 0] */
2988 msu2pair += *(msu2 - 1); /* .. */
2990 msu2pair++; /* .. +1 if any more */
2993 /* Since we are working in units, the units may have leading zeros, */
2994 /* but we calculated the exponent on the assumption that they are */
2995 /* both left-aligned. Adjust the exponent to compensate: add the */
2996 /* number of leading zeros in var1 msu and subtract those in var2 msu. */
2997 /* [We actually do this by counting the digits and negating, as */
2998 /* lead1=DECDPUN-digits1, and similarly for lead2.] */
2999 for (pow = &powers[1]; *msu1 >= *pow; pow++)
3001 for (pow = &powers[1]; *msu2 >= *pow; pow++)
3004 /* Now, if doing an integer divide or remainder, we want to ensure */
3005 /* that the result will be Unit-aligned. To do this, we shift the */
3006 /* var1 accumulator towards least if need be. (It's much easier to */
3007 /* do this now than to reassemble the residue afterwards, if we are */
3008 /* doing a remainder.) Also ensure the exponent is not negative. */
3012 /* save the initial 'false' padding of var1, in digits */
3013 var1initpad = (var1units - D2U (lhs->digits)) * DECDPUN;
3014 /* Determine the shift to do. */
3018 cut = DECDPUN - exponent % DECDPUN;
3019 decShiftToLeast (var1, var1units, cut);
3020 exponent += cut; /* maintain numerical value */
3021 var1initpad -= cut; /* .. and reduce padding */
3022 /* clean any most-significant units we just emptied */
3023 for (u = msu1; cut >= DECDPUN; cut -= DECDPUN, u--)
3028 maxexponent = lhs->exponent - rhs->exponent; /* save */
3029 /* optimization: if the first iteration will just produce 0, */
3030 /* preadjust to skip it [valid for DIVIDE only] */
3033 var2ulen--; /* shift down */
3034 exponent -= DECDPUN; /* update the exponent */
3038 /* ---- start the long-division loops ------------------------------ */
3039 accunits = 0; /* no units accumulated yet */
3040 accdigits = 0; /* .. or digits */
3041 accnext = acc + acclength - 1; /* -> msu of acc [NB: allows digits+1] */
3043 { /* outer forever loop */
3044 thisunit = 0; /* current unit assumed 0 */
3045 /* find the next unit */
3047 { /* inner forever loop */
3048 /* strip leading zero units [from either pre-adjust or from */
3049 /* subtract last time around]. Leave at least one unit. */
3050 for (; *msu1 == 0 && msu1 > var1; msu1--)
3053 if (var1units < var2ulen)
3054 break; /* var1 too low for subtract */
3055 if (var1units == var2ulen)
3056 { /* unit-by-unit compare needed */
3057 /* compare the two numbers, from msu */
3058 Unit *pv1, v2; /* units to compare */
3059 const Unit *pv2; /* units to compare */
3060 pv2 = msu2; /* -> msu */
3061 for (pv1 = msu1;; pv1--, pv2--)
3063 /* v1=*pv1 -- always OK */
3064 v2 = 0; /* assume in padding */
3066 v2 = *pv2; /* in range */
3068 break; /* no longer the same */
3070 break; /* done; leave pv1 as is */
3072 /* here when all inspected or a difference seen */
3074 break; /* var1 too low to subtract */
3076 { /* var1 == var2 */
3077 /* reach here if var1 and var2 are identical; subtraction */
3078 /* would increase digit by one, and the residue will be 0 so */
3079 /* we are done; leave the loop with residue set to 0. */
3080 thisunit++; /* as though subtracted */
3081 *var1 = 0; /* set var1 to 0 */
3082 var1units = 1; /* .. */
3083 break; /* from inner */
3084 } /* var1 == var2 */
3085 /* *pv1>v2. Prepare for real subtraction; the lengths are equal */
3086 /* Estimate the multiplier (there's always a msu1-1)... */
3087 /* Bring in two units of var2 to provide a good estimate. */
3089 (Int) (((eInt) * msu1 * (DECDPUNMAX + 1) +
3090 *(msu1 - 1)) / msu2pair);
3091 } /* lengths the same */
3093 { /* var1units > var2ulen, so subtraction is safe */
3094 /* The var2 msu is one unit towards the lsu of the var1 msu, */
3095 /* so we can only use one unit for var2. */
3097 (Int) (((eInt) * msu1 * (DECDPUNMAX + 1) +
3098 *(msu1 - 1)) / msu2plus);
3101 mult = 1; /* must always be at least 1 */
3102 /* subtraction needed; var1 is > var2 */
3103 thisunit = (Unit) (thisunit + mult); /* accumulate */
3104 /* subtract var1-var2, into var1; only the overlap needs */
3105 /* processing, as we are in place */
3106 shift = var2ulen - var2units;
3108 decDumpAr ('1', &var1[shift], var1units - shift);
3109 decDumpAr ('2', var2, var2units);
3110 printf ("m=%d\n", -mult);
3112 decUnitAddSub (&var1[shift], var1units - shift,
3113 var2, var2units, 0, &var1[shift], -mult);
3115 decDumpAr ('#', &var1[shift], var1units - shift);
3117 /* var1 now probably has leading zeros; these are removed at the */
3118 /* top of the inner loop. */
3121 /* We have the next unit; unless it's a leading zero, add to acc */
3122 if (accunits != 0 || thisunit != 0)
3123 { /* put the unit we got */
3124 *accnext = thisunit; /* store in accumulator */
3125 /* account exactly for the digits we got */
3128 accdigits++; /* at least one */
3129 for (pow = &powers[1]; thisunit >= *pow; pow++)
3133 accdigits += DECDPUN;
3134 accunits++; /* update count */
3135 accnext--; /* ready for next */
3136 if (accdigits > reqdigits)
3137 break; /* we have all we need */
3140 /* if the residue is zero, we're done (unless divide or */
3141 /* divideInteger and we haven't got enough digits yet) */
3142 if (*var1 == 0 && var1units == 1)
3143 { /* residue is 0 */
3144 if (op & (REMAINDER | REMNEAR))
3146 if ((op & DIVIDE) && (exponent <= maxexponent))
3148 /* [drop through if divideInteger] */
3150 /* we've also done enough if calculating remainder or integer */
3151 /* divide and we just did the last ('units') unit */
3152 if (exponent == 0 && !(op & DIVIDE))
3155 /* to get here, var1 is less than var2, so divide var2 by the per- */
3156 /* Unit power of ten and go for the next digit */
3157 var2ulen--; /* shift down */
3158 exponent -= DECDPUN; /* update the exponent */
3161 /* ---- division is complete --------------------------------------- */
3162 /* here: acc has at least reqdigits+1 of good results (or fewer */
3163 /* if early stop), starting at accnext+1 (its lsu) */
3164 /* var1 has any residue at the stopping point */
3165 /* accunits is the number of digits we collected in acc */
3168 accunits = 1; /* show we have one .. */
3169 accdigits = 1; /* .. */
3170 *accnext = 0; /* .. whose value is 0 */
3173 accnext++; /* back to last placed */
3174 /* accnext now -> lowest unit of result */
3176 residue = 0; /* assume no residue */
3179 /* record the presence of any residue, for rounding */
3180 if (*var1 != 0 || var1units > 1)
3184 /* We had an exact division; clean up spurious trailing 0s. */
3185 /* There will be at most DECDPUN-1, from the final multiply, */
3186 /* and then only if the result is non-0 (and even) and the */
3187 /* exponent is 'loose'. */
3189 Unit lsu = *accnext;
3190 if (!(lsu & 0x01) && (lsu != 0))
3192 /* count the trailing zeros */