beta-0.89.2
[luatex.git] / source / texk / web2c / mplibdir / decNumber.c
blob19230b89576e0e3a470143dc30ed3778efc60422
1 /* ------------------------------------------------------------------ */
2 /* Decimal Number arithmetic module */
3 /* ------------------------------------------------------------------ */
4 /* Copyright (c) IBM Corporation, 2000, 2009. All rights reserved. */
5 /* */
6 /* This software is made available under the terms of the */
7 /* ICU License -- ICU 1.8.1 and later. */
8 /* */
9 /* The description and User's Guide ("The decNumber C Library") for */
10 /* this software is called decNumber.pdf. This document is */
11 /* available, together with arithmetic and format specifications, */
12 /* testcases, and Web links, on the General Decimal Arithmetic page. */
13 /* */
14 /* Please send comments, suggestions, and corrections to the author: */
15 /* mfc@uk.ibm.com */
16 /* Mike Cowlishaw, IBM Fellow */
17 /* IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK */
18 /* ------------------------------------------------------------------ */
19 /* This module comprises the routines for arbitrary-precision General */
20 /* Decimal Arithmetic as defined in the specification which may be */
21 /* found on the General Decimal Arithmetic pages. It implements both */
22 /* the full ('extended') arithmetic and the simpler ('subset') */
23 /* arithmetic. */
24 /* */
25 /* Usage notes: */
26 /* */
27 /* 1. This code is ANSI C89 except: */
28 /* */
29 /* a) C99 line comments (double forward slash) are used. (Most C */
30 /* compilers accept these. If yours does not, a simple script */
31 /* can be used to convert them to ANSI C comments.) */
32 /* */
33 /* b) Types from C99 stdint.h are used. If you do not have this */
34 /* header file, see the User's Guide section of the decNumber */
35 /* documentation; this lists the necessary definitions. */
36 /* */
37 /* c) If DECDPUN>4 or DECUSE64=1, the C99 64-bit int64_t and */
38 /* uint64_t types may be used. To avoid these, set DECUSE64=0 */
39 /* and DECDPUN<=4 (see documentation). */
40 /* */
41 /* The code also conforms to C99 restrictions; in particular, */
42 /* strict aliasing rules are observed. */
43 /* */
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). Mathematical functions (for */
51 /* example decNumberExp) as identified below are restricted more */
52 /* tightly: digits, emax, and -emin in the context must be <= */
53 /* DEC_MAX_MATH (999999), and their operand(s) must be within */
54 /* these bounds. */
55 /* */
56 /* 3. Logical functions are further restricted; their operands must */
57 /* be finite, positive, have an exponent of zero, and all digits */
58 /* must be either 0 or 1. The result will only contain digits */
59 /* which are 0 or 1 (and will have exponent=0 and a sign of 0). */
60 /* */
61 /* 4. Operands to operator functions are never modified unless they */
62 /* are also specified to be the result number (which is always */
63 /* permitted). Other than that case, operands must not overlap. */
64 /* */
65 /* 5. Error handling: the type of the error is ORed into the status */
66 /* flags in the current context (decContext structure). The */
67 /* SIGFPE signal is then raised if the corresponding trap-enabler */
68 /* flag in the decContext is set (is 1). */
69 /* */
70 /* It is the responsibility of the caller to clear the status */
71 /* flags as required. */
72 /* */
73 /* The result of any routine which returns a number will always */
74 /* be a valid number (which may be a special value, such as an */
75 /* Infinity or NaN). */
76 /* */
77 /* 6. The decNumber format is not an exchangeable concrete */
78 /* representation as it comprises fields which may be machine- */
79 /* dependent (packed or unpacked, or special length, for example). */
80 /* Canonical conversions to and from strings are provided; other */
81 /* conversions are available in separate modules. */
82 /* */
83 /* 7. Normally, input operands are assumed to be valid. Set DECCHECK */
84 /* to 1 for extended operand checking (including NULL operands). */
85 /* Results are undefined if a badly-formed structure (or a NULL */
86 /* pointer to a structure) is provided, though with DECCHECK */
87 /* enabled the operator routines are protected against exceptions. */
88 /* (Except if the result pointer is NULL, which is unrecoverable.) */
89 /* */
90 /* However, the routines will never cause exceptions if they are */
91 /* given well-formed operands, even if the value of the operands */
92 /* is inappropriate for the operation and DECCHECK is not set. */
93 /* (Except for SIGFPE, as and where documented.) */
94 /* */
95 /* 8. Subset arithmetic is available only if DECSUBSET is set to 1. */
96 /* ------------------------------------------------------------------ */
97 /* Implementation notes for maintenance of this module: */
98 /* */
99 /* 1. Storage leak protection: Routines which use malloc are not */
100 /* permitted to use return for fastpath or error exits (i.e., */
101 /* they follow strict structured programming conventions). */
102 /* Instead they have a do{}while(0); construct surrounding the */
103 /* code which is protected -- break may be used to exit this. */
104 /* Other routines can safely use the return statement inline. */
105 /* */
106 /* Storage leak accounting can be enabled using DECALLOC. */
107 /* */
108 /* 2. All loops use the for(;;) construct. Any do construct does */
109 /* not loop; it is for allocation protection as just described. */
110 /* */
111 /* 3. Setting status in the context must always be the very last */
112 /* action in a routine, as non-0 status may raise a trap and hence */
113 /* the call to set status may not return (if the handler uses long */
114 /* jump). Therefore all cleanup must be done first. In general, */
115 /* to achieve this status is accumulated and is only applied just */
116 /* before return by calling decContextSetStatus (via decStatus). */
117 /* */
118 /* Routines which allocate storage cannot, in general, use the */
119 /* 'top level' routines which could cause a non-returning */
120 /* transfer of control. The decXxxxOp routines are safe (do not */
121 /* call decStatus even if traps are set in the context) and should */
122 /* be used instead (they are also a little faster). */
123 /* */
124 /* 4. Exponent checking is minimized by allowing the exponent to */
125 /* grow outside its limits during calculations, provided that */
126 /* the decFinalize function is called later. Multiplication and */
127 /* division, and intermediate calculations in exponentiation, */
128 /* require more careful checks because of the risk of 31-bit */
129 /* overflow (the most negative valid exponent is -1999999997, for */
130 /* a 999999999-digit number with adjusted exponent of -999999999). */
131 /* */
132 /* 5. Rounding is deferred until finalization of results, with any */
133 /* 'off to the right' data being represented as a single digit */
134 /* residue (in the range -1 through 9). This avoids any double- */
135 /* rounding when more than one shortening takes place (for */
136 /* example, when a result is subnormal). */
137 /* */
138 /* 6. The digits count is allowed to rise to a multiple of DECDPUN */
139 /* during many operations, so whole Units are handled and exact */
140 /* accounting of digits is not needed. The correct digits value */
141 /* is found by decGetDigits, which accounts for leading zeros. */
142 /* This must be called before any rounding if the number of digits */
143 /* is not known exactly. */
144 /* */
145 /* 7. The multiply-by-reciprocal 'trick' is used for partitioning */
146 /* numbers up to four digits, using appropriate constants. This */
147 /* is not useful for longer numbers because overflow of 32 bits */
148 /* would lead to 4 multiplies, which is almost as expensive as */
149 /* a divide (unless a floating-point or 64-bit multiply is */
150 /* assumed to be available). */
151 /* */
152 /* 8. Unusual abbreviations that may be used in the commentary: */
153 /* lhs -- left hand side (operand, of an operation) */
154 /* lsd -- least significant digit (of coefficient) */
155 /* lsu -- least significant Unit (of coefficient) */
156 /* msd -- most significant digit (of coefficient) */
157 /* msi -- most significant item (in an array) */
158 /* msu -- most significant Unit (of coefficient) */
159 /* rhs -- right hand side (operand, of an operation) */
160 /* +ve -- positive */
161 /* -ve -- negative */
162 /* ** -- raise to the power */
163 /* ------------------------------------------------------------------ */
165 #include <stdlib.h> // for malloc, free, etc.
166 #include <stdio.h> // for printf [if needed]
167 #include <string.h> // for strcpy
168 #include <ctype.h> // for lower
169 #include "decNumber.h" // base number library
170 #include "decNumberLocal.h" // decNumber local types, etc.
172 /* Constants */
173 // Public lookup table used by the D2U macro
174 const uByte d2utable[DECMAXD2U+1]=D2UTABLE;
176 #define DECVERB 1 // set to 1 for verbose DECCHECK
177 #define powers DECPOWERS // old internal name
179 // Local constants
180 #define DIVIDE 0x80 // Divide operators
181 #define REMAINDER 0x40 // ..
182 #define DIVIDEINT 0x20 // ..
183 #define REMNEAR 0x10 // ..
184 #define COMPARE 0x01 // Compare operators
185 #define COMPMAX 0x02 // ..
186 #define COMPMIN 0x03 // ..
187 #define COMPTOTAL 0x04 // ..
188 #define COMPNAN 0x05 // .. [NaN processing]
189 #define COMPSIG 0x06 // .. [signaling COMPARE]
190 #define COMPMAXMAG 0x07 // ..
191 #define COMPMINMAG 0x08 // ..
193 #define DEC_sNaN 0x40000000 // local status: sNaN signal
194 #define BADINT (Int)0x80000000 // most-negative Int; error indicator
195 // Next two indicate an integer >= 10**6, and its parity (bottom bit)
196 #define BIGEVEN (Int)0x80000002
197 #define BIGODD (Int)0x80000003
199 static Unit uarrone[1]={1}; // Unit array of 1, used for incrementing
201 /* Granularity-dependent code */
202 #if DECDPUN<=4
203 #define eInt Int // extended integer
204 #define ueInt uInt // unsigned extended integer
205 // Constant multipliers for divide-by-power-of five using reciprocal
206 // multiply, after removing powers of 2 by shifting, and final shift
207 // of 17 [we only need up to **4]
208 static const uInt multies[]={131073, 26215, 5243, 1049, 210};
209 // QUOT10 -- macro to return the quotient of unit u divided by 10**n
210 #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
211 #else
212 // For DECDPUN>4 non-ANSI-89 64-bit types are needed.
213 #if !DECUSE64
214 #error decNumber.c: DECUSE64 must be 1 when DECDPUN>4
215 #endif
216 #define eInt Long // extended integer
217 #define ueInt uLong // unsigned extended integer
218 #endif
220 /* Local routines */
221 static decNumber * decAddOp(decNumber *, const decNumber *, const decNumber *,
222 decContext *, uByte, uInt *);
223 static Flag decBiStr(const char *, const char *, const char *);
224 static uInt decCheckMath(const decNumber *, decContext *, uInt *);
225 static void decApplyRound(decNumber *, decContext *, Int, uInt *);
226 static Int decCompare(const decNumber *lhs, const decNumber *rhs, Flag);
227 static decNumber * decCompareOp(decNumber *, const decNumber *,
228 const decNumber *, decContext *,
229 Flag, uInt *);
230 static void decCopyFit(decNumber *, const decNumber *, decContext *,
231 Int *, uInt *);
232 static decNumber * decDecap(decNumber *, Int);
233 static decNumber * decDivideOp(decNumber *, const decNumber *,
234 const decNumber *, decContext *, Flag, uInt *);
235 static decNumber * decExpOp(decNumber *, const decNumber *,
236 decContext *, uInt *);
237 static void decFinalize(decNumber *, decContext *, Int *, uInt *);
238 static Int decGetDigits(Unit *, Int);
239 static Int decGetInt(const decNumber *);
240 static decNumber * decLnOp(decNumber *, const decNumber *,
241 decContext *, uInt *);
242 static decNumber * decMultiplyOp(decNumber *, const decNumber *,
243 const decNumber *, decContext *,
244 uInt *);
245 static decNumber * decNaNs(decNumber *, const decNumber *,
246 const decNumber *, decContext *, uInt *);
247 static decNumber * decQuantizeOp(decNumber *, const decNumber *,
248 const decNumber *, decContext *, Flag,
249 uInt *);
250 static void decReverse(Unit *, Unit *);
251 static void decSetCoeff(decNumber *, decContext *, const Unit *,
252 Int, Int *, uInt *);
253 static void decSetMaxValue(decNumber *, decContext *);
254 static void decSetOverflow(decNumber *, decContext *, uInt *);
255 static void decSetSubnormal(decNumber *, decContext *, Int *, uInt *);
256 static Int decShiftToLeast(Unit *, Int, Int);
257 static Int decShiftToMost(Unit *, Int, Int);
258 static void decStatus(decNumber *, uInt, decContext *);
259 static void decToString(const decNumber *, char[], Flag);
260 static decNumber * decTrim(decNumber *, decContext *, Flag, Flag, Int *);
261 static Int decUnitAddSub(const Unit *, Int, const Unit *, Int, Int,
262 Unit *, Int);
263 static Int decUnitCompare(const Unit *, Int, const Unit *, Int, Int);
265 #if !DECSUBSET
266 /* decFinish == decFinalize when no subset arithmetic needed */
267 #define decFinish(a,b,c,d) decFinalize(a,b,c,d)
268 #else
269 static void decFinish(decNumber *, decContext *, Int *, uInt *);
270 static decNumber * decRoundOperand(const decNumber *, decContext *, uInt *);
271 #endif
273 /* Local macros */
274 // masked special-values bits
275 #define SPECIALARG (rhs->bits & DECSPECIAL)
276 #define SPECIALARGS ((lhs->bits | rhs->bits) & DECSPECIAL)
278 /* Diagnostic macros, etc. */
279 #if DECALLOC
280 // Handle malloc/free accounting. If enabled, our accountable routines
281 // are used; otherwise the code just goes straight to the system malloc
282 // and free routines.
283 #define malloc(a) decMalloc(a)
284 #define free(a) decFree(a)
285 #define DECFENCE 0x5a // corruption detector
286 // 'Our' malloc and free:
287 static void *decMalloc(size_t);
288 static void decFree(void *);
289 uInt decAllocBytes=0; // count of bytes allocated
290 // Note that DECALLOC code only checks for storage buffer overflow.
291 // To check for memory leaks, the decAllocBytes variable must be
292 // checked to be 0 at appropriate times (e.g., after the test
293 // harness completes a set of tests). This checking may be unreliable
294 // if the testing is done in a multi-thread environment.
295 #endif
297 #if DECCHECK
298 // Optional checking routines. Enabling these means that decNumber
299 // and decContext operands to operator routines are checked for
300 // correctness. This roughly doubles the execution time of the
301 // fastest routines (and adds 600+ bytes), so should not normally be
302 // used in 'production'.
303 // decCheckInexact is used to check that inexact results have a full
304 // complement of digits (where appropriate -- this is not the case
305 // for Quantize, for example)
306 #define DECUNRESU ((decNumber *)(void *)0xffffffff)
307 #define DECUNUSED ((const decNumber *)(void *)0xffffffff)
308 #define DECUNCONT ((decContext *)(void *)(0xffffffff))
309 static Flag decCheckOperands(decNumber *, const decNumber *,
310 const decNumber *, decContext *);
311 static Flag decCheckNumber(const decNumber *);
312 static void decCheckInexact(const decNumber *, decContext *);
313 #endif
315 #if DECTRACE || DECCHECK
316 // Optional trace/debugging routines (may or may not be used)
317 void decNumberShow(const decNumber *); // displays the components of a number
318 static void decDumpAr(char, const Unit *, Int);
319 #endif
321 /* ================================================================== */
322 /* Conversions */
323 /* ================================================================== */
325 /* ------------------------------------------------------------------ */
326 /* from-int32 -- conversion from Int or uInt */
327 /* */
328 /* dn is the decNumber to receive the integer */
329 /* in or uin is the integer to be converted */
330 /* returns dn */
331 /* */
332 /* No error is possible. */
333 /* ------------------------------------------------------------------ */
334 decNumber * decNumberFromInt32(decNumber *dn, Int in) {
335 uInt unsig;
336 if (in>=0) unsig=in;
337 else { // negative (possibly BADINT)
338 if (in==BADINT) unsig=(uInt)1073741824*2; // special case
339 else unsig=-in; // invert
341 // in is now positive
342 decNumberFromUInt32(dn, unsig);
343 if (in<0) dn->bits=DECNEG; // sign needed
344 return dn;
345 } // decNumberFromInt32
347 decNumber * decNumberFromUInt32(decNumber *dn, uInt uin) {
348 Unit *up; // work pointer
349 decNumberZero(dn); // clean
350 if (uin==0) return dn; // [or decGetDigits bad call]
351 for (up=dn->lsu; uin>0; up++) {
352 *up=(Unit)(uin%(DECDPUNMAX+1));
353 uin=uin/(DECDPUNMAX+1);
355 dn->digits=decGetDigits(dn->lsu, up-dn->lsu);
356 return dn;
357 } // decNumberFromUInt32
359 /* ------------------------------------------------------------------ */
360 /* to-int32 -- conversion to Int or uInt */
361 /* */
362 /* dn is the decNumber to convert */
363 /* set is the context for reporting errors */
364 /* returns the converted decNumber, or 0 if Invalid is set */
365 /* */
366 /* Invalid is set if the decNumber does not have exponent==0 or if */
367 /* it is a NaN, Infinite, or out-of-range. */
368 /* ------------------------------------------------------------------ */
369 Int decNumberToInt32(const decNumber *dn, decContext *set) {
370 #if DECCHECK
371 if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
372 #endif
374 // special or too many digits, or bad exponent
375 if (dn->bits&DECSPECIAL || dn->digits>10 || dn->exponent!=0) ; // bad
376 else { // is a finite integer with 10 or fewer digits
377 Int d; // work
378 const Unit *up; // ..
379 uInt hi=0, lo; // ..
380 up=dn->lsu; // -> lsu
381 lo=*up; // get 1 to 9 digits
382 #if DECDPUN>1 // split to higher
383 hi=lo/10;
384 lo=lo%10;
385 #endif
386 up++;
387 // collect remaining Units, if any, into hi
388 for (d=DECDPUN; d<dn->digits; up++, d+=DECDPUN) hi+=*up*powers[d-1];
389 // now low has the lsd, hi the remainder
390 if (hi>214748364 || (hi==214748364 && lo>7)) { // out of range?
391 // most-negative is a reprieve
392 if (dn->bits&DECNEG && hi==214748364 && lo==8) return 0x80000000;
393 // bad -- drop through
395 else { // in-range always
396 Int i=X10(hi)+lo;
397 if (dn->bits&DECNEG) return -i;
398 return i;
400 } // integer
401 decContextSetStatus(set, DEC_Invalid_operation); // [may not return]
402 return 0;
403 } // decNumberToInt32
405 uInt decNumberToUInt32(const decNumber *dn, decContext *set) {
406 #if DECCHECK
407 if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
408 #endif
409 // special or too many digits, or bad exponent, or negative (<0)
410 if (dn->bits&DECSPECIAL || dn->digits>10 || dn->exponent!=0
411 || (dn->bits&DECNEG && !ISZERO(dn))); // bad
412 else { // is a finite integer with 10 or fewer digits
413 Int d; // work
414 const Unit *up; // ..
415 uInt hi=0, lo; // ..
416 up=dn->lsu; // -> lsu
417 lo=*up; // get 1 to 9 digits
418 #if DECDPUN>1 // split to higher
419 hi=lo/10;
420 lo=lo%10;
421 #endif
422 up++;
423 // collect remaining Units, if any, into hi
424 for (d=DECDPUN; d<dn->digits; up++, d+=DECDPUN) hi+=*up*powers[d-1];
426 // now low has the lsd, hi the remainder
427 if (hi>429496729 || (hi==429496729 && lo>5)) ; // no reprieve possible
428 else return X10(hi)+lo;
429 } // integer
430 decContextSetStatus(set, DEC_Invalid_operation); // [may not return]
431 return 0;
432 } // decNumberToUInt32
434 /* ------------------------------------------------------------------ */
435 /* to-scientific-string -- conversion to numeric string */
436 /* to-engineering-string -- conversion to numeric string */
437 /* */
438 /* decNumberToString(dn, string); */
439 /* decNumberToEngString(dn, string); */
440 /* */
441 /* dn is the decNumber to convert */
442 /* string is the string where the result will be laid out */
443 /* */
444 /* string must be at least dn->digits+14 characters long */
445 /* */
446 /* No error is possible, and no status can be set. */
447 /* ------------------------------------------------------------------ */
448 char * decNumberToString(const decNumber *dn, char *string){
449 decToString(dn, string, 0);
450 return string;
451 } // DecNumberToString
453 char * decNumberToEngString(const decNumber *dn, char *string){
454 decToString(dn, string, 1);
455 return string;
456 } // DecNumberToEngString
458 /* ------------------------------------------------------------------ */
459 /* to-number -- conversion from numeric string */
460 /* */
461 /* decNumberFromString -- convert string to decNumber */
462 /* dn -- the number structure to fill */
463 /* chars[] -- the string to convert ('\0' terminated) */
464 /* set -- the context used for processing any error, */
465 /* determining the maximum precision available */
466 /* (set.digits), determining the maximum and minimum */
467 /* exponent (set.emax and set.emin), determining if */
468 /* extended values are allowed, and checking the */
469 /* rounding mode if overflow occurs or rounding is */
470 /* needed. */
471 /* */
472 /* The length of the coefficient and the size of the exponent are */
473 /* checked by this routine, so the correct error (Underflow or */
474 /* Overflow) can be reported or rounding applied, as necessary. */
475 /* */
476 /* If bad syntax is detected, the result will be a quiet NaN. */
477 /* ------------------------------------------------------------------ */
478 decNumber * decNumberFromString(decNumber *dn, const char chars[],
479 decContext *set) {
480 Int exponent=0; // working exponent [assume 0]
481 uByte bits=0; // working flags [assume +ve]
482 Unit *res; // where result will be built
483 Unit resbuff[SD2U(DECBUFFER+9)];// local buffer in case need temporary
484 // [+9 allows for ln() constants]
485 Unit *allocres=NULL; // -> allocated result, iff allocated
486 Int d=0; // count of digits found in decimal part
487 const char *dotchar=NULL; // where dot was found
488 const char *cfirst=chars; // -> first character of decimal part
489 const char *last=NULL; // -> last digit of decimal part
490 const char *c; // work
491 Unit *up; // ..
492 #if DECDPUN>1
493 Int cut, out; // ..
494 #endif
495 Int residue; // rounding residue
496 uInt status=0; // error code
498 #if DECCHECK
499 if (decCheckOperands(DECUNRESU, DECUNUSED, DECUNUSED, set))
500 return decNumberZero(dn);
501 #endif
503 do { // status & malloc protection
504 for (c=chars;; c++) { // -> input character
505 if (*c>='0' && *c<='9') { // test for Arabic digit
506 last=c;
507 d++; // count of real digits
508 continue; // still in decimal part
510 if (*c=='.' && dotchar==NULL) { // first '.'
511 dotchar=c; // record offset into decimal part
512 if (c==cfirst) cfirst++; // first digit must follow
513 continue;}
514 if (c==chars) { // first in string...
515 if (*c=='-') { // valid - sign
516 cfirst++;
517 bits=DECNEG;
518 continue;}
519 if (*c=='+') { // valid + sign
520 cfirst++;
521 continue;}
523 // *c is not a digit, or a valid +, -, or '.'
524 break;
525 } // c
527 if (last==NULL) { // no digits yet
528 status=DEC_Conversion_syntax;// assume the worst
529 if (*c=='\0') break; // and no more to come...
530 #if DECSUBSET
531 // if subset then infinities and NaNs are not allowed
532 if (!set->extended) break; // hopeless
533 #endif
534 // Infinities and NaNs are possible, here
535 if (dotchar!=NULL) break; // .. unless had a dot
536 decNumberZero(dn); // be optimistic
537 if (decBiStr(c, "infinity", "INFINITY")
538 || decBiStr(c, "inf", "INF")) {
539 dn->bits=bits | DECINF;
540 status=0; // is OK
541 break; // all done
543 // a NaN expected
544 // 2003.09.10 NaNs are now permitted to have a sign
545 dn->bits=bits | DECNAN; // assume simple NaN
546 if (*c=='s' || *c=='S') { // looks like an sNaN
547 c++;
548 dn->bits=bits | DECSNAN;
550 if (*c!='n' && *c!='N') break; // check caseless "NaN"
551 c++;
552 if (*c!='a' && *c!='A') break; // ..
553 c++;
554 if (*c!='n' && *c!='N') break; // ..
555 c++;
556 // now either nothing, or nnnn payload, expected
557 // -> start of integer and skip leading 0s [including plain 0]
558 for (cfirst=c; *cfirst=='0';) cfirst++;
559 if (*cfirst=='\0') { // "NaN" or "sNaN", maybe with all 0s
560 status=0; // it's good
561 break; // ..
563 // something other than 0s; setup last and d as usual [no dots]
564 for (c=cfirst;; c++, d++) {
565 if (*c<'0' || *c>'9') break; // test for Arabic digit
566 last=c;
568 if (*c!='\0') break; // not all digits
569 if (d>set->digits-1) {
570 // [NB: payload in a decNumber can be full length unless
571 // clamped, in which case can only be digits-1]
572 if (set->clamp) break;
573 if (d>set->digits) break;
574 } // too many digits?
575 // good; drop through to convert the integer to coefficient
576 status=0; // syntax is OK
577 bits=dn->bits; // for copy-back
578 } // last==NULL
580 else if (*c!='\0') { // more to process...
581 // had some digits; exponent is only valid sequence now
582 Flag nege; // 1=negative exponent
583 const char *firstexp; // -> first significant exponent digit
584 status=DEC_Conversion_syntax;// assume the worst
585 if (*c!='e' && *c!='E') break;
586 /* Found 'e' or 'E' -- now process explicit exponent */
587 // 1998.07.11: sign no longer required
588 nege=0;
589 c++; // to (possible) sign
590 if (*c=='-') {nege=1; c++;}
591 else if (*c=='+') c++;
592 if (*c=='\0') break;
594 for (; *c=='0' && *(c+1)!='\0';) c++; // strip insignificant zeros
595 firstexp=c; // save exponent digit place
596 for (; ;c++) {
597 if (*c<'0' || *c>'9') break; // not a digit
598 exponent=X10(exponent)+(Int)*c-(Int)'0';
599 } // c
600 // if not now on a '\0', *c must not be a digit
601 if (*c!='\0') break;
603 // (this next test must be after the syntax checks)
604 // if it was too long the exponent may have wrapped, so check
605 // carefully and set it to a certain overflow if wrap possible
606 if (c>=firstexp+9+1) {
607 if (c>firstexp+9+1 || *firstexp>'1') exponent=DECNUMMAXE*2;
608 // [up to 1999999999 is OK, for example 1E-1000000998]
610 if (nege) exponent=-exponent; // was negative
611 status=0; // is OK
612 } // stuff after digits
614 // Here when whole string has been inspected; syntax is good
615 // cfirst->first digit (never dot), last->last digit (ditto)
617 // strip leading zeros/dot [leave final 0 if all 0's]
618 if (*cfirst=='0') { // [cfirst has stepped over .]
619 for (c=cfirst; c<last; c++, cfirst++) {
620 if (*c=='.') continue; // ignore dots
621 if (*c!='0') break; // non-zero found
622 d--; // 0 stripped
623 } // c
624 #if DECSUBSET
625 // make a rapid exit for easy zeros if !extended
626 if (*cfirst=='0' && !set->extended) {
627 decNumberZero(dn); // clean result
628 break; // [could be return]
630 #endif
631 } // at least one leading 0
633 // Handle decimal point...
634 if (dotchar!=NULL && dotchar<last) // non-trailing '.' found?
635 exponent-=(last-dotchar); // adjust exponent
636 // [we can now ignore the .]
638 // OK, the digits string is good. Assemble in the decNumber, or in
639 // a temporary units array if rounding is needed
640 if (d<=set->digits) res=dn->lsu; // fits into supplied decNumber
641 else { // rounding needed
642 Int needbytes=D2U(d)*sizeof(Unit);// bytes needed
643 res=resbuff; // assume use local buffer
644 if (needbytes>(Int)sizeof(resbuff)) { // too big for local
645 allocres=(Unit *)malloc(needbytes);
646 if (allocres==NULL) {status|=DEC_Insufficient_storage; break;}
647 res=allocres;
650 // res now -> number lsu, buffer, or allocated storage for Unit array
652 // Place the coefficient into the selected Unit array
653 // [this is often 70% of the cost of this function when DECDPUN>1]
654 #if DECDPUN>1
655 out=0; // accumulator
656 up=res+D2U(d)-1; // -> msu
657 cut=d-(up-res)*DECDPUN; // digits in top unit
658 for (c=cfirst;; c++) { // along the digits
659 if (*c=='.') continue; // ignore '.' [don't decrement cut]
660 out=X10(out)+(Int)*c-(Int)'0';
661 if (c==last) break; // done [never get to trailing '.']
662 cut--;
663 if (cut>0) continue; // more for this unit
664 *up=(Unit)out; // write unit
665 up--; // prepare for unit below..
666 cut=DECDPUN; // ..
667 out=0; // ..
668 } // c
669 *up=(Unit)out; // write lsu
671 #else
672 // DECDPUN==1
673 up=res; // -> lsu
674 for (c=last; c>=cfirst; c--) { // over each character, from least
675 if (*c=='.') continue; // ignore . [don't step up]
676 *up=(Unit)((Int)*c-(Int)'0');
677 up++;
678 } // c
679 #endif
681 dn->bits=bits;
682 dn->exponent=exponent;
683 dn->digits=d;
685 // if not in number (too long) shorten into the number
686 if (d>set->digits) {
687 residue=0;
688 decSetCoeff(dn, set, res, d, &residue, &status);
689 // always check for overflow or subnormal and round as needed
690 decFinalize(dn, set, &residue, &status);
692 else { // no rounding, but may still have overflow or subnormal
693 // [these tests are just for performance; finalize repeats them]
694 if ((dn->exponent-1<set->emin-dn->digits)
695 || (dn->exponent-1>set->emax-set->digits)) {
696 residue=0;
697 decFinalize(dn, set, &residue, &status);
700 // decNumberShow(dn);
701 } while(0); // [for break]
703 if (allocres!=NULL) free(allocres); // drop any storage used
704 if (status!=0) decStatus(dn, status, set);
705 return dn;
706 } /* decNumberFromString */
708 /* ================================================================== */
709 /* Operators */
710 /* ================================================================== */
712 /* ------------------------------------------------------------------ */
713 /* decNumberAbs -- absolute value operator */
714 /* */
715 /* This computes C = abs(A) */
716 /* */
717 /* res is C, the result. C may be A */
718 /* rhs is A */
719 /* set is the context */
720 /* */
721 /* See also decNumberCopyAbs for a quiet bitwise version of this. */
722 /* C must have space for set->digits digits. */
723 /* ------------------------------------------------------------------ */
724 /* This has the same effect as decNumberPlus unless A is negative, */
725 /* in which case it has the same effect as decNumberMinus. */
726 /* ------------------------------------------------------------------ */
727 decNumber * decNumberAbs(decNumber *res, const decNumber *rhs,
728 decContext *set) {
729 decNumber dzero; // for 0
730 uInt status=0; // accumulator
732 #if DECCHECK
733 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
734 #endif
736 decNumberZero(&dzero); // set 0
737 dzero.exponent=rhs->exponent; // [no coefficient expansion]
738 decAddOp(res, &dzero, rhs, set, (uByte)(rhs->bits & DECNEG), &status);
739 if (status!=0) decStatus(res, status, set);
740 #if DECCHECK
741 decCheckInexact(res, set);
742 #endif
743 return res;
744 } // decNumberAbs
746 /* ------------------------------------------------------------------ */
747 /* decNumberAdd -- add two Numbers */
748 /* */
749 /* This computes C = A + B */
750 /* */
751 /* res is C, the result. C may be A and/or B (e.g., X=X+X) */
752 /* lhs is A */
753 /* rhs is B */
754 /* set is the context */
755 /* */
756 /* C must have space for set->digits digits. */
757 /* ------------------------------------------------------------------ */
758 /* This just calls the routine shared with Subtract */
759 decNumber * decNumberAdd(decNumber *res, const decNumber *lhs,
760 const decNumber *rhs, decContext *set) {
761 uInt status=0; // accumulator
762 decAddOp(res, lhs, rhs, set, 0, &status);
763 if (status!=0) decStatus(res, status, set);
764 #if DECCHECK
765 decCheckInexact(res, set);
766 #endif
767 return res;
768 } // decNumberAdd
770 /* ------------------------------------------------------------------ */
771 /* decNumberAnd -- AND two Numbers, digitwise */
772 /* */
773 /* This computes C = A & B */
774 /* */
775 /* res is C, the result. C may be A and/or B (e.g., X=X&X) */
776 /* lhs is A */
777 /* rhs is B */
778 /* set is the context (used for result length and error report) */
779 /* */
780 /* C must have space for set->digits digits. */
781 /* */
782 /* Logical function restrictions apply (see above); a NaN is */
783 /* returned with Invalid_operation if a restriction is violated. */
784 /* ------------------------------------------------------------------ */
785 decNumber * decNumberAnd(decNumber *res, const decNumber *lhs,
786 const decNumber *rhs, decContext *set) {
787 const Unit *ua, *ub; // -> operands
788 const Unit *msua, *msub; // -> operand msus
789 Unit *uc, *msuc; // -> result and its msu
790 Int msudigs; // digits in res msu
791 #if DECCHECK
792 if (decCheckOperands(res, lhs, rhs, set)) return res;
793 #endif
795 if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
796 || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
797 decStatus(res, DEC_Invalid_operation, set);
798 return res;
801 // operands are valid
802 ua=lhs->lsu; // bottom-up
803 ub=rhs->lsu; // ..
804 uc=res->lsu; // ..
805 msua=ua+D2U(lhs->digits)-1; // -> msu of lhs
806 msub=ub+D2U(rhs->digits)-1; // -> msu of rhs
807 msuc=uc+D2U(set->digits)-1; // -> msu of result
808 msudigs=MSUDIGITS(set->digits); // [faster than remainder]
809 for (; uc<=msuc; ua++, ub++, uc++) { // Unit loop
810 Unit a, b; // extract units
811 if (ua>msua) a=0;
812 else a=*ua;
813 if (ub>msub) b=0;
814 else b=*ub;
815 *uc=0; // can now write back
816 if (a|b) { // maybe 1 bits to examine
817 Int i, j;
818 *uc=0; // can now write back
819 // This loop could be unrolled and/or use BIN2BCD tables
820 for (i=0; i<DECDPUN; i++) {
821 if (a&b&1) *uc=*uc+(Unit)powers[i]; // effect AND
822 j=a%10;
823 a=a/10;
824 j|=b%10;
825 b=b/10;
826 if (j>1) {
827 decStatus(res, DEC_Invalid_operation, set);
828 return res;
830 if (uc==msuc && i==msudigs-1) break; // just did final digit
831 } // each digit
832 } // both OK
833 } // each unit
834 // [here uc-1 is the msu of the result]
835 res->digits=decGetDigits(res->lsu, uc-res->lsu);
836 res->exponent=0; // integer
837 res->bits=0; // sign=0
838 return res; // [no status to set]
839 } // decNumberAnd
841 /* ------------------------------------------------------------------ */
842 /* decNumberCompare -- compare two Numbers */
843 /* */
844 /* This computes C = A ? B */
845 /* */
846 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
847 /* lhs is A */
848 /* rhs is B */
849 /* set is the context */
850 /* */
851 /* C must have space for one digit (or NaN). */
852 /* ------------------------------------------------------------------ */
853 decNumber * decNumberCompare(decNumber *res, const decNumber *lhs,
854 const decNumber *rhs, decContext *set) {
855 uInt status=0; // accumulator
856 decCompareOp(res, lhs, rhs, set, COMPARE, &status);
857 if (status!=0) decStatus(res, status, set);
858 return res;
859 } // decNumberCompare
861 /* ------------------------------------------------------------------ */
862 /* decNumberCompareSignal -- compare, signalling on all NaNs */
863 /* */
864 /* This computes C = A ? B */
865 /* */
866 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
867 /* lhs is A */
868 /* rhs is B */
869 /* set is the context */
870 /* */
871 /* C must have space for one digit (or NaN). */
872 /* ------------------------------------------------------------------ */
873 decNumber * decNumberCompareSignal(decNumber *res, const decNumber *lhs,
874 const decNumber *rhs, decContext *set) {
875 uInt status=0; // accumulator
876 decCompareOp(res, lhs, rhs, set, COMPSIG, &status);
877 if (status!=0) decStatus(res, status, set);
878 return res;
879 } // decNumberCompareSignal
881 /* ------------------------------------------------------------------ */
882 /* decNumberCompareTotal -- compare two Numbers, using total ordering */
883 /* */
884 /* This computes C = A ? B, under total ordering */
885 /* */
886 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
887 /* lhs is A */
888 /* rhs is B */
889 /* set is the context */
890 /* */
891 /* C must have space for one digit; the result will always be one of */
892 /* -1, 0, or 1. */
893 /* ------------------------------------------------------------------ */
894 decNumber * decNumberCompareTotal(decNumber *res, const decNumber *lhs,
895 const decNumber *rhs, decContext *set) {
896 uInt status=0; // accumulator
897 decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
898 if (status!=0) decStatus(res, status, set);
899 return res;
900 } // decNumberCompareTotal
902 /* ------------------------------------------------------------------ */
903 /* decNumberCompareTotalMag -- compare, total ordering of magnitudes */
904 /* */
905 /* This computes C = |A| ? |B|, under total ordering */
906 /* */
907 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
908 /* lhs is A */
909 /* rhs is B */
910 /* set is the context */
911 /* */
912 /* C must have space for one digit; the result will always be one of */
913 /* -1, 0, or 1. */
914 /* ------------------------------------------------------------------ */
915 decNumber * decNumberCompareTotalMag(decNumber *res, const decNumber *lhs,
916 const decNumber *rhs, decContext *set) {
917 uInt status=0; // accumulator
918 uInt needbytes; // for space calculations
919 decNumber bufa[D2N(DECBUFFER+1)];// +1 in case DECBUFFER=0
920 decNumber *allocbufa=NULL; // -> allocated bufa, iff allocated
921 decNumber bufb[D2N(DECBUFFER+1)];
922 decNumber *allocbufb=NULL; // -> allocated bufb, iff allocated
923 decNumber *a, *b; // temporary pointers
925 #if DECCHECK
926 if (decCheckOperands(res, lhs, rhs, set)) return res;
927 #endif
929 do { // protect allocated storage
930 // if either is negative, take a copy and absolute
931 if (decNumberIsNegative(lhs)) { // lhs<0
932 a=bufa;
933 needbytes=sizeof(decNumber)+(D2U(lhs->digits)-1)*sizeof(Unit);
934 if (needbytes>sizeof(bufa)) { // need malloc space
935 allocbufa=(decNumber *)malloc(needbytes);
936 if (allocbufa==NULL) { // hopeless -- abandon
937 status|=DEC_Insufficient_storage;
938 break;}
939 a=allocbufa; // use the allocated space
941 decNumberCopy(a, lhs); // copy content
942 a->bits&=~DECNEG; // .. and clear the sign
943 lhs=a; // use copy from here on
945 if (decNumberIsNegative(rhs)) { // rhs<0
946 b=bufb;
947 needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
948 if (needbytes>sizeof(bufb)) { // need malloc space
949 allocbufb=(decNumber *)malloc(needbytes);
950 if (allocbufb==NULL) { // hopeless -- abandon
951 status|=DEC_Insufficient_storage;
952 break;}
953 b=allocbufb; // use the allocated space
955 decNumberCopy(b, rhs); // copy content
956 b->bits&=~DECNEG; // .. and clear the sign
957 rhs=b; // use copy from here on
959 decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
960 } while(0); // end protected
962 if (allocbufa!=NULL) free(allocbufa); // drop any storage used
963 if (allocbufb!=NULL) free(allocbufb); // ..
964 if (status!=0) decStatus(res, status, set);
965 return res;
966 } // decNumberCompareTotalMag
968 /* ------------------------------------------------------------------ */
969 /* decNumberDivide -- divide one number by another */
970 /* */
971 /* This computes C = A / B */
972 /* */
973 /* res is C, the result. C may be A and/or B (e.g., X=X/X) */
974 /* lhs is A */
975 /* rhs is B */
976 /* set is the context */
977 /* */
978 /* C must have space for set->digits digits. */
979 /* ------------------------------------------------------------------ */
980 decNumber * decNumberDivide(decNumber *res, const decNumber *lhs,
981 const decNumber *rhs, decContext *set) {
982 uInt status=0; // accumulator
983 decDivideOp(res, lhs, rhs, set, DIVIDE, &status);
984 if (status!=0) decStatus(res, status, set);
985 #if DECCHECK
986 decCheckInexact(res, set);
987 #endif
988 return res;
989 } // decNumberDivide
991 /* ------------------------------------------------------------------ */
992 /* decNumberDivideInteger -- divide and return integer quotient */
993 /* */
994 /* This computes C = A # B, where # is the integer divide operator */
995 /* */
996 /* res is C, the result. C may be A and/or B (e.g., X=X#X) */
997 /* lhs is A */
998 /* rhs is B */
999 /* set is the context */
1000 /* */
1001 /* C must have space for set->digits digits. */
1002 /* ------------------------------------------------------------------ */
1003 decNumber * decNumberDivideInteger(decNumber *res, const decNumber *lhs,
1004 const decNumber *rhs, decContext *set) {
1005 uInt status=0; // accumulator
1006 decDivideOp(res, lhs, rhs, set, DIVIDEINT, &status);
1007 if (status!=0) decStatus(res, status, set);
1008 return res;
1009 } // decNumberDivideInteger
1011 /* ------------------------------------------------------------------ */
1012 /* decNumberExp -- exponentiation */
1013 /* */
1014 /* This computes C = exp(A) */
1015 /* */
1016 /* res is C, the result. C may be A */
1017 /* rhs is A */
1018 /* set is the context; note that rounding mode has no effect */
1019 /* */
1020 /* C must have space for set->digits digits. */
1021 /* */
1022 /* Mathematical function restrictions apply (see above); a NaN is */
1023 /* returned with Invalid_operation if a restriction is violated. */
1024 /* */
1025 /* Finite results will always be full precision and Inexact, except */
1026 /* when A is a zero or -Infinity (giving 1 or 0 respectively). */
1027 /* */
1028 /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will */
1029 /* almost always be correctly rounded, but may be up to 1 ulp in */
1030 /* error in rare cases. */
1031 /* ------------------------------------------------------------------ */
1032 /* This is a wrapper for decExpOp which can handle the slightly wider */
1033 /* (double) range needed by Ln (which has to be able to calculate */
1034 /* exp(-a) where a can be the tiniest number (Ntiny). */
1035 /* ------------------------------------------------------------------ */
1036 decNumber * decNumberExp(decNumber *res, const decNumber *rhs,
1037 decContext *set) {
1038 uInt status=0; // accumulator
1039 #if DECSUBSET
1040 decNumber *allocrhs=NULL; // non-NULL if rounded rhs allocated
1041 #endif
1043 #if DECCHECK
1044 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1045 #endif
1047 // Check restrictions; these restrictions ensure that if h=8 (see
1048 // decExpOp) then the result will either overflow or underflow to 0.
1049 // Other math functions restrict the input range, too, for inverses.
1050 // If not violated then carry out the operation.
1051 if (!decCheckMath(rhs, set, &status)) do { // protect allocation
1052 #if DECSUBSET
1053 if (!set->extended) {
1054 // reduce operand and set lostDigits status, as needed
1055 if (rhs->digits>set->digits) {
1056 allocrhs=decRoundOperand(rhs, set, &status);
1057 if (allocrhs==NULL) break;
1058 rhs=allocrhs;
1061 #endif
1062 decExpOp(res, rhs, set, &status);
1063 } while(0); // end protected
1065 #if DECSUBSET
1066 if (allocrhs !=NULL) free(allocrhs); // drop any storage used
1067 #endif
1068 // apply significant status
1069 if (status!=0) decStatus(res, status, set);
1070 #if DECCHECK
1071 decCheckInexact(res, set);
1072 #endif
1073 return res;
1074 } // decNumberExp
1076 /* ------------------------------------------------------------------ */
1077 /* decNumberFMA -- fused multiply add */
1078 /* */
1079 /* This computes D = (A * B) + C with only one rounding */
1080 /* */
1081 /* res is D, the result. D may be A or B or C (e.g., X=FMA(X,X,X)) */
1082 /* lhs is A */
1083 /* rhs is B */
1084 /* fhs is C [far hand side] */
1085 /* set is the context */
1086 /* */
1087 /* Mathematical function restrictions apply (see above); a NaN is */
1088 /* returned with Invalid_operation if a restriction is violated. */
1089 /* */
1090 /* C must have space for set->digits digits. */
1091 /* ------------------------------------------------------------------ */
1092 decNumber * decNumberFMA(decNumber *res, const decNumber *lhs,
1093 const decNumber *rhs, const decNumber *fhs,
1094 decContext *set) {
1095 uInt status=0; // accumulator
1096 decContext dcmul; // context for the multiplication
1097 uInt needbytes; // for space calculations
1098 decNumber bufa[D2N(DECBUFFER*2+1)];
1099 decNumber *allocbufa=NULL; // -> allocated bufa, iff allocated
1100 decNumber *acc; // accumulator pointer
1101 decNumber dzero; // work
1103 #if DECCHECK
1104 if (decCheckOperands(res, lhs, rhs, set)) return res;
1105 if (decCheckOperands(res, fhs, DECUNUSED, set)) return res;
1106 #endif
1108 do { // protect allocated storage
1109 #if DECSUBSET
1110 if (!set->extended) { // [undefined if subset]
1111 status|=DEC_Invalid_operation;
1112 break;}
1113 #endif
1114 // Check math restrictions [these ensure no overflow or underflow]
1115 if ((!decNumberIsSpecial(lhs) && decCheckMath(lhs, set, &status))
1116 || (!decNumberIsSpecial(rhs) && decCheckMath(rhs, set, &status))
1117 || (!decNumberIsSpecial(fhs) && decCheckMath(fhs, set, &status))) break;
1118 // set up context for multiply
1119 dcmul=*set;
1120 dcmul.digits=lhs->digits+rhs->digits; // just enough
1121 // [The above may be an over-estimate for subset arithmetic, but that's OK]
1122 dcmul.emax=DEC_MAX_EMAX; // effectively unbounded ..
1123 dcmul.emin=DEC_MIN_EMIN; // [thanks to Math restrictions]
1124 // set up decNumber space to receive the result of the multiply
1125 acc=bufa; // may fit
1126 needbytes=sizeof(decNumber)+(D2U(dcmul.digits)-1)*sizeof(Unit);
1127 if (needbytes>sizeof(bufa)) { // need malloc space
1128 allocbufa=(decNumber *)malloc(needbytes);
1129 if (allocbufa==NULL) { // hopeless -- abandon
1130 status|=DEC_Insufficient_storage;
1131 break;}
1132 acc=allocbufa; // use the allocated space
1134 // multiply with extended range and necessary precision
1135 //printf("emin=%ld\n", dcmul.emin);
1136 decMultiplyOp(acc, lhs, rhs, &dcmul, &status);
1137 // Only Invalid operation (from sNaN or Inf * 0) is possible in
1138 // status; if either is seen than ignore fhs (in case it is
1139 // another sNaN) and set acc to NaN unless we had an sNaN
1140 // [decMultiplyOp leaves that to caller]
1141 // Note sNaN has to go through addOp to shorten payload if
1142 // necessary
1143 if ((status&DEC_Invalid_operation)!=0) {
1144 if (!(status&DEC_sNaN)) { // but be true invalid
1145 decNumberZero(res); // acc not yet set
1146 res->bits=DECNAN;
1147 break;
1149 decNumberZero(&dzero); // make 0 (any non-NaN would do)
1150 fhs=&dzero; // use that
1152 #if DECCHECK
1153 else { // multiply was OK
1154 if (status!=0) printf("Status=%08lx after FMA multiply\n", (LI)status);
1156 #endif
1157 // add the third operand and result -> res, and all is done
1158 decAddOp(res, acc, fhs, set, 0, &status);
1159 } while(0); // end protected
1161 if (allocbufa!=NULL) free(allocbufa); // drop any storage used
1162 if (status!=0) decStatus(res, status, set);
1163 #if DECCHECK
1164 decCheckInexact(res, set);
1165 #endif
1166 return res;
1167 } // decNumberFMA
1169 /* ------------------------------------------------------------------ */
1170 /* decNumberInvert -- invert a Number, digitwise */
1171 /* */
1172 /* This computes C = ~A */
1173 /* */
1174 /* res is C, the result. C may be A (e.g., X=~X) */
1175 /* rhs is A */
1176 /* set is the context (used for result length and error report) */
1177 /* */
1178 /* C must have space for set->digits digits. */
1179 /* */
1180 /* Logical function restrictions apply (see above); a NaN is */
1181 /* returned with Invalid_operation if a restriction is violated. */
1182 /* ------------------------------------------------------------------ */
1183 decNumber * decNumberInvert(decNumber *res, const decNumber *rhs,
1184 decContext *set) {
1185 const Unit *ua, *msua; // -> operand and its msu
1186 Unit *uc, *msuc; // -> result and its msu
1187 Int msudigs; // digits in res msu
1188 #if DECCHECK
1189 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1190 #endif
1192 if (rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
1193 decStatus(res, DEC_Invalid_operation, set);
1194 return res;
1196 // operand is valid
1197 ua=rhs->lsu; // bottom-up
1198 uc=res->lsu; // ..
1199 msua=ua+D2U(rhs->digits)-1; // -> msu of rhs
1200 msuc=uc+D2U(set->digits)-1; // -> msu of result
1201 msudigs=MSUDIGITS(set->digits); // [faster than remainder]
1202 for (; uc<=msuc; ua++, uc++) { // Unit loop
1203 Unit a; // extract unit
1204 Int i, j; // work
1205 if (ua>msua) a=0;
1206 else a=*ua;
1207 *uc=0; // can now write back
1208 // always need to examine all bits in rhs
1209 // This loop could be unrolled and/or use BIN2BCD tables
1210 for (i=0; i<DECDPUN; i++) {
1211 if ((~a)&1) *uc=*uc+(Unit)powers[i]; // effect INVERT
1212 j=a%10;
1213 a=a/10;
1214 if (j>1) {
1215 decStatus(res, DEC_Invalid_operation, set);
1216 return res;
1218 if (uc==msuc && i==msudigs-1) break; // just did final digit
1219 } // each digit
1220 } // each unit
1221 // [here uc-1 is the msu of the result]
1222 res->digits=decGetDigits(res->lsu, uc-res->lsu);
1223 res->exponent=0; // integer
1224 res->bits=0; // sign=0
1225 return res; // [no status to set]
1226 } // decNumberInvert
1228 /* ------------------------------------------------------------------ */
1229 /* decNumberLn -- natural logarithm */
1230 /* */
1231 /* This computes C = ln(A) */
1232 /* */
1233 /* res is C, the result. C may be A */
1234 /* rhs is A */
1235 /* set is the context; note that rounding mode has no effect */
1236 /* */
1237 /* C must have space for set->digits digits. */
1238 /* */
1239 /* Notable cases: */
1240 /* A<0 -> Invalid */
1241 /* A=0 -> -Infinity (Exact) */
1242 /* A=+Infinity -> +Infinity (Exact) */
1243 /* A=1 exactly -> 0 (Exact) */
1244 /* */
1245 /* Mathematical function restrictions apply (see above); a NaN is */
1246 /* returned with Invalid_operation if a restriction is violated. */
1247 /* */
1248 /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will */
1249 /* almost always be correctly rounded, but may be up to 1 ulp in */
1250 /* error in rare cases. */
1251 /* ------------------------------------------------------------------ */
1252 /* This is a wrapper for decLnOp which can handle the slightly wider */
1253 /* (+11) range needed by Ln, Log10, etc. (which may have to be able */
1254 /* to calculate at p+e+2). */
1255 /* ------------------------------------------------------------------ */
1256 decNumber * decNumberLn(decNumber *res, const decNumber *rhs,
1257 decContext *set) {
1258 uInt status=0; // accumulator
1259 #if DECSUBSET
1260 decNumber *allocrhs=NULL; // non-NULL if rounded rhs allocated
1261 #endif
1263 #if DECCHECK
1264 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1265 #endif
1267 // Check restrictions; this is a math function; if not violated
1268 // then carry out the operation.
1269 if (!decCheckMath(rhs, set, &status)) do { // protect allocation
1270 #if DECSUBSET
1271 if (!set->extended) {
1272 // reduce operand and set lostDigits status, as needed
1273 if (rhs->digits>set->digits) {
1274 allocrhs=decRoundOperand(rhs, set, &status);
1275 if (allocrhs==NULL) break;
1276 rhs=allocrhs;
1278 // special check in subset for rhs=0
1279 if (ISZERO(rhs)) { // +/- zeros -> error
1280 status|=DEC_Invalid_operation;
1281 break;}
1282 } // extended=0
1283 #endif
1284 decLnOp(res, rhs, set, &status);
1285 } while(0); // end protected
1287 #if DECSUBSET
1288 if (allocrhs !=NULL) free(allocrhs); // drop any storage used
1289 #endif
1290 // apply significant status
1291 if (status!=0) decStatus(res, status, set);
1292 #if DECCHECK
1293 decCheckInexact(res, set);
1294 #endif
1295 return res;
1296 } // decNumberLn
1298 /* ------------------------------------------------------------------ */
1299 /* decNumberLogB - get adjusted exponent, by 754 rules */
1300 /* */
1301 /* This computes C = adjustedexponent(A) */
1302 /* */
1303 /* res is C, the result. C may be A */
1304 /* rhs is A */
1305 /* set is the context, used only for digits and status */
1306 /* */
1307 /* For an unrounded result, digits may need to be 10 (A might have */
1308 /* 10**9 digits and an exponent of +999999999, or one digit and an */
1309 /* exponent of -1999999999). */
1310 /* */
1311 /* This returns the adjusted exponent of A after (in theory) padding */
1312 /* with zeros on the right to set->digits digits while keeping the */
1313 /* same value. The exponent is not limited by emin/emax. */
1314 /* */
1315 /* Notable cases: */
1316 /* A<0 -> Use |A| */
1317 /* A=0 -> -Infinity (Division by zero) */
1318 /* A=Infinite -> +Infinity (Exact) */
1319 /* A=1 exactly -> 0 (Exact) */
1320 /* NaNs are propagated as usual */
1321 /* ------------------------------------------------------------------ */
1322 decNumber * decNumberLogB(decNumber *res, const decNumber *rhs,
1323 decContext *set) {
1324 uInt status=0; // accumulator
1326 #if DECCHECK
1327 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1328 #endif
1330 // NaNs as usual; Infinities return +Infinity; 0->oops
1331 if (decNumberIsNaN(rhs)) decNaNs(res, rhs, NULL, set, &status);
1332 else if (decNumberIsInfinite(rhs)) decNumberCopyAbs(res, rhs);
1333 else if (decNumberIsZero(rhs)) {
1334 decNumberZero(res); // prepare for Infinity
1335 res->bits=DECNEG|DECINF; // -Infinity
1336 status|=DEC_Division_by_zero; // as per 754
1338 else { // finite non-zero
1339 Int ae=rhs->exponent+rhs->digits-1; // adjusted exponent
1340 if (set->digits>=10) decNumberFromInt32(res, ae); // lay it out
1341 else {
1342 decNumber buft[D2N(10)]; // temporary number
1343 decNumber *t=buft; // ..
1344 decNumberFromInt32(t, ae); // lay it out
1345 decNumberPlus(res, t, set); // round as necessary
1349 if (status!=0) decStatus(res, status, set);
1350 return res;
1351 } // decNumberLogB
1353 /* ------------------------------------------------------------------ */
1354 /* decNumberLog10 -- logarithm in base 10 */
1355 /* */
1356 /* This computes C = log10(A) */
1357 /* */
1358 /* res is C, the result. C may be A */
1359 /* rhs is A */
1360 /* set is the context; note that rounding mode has no effect */
1361 /* */
1362 /* C must have space for set->digits digits. */
1363 /* */
1364 /* Notable cases: */
1365 /* A<0 -> Invalid */
1366 /* A=0 -> -Infinity (Exact) */
1367 /* A=+Infinity -> +Infinity (Exact) */
1368 /* A=10**n (if n is an integer) -> n (Exact) */
1369 /* */
1370 /* Mathematical function restrictions apply (see above); a NaN is */
1371 /* returned with Invalid_operation if a restriction is violated. */
1372 /* */
1373 /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will */
1374 /* almost always be correctly rounded, but may be up to 1 ulp in */
1375 /* error in rare cases. */
1376 /* ------------------------------------------------------------------ */
1377 /* This calculates ln(A)/ln(10) using appropriate precision. For */
1378 /* ln(A) this is the max(p, rhs->digits + t) + 3, where p is the */
1379 /* requested digits and t is the number of digits in the exponent */
1380 /* (maximum 6). For ln(10) it is p + 3; this is often handled by the */
1381 /* fastpath in decLnOp. The final division is done to the requested */
1382 /* precision. */
1383 /* ------------------------------------------------------------------ */
1384 decNumber * decNumberLog10(decNumber *res, const decNumber *rhs,
1385 decContext *set) {
1386 uInt status=0, ignore=0; // status accumulators
1387 uInt needbytes; // for space calculations
1388 Int p; // working precision
1389 Int t; // digits in exponent of A
1391 // buffers for a and b working decimals
1392 // (adjustment calculator, same size)
1393 decNumber bufa[D2N(DECBUFFER+2)];
1394 decNumber *allocbufa=NULL; // -> allocated bufa, iff allocated
1395 decNumber *a=bufa; // temporary a
1396 decNumber bufb[D2N(DECBUFFER+2)];
1397 decNumber *allocbufb=NULL; // -> allocated bufb, iff allocated
1398 decNumber *b=bufb; // temporary b
1399 decNumber bufw[D2N(10)]; // working 2-10 digit number
1400 decNumber *w=bufw; // ..
1401 #if DECSUBSET
1402 decNumber *allocrhs=NULL; // non-NULL if rounded rhs allocated
1403 #endif
1405 decContext aset; // working context
1407 #if DECCHECK
1408 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1409 #endif
1411 // Check restrictions; this is a math function; if not violated
1412 // then carry out the operation.
1413 if (!decCheckMath(rhs, set, &status)) do { // protect malloc
1414 #if DECSUBSET
1415 if (!set->extended) {
1416 // reduce operand and set lostDigits status, as needed
1417 if (rhs->digits>set->digits) {
1418 allocrhs=decRoundOperand(rhs, set, &status);
1419 if (allocrhs==NULL) break;
1420 rhs=allocrhs;
1422 // special check in subset for rhs=0
1423 if (ISZERO(rhs)) { // +/- zeros -> error
1424 status|=DEC_Invalid_operation;
1425 break;}
1426 } // extended=0
1427 #endif
1429 decContextDefault(&aset, DEC_INIT_DECIMAL64); // clean context
1431 // handle exact powers of 10; only check if +ve finite
1432 if (!(rhs->bits&(DECNEG|DECSPECIAL)) && !ISZERO(rhs)) {
1433 Int residue=0; // (no residue)
1434 uInt copystat=0; // clean status
1436 // round to a single digit...
1437 aset.digits=1;
1438 decCopyFit(w, rhs, &aset, &residue, &copystat); // copy & shorten
1439 // if exact and the digit is 1, rhs is a power of 10
1440 if (!(copystat&DEC_Inexact) && w->lsu[0]==1) {
1441 // the exponent, conveniently, is the power of 10; making
1442 // this the result needs a little care as it might not fit,
1443 // so first convert it into the working number, and then move
1444 // to res
1445 decNumberFromInt32(w, w->exponent);
1446 residue=0;
1447 decCopyFit(res, w, set, &residue, &status); // copy & round
1448 decFinish(res, set, &residue, &status); // cleanup/set flags
1449 break;
1450 } // not a power of 10
1451 } // not a candidate for exact
1453 // simplify the information-content calculation to use 'total
1454 // number of digits in a, including exponent' as compared to the
1455 // requested digits, as increasing this will only rarely cost an
1456 // iteration in ln(a) anyway
1457 t=6; // it can never be >6
1459 // allocate space when needed...
1460 p=(rhs->digits+t>set->digits?rhs->digits+t:set->digits)+3;
1461 needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
1462 if (needbytes>sizeof(bufa)) { // need malloc space
1463 allocbufa=(decNumber *)malloc(needbytes);
1464 if (allocbufa==NULL) { // hopeless -- abandon
1465 status|=DEC_Insufficient_storage;
1466 break;}
1467 a=allocbufa; // use the allocated space
1469 aset.digits=p; // as calculated
1470 aset.emax=DEC_MAX_MATH; // usual bounds
1471 aset.emin=-DEC_MAX_MATH; // ..
1472 aset.clamp=0; // and no concrete format
1473 decLnOp(a, rhs, &aset, &status); // a=ln(rhs)
1475 // skip the division if the result so far is infinite, NaN, or
1476 // zero, or there was an error; note NaN from sNaN needs copy
1477 if (status&DEC_NaNs && !(status&DEC_sNaN)) break;
1478 if (a->bits&DECSPECIAL || ISZERO(a)) {
1479 decNumberCopy(res, a); // [will fit]
1480 break;}
1482 // for ln(10) an extra 3 digits of precision are needed
1483 p=set->digits+3;
1484 needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
1485 if (needbytes>sizeof(bufb)) { // need malloc space
1486 allocbufb=(decNumber *)malloc(needbytes);
1487 if (allocbufb==NULL) { // hopeless -- abandon
1488 status|=DEC_Insufficient_storage;
1489 break;}
1490 b=allocbufb; // use the allocated space
1492 decNumberZero(w); // set up 10...
1493 #if DECDPUN==1
1494 w->lsu[1]=1; w->lsu[0]=0; // ..
1495 #else
1496 w->lsu[0]=10; // ..
1497 #endif
1498 w->digits=2; // ..
1500 aset.digits=p;
1501 decLnOp(b, w, &aset, &ignore); // b=ln(10)
1503 aset.digits=set->digits; // for final divide
1504 decDivideOp(res, a, b, &aset, DIVIDE, &status); // into result
1505 } while(0); // [for break]
1507 if (allocbufa!=NULL) free(allocbufa); // drop any storage used
1508 if (allocbufb!=NULL) free(allocbufb); // ..
1509 #if DECSUBSET
1510 if (allocrhs !=NULL) free(allocrhs); // ..
1511 #endif
1512 // apply significant status
1513 if (status!=0) decStatus(res, status, set);
1514 #if DECCHECK
1515 decCheckInexact(res, set);
1516 #endif
1517 return res;
1518 } // decNumberLog10
1520 /* ------------------------------------------------------------------ */
1521 /* decNumberMax -- compare two Numbers and return the maximum */
1522 /* */
1523 /* This computes C = A ? B, returning the maximum by 754 rules */
1524 /* */
1525 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
1526 /* lhs is A */
1527 /* rhs is B */
1528 /* set is the context */
1529 /* */
1530 /* C must have space for set->digits digits. */
1531 /* ------------------------------------------------------------------ */
1532 decNumber * decNumberMax(decNumber *res, const decNumber *lhs,
1533 const decNumber *rhs, decContext *set) {
1534 uInt status=0; // accumulator
1535 decCompareOp(res, lhs, rhs, set, COMPMAX, &status);
1536 if (status!=0) decStatus(res, status, set);
1537 #if DECCHECK
1538 decCheckInexact(res, set);
1539 #endif
1540 return res;
1541 } // decNumberMax
1543 /* ------------------------------------------------------------------ */
1544 /* decNumberMaxMag -- compare and return the maximum by magnitude */
1545 /* */
1546 /* This computes C = A ? B, returning the maximum by 754 rules */
1547 /* */
1548 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
1549 /* lhs is A */
1550 /* rhs is B */
1551 /* set is the context */
1552 /* */
1553 /* C must have space for set->digits digits. */
1554 /* ------------------------------------------------------------------ */
1555 decNumber * decNumberMaxMag(decNumber *res, const decNumber *lhs,
1556 const decNumber *rhs, decContext *set) {
1557 uInt status=0; // accumulator
1558 decCompareOp(res, lhs, rhs, set, COMPMAXMAG, &status);
1559 if (status!=0) decStatus(res, status, set);
1560 #if DECCHECK
1561 decCheckInexact(res, set);
1562 #endif
1563 return res;
1564 } // decNumberMaxMag
1566 /* ------------------------------------------------------------------ */
1567 /* decNumberMin -- compare two Numbers and return the minimum */
1568 /* */
1569 /* This computes C = A ? B, returning the minimum by 754 rules */
1570 /* */
1571 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
1572 /* lhs is A */
1573 /* rhs is B */
1574 /* set is the context */
1575 /* */
1576 /* C must have space for set->digits digits. */
1577 /* ------------------------------------------------------------------ */
1578 decNumber * decNumberMin(decNumber *res, const decNumber *lhs,
1579 const decNumber *rhs, decContext *set) {
1580 uInt status=0; // accumulator
1581 decCompareOp(res, lhs, rhs, set, COMPMIN, &status);
1582 if (status!=0) decStatus(res, status, set);
1583 #if DECCHECK
1584 decCheckInexact(res, set);
1585 #endif
1586 return res;
1587 } // decNumberMin
1589 /* ------------------------------------------------------------------ */
1590 /* decNumberMinMag -- compare and return the minimum by magnitude */
1591 /* */
1592 /* This computes C = A ? B, returning the minimum by 754 rules */
1593 /* */
1594 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
1595 /* lhs is A */
1596 /* rhs is B */
1597 /* set is the context */
1598 /* */
1599 /* C must have space for set->digits digits. */
1600 /* ------------------------------------------------------------------ */
1601 decNumber * decNumberMinMag(decNumber *res, const decNumber *lhs,
1602 const decNumber *rhs, decContext *set) {
1603 uInt status=0; // accumulator
1604 decCompareOp(res, lhs, rhs, set, COMPMINMAG, &status);
1605 if (status!=0) decStatus(res, status, set);
1606 #if DECCHECK
1607 decCheckInexact(res, set);
1608 #endif
1609 return res;
1610 } // decNumberMinMag
1612 /* ------------------------------------------------------------------ */
1613 /* decNumberMinus -- prefix minus operator */
1614 /* */
1615 /* This computes C = 0 - A */
1616 /* */
1617 /* res is C, the result. C may be A */
1618 /* rhs is A */
1619 /* set is the context */
1620 /* */
1621 /* See also decNumberCopyNegate for a quiet bitwise version of this. */
1622 /* C must have space for set->digits digits. */
1623 /* ------------------------------------------------------------------ */
1624 /* Simply use AddOp for the subtract, which will do the necessary. */
1625 /* ------------------------------------------------------------------ */
1626 decNumber * decNumberMinus(decNumber *res, const decNumber *rhs,
1627 decContext *set) {
1628 decNumber dzero;
1629 uInt status=0; // accumulator
1631 #if DECCHECK
1632 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1633 #endif
1635 decNumberZero(&dzero); // make 0
1636 dzero.exponent=rhs->exponent; // [no coefficient expansion]
1637 decAddOp(res, &dzero, rhs, set, DECNEG, &status);
1638 if (status!=0) decStatus(res, status, set);
1639 #if DECCHECK
1640 decCheckInexact(res, set);
1641 #endif
1642 return res;
1643 } // decNumberMinus
1645 /* ------------------------------------------------------------------ */
1646 /* decNumberNextMinus -- next towards -Infinity */
1647 /* */
1648 /* This computes C = A - infinitesimal, rounded towards -Infinity */
1649 /* */
1650 /* res is C, the result. C may be A */
1651 /* rhs is A */
1652 /* set is the context */
1653 /* */
1654 /* This is a generalization of 754 NextDown. */
1655 /* ------------------------------------------------------------------ */
1656 decNumber * decNumberNextMinus(decNumber *res, const decNumber *rhs,
1657 decContext *set) {
1658 decNumber dtiny; // constant
1659 decContext workset=*set; // work
1660 uInt status=0; // accumulator
1661 #if DECCHECK
1662 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1663 #endif
1665 // +Infinity is the special case
1666 if ((rhs->bits&(DECINF|DECNEG))==DECINF) {
1667 decSetMaxValue(res, set); // is +ve
1668 // there is no status to set
1669 return res;
1671 decNumberZero(&dtiny); // start with 0
1672 dtiny.lsu[0]=1; // make number that is ..
1673 dtiny.exponent=DEC_MIN_EMIN-1; // .. smaller than tiniest
1674 workset.round=DEC_ROUND_FLOOR;
1675 decAddOp(res, rhs, &dtiny, &workset, DECNEG, &status);
1676 status&=DEC_Invalid_operation|DEC_sNaN; // only sNaN Invalid please
1677 if (status!=0) decStatus(res, status, set);
1678 return res;
1679 } // decNumberNextMinus
1681 /* ------------------------------------------------------------------ */
1682 /* decNumberNextPlus -- next towards +Infinity */
1683 /* */
1684 /* This computes C = A + infinitesimal, rounded towards +Infinity */
1685 /* */
1686 /* res is C, the result. C may be A */
1687 /* rhs is A */
1688 /* set is the context */
1689 /* */
1690 /* This is a generalization of 754 NextUp. */
1691 /* ------------------------------------------------------------------ */
1692 decNumber * decNumberNextPlus(decNumber *res, const decNumber *rhs,
1693 decContext *set) {
1694 decNumber dtiny; // constant
1695 decContext workset=*set; // work
1696 uInt status=0; // accumulator
1697 #if DECCHECK
1698 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1699 #endif
1701 // -Infinity is the special case
1702 if ((rhs->bits&(DECINF|DECNEG))==(DECINF|DECNEG)) {
1703 decSetMaxValue(res, set);
1704 res->bits=DECNEG; // negative
1705 // there is no status to set
1706 return res;
1708 decNumberZero(&dtiny); // start with 0
1709 dtiny.lsu[0]=1; // make number that is ..
1710 dtiny.exponent=DEC_MIN_EMIN-1; // .. smaller than tiniest
1711 workset.round=DEC_ROUND_CEILING;
1712 decAddOp(res, rhs, &dtiny, &workset, 0, &status);
1713 status&=DEC_Invalid_operation|DEC_sNaN; // only sNaN Invalid please
1714 if (status!=0) decStatus(res, status, set);
1715 return res;
1716 } // decNumberNextPlus
1718 /* ------------------------------------------------------------------ */
1719 /* decNumberNextToward -- next towards rhs */
1720 /* */
1721 /* This computes C = A +/- infinitesimal, rounded towards */
1722 /* +/-Infinity in the direction of B, as per 754-1985 nextafter */
1723 /* modified during revision but dropped from 754-2008. */
1724 /* */
1725 /* res is C, the result. C may be A or B. */
1726 /* lhs is A */
1727 /* rhs is B */
1728 /* set is the context */
1729 /* */
1730 /* This is a generalization of 754-1985 NextAfter. */
1731 /* ------------------------------------------------------------------ */
1732 decNumber * decNumberNextToward(decNumber *res, const decNumber *lhs,
1733 const decNumber *rhs, decContext *set) {
1734 decNumber dtiny; // constant
1735 decContext workset=*set; // work
1736 Int result; // ..
1737 uInt status=0; // accumulator
1738 #if DECCHECK
1739 if (decCheckOperands(res, lhs, rhs, set)) return res;
1740 #endif
1742 if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs)) {
1743 decNaNs(res, lhs, rhs, set, &status);
1745 else { // Is numeric, so no chance of sNaN Invalid, etc.
1746 result=decCompare(lhs, rhs, 0); // sign matters
1747 if (result==BADINT) status|=DEC_Insufficient_storage; // rare
1748 else { // valid compare
1749 if (result==0) decNumberCopySign(res, lhs, rhs); // easy
1750 else { // differ: need NextPlus or NextMinus
1751 uByte sub; // add or subtract
1752 if (result<0) { // lhs<rhs, do nextplus
1753 // -Infinity is the special case
1754 if ((lhs->bits&(DECINF|DECNEG))==(DECINF|DECNEG)) {
1755 decSetMaxValue(res, set);
1756 res->bits=DECNEG; // negative
1757 return res; // there is no status to set
1759 workset.round=DEC_ROUND_CEILING;
1760 sub=0; // add, please
1761 } // plus
1762 else { // lhs>rhs, do nextminus
1763 // +Infinity is the special case
1764 if ((lhs->bits&(DECINF|DECNEG))==DECINF) {
1765 decSetMaxValue(res, set);
1766 return res; // there is no status to set
1768 workset.round=DEC_ROUND_FLOOR;
1769 sub=DECNEG; // subtract, please
1770 } // minus
1771 decNumberZero(&dtiny); // start with 0
1772 dtiny.lsu[0]=1; // make number that is ..
1773 dtiny.exponent=DEC_MIN_EMIN-1; // .. smaller than tiniest
1774 decAddOp(res, lhs, &dtiny, &workset, sub, &status); // + or -
1775 // turn off exceptions if the result is a normal number
1776 // (including Nmin), otherwise let all status through
1777 if (decNumberIsNormal(res, set)) status=0;
1778 } // unequal
1779 } // compare OK
1780 } // numeric
1781 if (status!=0) decStatus(res, status, set);
1782 return res;
1783 } // decNumberNextToward
1785 /* ------------------------------------------------------------------ */
1786 /* decNumberOr -- OR two Numbers, digitwise */
1787 /* */
1788 /* This computes C = A | B */
1789 /* */
1790 /* res is C, the result. C may be A and/or B (e.g., X=X|X) */
1791 /* lhs is A */
1792 /* rhs is B */
1793 /* set is the context (used for result length and error report) */
1794 /* */
1795 /* C must have space for set->digits digits. */
1796 /* */
1797 /* Logical function restrictions apply (see above); a NaN is */
1798 /* returned with Invalid_operation if a restriction is violated. */
1799 /* ------------------------------------------------------------------ */
1800 decNumber * decNumberOr(decNumber *res, const decNumber *lhs,
1801 const decNumber *rhs, decContext *set) {
1802 const Unit *ua, *ub; // -> operands
1803 const Unit *msua, *msub; // -> operand msus
1804 Unit *uc, *msuc; // -> result and its msu
1805 Int msudigs; // digits in res msu
1806 #if DECCHECK
1807 if (decCheckOperands(res, lhs, rhs, set)) return res;
1808 #endif
1810 if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
1811 || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
1812 decStatus(res, DEC_Invalid_operation, set);
1813 return res;
1815 // operands are valid
1816 ua=lhs->lsu; // bottom-up
1817 ub=rhs->lsu; // ..
1818 uc=res->lsu; // ..
1819 msua=ua+D2U(lhs->digits)-1; // -> msu of lhs
1820 msub=ub+D2U(rhs->digits)-1; // -> msu of rhs
1821 msuc=uc+D2U(set->digits)-1; // -> msu of result
1822 msudigs=MSUDIGITS(set->digits); // [faster than remainder]
1823 for (; uc<=msuc; ua++, ub++, uc++) { // Unit loop
1824 Unit a, b; // extract units
1825 if (ua>msua) a=0;
1826 else a=*ua;
1827 if (ub>msub) b=0;
1828 else b=*ub;
1829 *uc=0; // can now write back
1830 if (a|b) { // maybe 1 bits to examine
1831 Int i, j;
1832 // This loop could be unrolled and/or use BIN2BCD tables
1833 for (i=0; i<DECDPUN; i++) {
1834 if ((a|b)&1) *uc=*uc+(Unit)powers[i]; // effect OR
1835 j=a%10;
1836 a=a/10;
1837 j|=b%10;
1838 b=b/10;
1839 if (j>1) {
1840 decStatus(res, DEC_Invalid_operation, set);
1841 return res;
1843 if (uc==msuc && i==msudigs-1) break; // just did final digit
1844 } // each digit
1845 } // non-zero
1846 } // each unit
1847 // [here uc-1 is the msu of the result]
1848 res->digits=decGetDigits(res->lsu, uc-res->lsu);
1849 res->exponent=0; // integer
1850 res->bits=0; // sign=0
1851 return res; // [no status to set]
1852 } // decNumberOr
1854 /* ------------------------------------------------------------------ */
1855 /* decNumberPlus -- prefix plus operator */
1856 /* */
1857 /* This computes C = 0 + A */
1858 /* */
1859 /* res is C, the result. C may be A */
1860 /* rhs is A */
1861 /* set is the context */
1862 /* */
1863 /* See also decNumberCopy for a quiet bitwise version of this. */
1864 /* C must have space for set->digits digits. */
1865 /* ------------------------------------------------------------------ */
1866 /* This simply uses AddOp; Add will take fast path after preparing A. */
1867 /* Performance is a concern here, as this routine is often used to */
1868 /* check operands and apply rounding and overflow/underflow testing. */
1869 /* ------------------------------------------------------------------ */
1870 decNumber * decNumberPlus(decNumber *res, const decNumber *rhs,
1871 decContext *set) {
1872 decNumber dzero;
1873 uInt status=0; // accumulator
1874 #if DECCHECK
1875 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1876 #endif
1878 decNumberZero(&dzero); // make 0
1879 dzero.exponent=rhs->exponent; // [no coefficient expansion]
1880 decAddOp(res, &dzero, rhs, set, 0, &status);
1881 if (status!=0) decStatus(res, status, set);
1882 #if DECCHECK
1883 decCheckInexact(res, set);
1884 #endif
1885 return res;
1886 } // decNumberPlus
1888 /* ------------------------------------------------------------------ */
1889 /* decNumberMultiply -- multiply two Numbers */
1890 /* */
1891 /* This computes C = A x B */
1892 /* */
1893 /* res is C, the result. C may be A and/or B (e.g., X=X+X) */
1894 /* lhs is A */
1895 /* rhs is B */
1896 /* set is the context */
1897 /* */
1898 /* C must have space for set->digits digits. */
1899 /* ------------------------------------------------------------------ */
1900 decNumber * decNumberMultiply(decNumber *res, const decNumber *lhs,
1901 const decNumber *rhs, decContext *set) {
1902 uInt status=0; // accumulator
1903 decMultiplyOp(res, lhs, rhs, set, &status);
1904 if (status!=0) decStatus(res, status, set);
1905 #if DECCHECK
1906 decCheckInexact(res, set);
1907 #endif
1908 return res;
1909 } // decNumberMultiply
1911 /* ------------------------------------------------------------------ */
1912 /* decNumberPower -- raise a number to a power */
1913 /* */
1914 /* This computes C = A ** B */
1915 /* */
1916 /* res is C, the result. C may be A and/or B (e.g., X=X**X) */
1917 /* lhs is A */
1918 /* rhs is B */
1919 /* set is the context */
1920 /* */
1921 /* C must have space for set->digits digits. */
1922 /* */
1923 /* Mathematical function restrictions apply (see above); a NaN is */
1924 /* returned with Invalid_operation if a restriction is violated. */
1925 /* */
1926 /* However, if 1999999997<=B<=999999999 and B is an integer then the */
1927 /* restrictions on A and the context are relaxed to the usual bounds, */
1928 /* for compatibility with the earlier (integer power only) version */
1929 /* of this function. */
1930 /* */
1931 /* When B is an integer, the result may be exact, even if rounded. */
1932 /* */
1933 /* The final result is rounded according to the context; it will */
1934 /* almost always be correctly rounded, but may be up to 1 ulp in */
1935 /* error in rare cases. */
1936 /* ------------------------------------------------------------------ */
1937 decNumber * decNumberPower(decNumber *res, const decNumber *lhs,
1938 const decNumber *rhs, decContext *set) {
1939 #if DECSUBSET
1940 decNumber *alloclhs=NULL; // non-NULL if rounded lhs allocated
1941 decNumber *allocrhs=NULL; // .., rhs
1942 #endif
1943 decNumber *allocdac=NULL; // -> allocated acc buffer, iff used
1944 decNumber *allocinv=NULL; // -> allocated 1/x buffer, iff used
1945 Int reqdigits=set->digits; // requested DIGITS
1946 Int n; // rhs in binary
1947 Flag rhsint=0; // 1 if rhs is an integer
1948 Flag useint=0; // 1 if can use integer calculation
1949 Flag isoddint=0; // 1 if rhs is an integer and odd
1950 Int i; // work
1951 #if DECSUBSET
1952 Int dropped; // ..
1953 #endif
1954 uInt needbytes; // buffer size needed
1955 Flag seenbit; // seen a bit while powering
1956 Int residue=0; // rounding residue
1957 uInt status=0; // accumulators
1958 uByte bits=0; // result sign if errors
1959 decContext aset; // working context
1960 decNumber dnOne; // work value 1...
1961 // local accumulator buffer [a decNumber, with digits+elength+1 digits]
1962 decNumber dacbuff[D2N(DECBUFFER+9)];
1963 decNumber *dac=dacbuff; // -> result accumulator
1964 // same again for possible 1/lhs calculation
1965 decNumber invbuff[D2N(DECBUFFER+9)];
1967 #if DECCHECK
1968 if (decCheckOperands(res, lhs, rhs, set)) return res;
1969 #endif
1971 do { // protect allocated storage
1972 #if DECSUBSET
1973 if (!set->extended) { // reduce operands and set status, as needed
1974 if (lhs->digits>reqdigits) {
1975 alloclhs=decRoundOperand(lhs, set, &status);
1976 if (alloclhs==NULL) break;
1977 lhs=alloclhs;
1979 if (rhs->digits>reqdigits) {
1980 allocrhs=decRoundOperand(rhs, set, &status);
1981 if (allocrhs==NULL) break;
1982 rhs=allocrhs;
1985 #endif
1986 // [following code does not require input rounding]
1988 // handle NaNs and rhs Infinity (lhs infinity is harder)
1989 if (SPECIALARGS) {
1990 if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs)) { // NaNs
1991 decNaNs(res, lhs, rhs, set, &status);
1992 break;}
1993 if (decNumberIsInfinite(rhs)) { // rhs Infinity
1994 Flag rhsneg=rhs->bits&DECNEG; // save rhs sign
1995 if (decNumberIsNegative(lhs) // lhs<0
1996 && !decNumberIsZero(lhs)) // ..
1997 status|=DEC_Invalid_operation;
1998 else { // lhs >=0
1999 decNumberZero(&dnOne); // set up 1
2000 dnOne.lsu[0]=1;
2001 decNumberCompare(dac, lhs, &dnOne, set); // lhs ? 1
2002 decNumberZero(res); // prepare for 0/1/Infinity
2003 if (decNumberIsNegative(dac)) { // lhs<1
2004 if (rhsneg) res->bits|=DECINF; // +Infinity [else is +0]
2006 else if (dac->lsu[0]==0) { // lhs=1
2007 // 1**Infinity is inexact, so return fully-padded 1.0000
2008 Int shift=set->digits-1;
2009 *res->lsu=1; // was 0, make int 1
2010 res->digits=decShiftToMost(res->lsu, 1, shift);
2011 res->exponent=-shift; // make 1.0000...
2012 status|=DEC_Inexact|DEC_Rounded; // deemed inexact
2014 else { // lhs>1
2015 if (!rhsneg) res->bits|=DECINF; // +Infinity [else is +0]
2017 } // lhs>=0
2018 break;}
2019 // [lhs infinity drops through]
2020 } // specials
2022 // Original rhs may be an integer that fits and is in range
2023 n=decGetInt(rhs);
2024 if (n!=BADINT) { // it is an integer
2025 rhsint=1; // record the fact for 1**n
2026 isoddint=(Flag)n&1; // [works even if big]
2027 if (n!=BIGEVEN && n!=BIGODD) // can use integer path?
2028 useint=1; // looks good
2031 if (decNumberIsNegative(lhs) // -x ..
2032 && isoddint) bits=DECNEG; // .. to an odd power
2034 // handle LHS infinity
2035 if (decNumberIsInfinite(lhs)) { // [NaNs already handled]
2036 uByte rbits=rhs->bits; // save
2037 decNumberZero(res); // prepare
2038 if (n==0) *res->lsu=1; // [-]Inf**0 => 1
2039 else {
2040 // -Inf**nonint -> error
2041 if (!rhsint && decNumberIsNegative(lhs)) {
2042 status|=DEC_Invalid_operation; // -Inf**nonint is error
2043 break;}
2044 if (!(rbits & DECNEG)) bits|=DECINF; // was not a **-n
2045 // [otherwise will be 0 or -0]
2046 res->bits=bits;
2048 break;}
2050 // similarly handle LHS zero
2051 if (decNumberIsZero(lhs)) {
2052 if (n==0) { // 0**0 => Error
2053 #if DECSUBSET
2054 if (!set->extended) { // [unless subset]
2055 decNumberZero(res);
2056 *res->lsu=1; // return 1
2057 break;}
2058 #endif
2059 status|=DEC_Invalid_operation;
2061 else { // 0**x
2062 uByte rbits=rhs->bits; // save
2063 if (rbits & DECNEG) { // was a 0**(-n)
2064 #if DECSUBSET
2065 if (!set->extended) { // [bad if subset]
2066 status|=DEC_Invalid_operation;
2067 break;}
2068 #endif
2069 bits|=DECINF;
2071 decNumberZero(res); // prepare
2072 // [otherwise will be 0 or -0]
2073 res->bits=bits;
2075 break;}
2077 // here both lhs and rhs are finite; rhs==0 is handled in the
2078 // integer path. Next handle the non-integer cases
2079 if (!useint) { // non-integral rhs
2080 // any -ve lhs is bad, as is either operand or context out of
2081 // bounds
2082 if (decNumberIsNegative(lhs)) {
2083 status|=DEC_Invalid_operation;
2084 break;}
2085 if (decCheckMath(lhs, set, &status)
2086 || decCheckMath(rhs, set, &status)) break; // variable status
2088 decContextDefault(&aset, DEC_INIT_DECIMAL64); // clean context
2089 aset.emax=DEC_MAX_MATH; // usual bounds
2090 aset.emin=-DEC_MAX_MATH; // ..
2091 aset.clamp=0; // and no concrete format
2093 // calculate the result using exp(ln(lhs)*rhs), which can
2094 // all be done into the accumulator, dac. The precision needed
2095 // is enough to contain the full information in the lhs (which
2096 // is the total digits, including exponent), or the requested
2097 // precision, if larger, + 4; 6 is used for the exponent
2098 // maximum length, and this is also used when it is shorter
2099 // than the requested digits as it greatly reduces the >0.5 ulp
2100 // cases at little cost (because Ln doubles digits each
2101 // iteration so a few extra digits rarely causes an extra
2102 // iteration)
2103 aset.digits=MAXI(lhs->digits, set->digits)+6+4;
2104 } // non-integer rhs
2106 else { // rhs is in-range integer
2107 if (n==0) { // x**0 = 1
2108 // (0**0 was handled above)
2109 decNumberZero(res); // result=1
2110 *res->lsu=1; // ..
2111 break;}
2112 // rhs is a non-zero integer
2113 if (n<0) n=-n; // use abs(n)
2115 aset=*set; // clone the context
2116 aset.round=DEC_ROUND_HALF_EVEN; // internally use balanced
2117 // calculate the working DIGITS
2118 aset.digits=reqdigits+(rhs->digits+rhs->exponent)+2;
2119 #if DECSUBSET
2120 if (!set->extended) aset.digits--; // use classic precision
2121 #endif
2122 // it's an error if this is more than can be handled
2123 if (aset.digits>DECNUMMAXP) {status|=DEC_Invalid_operation; break;}
2124 } // integer path
2126 // aset.digits is the count of digits for the accumulator needed
2127 // if accumulator is too long for local storage, then allocate
2128 needbytes=sizeof(decNumber)+(D2U(aset.digits)-1)*sizeof(Unit);
2129 // [needbytes also used below if 1/lhs needed]
2130 if (needbytes>sizeof(dacbuff)) {
2131 allocdac=(decNumber *)malloc(needbytes);
2132 if (allocdac==NULL) { // hopeless -- abandon
2133 status|=DEC_Insufficient_storage;
2134 break;}
2135 dac=allocdac; // use the allocated space
2137 // here, aset is set up and accumulator is ready for use
2139 if (!useint) { // non-integral rhs
2140 // x ** y; special-case x=1 here as it will otherwise always
2141 // reduce to integer 1; decLnOp has a fastpath which detects
2142 // the case of x=1
2143 decLnOp(dac, lhs, &aset, &status); // dac=ln(lhs)
2144 // [no error possible, as lhs 0 already handled]
2145 if (ISZERO(dac)) { // x==1, 1.0, etc.
2146 // need to return fully-padded 1.0000 etc., but rhsint->1
2147 *dac->lsu=1; // was 0, make int 1
2148 if (!rhsint) { // add padding
2149 Int shift=set->digits-1;
2150 dac->digits=decShiftToMost(dac->lsu, 1, shift);
2151 dac->exponent=-shift; // make 1.0000...
2152 status|=DEC_Inexact|DEC_Rounded; // deemed inexact
2155 else {
2156 decMultiplyOp(dac, dac, rhs, &aset, &status); // dac=dac*rhs
2157 decExpOp(dac, dac, &aset, &status); // dac=exp(dac)
2159 // and drop through for final rounding
2160 } // non-integer rhs
2162 else { // carry on with integer
2163 decNumberZero(dac); // acc=1
2164 *dac->lsu=1; // ..
2166 // if a negative power the constant 1 is needed, and if not subset
2167 // invert the lhs now rather than inverting the result later
2168 if (decNumberIsNegative(rhs)) { // was a **-n [hence digits>0]
2169 decNumber *inv=invbuff; // asssume use fixed buffer
2170 decNumberCopy(&dnOne, dac); // dnOne=1; [needed now or later]
2171 #if DECSUBSET
2172 if (set->extended) { // need to calculate 1/lhs
2173 #endif
2174 // divide lhs into 1, putting result in dac [dac=1/dac]
2175 decDivideOp(dac, &dnOne, lhs, &aset, DIVIDE, &status);
2176 // now locate or allocate space for the inverted lhs
2177 if (needbytes>sizeof(invbuff)) {
2178 allocinv=(decNumber *)malloc(needbytes);
2179 if (allocinv==NULL) { // hopeless -- abandon
2180 status|=DEC_Insufficient_storage;
2181 break;}
2182 inv=allocinv; // use the allocated space
2184 // [inv now points to big-enough buffer or allocated storage]
2185 decNumberCopy(inv, dac); // copy the 1/lhs
2186 decNumberCopy(dac, &dnOne); // restore acc=1
2187 lhs=inv; // .. and go forward with new lhs
2188 #if DECSUBSET
2190 #endif
2193 // Raise-to-the-power loop...
2194 seenbit=0; // set once a 1-bit is encountered
2195 for (i=1;;i++){ // for each bit [top bit ignored]
2196 // abandon if had overflow or terminal underflow
2197 if (status & (DEC_Overflow|DEC_Underflow)) { // interesting?
2198 if (status&DEC_Overflow || ISZERO(dac)) break;
2200 // [the following two lines revealed an optimizer bug in a C++
2201 // compiler, with symptom: 5**3 -> 25, when n=n+n was used]
2202 n=n<<1; // move next bit to testable position
2203 if (n<0) { // top bit is set
2204 seenbit=1; // OK, significant bit seen
2205 decMultiplyOp(dac, dac, lhs, &aset, &status); // dac=dac*x
2207 if (i==31) break; // that was the last bit
2208 if (!seenbit) continue; // no need to square 1
2209 decMultiplyOp(dac, dac, dac, &aset, &status); // dac=dac*dac [square]
2210 } /*i*/ // 32 bits
2212 // complete internal overflow or underflow processing
2213 if (status & (DEC_Overflow|DEC_Underflow)) {
2214 #if DECSUBSET
2215 // If subset, and power was negative, reverse the kind of -erflow
2216 // [1/x not yet done]
2217 if (!set->extended && decNumberIsNegative(rhs)) {
2218 if (status & DEC_Overflow)
2219 status^=DEC_Overflow | DEC_Underflow | DEC_Subnormal;
2220 else { // trickier -- Underflow may or may not be set
2221 status&=~(DEC_Underflow | DEC_Subnormal); // [one or both]
2222 status|=DEC_Overflow;
2225 #endif
2226 dac->bits=(dac->bits & ~DECNEG) | bits; // force correct sign
2227 // round subnormals [to set.digits rather than aset.digits]
2228 // or set overflow result similarly as required
2229 decFinalize(dac, set, &residue, &status);
2230 decNumberCopy(res, dac); // copy to result (is now OK length)
2231 break;
2234 #if DECSUBSET
2235 if (!set->extended && // subset math
2236 decNumberIsNegative(rhs)) { // was a **-n [hence digits>0]
2237 // so divide result into 1 [dac=1/dac]
2238 decDivideOp(dac, &dnOne, dac, &aset, DIVIDE, &status);
2240 #endif
2241 } // rhs integer path
2243 // reduce result to the requested length and copy to result
2244 decCopyFit(res, dac, set, &residue, &status);
2245 decFinish(res, set, &residue, &status); // final cleanup
2246 #if DECSUBSET
2247 if (!set->extended) decTrim(res, set, 0, 1, &dropped); // trailing zeros
2248 #endif
2249 } while(0); // end protected
2251 if (allocdac!=NULL) free(allocdac); // drop any storage used
2252 if (allocinv!=NULL) free(allocinv); // ..
2253 #if DECSUBSET
2254 if (alloclhs!=NULL) free(alloclhs); // ..
2255 if (allocrhs!=NULL) free(allocrhs); // ..
2256 #endif
2257 if (status!=0) decStatus(res, status, set);
2258 #if DECCHECK
2259 decCheckInexact(res, set);
2260 #endif
2261 return res;
2262 } // decNumberPower
2264 /* ------------------------------------------------------------------ */
2265 /* decNumberQuantize -- force exponent to requested value */
2266 /* */
2267 /* This computes C = op(A, B), where op adjusts the coefficient */
2268 /* of C (by rounding or shifting) such that the exponent (-scale) */
2269 /* of C has exponent of B. The numerical value of C will equal A, */
2270 /* except for the effects of any rounding that occurred. */
2271 /* */
2272 /* res is C, the result. C may be A or B */
2273 /* lhs is A, the number to adjust */
2274 /* rhs is B, the number with exponent to match */
2275 /* set is the context */
2276 /* */
2277 /* C must have space for set->digits digits. */
2278 /* */
2279 /* Unless there is an error or the result is infinite, the exponent */
2280 /* after the operation is guaranteed to be equal to that of B. */
2281 /* ------------------------------------------------------------------ */
2282 decNumber * decNumberQuantize(decNumber *res, const decNumber *lhs,
2283 const decNumber *rhs, decContext *set) {
2284 uInt status=0; // accumulator
2285 decQuantizeOp(res, lhs, rhs, set, 1, &status);
2286 if (status!=0) decStatus(res, status, set);
2287 return res;
2288 } // decNumberQuantize
2290 /* ------------------------------------------------------------------ */
2291 /* decNumberReduce -- remove trailing zeros */
2292 /* */
2293 /* This computes C = 0 + A, and normalizes the result */
2294 /* */
2295 /* res is C, the result. C may be A */
2296 /* rhs is A */
2297 /* set is the context */
2298 /* */
2299 /* C must have space for set->digits digits. */
2300 /* ------------------------------------------------------------------ */
2301 // Previously known as Normalize
2302 decNumber * decNumberNormalize(decNumber *res, const decNumber *rhs,
2303 decContext *set) {
2304 return decNumberReduce(res, rhs, set);
2305 } // decNumberNormalize
2307 decNumber * decNumberReduce(decNumber *res, const decNumber *rhs,
2308 decContext *set) {
2309 #if DECSUBSET
2310 decNumber *allocrhs=NULL; // non-NULL if rounded rhs allocated
2311 #endif
2312 uInt status=0; // as usual
2313 Int residue=0; // as usual
2314 Int dropped; // work
2316 #if DECCHECK
2317 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
2318 #endif
2320 do { // protect allocated storage
2321 #if DECSUBSET
2322 if (!set->extended) {
2323 // reduce operand and set lostDigits status, as needed
2324 if (rhs->digits>set->digits) {
2325 allocrhs=decRoundOperand(rhs, set, &status);
2326 if (allocrhs==NULL) break;
2327 rhs=allocrhs;
2330 #endif
2331 // [following code does not require input rounding]
2333 // Infinities copy through; NaNs need usual treatment
2334 if (decNumberIsNaN(rhs)) {
2335 decNaNs(res, rhs, NULL, set, &status);
2336 break;
2339 // reduce result to the requested length and copy to result
2340 decCopyFit(res, rhs, set, &residue, &status); // copy & round
2341 decFinish(res, set, &residue, &status); // cleanup/set flags
2342 decTrim(res, set, 1, 0, &dropped); // normalize in place
2343 // [may clamp]
2344 } while(0); // end protected
2346 #if DECSUBSET
2347 if (allocrhs !=NULL) free(allocrhs); // ..
2348 #endif
2349 if (status!=0) decStatus(res, status, set);// then report status
2350 return res;
2351 } // decNumberReduce
2353 /* ------------------------------------------------------------------ */
2354 /* decNumberRescale -- force exponent to requested value */
2355 /* */
2356 /* This computes C = op(A, B), where op adjusts the coefficient */
2357 /* of C (by rounding or shifting) such that the exponent (-scale) */
2358 /* of C has the value B. The numerical value of C will equal A, */
2359 /* except for the effects of any rounding that occurred. */
2360 /* */
2361 /* res is C, the result. C may be A or B */
2362 /* lhs is A, the number to adjust */
2363 /* rhs is B, the requested exponent */
2364 /* set is the context */
2365 /* */
2366 /* C must have space for set->digits digits. */
2367 /* */
2368 /* Unless there is an error or the result is infinite, the exponent */
2369 /* after the operation is guaranteed to be equal to B. */
2370 /* ------------------------------------------------------------------ */
2371 decNumber * decNumberRescale(decNumber *res, const decNumber *lhs,
2372 const decNumber *rhs, decContext *set) {
2373 uInt status=0; // accumulator
2374 decQuantizeOp(res, lhs, rhs, set, 0, &status);
2375 if (status!=0) decStatus(res, status, set);
2376 return res;
2377 } // decNumberRescale
2379 /* ------------------------------------------------------------------ */
2380 /* decNumberRemainder -- divide and return remainder */
2381 /* */
2382 /* This computes C = A % B */
2383 /* */
2384 /* res is C, the result. C may be A and/or B (e.g., X=X%X) */
2385 /* lhs is A */
2386 /* rhs is B */
2387 /* set is the context */
2388 /* */
2389 /* C must have space for set->digits digits. */
2390 /* ------------------------------------------------------------------ */
2391 decNumber * decNumberRemainder(decNumber *res, const decNumber *lhs,
2392 const decNumber *rhs, decContext *set) {
2393 uInt status=0; // accumulator
2394 decDivideOp(res, lhs, rhs, set, REMAINDER, &status);
2395 if (status!=0) decStatus(res, status, set);
2396 #if DECCHECK
2397 decCheckInexact(res, set);
2398 #endif
2399 return res;
2400 } // decNumberRemainder
2402 /* ------------------------------------------------------------------ */
2403 /* decNumberRemainderNear -- divide and return remainder from nearest */
2404 /* */
2405 /* This computes C = A % B, where % is the IEEE remainder operator */
2406 /* */
2407 /* res is C, the result. C may be A and/or B (e.g., X=X%X) */
2408 /* lhs is A */
2409 /* rhs is B */
2410 /* set is the context */
2411 /* */
2412 /* C must have space for set->digits digits. */
2413 /* ------------------------------------------------------------------ */
2414 decNumber * decNumberRemainderNear(decNumber *res, const decNumber *lhs,
2415 const decNumber *rhs, decContext *set) {
2416 uInt status=0; // accumulator
2417 decDivideOp(res, lhs, rhs, set, REMNEAR, &status);
2418 if (status!=0) decStatus(res, status, set);
2419 #if DECCHECK
2420 decCheckInexact(res, set);
2421 #endif
2422 return res;
2423 } // decNumberRemainderNear
2425 /* ------------------------------------------------------------------ */
2426 /* decNumberRotate -- rotate the coefficient of a Number left/right */
2427 /* */
2428 /* This computes C = A rot B (in base ten and rotating set->digits */
2429 /* digits). */
2430 /* */
2431 /* res is C, the result. C may be A and/or B (e.g., X=XrotX) */
2432 /* lhs is A */
2433 /* rhs is B, the number of digits to rotate (-ve to right) */
2434 /* set is the context */
2435 /* */
2436 /* The digits of the coefficient of A are rotated to the left (if B */
2437 /* is positive) or to the right (if B is negative) without adjusting */
2438 /* the exponent or the sign of A. If lhs->digits is less than */
2439 /* set->digits the coefficient is padded with zeros on the left */
2440 /* before the rotate. Any leading zeros in the result are removed */
2441 /* as usual. */
2442 /* */
2443 /* B must be an integer (q=0) and in the range -set->digits through */
2444 /* +set->digits. */
2445 /* C must have space for set->digits digits. */
2446 /* NaNs are propagated as usual. Infinities are unaffected (but */
2447 /* B must be valid). No status is set unless B is invalid or an */
2448 /* operand is an sNaN. */
2449 /* ------------------------------------------------------------------ */
2450 decNumber * decNumberRotate(decNumber *res, const decNumber *lhs,
2451 const decNumber *rhs, decContext *set) {
2452 uInt status=0; // accumulator
2453 Int rotate; // rhs as an Int
2455 #if DECCHECK
2456 if (decCheckOperands(res, lhs, rhs, set)) return res;
2457 #endif
2459 // NaNs propagate as normal
2460 if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
2461 decNaNs(res, lhs, rhs, set, &status);
2462 // rhs must be an integer
2463 else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
2464 status=DEC_Invalid_operation;
2465 else { // both numeric, rhs is an integer
2466 rotate=decGetInt(rhs); // [cannot fail]
2467 if (rotate==BADINT // something bad ..
2468 || rotate==BIGODD || rotate==BIGEVEN // .. very big ..
2469 || abs(rotate)>set->digits) // .. or out of range
2470 status=DEC_Invalid_operation;
2471 else { // rhs is OK
2472 decNumberCopy(res, lhs);
2473 // convert -ve rotate to equivalent positive rotation
2474 if (rotate<0) rotate=set->digits+rotate;
2475 if (rotate!=0 && rotate!=set->digits // zero or full rotation
2476 && !decNumberIsInfinite(res)) { // lhs was infinite
2477 // left-rotate to do; 0 < rotate < set->digits
2478 uInt units, shift; // work
2479 uInt msudigits; // digits in result msu
2480 Unit *msu=res->lsu+D2U(res->digits)-1; // current msu
2481 Unit *msumax=res->lsu+D2U(set->digits)-1; // rotation msu
2482 for (msu++; msu<=msumax; msu++) *msu=0; // ensure high units=0
2483 res->digits=set->digits; // now full-length
2484 msudigits=MSUDIGITS(res->digits); // actual digits in msu
2486 // rotation here is done in-place, in three steps
2487 // 1. shift all to least up to one unit to unit-align final
2488 // lsd [any digits shifted out are rotated to the left,
2489 // abutted to the original msd (which may require split)]
2491 // [if there are no whole units left to rotate, the
2492 // rotation is now complete]
2494 // 2. shift to least, from below the split point only, so that
2495 // the final msd is in the right place in its Unit [any
2496 // digits shifted out will fit exactly in the current msu,
2497 // left aligned, no split required]
2499 // 3. rotate all the units by reversing left part, right
2500 // part, and then whole
2502 // example: rotate right 8 digits (2 units + 2), DECDPUN=3.
2504 // start: 00a bcd efg hij klm npq
2506 // 1a 000 0ab cde fgh|ijk lmn [pq saved]
2507 // 1b 00p qab cde fgh|ijk lmn
2509 // 2a 00p qab cde fgh|00i jkl [mn saved]
2510 // 2b mnp qab cde fgh|00i jkl
2512 // 3a fgh cde qab mnp|00i jkl
2513 // 3b fgh cde qab mnp|jkl 00i
2514 // 3c 00i jkl mnp qab cde fgh
2516 // Step 1: amount to shift is the partial right-rotate count
2517 rotate=set->digits-rotate; // make it right-rotate
2518 units=rotate/DECDPUN; // whole units to rotate
2519 shift=rotate%DECDPUN; // left-over digits count
2520 if (shift>0) { // not an exact number of units
2521 uInt save=res->lsu[0]%powers[shift]; // save low digit(s)
2522 decShiftToLeast(res->lsu, D2U(res->digits), shift);
2523 if (shift>msudigits) { // msumax-1 needs >0 digits
2524 uInt rem=save%powers[shift-msudigits];// split save
2525 *msumax=(Unit)(save/powers[shift-msudigits]); // and insert
2526 *(msumax-1)=*(msumax-1)
2527 +(Unit)(rem*powers[DECDPUN-(shift-msudigits)]); // ..
2529 else { // all fits in msumax
2530 *msumax=*msumax+(Unit)(save*powers[msudigits-shift]); // [maybe *1]
2532 } // digits shift needed
2534 // If whole units to rotate...
2535 if (units>0) { // some to do
2536 // Step 2: the units to touch are the whole ones in rotate,
2537 // if any, and the shift is DECDPUN-msudigits (which may be
2538 // 0, again)
2539 shift=DECDPUN-msudigits;
2540 if (shift>0) { // not an exact number of units
2541 uInt save=res->lsu[0]%powers[shift]; // save low digit(s)
2542 decShiftToLeast(res->lsu, units, shift);
2543 *msumax=*msumax+(Unit)(save*powers[msudigits]);
2544 } // partial shift needed
2546 // Step 3: rotate the units array using triple reverse
2547 // (reversing is easy and fast)
2548 decReverse(res->lsu+units, msumax); // left part
2549 decReverse(res->lsu, res->lsu+units-1); // right part
2550 decReverse(res->lsu, msumax); // whole
2551 } // whole units to rotate
2552 // the rotation may have left an undetermined number of zeros
2553 // on the left, so true length needs to be calculated
2554 res->digits=decGetDigits(res->lsu, msumax-res->lsu+1);
2555 } // rotate needed
2556 } // rhs OK
2557 } // numerics
2558 if (status!=0) decStatus(res, status, set);
2559 return res;
2560 } // decNumberRotate
2562 /* ------------------------------------------------------------------ */
2563 /* decNumberSameQuantum -- test for equal exponents */
2564 /* */
2565 /* res is the result number, which will contain either 0 or 1 */
2566 /* lhs is a number to test */
2567 /* rhs is the second (usually a pattern) */
2568 /* */
2569 /* No errors are possible and no context is needed. */
2570 /* ------------------------------------------------------------------ */
2571 decNumber * decNumberSameQuantum(decNumber *res, const decNumber *lhs,
2572 const decNumber *rhs) {
2573 Unit ret=0; // return value
2575 #if DECCHECK
2576 if (decCheckOperands(res, lhs, rhs, DECUNCONT)) return res;
2577 #endif
2579 if (SPECIALARGS) {
2580 if (decNumberIsNaN(lhs) && decNumberIsNaN(rhs)) ret=1;
2581 else if (decNumberIsInfinite(lhs) && decNumberIsInfinite(rhs)) ret=1;
2582 // [anything else with a special gives 0]
2584 else if (lhs->exponent==rhs->exponent) ret=1;
2586 decNumberZero(res); // OK to overwrite an operand now
2587 *res->lsu=ret;
2588 return res;
2589 } // decNumberSameQuantum
2591 /* ------------------------------------------------------------------ */
2592 /* decNumberScaleB -- multiply by a power of 10 */
2593 /* */
2594 /* This computes C = A x 10**B where B is an integer (q=0) with */
2595 /* maximum magnitude 2*(emax+digits) */
2596 /* */
2597 /* res is C, the result. C may be A or B */
2598 /* lhs is A, the number to adjust */
2599 /* rhs is B, the requested power of ten to use */
2600 /* set is the context */
2601 /* */
2602 /* C must have space for set->digits digits. */
2603 /* */
2604 /* The result may underflow or overflow. */
2605 /* ------------------------------------------------------------------ */
2606 decNumber * decNumberScaleB(decNumber *res, const decNumber *lhs,
2607 const decNumber *rhs, decContext *set) {
2608 Int reqexp; // requested exponent change [B]
2609 uInt status=0; // accumulator
2610 Int residue; // work
2612 #if DECCHECK
2613 if (decCheckOperands(res, lhs, rhs, set)) return res;
2614 #endif
2616 // Handle special values except lhs infinite
2617 if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
2618 decNaNs(res, lhs, rhs, set, &status);
2619 // rhs must be an integer
2620 else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
2621 status=DEC_Invalid_operation;
2622 else {
2623 // lhs is a number; rhs is a finite with q==0
2624 reqexp=decGetInt(rhs); // [cannot fail]
2625 // maximum range is larger than getInt can handle, so this is
2626 // more restrictive than the specification
2627 if (reqexp==BADINT // something bad ..
2628 || reqexp==BIGODD || reqexp==BIGEVEN // it was huge
2629 || (abs(reqexp)+1)/2>(set->digits+set->emax)) // .. or out of range
2630 status=DEC_Invalid_operation;
2631 else { // rhs is OK
2632 decNumberCopy(res, lhs); // all done if infinite lhs
2633 if (!decNumberIsInfinite(res)) { // prepare to scale
2634 Int exp=res->exponent; // save for overflow test
2635 res->exponent+=reqexp; // adjust the exponent
2636 if (((exp^reqexp)>=0) // same sign ...
2637 && ((exp^res->exponent)<0)) { // .. but result had different
2638 // the calculation overflowed, so force right treatment
2639 if (exp<0) res->exponent=DEC_MIN_EMIN-DEC_MAX_DIGITS;
2640 else res->exponent=DEC_MAX_EMAX+1;
2642 residue=0;
2643 decFinalize(res, set, &residue, &status); // final check
2644 } // finite LHS
2645 } // rhs OK
2646 } // rhs finite
2647 if (status!=0) decStatus(res, status, set);
2648 return res;
2649 } // decNumberScaleB
2651 /* ------------------------------------------------------------------ */
2652 /* decNumberShift -- shift the coefficient of a Number left or right */
2653 /* */
2654 /* This computes C = A << B or C = A >> -B (in base ten). */
2655 /* */
2656 /* res is C, the result. C may be A and/or B (e.g., X=X<<X) */
2657 /* lhs is A */
2658 /* rhs is B, the number of digits to shift (-ve to right) */
2659 /* set is the context */
2660 /* */
2661 /* The digits of the coefficient of A are shifted to the left (if B */
2662 /* is positive) or to the right (if B is negative) without adjusting */
2663 /* the exponent or the sign of A. */
2664 /* */
2665 /* B must be an integer (q=0) and in the range -set->digits through */
2666 /* +set->digits. */
2667 /* C must have space for set->digits digits. */
2668 /* NaNs are propagated as usual. Infinities are unaffected (but */
2669 /* B must be valid). No status is set unless B is invalid or an */
2670 /* operand is an sNaN. */
2671 /* ------------------------------------------------------------------ */
2672 decNumber * decNumberShift(decNumber *res, const decNumber *lhs,
2673 const decNumber *rhs, decContext *set) {
2674 uInt status=0; // accumulator
2675 Int shift; // rhs as an Int
2677 #if DECCHECK
2678 if (decCheckOperands(res, lhs, rhs, set)) return res;
2679 #endif
2681 // NaNs propagate as normal
2682 if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
2683 decNaNs(res, lhs, rhs, set, &status);
2684 // rhs must be an integer
2685 else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
2686 status=DEC_Invalid_operation;
2687 else { // both numeric, rhs is an integer
2688 shift=decGetInt(rhs); // [cannot fail]
2689 if (shift==BADINT // something bad ..
2690 || shift==BIGODD || shift==BIGEVEN // .. very big ..
2691 || abs(shift)>set->digits) // .. or out of range
2692 status=DEC_Invalid_operation;
2693 else { // rhs is OK
2694 decNumberCopy(res, lhs);
2695 if (shift!=0 && !decNumberIsInfinite(res)) { // something to do
2696 if (shift>0) { // to left
2697 if (shift==set->digits) { // removing all
2698 *res->lsu=0; // so place 0
2699 res->digits=1; // ..
2701 else { //
2702 // first remove leading digits if necessary
2703 if (res->digits+shift>set->digits) {
2704 decDecap(res, res->digits+shift-set->digits);
2705 // that updated res->digits; may have gone to 1 (for a
2706 // single digit or for zero
2708 if (res->digits>1 || *res->lsu) // if non-zero..
2709 res->digits=decShiftToMost(res->lsu, res->digits, shift);
2710 } // partial left
2711 } // left
2712 else { // to right
2713 if (-shift>=res->digits) { // discarding all
2714 *res->lsu=0; // so place 0
2715 res->digits=1; // ..
2717 else {
2718 decShiftToLeast(res->lsu, D2U(res->digits), -shift);
2719 res->digits-=(-shift);
2721 } // to right
2722 } // non-0 non-Inf shift
2723 } // rhs OK
2724 } // numerics
2725 if (status!=0) decStatus(res, status, set);
2726 return res;
2727 } // decNumberShift
2729 /* ------------------------------------------------------------------ */
2730 /* decNumberSquareRoot -- square root operator */
2731 /* */
2732 /* This computes C = squareroot(A) */
2733 /* */
2734 /* res is C, the result. C may be A */
2735 /* rhs is A */
2736 /* set is the context; note that rounding mode has no effect */
2737 /* */
2738 /* C must have space for set->digits digits. */
2739 /* ------------------------------------------------------------------ */
2740 /* This uses the following varying-precision algorithm in: */
2741 /* */
2742 /* Properly Rounded Variable Precision Square Root, T. E. Hull and */
2743 /* A. Abrham, ACM Transactions on Mathematical Software, Vol 11 #3, */
2744 /* pp229-237, ACM, September 1985. */
2745 /* */
2746 /* The square-root is calculated using Newton's method, after which */
2747 /* a check is made to ensure the result is correctly rounded. */
2748 /* */
2749 /* % [Reformatted original Numerical Turing source code follows.] */
2750 /* function sqrt(x : real) : real */
2751 /* % sqrt(x) returns the properly rounded approximation to the square */
2752 /* % root of x, in the precision of the calling environment, or it */
2753 /* % fails if x < 0. */
2754 /* % t e hull and a abrham, august, 1984 */
2755 /* if x <= 0 then */
2756 /* if x < 0 then */
2757 /* assert false */
2758 /* else */
2759 /* result 0 */
2760 /* end if */
2761 /* end if */
2762 /* var f := setexp(x, 0) % fraction part of x [0.1 <= x < 1] */
2763 /* var e := getexp(x) % exponent part of x */
2764 /* var approx : real */
2765 /* if e mod 2 = 0 then */
2766 /* approx := .259 + .819 * f % approx to root of f */
2767 /* else */
2768 /* f := f/l0 % adjustments */
2769 /* e := e + 1 % for odd */
2770 /* approx := .0819 + 2.59 * f % exponent */
2771 /* end if */
2772 /* */
2773 /* var p:= 3 */
2774 /* const maxp := currentprecision + 2 */
2775 /* loop */
2776 /* p := min(2*p - 2, maxp) % p = 4,6,10, . . . , maxp */
2777 /* precision p */
2778 /* approx := .5 * (approx + f/approx) */
2779 /* exit when p = maxp */
2780 /* end loop */
2781 /* */
2782 /* % approx is now within 1 ulp of the properly rounded square root */
2783 /* % of f; to ensure proper rounding, compare squares of (approx - */
2784 /* % l/2 ulp) and (approx + l/2 ulp) with f. */
2785 /* p := currentprecision */
2786 /* begin */
2787 /* precision p + 2 */
2788 /* const approxsubhalf := approx - setexp(.5, -p) */
2789 /* if mulru(approxsubhalf, approxsubhalf) > f then */
2790 /* approx := approx - setexp(.l, -p + 1) */
2791 /* else */
2792 /* const approxaddhalf := approx + setexp(.5, -p) */
2793 /* if mulrd(approxaddhalf, approxaddhalf) < f then */
2794 /* approx := approx + setexp(.l, -p + 1) */
2795 /* end if */
2796 /* end if */
2797 /* end */
2798 /* result setexp(approx, e div 2) % fix exponent */
2799 /* end sqrt */
2800 /* ------------------------------------------------------------------ */
2801 decNumber * decNumberSquareRoot(decNumber *res, const decNumber *rhs,
2802 decContext *set) {
2803 decContext workset, approxset; // work contexts
2804 decNumber dzero; // used for constant zero
2805 Int maxp; // largest working precision
2806 Int workp; // working precision
2807 Int residue=0; // rounding residue
2808 uInt status=0, ignore=0; // status accumulators
2809 uInt rstatus; // ..
2810 Int exp; // working exponent
2811 Int ideal; // ideal (preferred) exponent
2812 Int needbytes; // work
2813 Int dropped; // ..
2815 #if DECSUBSET
2816 decNumber *allocrhs=NULL; // non-NULL if rounded rhs allocated
2817 #endif
2818 // buffer for f [needs +1 in case DECBUFFER 0]
2819 decNumber buff[D2N(DECBUFFER+1)];
2820 // buffer for a [needs +2 to match likely maxp]
2821 decNumber bufa[D2N(DECBUFFER+2)];
2822 // buffer for temporary, b [must be same size as a]
2823 decNumber bufb[D2N(DECBUFFER+2)];
2824 decNumber *allocbuff=NULL; // -> allocated buff, iff allocated
2825 decNumber *allocbufa=NULL; // -> allocated bufa, iff allocated
2826 decNumber *allocbufb=NULL; // -> allocated bufb, iff allocated
2827 decNumber *f=buff; // reduced fraction
2828 decNumber *a=bufa; // approximation to result
2829 decNumber *b=bufb; // intermediate result
2830 // buffer for temporary variable, up to 3 digits
2831 decNumber buft[D2N(3)];
2832 decNumber *t=buft; // up-to-3-digit constant or work
2834 #if DECCHECK
2835 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
2836 #endif
2838 do { // protect allocated storage
2839 #if DECSUBSET
2840 if (!set->extended) {
2841 // reduce operand and set lostDigits status, as needed
2842 if (rhs->digits>set->digits) {
2843 allocrhs=decRoundOperand(rhs, set, &status);
2844 if (allocrhs==NULL) break;
2845 // [Note: 'f' allocation below could reuse this buffer if
2846 // used, but as this is rare they are kept separate for clarity.]
2847 rhs=allocrhs;
2850 #endif
2851 // [following code does not require input rounding]
2853 // handle infinities and NaNs
2854 if (SPECIALARG) {
2855 if (decNumberIsInfinite(rhs)) { // an infinity
2856 if (decNumberIsNegative(rhs)) status|=DEC_Invalid_operation;
2857 else decNumberCopy(res, rhs); // +Infinity
2859 else decNaNs(res, rhs, NULL, set, &status); // a NaN
2860 break;
2863 // calculate the ideal (preferred) exponent [floor(exp/2)]
2864 // [It would be nicer to write: ideal=rhs->exponent>>1, but this
2865 // generates a compiler warning. Generated code is the same.]
2866 ideal=(rhs->exponent&~1)/2; // target
2868 // handle zeros
2869 if (ISZERO(rhs)) {
2870 decNumberCopy(res, rhs); // could be 0 or -0
2871 res->exponent=ideal; // use the ideal [safe]
2872 // use decFinish to clamp any out-of-range exponent, etc.
2873 decFinish(res, set, &residue, &status);
2874 break;
2877 // any other -x is an oops
2878 if (decNumberIsNegative(rhs)) {
2879 status|=DEC_Invalid_operation;
2880 break;
2883 // space is needed for three working variables
2884 // f -- the same precision as the RHS, reduced to 0.01->0.99...
2885 // a -- Hull's approximation -- precision, when assigned, is
2886 // currentprecision+1 or the input argument precision,
2887 // whichever is larger (+2 for use as temporary)
2888 // b -- intermediate temporary result (same size as a)
2889 // if any is too long for local storage, then allocate
2890 workp=MAXI(set->digits+1, rhs->digits); // actual rounding precision
2891 workp=MAXI(workp, 7); // at least 7 for low cases
2892 maxp=workp+2; // largest working precision
2894 needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
2895 if (needbytes>(Int)sizeof(buff)) {
2896 allocbuff=(decNumber *)malloc(needbytes);
2897 if (allocbuff==NULL) { // hopeless -- abandon
2898 status|=DEC_Insufficient_storage;
2899 break;}
2900 f=allocbuff; // use the allocated space
2902 // a and b both need to be able to hold a maxp-length number
2903 needbytes=sizeof(decNumber)+(D2U(maxp)-1)*sizeof(Unit);
2904 if (needbytes>(Int)sizeof(bufa)) { // [same applies to b]
2905 allocbufa=(decNumber *)malloc(needbytes);
2906 allocbufb=(decNumber *)malloc(needbytes);
2907 if (allocbufa==NULL || allocbufb==NULL) { // hopeless
2908 status|=DEC_Insufficient_storage;
2909 break;}
2910 a=allocbufa; // use the allocated spaces
2911 b=allocbufb; // ..
2914 // copy rhs -> f, save exponent, and reduce so 0.1 <= f < 1
2915 decNumberCopy(f, rhs);
2916 exp=f->exponent+f->digits; // adjusted to Hull rules
2917 f->exponent=-(f->digits); // to range
2919 // set up working context
2920 decContextDefault(&workset, DEC_INIT_DECIMAL64);
2921 workset.emax=DEC_MAX_EMAX;
2922 workset.emin=DEC_MIN_EMIN;
2924 // [Until further notice, no error is possible and status bits
2925 // (Rounded, etc.) should be ignored, not accumulated.]
2927 // Calculate initial approximation, and allow for odd exponent
2928 workset.digits=workp; // p for initial calculation
2929 t->bits=0; t->digits=3;
2930 a->bits=0; a->digits=3;
2931 if ((exp & 1)==0) { // even exponent
2932 // Set t=0.259, a=0.819
2933 t->exponent=-3;
2934 a->exponent=-3;
2935 #if DECDPUN>=3
2936 t->lsu[0]=259;
2937 a->lsu[0]=819;
2938 #elif DECDPUN==2
2939 t->lsu[0]=59; t->lsu[1]=2;
2940 a->lsu[0]=19; a->lsu[1]=8;
2941 #else
2942 t->lsu[0]=9; t->lsu[1]=5; t->lsu[2]=2;
2943 a->lsu[0]=9; a->lsu[1]=1; a->lsu[2]=8;
2944 #endif
2946 else { // odd exponent
2947 // Set t=0.0819, a=2.59
2948 f->exponent--; // f=f/10
2949 exp++; // e=e+1
2950 t->exponent=-4;
2951 a->exponent=-2;
2952 #if DECDPUN>=3
2953 t->lsu[0]=819;
2954 a->lsu[0]=259;
2955 #elif DECDPUN==2
2956 t->lsu[0]=19; t->lsu[1]=8;
2957 a->lsu[0]=59; a->lsu[1]=2;
2958 #else
2959 t->lsu[0]=9; t->lsu[1]=1; t->lsu[2]=8;
2960 a->lsu[0]=9; a->lsu[1]=5; a->lsu[2]=2;
2961 #endif
2964 decMultiplyOp(a, a, f, &workset, &ignore); // a=a*f
2965 decAddOp(a, a, t, &workset, 0, &ignore); // ..+t
2966 // [a is now the initial approximation for sqrt(f), calculated with
2967 // currentprecision, which is also a's precision.]
2969 // the main calculation loop
2970 decNumberZero(&dzero); // make 0
2971 decNumberZero(t); // set t = 0.5
2972 t->lsu[0]=5; // ..
2973 t->exponent=-1; // ..
2974 workset.digits=3; // initial p
2975 for (; workset.digits<maxp;) {
2976 // set p to min(2*p - 2, maxp) [hence 3; or: 4, 6, 10, ... , maxp]
2977 workset.digits=MINI(workset.digits*2-2, maxp);
2978 // a = 0.5 * (a + f/a)
2979 // [calculated at p then rounded to currentprecision]
2980 decDivideOp(b, f, a, &workset, DIVIDE, &ignore); // b=f/a
2981 decAddOp(b, b, a, &workset, 0, &ignore); // b=b+a
2982 decMultiplyOp(a, b, t, &workset, &ignore); // a=b*0.5
2983 } // loop
2985 // Here, 0.1 <= a < 1 [Hull], and a has maxp digits
2986 // now reduce to length, etc.; this needs to be done with a
2987 // having the correct exponent so as to handle subnormals
2988 // correctly
2989 approxset=*set; // get emin, emax, etc.
2990 approxset.round=DEC_ROUND_HALF_EVEN;
2991 a->exponent+=exp/2; // set correct exponent
2992 rstatus=0; // clear status
2993 residue=0; // .. and accumulator
2994 decCopyFit(a, a, &approxset, &residue, &rstatus); // reduce (if needed)
2995 decFinish(a, &approxset, &residue, &rstatus); // clean and finalize
2997 // Overflow was possible if the input exponent was out-of-range,
2998 // in which case quit
2999 if (rstatus&DEC_Overflow) {
3000 status=rstatus; // use the status as-is
3001 decNumberCopy(res, a); // copy to result
3002 break;
3005 // Preserve status except Inexact/Rounded
3006 status|=(rstatus & ~(DEC_Rounded|DEC_Inexact));
3008 // Carry out the Hull correction
3009 a->exponent-=exp/2; // back to 0.1->1
3011 // a is now at final precision and within 1 ulp of the properly
3012 // rounded square root of f; to ensure proper rounding, compare
3013 // squares of (a - l/2 ulp) and (a + l/2 ulp) with f.
3014 // Here workset.digits=maxp and t=0.5, and a->digits determines
3015 // the ulp
3016 workset.digits--; // maxp-1 is OK now
3017 t->exponent=-a->digits-1; // make 0.5 ulp
3018 decAddOp(b, a, t, &workset, DECNEG, &ignore); // b = a - 0.5 ulp
3019 workset.round=DEC_ROUND_UP;
3020 decMultiplyOp(b, b, b, &workset, &ignore); // b = mulru(b, b)
3021 decCompareOp(b, f, b, &workset, COMPARE, &ignore); // b ? f, reversed
3022 if (decNumberIsNegative(b)) { // f < b [i.e., b > f]
3023 // this is the more common adjustment, though both are rare
3024 t->exponent++; // make 1.0 ulp
3025 t->lsu[0]=1; // ..
3026 decAddOp(a, a, t, &workset, DECNEG, &ignore); // a = a - 1 ulp
3027 // assign to approx [round to length]
3028 approxset.emin-=exp/2; // adjust to match a
3029 approxset.emax-=exp/2;
3030 decAddOp(a, &dzero, a, &approxset, 0, &ignore);
3032 else {
3033 decAddOp(b, a, t, &workset, 0, &ignore); // b = a + 0.5 ulp
3034 workset.round=DEC_ROUND_DOWN;
3035 decMultiplyOp(b, b, b, &workset, &ignore); // b = mulrd(b, b)
3036 decCompareOp(b, b, f, &workset, COMPARE, &ignore); // b ? f
3037 if (decNumberIsNegative(b)) { // b < f
3038 t->exponent++; // make 1.0 ulp
3039 t->lsu[0]=1; // ..
3040 decAddOp(a, a, t, &workset, 0, &ignore); // a = a + 1 ulp
3041 // assign to approx [round to length]
3042 approxset.emin-=exp/2; // adjust to match a
3043 approxset.emax-=exp/2;
3044 decAddOp(a, &dzero, a, &approxset, 0, &ignore);
3047 // [no errors are possible in the above, and rounding/inexact during
3048 // estimation are irrelevant, so status was not accumulated]
3050 // Here, 0.1 <= a < 1 (still), so adjust back
3051 a->exponent+=exp/2; // set correct exponent
3053 // count droppable zeros [after any subnormal rounding] by
3054 // trimming a copy
3055 decNumberCopy(b, a);
3056 decTrim(b, set, 1, 1, &dropped); // [drops trailing zeros]
3058 // Set Inexact and Rounded. The answer can only be exact if
3059 // it is short enough so that squaring it could fit in workp
3060 // digits, so this is the only (relatively rare) condition that
3061 // a careful check is needed
3062 if (b->digits*2-1 > workp) { // cannot fit
3063 status|=DEC_Inexact|DEC_Rounded;
3065 else { // could be exact/unrounded
3066 uInt mstatus=0; // local status
3067 decMultiplyOp(b, b, b, &workset, &mstatus); // try the multiply
3068 if (mstatus&DEC_Overflow) { // result just won't fit
3069 status|=DEC_Inexact|DEC_Rounded;
3071 else { // plausible
3072 decCompareOp(t, b, rhs, &workset, COMPARE, &mstatus); // b ? rhs
3073 if (!ISZERO(t)) status|=DEC_Inexact|DEC_Rounded; // not equal
3074 else { // is Exact
3075 // here, dropped is the count of trailing zeros in 'a'
3076 // use closest exponent to ideal...
3077 Int todrop=ideal-a->exponent; // most that can be dropped
3078 if (todrop<0) status|=DEC_Rounded; // ideally would add 0s
3079 else { // unrounded
3080 // there are some to drop, but emax may not allow all
3081 Int maxexp=set->emax-set->digits+1;
3082 Int maxdrop=maxexp-a->exponent;
3083 if (todrop>maxdrop && set->clamp) { // apply clamping
3084 todrop=maxdrop;
3085 status|=DEC_Clamped;
3087 if (dropped<todrop) { // clamp to those available
3088 todrop=dropped;
3089 status|=DEC_Clamped;
3091 if (todrop>0) { // have some to drop
3092 decShiftToLeast(a->lsu, D2U(a->digits), todrop);
3093 a->exponent+=todrop; // maintain numerical value
3094 a->digits-=todrop; // new length
3101 // double-check Underflow, as perhaps the result could not have
3102 // been subnormal (initial argument too big), or it is now Exact
3103 if (status&DEC_Underflow) {
3104 Int ae=rhs->exponent+rhs->digits-1; // adjusted exponent
3105 // check if truly subnormal
3106 #if DECEXTFLAG // DEC_Subnormal too
3107 if (ae>=set->emin*2) status&=~(DEC_Subnormal|DEC_Underflow);
3108 #else
3109 if (ae>=set->emin*2) status&=~DEC_Underflow;
3110 #endif
3111 // check if truly inexact
3112 if (!(status&DEC_Inexact)) status&=~DEC_Underflow;
3115 decNumberCopy(res, a); // a is now the result
3116 } while(0); // end protected
3118 if (allocbuff!=NULL) free(allocbuff); // drop any storage used
3119 if (allocbufa!=NULL) free(allocbufa); // ..
3120 if (allocbufb!=NULL) free(allocbufb); // ..
3121 #if DECSUBSET
3122 if (allocrhs !=NULL) free(allocrhs); // ..
3123 #endif
3124 if (status!=0) decStatus(res, status, set);// then report status
3125 #if DECCHECK
3126 decCheckInexact(res, set);
3127 #endif
3128 return res;
3129 } // decNumberSquareRoot
3131 /* ------------------------------------------------------------------ */
3132 /* decNumberSubtract -- subtract two Numbers */
3133 /* */
3134 /* This computes C = A - B */
3135 /* */
3136 /* res is C, the result. C may be A and/or B (e.g., X=X-X) */
3137 /* lhs is A */
3138 /* rhs is B */
3139 /* set is the context */
3140 /* */
3141 /* C must have space for set->digits digits. */
3142 /* ------------------------------------------------------------------ */
3143 decNumber * decNumberSubtract(decNumber *res, const decNumber *lhs,
3144 const decNumber *rhs, decContext *set) {
3145 uInt status=0; // accumulator
3147 decAddOp(res, lhs, rhs, set, DECNEG, &status);
3148 if (status!=0) decStatus(res, status, set);
3149 #if DECCHECK
3150 decCheckInexact(res, set);
3151 #endif
3152 return res;
3153 } // decNumberSubtract
3155 /* ------------------------------------------------------------------ */
3156 /* decNumberToIntegralExact -- round-to-integral-value with InExact */
3157 /* decNumberToIntegralValue -- round-to-integral-value */
3158 /* */
3159 /* res is the result */
3160 /* rhs is input number */
3161 /* set is the context */
3162 /* */
3163 /* res must have space for any value of rhs. */
3164 /* */
3165 /* This implements the IEEE special operators and therefore treats */
3166 /* special values as valid. For finite numbers it returns */
3167 /* rescale(rhs, 0) if rhs->exponent is <0. */
3168 /* Otherwise the result is rhs (so no error is possible, except for */
3169 /* sNaN). */
3170 /* */
3171 /* The context is used for rounding mode and status after sNaN, but */
3172 /* the digits setting is ignored. The Exact version will signal */
3173 /* Inexact if the result differs numerically from rhs; the other */
3174 /* never signals Inexact. */
3175 /* ------------------------------------------------------------------ */
3176 decNumber * decNumberToIntegralExact(decNumber *res, const decNumber *rhs,
3177 decContext *set) {
3178 decNumber dn;
3179 decContext workset; // working context
3180 uInt status=0; // accumulator
3182 #if DECCHECK
3183 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
3184 #endif
3186 // handle infinities and NaNs
3187 if (SPECIALARG) {
3188 if (decNumberIsInfinite(rhs)) decNumberCopy(res, rhs); // an Infinity
3189 else decNaNs(res, rhs, NULL, set, &status); // a NaN
3191 else { // finite
3192 // have a finite number; no error possible (res must be big enough)
3193 if (rhs->exponent>=0) return decNumberCopy(res, rhs);
3194 // that was easy, but if negative exponent there is work to do...
3195 workset=*set; // clone rounding, etc.
3196 workset.digits=rhs->digits; // no length rounding
3197 workset.traps=0; // no traps
3198 decNumberZero(&dn); // make a number with exponent 0
3199 decNumberQuantize(res, rhs, &dn, &workset);
3200 status|=workset.status;
3202 if (status!=0) decStatus(res, status, set);
3203 return res;
3204 } // decNumberToIntegralExact
3206 decNumber * decNumberToIntegralValue(decNumber *res, const decNumber *rhs,
3207 decContext *set) {
3208 decContext workset=*set; // working context
3209 workset.traps=0; // no traps
3210 decNumberToIntegralExact(res, rhs, &workset);
3211 // this never affects set, except for sNaNs; NaN will have been set
3212 // or propagated already, so no need to call decStatus
3213 set->status|=workset.status&DEC_Invalid_operation;
3214 return res;
3215 } // decNumberToIntegralValue
3217 /* ------------------------------------------------------------------ */
3218 /* decNumberXor -- XOR two Numbers, digitwise */
3219 /* */
3220 /* This computes C = A ^ B */
3221 /* */
3222 /* res is C, the result. C may be A and/or B (e.g., X=X^X) */
3223 /* lhs is A */
3224 /* rhs is B */
3225 /* set is the context (used for result length and error report) */
3226 /* */
3227 /* C must have space for set->digits digits. */
3228 /* */
3229 /* Logical function restrictions apply (see above); a NaN is */
3230 /* returned with Invalid_operation if a restriction is violated. */
3231 /* ------------------------------------------------------------------ */
3232 decNumber * decNumberXor(decNumber *res, const decNumber *lhs,
3233 const decNumber *rhs, decContext *set) {
3234 const Unit *ua, *ub; // -> operands
3235 const Unit *msua, *msub; // -> operand msus
3236 Unit *uc, *msuc; // -> result and its msu
3237 Int msudigs; // digits in res msu
3238 #if DECCHECK
3239 if (decCheckOperands(res, lhs, rhs, set)) return res;
3240 #endif
3242 if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
3243 || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
3244 decStatus(res, DEC_Invalid_operation, set);
3245 return res;
3247 // operands are valid
3248 ua=lhs->lsu; // bottom-up
3249 ub=rhs->lsu; // ..
3250 uc=res->lsu; // ..
3251 msua=ua+D2U(lhs->digits)-1; // -> msu of lhs
3252 msub=ub+D2U(rhs->digits)-1; // -> msu of rhs
3253 msuc=uc+D2U(set->digits)-1; // -> msu of result
3254 msudigs=MSUDIGITS(set->digits); // [faster than remainder]
3255 for (; uc<=msuc; ua++, ub++, uc++) { // Unit loop
3256 Unit a, b; // extract units
3257 if (ua>msua) a=0;
3258 else a=*ua;
3259 if (ub>msub) b=0;
3260 else b=*ub;
3261 *uc=0; // can now write back
3262 if (a|b) { // maybe 1 bits to examine
3263 Int i, j;
3264 // This loop could be unrolled and/or use BIN2BCD tables
3265 for (i=0; i<DECDPUN; i++) {
3266 if ((a^b)&1) *uc=*uc+(Unit)powers[i]; // effect XOR
3267 j=a%10;
3268 a=a/10;
3269 j|=b%10;
3270 b=b/10;
3271 if (j>1) {
3272 decStatus(res, DEC_Invalid_operation, set);
3273 return res;
3275 if (uc==msuc && i==msudigs-1) break; // just did final digit
3276 } // each digit
3277 } // non-zero
3278 } // each unit
3279 // [here uc-1 is the msu of the result]
3280 res->digits=decGetDigits(res->lsu, uc-res->lsu);
3281 res->exponent=0; // integer
3282 res->bits=0; // sign=0
3283 return res; // [no status to set]
3284 } // decNumberXor
3287 /* ================================================================== */
3288 /* Utility routines */
3289 /* ================================================================== */
3291 /* ------------------------------------------------------------------ */
3292 /* decNumberClass -- return the decClass of a decNumber */
3293 /* dn -- the decNumber to test */
3294 /* set -- the context to use for Emin */
3295 /* returns the decClass enum */
3296 /* ------------------------------------------------------------------ */
3297 enum decClass decNumberClass(const decNumber *dn, decContext *set) {
3298 if (decNumberIsSpecial(dn)) {
3299 if (decNumberIsQNaN(dn)) return DEC_CLASS_QNAN;
3300 if (decNumberIsSNaN(dn)) return DEC_CLASS_SNAN;
3301 // must be an infinity
3302 if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_INF;
3303 return DEC_CLASS_POS_INF;
3305 // is finite
3306 if (decNumberIsNormal(dn, set)) { // most common
3307 if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_NORMAL;
3308 return DEC_CLASS_POS_NORMAL;
3310 // is subnormal or zero
3311 if (decNumberIsZero(dn)) { // most common
3312 if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_ZERO;
3313 return DEC_CLASS_POS_ZERO;
3315 if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_SUBNORMAL;
3316 return DEC_CLASS_POS_SUBNORMAL;
3317 } // decNumberClass
3319 /* ------------------------------------------------------------------ */
3320 /* decNumberClassToString -- convert decClass to a string */
3321 /* */
3322 /* eclass is a valid decClass */
3323 /* returns a constant string describing the class (max 13+1 chars) */
3324 /* ------------------------------------------------------------------ */
3325 const char *decNumberClassToString(enum decClass eclass) {
3326 if (eclass==DEC_CLASS_POS_NORMAL) return DEC_ClassString_PN;
3327 if (eclass==DEC_CLASS_NEG_NORMAL) return DEC_ClassString_NN;
3328 if (eclass==DEC_CLASS_POS_ZERO) return DEC_ClassString_PZ;
3329 if (eclass==DEC_CLASS_NEG_ZERO) return DEC_ClassString_NZ;
3330 if (eclass==DEC_CLASS_POS_SUBNORMAL) return DEC_ClassString_PS;
3331 if (eclass==DEC_CLASS_NEG_SUBNORMAL) return DEC_ClassString_NS;
3332 if (eclass==DEC_CLASS_POS_INF) return DEC_ClassString_PI;
3333 if (eclass==DEC_CLASS_NEG_INF) return DEC_ClassString_NI;
3334 if (eclass==DEC_CLASS_QNAN) return DEC_ClassString_QN;
3335 if (eclass==DEC_CLASS_SNAN) return DEC_ClassString_SN;
3336 return DEC_ClassString_UN; // Unknown
3337 } // decNumberClassToString
3339 /* ------------------------------------------------------------------ */
3340 /* decNumberCopy -- copy a number */
3341 /* */
3342 /* dest is the target decNumber */
3343 /* src is the source decNumber */
3344 /* returns dest */
3345 /* */
3346 /* (dest==src is allowed and is a no-op) */
3347 /* All fields are updated as required. This is a utility operation, */
3348 /* so special values are unchanged and no error is possible. */
3349 /* ------------------------------------------------------------------ */
3350 decNumber * decNumberCopy(decNumber *dest, const decNumber *src) {
3352 #if DECCHECK
3353 if (src==NULL) return decNumberZero(dest);
3354 #endif
3356 if (dest==src) return dest; // no copy required
3358 // Use explicit assignments here as structure assignment could copy
3359 // more than just the lsu (for small DECDPUN). This would not affect
3360 // the value of the results, but could disturb test harness spill
3361 // checking.
3362 dest->bits=src->bits;
3363 dest->exponent=src->exponent;
3364 dest->digits=src->digits;
3365 dest->lsu[0]=src->lsu[0];
3366 if (src->digits>DECDPUN) { // more Units to come
3367 const Unit *smsup, *s; // work
3368 Unit *d; // ..
3369 // memcpy for the remaining Units would be safe as they cannot
3370 // overlap. However, this explicit loop is faster in short cases.
3371 d=dest->lsu+1; // -> first destination
3372 smsup=src->lsu+D2U(src->digits); // -> source msu+1
3373 for (s=src->lsu+1; s<smsup; s++, d++) *d=*s;
3375 return dest;
3376 } // decNumberCopy
3378 /* ------------------------------------------------------------------ */
3379 /* decNumberCopyAbs -- quiet absolute value operator */
3380 /* */
3381 /* This sets C = abs(A) */
3382 /* */
3383 /* res is C, the result. C may be A */
3384 /* rhs is A */
3385 /* */
3386 /* C must have space for set->digits digits. */
3387 /* No exception or error can occur; this is a quiet bitwise operation.*/
3388 /* See also decNumberAbs for a checking version of this. */
3389 /* ------------------------------------------------------------------ */
3390 decNumber * decNumberCopyAbs(decNumber *res, const decNumber *rhs) {
3391 #if DECCHECK
3392 if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
3393 #endif
3394 decNumberCopy(res, rhs);
3395 res->bits&=~DECNEG; // turn off sign
3396 return res;
3397 } // decNumberCopyAbs
3399 /* ------------------------------------------------------------------ */
3400 /* decNumberCopyNegate -- quiet negate value operator */
3401 /* */
3402 /* This sets C = negate(A) */
3403 /* */
3404 /* res is C, the result. C may be A */
3405 /* rhs is A */
3406 /* */
3407 /* C must have space for set->digits digits. */
3408 /* No exception or error can occur; this is a quiet bitwise operation.*/
3409 /* See also decNumberMinus for a checking version of this. */
3410 /* ------------------------------------------------------------------ */
3411 decNumber * decNumberCopyNegate(decNumber *res, const decNumber *rhs) {
3412 #if DECCHECK
3413 if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
3414 #endif
3415 decNumberCopy(res, rhs);
3416 res->bits^=DECNEG; // invert the sign
3417 return res;
3418 } // decNumberCopyNegate
3420 /* ------------------------------------------------------------------ */
3421 /* decNumberCopySign -- quiet copy and set sign operator */
3422 /* */
3423 /* This sets C = A with the sign of B */
3424 /* */
3425 /* res is C, the result. C may be A */
3426 /* lhs is A */
3427 /* rhs is B */
3428 /* */
3429 /* C must have space for set->digits digits. */
3430 /* No exception or error can occur; this is a quiet bitwise operation.*/
3431 /* ------------------------------------------------------------------ */
3432 decNumber * decNumberCopySign(decNumber *res, const decNumber *lhs,
3433 const decNumber *rhs) {
3434 uByte sign; // rhs sign
3435 #if DECCHECK
3436 if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
3437 #endif
3438 sign=rhs->bits & DECNEG; // save sign bit
3439 decNumberCopy(res, lhs);
3440 res->bits&=~DECNEG; // clear the sign
3441 res->bits|=sign; // set from rhs
3442 return res;
3443 } // decNumberCopySign
3445 /* ------------------------------------------------------------------ */
3446 /* decNumberGetBCD -- get the coefficient in BCD8 */
3447 /* dn is the source decNumber */
3448 /* bcd is the uInt array that will receive dn->digits BCD bytes, */
3449 /* most-significant at offset 0 */
3450 /* returns bcd */
3451 /* */
3452 /* bcd must have at least dn->digits bytes. No error is possible; if */
3453 /* dn is a NaN or Infinite, digits must be 1 and the coefficient 0. */
3454 /* ------------------------------------------------------------------ */
3455 uByte * decNumberGetBCD(const decNumber *dn, uByte *bcd) {
3456 uByte *ub=bcd+dn->digits-1; // -> lsd
3457 const Unit *up=dn->lsu; // Unit pointer, -> lsu
3459 #if DECDPUN==1 // trivial simple copy
3460 for (; ub>=bcd; ub--, up++) *ub=*up;
3461 #else // chopping needed
3462 uInt u=*up; // work
3463 uInt cut=DECDPUN; // downcounter through unit
3464 for (; ub>=bcd; ub--) {
3465 *ub=(uByte)(u%10); // [*6554 trick inhibits, here]
3466 u=u/10;
3467 cut--;
3468 if (cut>0) continue; // more in this unit
3469 up++;
3470 u=*up;
3471 cut=DECDPUN;
3473 #endif
3474 return bcd;
3475 } // decNumberGetBCD
3477 /* ------------------------------------------------------------------ */
3478 /* decNumberSetBCD -- set (replace) the coefficient from BCD8 */
3479 /* dn is the target decNumber */
3480 /* bcd is the uInt array that will source n BCD bytes, most- */
3481 /* significant at offset 0 */
3482 /* n is the number of digits in the source BCD array (bcd) */
3483 /* returns dn */
3484 /* */
3485 /* dn must have space for at least n digits. No error is possible; */
3486 /* if dn is a NaN, or Infinite, or is to become a zero, n must be 1 */
3487 /* and bcd[0] zero. */
3488 /* ------------------------------------------------------------------ */
3489 decNumber * decNumberSetBCD(decNumber *dn, const uByte *bcd, uInt n) {
3490 Unit *up=dn->lsu+D2U(dn->digits)-1; // -> msu [target pointer]
3491 const uByte *ub=bcd; // -> source msd
3493 #if DECDPUN==1 // trivial simple copy
3494 for (; ub<bcd+n; ub++, up--) *up=*ub;
3495 #else // some assembly needed
3496 // calculate how many digits in msu, and hence first cut
3497 Int cut=MSUDIGITS(n); // [faster than remainder]
3498 for (;up>=dn->lsu; up--) { // each Unit from msu
3499 *up=0; // will take <=DECDPUN digits
3500 for (; cut>0; ub++, cut--) *up=X10(*up)+*ub;
3501 cut=DECDPUN; // next Unit has all digits
3503 #endif
3504 dn->digits=n; // set digit count
3505 return dn;
3506 } // decNumberSetBCD
3508 /* ------------------------------------------------------------------ */
3509 /* decNumberIsNormal -- test normality of a decNumber */
3510 /* dn is the decNumber to test */
3511 /* set is the context to use for Emin */
3512 /* returns 1 if |dn| is finite and >=Nmin, 0 otherwise */
3513 /* ------------------------------------------------------------------ */
3514 Int decNumberIsNormal(const decNumber *dn, decContext *set) {
3515 Int ae; // adjusted exponent
3516 #if DECCHECK
3517 if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
3518 #endif
3520 if (decNumberIsSpecial(dn)) return 0; // not finite
3521 if (decNumberIsZero(dn)) return 0; // not non-zero
3523 ae=dn->exponent+dn->digits-1; // adjusted exponent
3524 if (ae<set->emin) return 0; // is subnormal
3525 return 1;
3526 } // decNumberIsNormal
3528 /* ------------------------------------------------------------------ */
3529 /* decNumberIsSubnormal -- test subnormality of a decNumber */
3530 /* dn is the decNumber to test */
3531 /* set is the context to use for Emin */
3532 /* returns 1 if |dn| is finite, non-zero, and <Nmin, 0 otherwise */
3533 /* ------------------------------------------------------------------ */
3534 Int decNumberIsSubnormal(const decNumber *dn, decContext *set) {
3535 Int ae; // adjusted exponent
3536 #if DECCHECK
3537 if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
3538 #endif
3540 if (decNumberIsSpecial(dn)) return 0; // not finite
3541 if (decNumberIsZero(dn)) return 0; // not non-zero
3543 ae=dn->exponent+dn->digits-1; // adjusted exponent
3544 if (ae<set->emin) return 1; // is subnormal
3545 return 0;
3546 } // decNumberIsSubnormal
3548 /* ------------------------------------------------------------------ */
3549 /* decNumberTrim -- remove insignificant zeros */
3550 /* */
3551 /* dn is the number to trim */
3552 /* returns dn */
3553 /* */
3554 /* All fields are updated as required. This is a utility operation, */
3555 /* so special values are unchanged and no error is possible. The */
3556 /* zeros are removed unconditionally. */
3557 /* ------------------------------------------------------------------ */
3558 decNumber * decNumberTrim(decNumber *dn) {
3559 Int dropped; // work
3560 decContext set; // ..
3561 #if DECCHECK
3562 if (decCheckOperands(DECUNRESU, DECUNUSED, dn, DECUNCONT)) return dn;
3563 #endif
3564 decContextDefault(&set, DEC_INIT_BASE); // clamp=0
3565 return decTrim(dn, &set, 0, 1, &dropped);
3566 } // decNumberTrim
3568 /* ------------------------------------------------------------------ */
3569 /* decNumberVersion -- return the name and version of this module */
3570 /* */
3571 /* No error is possible. */
3572 /* ------------------------------------------------------------------ */
3573 const char * decNumberVersion(void) {
3574 return DECVERSION;
3575 } // decNumberVersion
3577 /* ------------------------------------------------------------------ */
3578 /* decNumberZero -- set a number to 0 */
3579 /* */
3580 /* dn is the number to set, with space for one digit */
3581 /* returns dn */
3582 /* */
3583 /* No error is possible. */
3584 /* ------------------------------------------------------------------ */
3585 // Memset is not used as it is much slower in some environments.
3586 decNumber * decNumberZero(decNumber *dn) {
3588 #if DECCHECK
3589 if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
3590 #endif
3592 dn->bits=0;
3593 dn->exponent=0;
3594 dn->digits=1;
3595 dn->lsu[0]=0;
3596 return dn;
3597 } // decNumberZero
3599 /* ================================================================== */
3600 /* Local routines */
3601 /* ================================================================== */
3603 /* ------------------------------------------------------------------ */
3604 /* decToString -- lay out a number into a string */
3605 /* */
3606 /* dn is the number to lay out */
3607 /* string is where to lay out the number */
3608 /* eng is 1 if Engineering, 0 if Scientific */
3609 /* */
3610 /* string must be at least dn->digits+14 characters long */
3611 /* No error is possible. */
3612 /* */
3613 /* Note that this routine can generate a -0 or 0.000. These are */
3614 /* never generated in subset to-number or arithmetic, but can occur */
3615 /* in non-subset arithmetic (e.g., -1*0 or 1.234-1.234). */
3616 /* ------------------------------------------------------------------ */
3617 // If DECCHECK is enabled the string "?" is returned if a number is
3618 // invalid.
3619 static void decToString(const decNumber *dn, char *string, Flag eng) {
3620 Int exp=dn->exponent; // local copy
3621 Int e; // E-part value
3622 Int pre; // digits before the '.'
3623 Int cut; // for counting digits in a Unit
3624 char *c=string; // work [output pointer]
3625 const Unit *up=dn->lsu+D2U(dn->digits)-1; // -> msu [input pointer]
3626 uInt u, pow; // work
3628 #if DECCHECK
3629 if (decCheckOperands(DECUNRESU, dn, DECUNUSED, DECUNCONT)) {
3630 strcpy(string, "?");
3631 return;}
3632 #endif
3634 if (decNumberIsNegative(dn)) { // Negatives get a minus
3635 *c='-';
3636 c++;
3638 if (dn->bits&DECSPECIAL) { // Is a special value
3639 if (decNumberIsInfinite(dn)) {
3640 strcpy(c, "Inf");
3641 strcpy(c+3, "inity");
3642 return;}
3643 // a NaN
3644 if (dn->bits&DECSNAN) { // signalling NaN
3645 *c='s';
3646 c++;
3648 strcpy(c, "NaN");
3649 c+=3; // step past
3650 // if not a clean non-zero coefficient, that's all there is in a
3651 // NaN string
3652 if (exp!=0 || (*dn->lsu==0 && dn->digits==1)) return;
3653 // [drop through to add integer]
3656 // calculate how many digits in msu, and hence first cut
3657 cut=MSUDIGITS(dn->digits); // [faster than remainder]
3658 cut--; // power of ten for digit
3660 if (exp==0) { // simple integer [common fastpath]
3661 for (;up>=dn->lsu; up--) { // each Unit from msu
3662 u=*up; // contains DECDPUN digits to lay out
3663 for (; cut>=0; c++, cut--) TODIGIT(u, cut, c, pow);
3664 cut=DECDPUN-1; // next Unit has all digits
3666 *c='\0'; // terminate the string
3667 return;}
3669 /* non-0 exponent -- assume plain form */
3670 pre=dn->digits+exp; // digits before '.'
3671 e=0; // no E
3672 if ((exp>0) || (pre<-5)) { // need exponential form
3673 e=exp+dn->digits-1; // calculate E value
3674 pre=1; // assume one digit before '.'
3675 if (eng && (e!=0)) { // engineering: may need to adjust
3676 Int adj; // adjustment
3677 // The C remainder operator is undefined for negative numbers, so
3678 // a positive remainder calculation must be used here
3679 if (e<0) {
3680 adj=(-e)%3;
3681 if (adj!=0) adj=3-adj;
3683 else { // e>0
3684 adj=e%3;
3686 e=e-adj;
3687 // if dealing with zero still produce an exponent which is a
3688 // multiple of three, as expected, but there will only be the
3689 // one zero before the E, still. Otherwise note the padding.
3690 if (!ISZERO(dn)) pre+=adj;
3691 else { // is zero
3692 if (adj!=0) { // 0.00Esnn needed
3693 e=e+3;
3694 pre=-(2-adj);
3696 } // zero
3697 } // eng
3698 } // need exponent
3700 /* lay out the digits of the coefficient, adding 0s and . as needed */
3701 u=*up;
3702 if (pre>0) { // xxx.xxx or xx00 (engineering) form
3703 Int n=pre;
3704 for (; pre>0; pre--, c++, cut--) {
3705 if (cut<0) { // need new Unit
3706 if (up==dn->lsu) break; // out of input digits (pre>digits)
3707 up--;
3708 cut=DECDPUN-1;
3709 u=*up;
3711 TODIGIT(u, cut, c, pow);
3713 if (n<dn->digits) { // more to come, after '.'
3714 *c='.'; c++;
3715 for (;; c++, cut--) {
3716 if (cut<0) { // need new Unit
3717 if (up==dn->lsu) break; // out of input digits
3718 up--;
3719 cut=DECDPUN-1;
3720 u=*up;
3722 TODIGIT(u, cut, c, pow);
3725 else for (; pre>0; pre--, c++) *c='0'; // 0 padding (for engineering) needed
3727 else { // 0.xxx or 0.000xxx form
3728 *c='0'; c++;
3729 *c='.'; c++;
3730 for (; pre<0; pre++, c++) *c='0'; // add any 0's after '.'
3731 for (; ; c++, cut--) {
3732 if (cut<0) { // need new Unit
3733 if (up==dn->lsu) break; // out of input digits
3734 up--;
3735 cut=DECDPUN-1;
3736 u=*up;
3738 TODIGIT(u, cut, c, pow);
3742 /* Finally add the E-part, if needed. It will never be 0, has a
3743 base maximum and minimum of +999999999 through -999999999, but
3744 could range down to -1999999998 for anormal numbers */
3745 if (e!=0) {
3746 Flag had=0; // 1=had non-zero
3747 *c='E'; c++;
3748 *c='+'; c++; // assume positive
3749 u=e; // ..
3750 if (e<0) {
3751 *(c-1)='-'; // oops, need -
3752 u=-e; // uInt, please
3754 // lay out the exponent [_itoa or equivalent is not ANSI C]
3755 for (cut=9; cut>=0; cut--) {
3756 TODIGIT(u, cut, c, pow);
3757 if (*c=='0' && !had) continue; // skip leading zeros
3758 had=1; // had non-0
3759 c++; // step for next
3760 } // cut
3762 *c='\0'; // terminate the string (all paths)
3763 return;
3764 } // decToString
3766 /* ------------------------------------------------------------------ */
3767 /* decAddOp -- add/subtract operation */
3768 /* */
3769 /* This computes C = A + B */
3770 /* */
3771 /* res is C, the result. C may be A and/or B (e.g., X=X+X) */
3772 /* lhs is A */
3773 /* rhs is B */
3774 /* set is the context */
3775 /* negate is DECNEG if rhs should be negated, or 0 otherwise */
3776 /* status accumulates status for the caller */
3777 /* */
3778 /* C must have space for set->digits digits. */
3779 /* Inexact in status must be 0 for correct Exact zero sign in result */
3780 /* ------------------------------------------------------------------ */
3781 /* If possible, the coefficient is calculated directly into C. */
3782 /* However, if: */
3783 /* -- a digits+1 calculation is needed because the numbers are */
3784 /* unaligned and span more than set->digits digits */
3785 /* -- a carry to digits+1 digits looks possible */
3786 /* -- C is the same as A or B, and the result would destructively */
3787 /* overlap the A or B coefficient */
3788 /* then the result must be calculated into a temporary buffer. In */
3789 /* this case a local (stack) buffer is used if possible, and only if */
3790 /* too long for that does malloc become the final resort. */
3791 /* */
3792 /* Misalignment is handled as follows: */
3793 /* Apad: (AExp>BExp) Swap operands and proceed as for BExp>AExp. */
3794 /* BPad: Apply the padding by a combination of shifting (whole */
3795 /* units) and multiplication (part units). */
3796 /* */
3797 /* Addition, especially x=x+1, is speed-critical. */
3798 /* The static buffer is larger than might be expected to allow for */
3799 /* calls from higher-level funtions (notable exp). */
3800 /* ------------------------------------------------------------------ */
3801 static decNumber * decAddOp(decNumber *res, const decNumber *lhs,
3802 const decNumber *rhs, decContext *set,
3803 uByte negate, uInt *status) {
3804 #if DECSUBSET
3805 decNumber *alloclhs=NULL; // non-NULL if rounded lhs allocated
3806 decNumber *allocrhs=NULL; // .., rhs
3807 #endif
3808 Int rhsshift; // working shift (in Units)
3809 Int maxdigits; // longest logical length
3810 Int mult; // multiplier
3811 Int residue; // rounding accumulator
3812 uByte bits; // result bits
3813 Flag diffsign; // non-0 if arguments have different sign
3814 Unit *acc; // accumulator for result
3815 Unit accbuff[SD2U(DECBUFFER*2+20)]; // local buffer [*2+20 reduces many
3816 // allocations when called from
3817 // other operations, notable exp]
3818 Unit *allocacc=NULL; // -> allocated acc buffer, iff allocated
3819 Int reqdigits=set->digits; // local copy; requested DIGITS
3820 Int padding; // work
3822 #if DECCHECK
3823 if (decCheckOperands(res, lhs, rhs, set)) return res;
3824 #endif
3826 do { // protect allocated storage
3827 #if DECSUBSET
3828 if (!set->extended) {
3829 // reduce operands and set lostDigits status, as needed
3830 if (lhs->digits>reqdigits) {
3831 alloclhs=decRoundOperand(lhs, set, status);
3832 if (alloclhs==NULL) break;
3833 lhs=alloclhs;
3835 if (rhs->digits>reqdigits) {
3836 allocrhs=decRoundOperand(rhs, set, status);
3837 if (allocrhs==NULL) break;
3838 rhs=allocrhs;
3841 #endif
3842 // [following code does not require input rounding]
3844 // note whether signs differ [used all paths]
3845 diffsign=(Flag)((lhs->bits^rhs->bits^negate)&DECNEG);
3847 // handle infinities and NaNs
3848 if (SPECIALARGS) { // a special bit set
3849 if (SPECIALARGS & (DECSNAN | DECNAN)) // a NaN
3850 decNaNs(res, lhs, rhs, set, status);
3851 else { // one or two infinities
3852 if (decNumberIsInfinite(lhs)) { // LHS is infinity
3853 // two infinities with different signs is invalid
3854 if (decNumberIsInfinite(rhs) && diffsign) {
3855 *status|=DEC_Invalid_operation;
3856 break;
3858 bits=lhs->bits & DECNEG; // get sign from LHS
3860 else bits=(rhs->bits^negate) & DECNEG;// RHS must be Infinity
3861 bits|=DECINF;
3862 decNumberZero(res);
3863 res->bits=bits; // set +/- infinity
3864 } // an infinity
3865 break;
3868 // Quick exit for add 0s; return the non-0, modified as need be
3869 if (ISZERO(lhs)) {
3870 Int adjust; // work
3871 Int lexp=lhs->exponent; // save in case LHS==RES
3872 bits=lhs->bits; // ..
3873 residue=0; // clear accumulator
3874 decCopyFit(res, rhs, set, &residue, status); // copy (as needed)
3875 res->bits^=negate; // flip if rhs was negated
3876 #if DECSUBSET
3877 if (set->extended) { // exponents on zeros count
3878 #endif
3879 // exponent will be the lower of the two
3880 adjust=lexp-res->exponent; // adjustment needed [if -ve]
3881 if (ISZERO(res)) { // both 0: special IEEE 754 rules
3882 if (adjust<0) res->exponent=lexp; // set exponent
3883 // 0-0 gives +0 unless rounding to -infinity, and -0-0 gives -0
3884 if (diffsign) {
3885 if (set->round!=DEC_ROUND_FLOOR) res->bits=0;
3886 else res->bits=DECNEG; // preserve 0 sign
3889 else { // non-0 res
3890 if (adjust<0) { // 0-padding needed
3891 if ((res->digits-adjust)>set->digits) {
3892 adjust=res->digits-set->digits; // to fit exactly
3893 *status|=DEC_Rounded; // [but exact]
3895 res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
3896 res->exponent+=adjust; // set the exponent.
3898 } // non-0 res
3899 #if DECSUBSET
3900 } // extended
3901 #endif
3902 decFinish(res, set, &residue, status); // clean and finalize
3903 break;}
3905 if (ISZERO(rhs)) { // [lhs is non-zero]
3906 Int adjust; // work
3907 Int rexp=rhs->exponent; // save in case RHS==RES
3908 bits=rhs->bits; // be clean
3909 residue=0; // clear accumulator
3910 decCopyFit(res, lhs, set, &residue, status); // copy (as needed)
3911 #if DECSUBSET
3912 if (set->extended) { // exponents on zeros count
3913 #endif
3914 // exponent will be the lower of the two
3915 // [0-0 case handled above]
3916 adjust=rexp-res->exponent; // adjustment needed [if -ve]
3917 if (adjust<0) { // 0-padding needed
3918 if ((res->digits-adjust)>set->digits) {
3919 adjust=res->digits-set->digits; // to fit exactly
3920 *status|=DEC_Rounded; // [but exact]
3922 res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
3923 res->exponent+=adjust; // set the exponent.
3925 #if DECSUBSET
3926 } // extended
3927 #endif
3928 decFinish(res, set, &residue, status); // clean and finalize
3929 break;}
3931 // [NB: both fastpath and mainpath code below assume these cases
3932 // (notably 0-0) have already been handled]
3934 // calculate the padding needed to align the operands
3935 padding=rhs->exponent-lhs->exponent;
3937 // Fastpath cases where the numbers are aligned and normal, the RHS
3938 // is all in one unit, no operand rounding is needed, and no carry,
3939 // lengthening, or borrow is needed
3940 if (padding==0
3941 && rhs->digits<=DECDPUN
3942 && rhs->exponent>=set->emin // [some normals drop through]
3943 && rhs->exponent<=set->emax-set->digits+1 // [could clamp]
3944 && rhs->digits<=reqdigits
3945 && lhs->digits<=reqdigits) {
3946 Int partial=*lhs->lsu;
3947 if (!diffsign) { // adding
3948 partial+=*rhs->lsu;
3949 if ((partial<=DECDPUNMAX) // result fits in unit
3950 && (lhs->digits>=DECDPUN || // .. and no digits-count change
3951 partial<(Int)powers[lhs->digits])) { // ..
3952 if (res!=lhs) decNumberCopy(res, lhs); // not in place
3953 *res->lsu=(Unit)partial; // [copy could have overwritten RHS]
3954 break;
3956 // else drop out for careful add
3958 else { // signs differ
3959 partial-=*rhs->lsu;
3960 if (partial>0) { // no borrow needed, and non-0 result
3961 if (res!=lhs) decNumberCopy(res, lhs); // not in place
3962 *res->lsu=(Unit)partial;
3963 // this could have reduced digits [but result>0]
3964 res->digits=decGetDigits(res->lsu, D2U(res->digits));
3965 break;
3967 // else drop out for careful subtract
3971 // Now align (pad) the lhs or rhs so they can be added or
3972 // subtracted, as necessary. If one number is much larger than
3973 // the other (that is, if in plain form there is a least one
3974 // digit between the lowest digit of one and the highest of the
3975 // other) padding with up to DIGITS-1 trailing zeros may be
3976 // needed; then apply rounding (as exotic rounding modes may be
3977 // affected by the residue).
3978 rhsshift=0; // rhs shift to left (padding) in Units
3979 bits=lhs->bits; // assume sign is that of LHS
3980 mult=1; // likely multiplier
3982 // [if padding==0 the operands are aligned; no padding is needed]
3983 if (padding!=0) {
3984 // some padding needed; always pad the RHS, as any required
3985 // padding can then be effected by a simple combination of
3986 // shifts and a multiply
3987 Flag swapped=0;
3988 if (padding<0) { // LHS needs the padding
3989 const decNumber *t;
3990 padding=-padding; // will be +ve
3991 bits=(uByte)(rhs->bits^negate); // assumed sign is now that of RHS
3992 t=lhs; lhs=rhs; rhs=t;
3993 swapped=1;
3996 // If, after pad, rhs would be longer than lhs by digits+1 or
3997 // more then lhs cannot affect the answer, except as a residue,
3998 // so only need to pad up to a length of DIGITS+1.
3999 if (rhs->digits+padding > lhs->digits+reqdigits+1) {
4000 // The RHS is sufficient
4001 // for residue use the relative sign indication...
4002 Int shift=reqdigits-rhs->digits; // left shift needed
4003 residue=1; // residue for rounding
4004 if (diffsign) residue=-residue; // signs differ
4005 // copy, shortening if necessary
4006 decCopyFit(res, rhs, set, &residue, status);
4007 // if it was already shorter, then need to pad with zeros
4008 if (shift>0) {
4009 res->digits=decShiftToMost(res->lsu, res->digits, shift);
4010 res->exponent-=shift; // adjust the exponent.
4012 // flip the result sign if unswapped and rhs was negated
4013 if (!swapped) res->bits^=negate;
4014 decFinish(res, set, &residue, status); // done
4015 break;}
4017 // LHS digits may affect result
4018 rhsshift=D2U(padding+1)-1; // this much by Unit shift ..
4019 mult=powers[padding-(rhsshift*DECDPUN)]; // .. this by multiplication
4020 } // padding needed
4022 if (diffsign) mult=-mult; // signs differ
4024 // determine the longer operand
4025 maxdigits=rhs->digits+padding; // virtual length of RHS
4026 if (lhs->digits>maxdigits) maxdigits=lhs->digits;
4028 // Decide on the result buffer to use; if possible place directly
4029 // into result.
4030 acc=res->lsu; // assume add direct to result
4031 // If destructive overlap, or the number is too long, or a carry or
4032 // borrow to DIGITS+1 might be possible, a buffer must be used.
4033 // [Might be worth more sophisticated tests when maxdigits==reqdigits]
4034 if ((maxdigits>=reqdigits) // is, or could be, too large
4035 || (res==rhs && rhsshift>0)) { // destructive overlap
4036 // buffer needed, choose it; units for maxdigits digits will be
4037 // needed, +1 Unit for carry or borrow
4038 Int need=D2U(maxdigits)+1;
4039 acc=accbuff; // assume use local buffer
4040 if (need*sizeof(Unit)>sizeof(accbuff)) {
4041 // printf("malloc add %ld %ld\n", need, sizeof(accbuff));
4042 allocacc=(Unit *)malloc(need*sizeof(Unit));
4043 if (allocacc==NULL) { // hopeless -- abandon
4044 *status|=DEC_Insufficient_storage;
4045 break;}
4046 acc=allocacc;
4050 res->bits=(uByte)(bits&DECNEG); // it's now safe to overwrite..
4051 res->exponent=lhs->exponent; // .. operands (even if aliased)
4053 #if DECTRACE
4054 decDumpAr('A', lhs->lsu, D2U(lhs->digits));
4055 decDumpAr('B', rhs->lsu, D2U(rhs->digits));
4056 printf(" :h: %ld %ld\n", rhsshift, mult);
4057 #endif
4059 // add [A+B*m] or subtract [A+B*(-m)]
4060 res->digits=decUnitAddSub(lhs->lsu, D2U(lhs->digits),
4061 rhs->lsu, D2U(rhs->digits),
4062 rhsshift, acc, mult)
4063 *DECDPUN; // [units -> digits]
4064 if (res->digits<0) { // borrowed...
4065 res->digits=-res->digits;
4066 res->bits^=DECNEG; // flip the sign
4068 #if DECTRACE
4069 decDumpAr('+', acc, D2U(res->digits));
4070 #endif
4072 // If a buffer was used the result must be copied back, possibly
4073 // shortening. (If no buffer was used then the result must have
4074 // fit, so can't need rounding and residue must be 0.)
4075 residue=0; // clear accumulator
4076 if (acc!=res->lsu) {
4077 #if DECSUBSET
4078 if (set->extended) { // round from first significant digit
4079 #endif
4080 // remove leading zeros that were added due to rounding up to
4081 // integral Units -- before the test for rounding.
4082 if (res->digits>reqdigits)
4083 res->digits=decGetDigits(acc, D2U(res->digits));
4084 decSetCoeff(res, set, acc, res->digits, &residue, status);
4085 #if DECSUBSET
4087 else { // subset arithmetic rounds from original significant digit
4088 // May have an underestimate. This only occurs when both
4089 // numbers fit in DECDPUN digits and are padding with a
4090 // negative multiple (-10, -100...) and the top digit(s) become
4091 // 0. (This only matters when using X3.274 rules where the
4092 // leading zero could be included in the rounding.)
4093 if (res->digits<maxdigits) {
4094 *(acc+D2U(res->digits))=0; // ensure leading 0 is there
4095 res->digits=maxdigits;
4097 else {
4098 // remove leading zeros that added due to rounding up to
4099 // integral Units (but only those in excess of the original
4100 // maxdigits length, unless extended) before test for rounding.
4101 if (res->digits>reqdigits) {
4102 res->digits=decGetDigits(acc, D2U(res->digits));
4103 if (res->digits<maxdigits) res->digits=maxdigits;
4106 decSetCoeff(res, set, acc, res->digits, &residue, status);
4107 // Now apply rounding if needed before removing leading zeros.
4108 // This is safe because subnormals are not a possibility
4109 if (residue!=0) {
4110 decApplyRound(res, set, residue, status);
4111 residue=0; // did what needed to be done
4113 } // subset
4114 #endif
4115 } // used buffer
4117 // strip leading zeros [these were left on in case of subset subtract]
4118 res->digits=decGetDigits(res->lsu, D2U(res->digits));
4120 // apply checks and rounding
4121 decFinish(res, set, &residue, status);
4123 // "When the sum of two operands with opposite signs is exactly
4124 // zero, the sign of that sum shall be '+' in all rounding modes
4125 // except round toward -Infinity, in which mode that sign shall be
4126 // '-'." [Subset zeros also never have '-', set by decFinish.]
4127 if (ISZERO(res) && diffsign
4128 #if DECSUBSET
4129 && set->extended
4130 #endif
4131 && (*status&DEC_Inexact)==0) {
4132 if (set->round==DEC_ROUND_FLOOR) res->bits|=DECNEG; // sign -
4133 else res->bits&=~DECNEG; // sign +
4135 } while(0); // end protected
4137 if (allocacc!=NULL) free(allocacc); // drop any storage used
4138 #if DECSUBSET
4139 if (allocrhs!=NULL) free(allocrhs); // ..
4140 if (alloclhs!=NULL) free(alloclhs); // ..
4141 #endif
4142 return res;
4143 } // decAddOp
4145 /* ------------------------------------------------------------------ */
4146 /* decDivideOp -- division operation */
4147 /* */
4148 /* This routine performs the calculations for all four division */
4149 /* operators (divide, divideInteger, remainder, remainderNear). */
4150 /* */
4151 /* C=A op B */
4152 /* */
4153 /* res is C, the result. C may be A and/or B (e.g., X=X/X) */
4154 /* lhs is A */
4155 /* rhs is B */
4156 /* set is the context */
4157 /* op is DIVIDE, DIVIDEINT, REMAINDER, or REMNEAR respectively. */
4158 /* status is the usual accumulator */
4159 /* */
4160 /* C must have space for set->digits digits. */
4161 /* */
4162 /* ------------------------------------------------------------------ */
4163 /* The underlying algorithm of this routine is the same as in the */
4164 /* 1981 S/370 implementation, that is, non-restoring long division */
4165 /* with bi-unit (rather than bi-digit) estimation for each unit */
4166 /* multiplier. In this pseudocode overview, complications for the */
4167 /* Remainder operators and division residues for exact rounding are */
4168 /* omitted for clarity. */
4169 /* */
4170 /* Prepare operands and handle special values */
4171 /* Test for x/0 and then 0/x */
4172 /* Exp =Exp1 - Exp2 */
4173 /* Exp =Exp +len(var1) -len(var2) */
4174 /* Sign=Sign1 * Sign2 */
4175 /* Pad accumulator (Var1) to double-length with 0's (pad1) */
4176 /* Pad Var2 to same length as Var1 */
4177 /* msu2pair/plus=1st 2 or 1 units of var2, +1 to allow for round */
4178 /* have=0 */
4179 /* Do until (have=digits+1 OR residue=0) */
4180 /* if exp<0 then if integer divide/residue then leave */
4181 /* this_unit=0 */
4182 /* Do forever */
4183 /* compare numbers */
4184 /* if <0 then leave inner_loop */
4185 /* if =0 then (* quick exit without subtract *) do */
4186 /* this_unit=this_unit+1; output this_unit */
4187 /* leave outer_loop; end */
4188 /* Compare lengths of numbers (mantissae): */
4189 /* If same then tops2=msu2pair -- {units 1&2 of var2} */
4190 /* else tops2=msu2plus -- {0, unit 1 of var2} */
4191 /* tops1=first_unit_of_Var1*10**DECDPUN +second_unit_of_var1 */
4192 /* mult=tops1/tops2 -- Good and safe guess at divisor */
4193 /* if mult=0 then mult=1 */
4194 /* this_unit=this_unit+mult */
4195 /* subtract */
4196 /* end inner_loop */
4197 /* if have\=0 | this_unit\=0 then do */
4198 /* output this_unit */
4199 /* have=have+1; end */
4200 /* var2=var2/10 */
4201 /* exp=exp-1 */
4202 /* end outer_loop */
4203 /* exp=exp+1 -- set the proper exponent */
4204 /* if have=0 then generate answer=0 */
4205 /* Return (Result is defined by Var1) */
4206 /* */
4207 /* ------------------------------------------------------------------ */
4208 /* Two working buffers are needed during the division; one (digits+ */
4209 /* 1) to accumulate the result, and the other (up to 2*digits+1) for */
4210 /* long subtractions. These are acc and var1 respectively. */
4211 /* var1 is a copy of the lhs coefficient, var2 is the rhs coefficient.*/
4212 /* The static buffers may be larger than might be expected to allow */
4213 /* for calls from higher-level funtions (notable exp). */
4214 /* ------------------------------------------------------------------ */
4215 static decNumber * decDivideOp(decNumber *res,
4216 const decNumber *lhs, const decNumber *rhs,
4217 decContext *set, Flag op, uInt *status) {
4218 #if DECSUBSET
4219 decNumber *alloclhs=NULL; // non-NULL if rounded lhs allocated
4220 decNumber *allocrhs=NULL; // .., rhs
4221 #endif
4222 Unit accbuff[SD2U(DECBUFFER+DECDPUN+10)]; // local buffer
4223 Unit *acc=accbuff; // -> accumulator array for result
4224 Unit *allocacc=NULL; // -> allocated buffer, iff allocated
4225 Unit *accnext; // -> where next digit will go
4226 Int acclength; // length of acc needed [Units]
4227 Int accunits; // count of units accumulated
4228 Int accdigits; // count of digits accumulated
4230 Unit varbuff[SD2U(DECBUFFER*2+DECDPUN)]; // buffer for var1
4231 Unit *var1=varbuff; // -> var1 array for long subtraction
4232 Unit *varalloc=NULL; // -> allocated buffer, iff used
4233 Unit *msu1; // -> msu of var1
4235 const Unit *var2; // -> var2 array
4236 const Unit *msu2; // -> msu of var2
4237 Int msu2plus; // msu2 plus one [does not vary]
4238 eInt msu2pair; // msu2 pair plus one [does not vary]
4240 Int var1units, var2units; // actual lengths
4241 Int var2ulen; // logical length (units)
4242 Int var1initpad=0; // var1 initial padding (digits)
4243 Int maxdigits; // longest LHS or required acc length
4244 Int mult; // multiplier for subtraction
4245 Unit thisunit; // current unit being accumulated
4246 Int residue; // for rounding
4247 Int reqdigits=set->digits; // requested DIGITS
4248 Int exponent; // working exponent
4249 Int maxexponent=0; // DIVIDE maximum exponent if unrounded
4250 uByte bits; // working sign
4251 Unit *target; // work
4252 const Unit *source; // ..
4253 uInt const *pow; // ..
4254 Int shift, cut; // ..
4255 #if DECSUBSET
4256 Int dropped; // work
4257 #endif
4259 #if DECCHECK
4260 if (decCheckOperands(res, lhs, rhs, set)) return res;
4261 #endif
4263 do { // protect allocated storage
4264 #if DECSUBSET
4265 if (!set->extended) {
4266 // reduce operands and set lostDigits status, as needed
4267 if (lhs->digits>reqdigits) {
4268 alloclhs=decRoundOperand(lhs, set, status);
4269 if (alloclhs==NULL) break;
4270 lhs=alloclhs;
4272 if (rhs->digits>reqdigits) {
4273 allocrhs=decRoundOperand(rhs, set, status);
4274 if (allocrhs==NULL) break;
4275 rhs=allocrhs;
4278 #endif
4279 // [following code does not require input rounding]
4281 bits=(lhs->bits^rhs->bits)&DECNEG; // assumed sign for divisions
4283 // handle infinities and NaNs
4284 if (SPECIALARGS) { // a special bit set
4285 if (SPECIALARGS & (DECSNAN | DECNAN)) { // one or two NaNs
4286 decNaNs(res, lhs, rhs, set, status);
4287 break;
4289 // one or two infinities
4290 if (decNumberIsInfinite(lhs)) { // LHS (dividend) is infinite
4291 if (decNumberIsInfinite(rhs) || // two infinities are invalid ..
4292 op & (REMAINDER | REMNEAR)) { // as is remainder of infinity
4293 *status|=DEC_Invalid_operation;
4294 break;
4296 // [Note that infinity/0 raises no exceptions]
4297 decNumberZero(res);
4298 res->bits=bits|DECINF; // set +/- infinity
4299 break;
4301 else { // RHS (divisor) is infinite
4302 residue=0;
4303 if (op&(REMAINDER|REMNEAR)) {
4304 // result is [finished clone of] lhs
4305 decCopyFit(res, lhs, set, &residue, status);
4307 else { // a division
4308 decNumberZero(res);
4309 res->bits=bits; // set +/- zero
4310 // for DIVIDEINT the exponent is always 0. For DIVIDE, result
4311 // is a 0 with infinitely negative exponent, clamped to minimum
4312 if (op&DIVIDE) {
4313 res->exponent=set->emin-set->digits+1;
4314 *status|=DEC_Clamped;
4317 decFinish(res, set, &residue, status);
4318 break;
4322 // handle 0 rhs (x/0)
4323 if (ISZERO(rhs)) { // x/0 is always exceptional
4324 if (ISZERO(lhs)) {
4325 decNumberZero(res); // [after lhs test]
4326 *status|=DEC_Division_undefined;// 0/0 will become NaN
4328 else {
4329 decNumberZero(res);
4330 if (op&(REMAINDER|REMNEAR)) *status|=DEC_Invalid_operation;
4331 else {
4332 *status|=DEC_Division_by_zero; // x/0
4333 res->bits=bits|DECINF; // .. is +/- Infinity
4336 break;}
4338 // handle 0 lhs (0/x)
4339 if (ISZERO(lhs)) { // 0/x [x!=0]
4340 #if DECSUBSET
4341 if (!set->extended) decNumberZero(res);
4342 else {
4343 #endif
4344 if (op&DIVIDE) {
4345 residue=0;
4346 exponent=lhs->exponent-rhs->exponent; // ideal exponent
4347 decNumberCopy(res, lhs); // [zeros always fit]
4348 res->bits=bits; // sign as computed
4349 res->exponent=exponent; // exponent, too
4350 decFinalize(res, set, &residue, status); // check exponent
4352 else if (op&DIVIDEINT) {
4353 decNumberZero(res); // integer 0
4354 res->bits=bits; // sign as computed
4356 else { // a remainder
4357 exponent=rhs->exponent; // [save in case overwrite]
4358 decNumberCopy(res, lhs); // [zeros always fit]
4359 if (exponent<res->exponent) res->exponent=exponent; // use lower
4361 #if DECSUBSET
4363 #endif
4364 break;}
4366 // Precalculate exponent. This starts off adjusted (and hence fits
4367 // in 31 bits) and becomes the usual unadjusted exponent as the
4368 // division proceeds. The order of evaluation is important, here,
4369 // to avoid wrap.
4370 exponent=(lhs->exponent+lhs->digits)-(rhs->exponent+rhs->digits);
4372 // If the working exponent is -ve, then some quick exits are
4373 // possible because the quotient is known to be <1
4374 // [for REMNEAR, it needs to be < -1, as -0.5 could need work]
4375 if (exponent<0 && !(op==DIVIDE)) {
4376 if (op&DIVIDEINT) {
4377 decNumberZero(res); // integer part is 0
4378 #if DECSUBSET
4379 if (set->extended)
4380 #endif
4381 res->bits=bits; // set +/- zero
4382 break;}
4383 // fastpath remainders so long as the lhs has the smaller
4384 // (or equal) exponent
4385 if (lhs->exponent<=rhs->exponent) {
4386 if (op&REMAINDER || exponent<-1) {
4387 // It is REMAINDER or safe REMNEAR; result is [finished
4388 // clone of] lhs (r = x - 0*y)
4389 residue=0;
4390 decCopyFit(res, lhs, set, &residue, status);
4391 decFinish(res, set, &residue, status);
4392 break;
4394 // [unsafe REMNEAR drops through]
4396 } // fastpaths
4398 /* Long (slow) division is needed; roll up the sleeves... */
4400 // The accumulator will hold the quotient of the division.
4401 // If it needs to be too long for stack storage, then allocate.
4402 acclength=D2U(reqdigits+DECDPUN); // in Units
4403 if (acclength*sizeof(Unit)>sizeof(accbuff)) {
4404 // printf("malloc dvacc %ld units\n", acclength);
4405 allocacc=(Unit *)malloc(acclength*sizeof(Unit));
4406 if (allocacc==NULL) { // hopeless -- abandon
4407 *status|=DEC_Insufficient_storage;
4408 break;}
4409 acc=allocacc; // use the allocated space
4412 // var1 is the padded LHS ready for subtractions.
4413 // If it needs to be too long for stack storage, then allocate.
4414 // The maximum units needed for var1 (long subtraction) is:
4415 // Enough for
4416 // (rhs->digits+reqdigits-1) -- to allow full slide to right
4417 // or (lhs->digits) -- to allow for long lhs
4418 // whichever is larger
4419 // +1 -- for rounding of slide to right
4420 // +1 -- for leading 0s
4421 // +1 -- for pre-adjust if a remainder or DIVIDEINT
4422 // [Note: unused units do not participate in decUnitAddSub data]
4423 maxdigits=rhs->digits+reqdigits-1;
4424 if (lhs->digits>maxdigits) maxdigits=lhs->digits;
4425 var1units=D2U(maxdigits)+2;
4426 // allocate a guard unit above msu1 for REMAINDERNEAR
4427 if (!(op&DIVIDE)) var1units++;
4428 if ((var1units+1)*sizeof(Unit)>sizeof(varbuff)) {
4429 // printf("malloc dvvar %ld units\n", var1units+1);
4430 varalloc=(Unit *)malloc((var1units+1)*sizeof(Unit));
4431 if (varalloc==NULL) { // hopeless -- abandon
4432 *status|=DEC_Insufficient_storage;
4433 break;}
4434 var1=varalloc; // use the allocated space
4437 // Extend the lhs and rhs to full long subtraction length. The lhs
4438 // is truly extended into the var1 buffer, with 0 padding, so a
4439 // subtract in place is always possible. The rhs (var2) has
4440 // virtual padding (implemented by decUnitAddSub).
4441 // One guard unit was allocated above msu1 for rem=rem+rem in
4442 // REMAINDERNEAR.
4443 msu1=var1+var1units-1; // msu of var1
4444 source=lhs->lsu+D2U(lhs->digits)-1; // msu of input array
4445 for (target=msu1; source>=lhs->lsu; source--, target--) *target=*source;
4446 for (; target>=var1; target--) *target=0;
4448 // rhs (var2) is left-aligned with var1 at the start
4449 var2ulen=var1units; // rhs logical length (units)
4450 var2units=D2U(rhs->digits); // rhs actual length (units)
4451 var2=rhs->lsu; // -> rhs array
4452 msu2=var2+var2units-1; // -> msu of var2 [never changes]
4453 // now set up the variables which will be used for estimating the
4454 // multiplication factor. If these variables are not exact, add
4455 // 1 to make sure that the multiplier is never overestimated.
4456 msu2plus=*msu2; // it's value ..
4457 if (var2units>1) msu2plus++; // .. +1 if any more
4458 msu2pair=(eInt)*msu2*(DECDPUNMAX+1);// top two pair ..
4459 if (var2units>1) { // .. [else treat 2nd as 0]
4460 msu2pair+=*(msu2-1); // ..
4461 if (var2units>2) msu2pair++; // .. +1 if any more
4464 // The calculation is working in units, which may have leading zeros,
4465 // but the exponent was calculated on the assumption that they are
4466 // both left-aligned. Adjust the exponent to compensate: add the
4467 // number of leading zeros in var1 msu and subtract those in var2 msu.
4468 // [This is actually done by counting the digits and negating, as
4469 // lead1=DECDPUN-digits1, and similarly for lead2.]
4470 for (pow=&powers[1]; *msu1>=*pow; pow++) exponent--;
4471 for (pow=&powers[1]; *msu2>=*pow; pow++) exponent++;
4473 // Now, if doing an integer divide or remainder, ensure that
4474 // the result will be Unit-aligned. To do this, shift the var1
4475 // accumulator towards least if need be. (It's much easier to
4476 // do this now than to reassemble the residue afterwards, if
4477 // doing a remainder.) Also ensure the exponent is not negative.
4478 if (!(op&DIVIDE)) {
4479 Unit *u; // work
4480 // save the initial 'false' padding of var1, in digits
4481 var1initpad=(var1units-D2U(lhs->digits))*DECDPUN;
4482 // Determine the shift to do.
4483 if (exponent<0) cut=-exponent;
4484 else cut=DECDPUN-exponent%DECDPUN;
4485 decShiftToLeast(var1, var1units, cut);
4486 exponent+=cut; // maintain numerical value
4487 var1initpad-=cut; // .. and reduce padding
4488 // clean any most-significant units which were just emptied
4489 for (u=msu1; cut>=DECDPUN; cut-=DECDPUN, u--) *u=0;
4490 } // align
4491 else { // is DIVIDE
4492 maxexponent=lhs->exponent-rhs->exponent; // save
4493 // optimization: if the first iteration will just produce 0,
4494 // preadjust to skip it [valid for DIVIDE only]
4495 if (*msu1<*msu2) {
4496 var2ulen--; // shift down
4497 exponent-=DECDPUN; // update the exponent
4501 // ---- start the long-division loops ------------------------------
4502 accunits=0; // no units accumulated yet
4503 accdigits=0; // .. or digits
4504 accnext=acc+acclength-1; // -> msu of acc [NB: allows digits+1]
4505 for (;;) { // outer forever loop
4506 thisunit=0; // current unit assumed 0
4507 // find the next unit
4508 for (;;) { // inner forever loop
4509 // strip leading zero units [from either pre-adjust or from
4510 // subtract last time around]. Leave at least one unit.
4511 for (; *msu1==0 && msu1>var1; msu1--) var1units--;
4513 if (var1units<var2ulen) break; // var1 too low for subtract
4514 if (var1units==var2ulen) { // unit-by-unit compare needed
4515 // compare the two numbers, from msu
4516 const Unit *pv1, *pv2;
4517 Unit v2; // units to compare
4518 pv2=msu2; // -> msu
4519 for (pv1=msu1; ; pv1--, pv2--) {
4520 // v1=*pv1 -- always OK
4521 v2=0; // assume in padding
4522 if (pv2>=var2) v2=*pv2; // in range
4523 if (*pv1!=v2) break; // no longer the same
4524 if (pv1==var1) break; // done; leave pv1 as is
4526 // here when all inspected or a difference seen
4527 if (*pv1<v2) break; // var1 too low to subtract
4528 if (*pv1==v2) { // var1 == var2
4529 // reach here if var1 and var2 are identical; subtraction
4530 // would increase digit by one, and the residue will be 0 so
4531 // the calculation is done; leave the loop with residue=0.
4532 thisunit++; // as though subtracted
4533 *var1=0; // set var1 to 0
4534 var1units=1; // ..
4535 break; // from inner
4536 } // var1 == var2
4537 // *pv1>v2. Prepare for real subtraction; the lengths are equal
4538 // Estimate the multiplier (there's always a msu1-1)...
4539 // Bring in two units of var2 to provide a good estimate.
4540 mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2pair);
4541 } // lengths the same
4542 else { // var1units > var2ulen, so subtraction is safe
4543 // The var2 msu is one unit towards the lsu of the var1 msu,
4544 // so only one unit for var2 can be used.
4545 mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2plus);
4547 if (mult==0) mult=1; // must always be at least 1
4548 // subtraction needed; var1 is > var2
4549 thisunit=(Unit)(thisunit+mult); // accumulate
4550 // subtract var1-var2, into var1; only the overlap needs
4551 // processing, as this is an in-place calculation
4552 shift=var2ulen-var2units;
4553 #if DECTRACE
4554 decDumpAr('1', &var1[shift], var1units-shift);
4555 decDumpAr('2', var2, var2units);
4556 printf("m=%ld\n", -mult);
4557 #endif
4558 decUnitAddSub(&var1[shift], var1units-shift,
4559 var2, var2units, 0,
4560 &var1[shift], -mult);
4561 #if DECTRACE
4562 decDumpAr('#', &var1[shift], var1units-shift);
4563 #endif
4564 // var1 now probably has leading zeros; these are removed at the
4565 // top of the inner loop.
4566 } // inner loop
4568 // The next unit has been calculated in full; unless it's a
4569 // leading zero, add to acc
4570 if (accunits!=0 || thisunit!=0) { // is first or non-zero
4571 *accnext=thisunit; // store in accumulator
4572 // account exactly for the new digits
4573 if (accunits==0) {
4574 accdigits++; // at least one
4575 for (pow=&powers[1]; thisunit>=*pow; pow++) accdigits++;
4577 else accdigits+=DECDPUN;
4578 accunits++; // update count
4579 accnext--; // ready for next
4580 if (accdigits>reqdigits) break; // have enough digits
4583 // if the residue is zero, the operation is done (unless divide
4584 // or divideInteger and still not enough digits yet)
4585 if (*var1==0 && var1units==1) { // residue is 0
4586 if (op&(REMAINDER|REMNEAR)) break;
4587 if ((op&DIVIDE) && (exponent<=maxexponent)) break;
4588 // [drop through if divideInteger]
4590 // also done enough if calculating remainder or integer
4591 // divide and just did the last ('units') unit
4592 if (exponent==0 && !(op&DIVIDE)) break;
4594 // to get here, var1 is less than var2, so divide var2 by the per-
4595 // Unit power of ten and go for the next digit
4596 var2ulen--; // shift down
4597 exponent-=DECDPUN; // update the exponent
4598 } // outer loop
4600 // ---- division is complete ---------------------------------------
4601 // here: acc has at least reqdigits+1 of good results (or fewer
4602 // if early stop), starting at accnext+1 (its lsu)
4603 // var1 has any residue at the stopping point
4604 // accunits is the number of digits collected in acc
4605 if (accunits==0) { // acc is 0
4606 accunits=1; // show have a unit ..
4607 accdigits=1; // ..
4608 *accnext=0; // .. whose value is 0
4610 else accnext++; // back to last placed
4611 // accnext now -> lowest unit of result
4613 residue=0; // assume no residue
4614 if (op&DIVIDE) {
4615 // record the presence of any residue, for rounding
4616 if (*var1!=0 || var1units>1) residue=1;
4617 else { // no residue
4618 // Had an exact division; clean up spurious trailing 0s.
4619 // There will be at most DECDPUN-1, from the final multiply,
4620 // and then only if the result is non-0 (and even) and the
4621 // exponent is 'loose'.
4622 #if DECDPUN>1
4623 Unit lsu=*accnext;
4624 if (!(lsu&0x01) && (lsu!=0)) {
4625 // count the trailing zeros
4626 Int drop=0;
4627 for (;; drop++) { // [will terminate because lsu!=0]
4628 if (exponent>=maxexponent) break; // don't chop real 0s
4629 #if DECDPUN<=4
4630 if ((lsu-QUOT10(lsu, drop+1)
4631 *powers[drop+1])!=0) break; // found non-0 digit
4632 #else
4633 if (lsu%powers[drop+1]!=0) break; // found non-0 digit
4634 #endif
4635 exponent++;
4637 if (drop>0) {
4638 accunits=decShiftToLeast(accnext, accunits, drop);
4639 accdigits=decGetDigits(accnext, accunits);
4640 accunits=D2U(accdigits);
4641 // [exponent was adjusted in the loop]
4643 } // neither odd nor 0
4644 #endif
4645 } // exact divide
4646 } // divide
4647 else /* op!=DIVIDE */ {
4648 // check for coefficient overflow
4649 if (accdigits+exponent>reqdigits) {
4650 *status|=DEC_Division_impossible;
4651 break;
4653 if (op & (REMAINDER|REMNEAR)) {
4654 // [Here, the exponent will be 0, because var1 was adjusted
4655 // appropriately.]
4656 Int postshift; // work
4657 Flag wasodd=0; // integer was odd
4658 Unit *quotlsu; // for save
4659 Int quotdigits; // ..
4661 bits=lhs->bits; // remainder sign is always as lhs
4663 // Fastpath when residue is truly 0 is worthwhile [and
4664 // simplifies the code below]
4665 if (*var1==0 && var1units==1) { // residue is 0
4666 Int exp=lhs->exponent; // save min(exponents)
4667 if (rhs->exponent<exp) exp=rhs->exponent;
4668 decNumberZero(res); // 0 coefficient
4669 #if DECSUBSET
4670 if (set->extended)
4671 #endif
4672 res->exponent=exp; // .. with proper exponent
4673 res->bits=(uByte)(bits&DECNEG); // [cleaned]
4674 decFinish(res, set, &residue, status); // might clamp
4675 break;
4677 // note if the quotient was odd
4678 if (*accnext & 0x01) wasodd=1; // acc is odd
4679 quotlsu=accnext; // save in case need to reinspect
4680 quotdigits=accdigits; // ..
4682 // treat the residue, in var1, as the value to return, via acc
4683 // calculate the unused zero digits. This is the smaller of:
4684 // var1 initial padding (saved above)
4685 // var2 residual padding, which happens to be given by:
4686 postshift=var1initpad+exponent-lhs->exponent+rhs->exponent;
4687 // [the 'exponent' term accounts for the shifts during divide]
4688 if (var1initpad<postshift) postshift=var1initpad;
4690 // shift var1 the requested amount, and adjust its digits
4691 var1units=decShiftToLeast(var1, var1units, postshift);
4692 accnext=var1;
4693 accdigits=decGetDigits(var1, var1units);
4694 accunits=D2U(accdigits);
4696 exponent=lhs->exponent; // exponent is smaller of lhs & rhs
4697 if (rhs->exponent<exponent) exponent=rhs->exponent;
4699 // Now correct the result if doing remainderNear; if it
4700 // (looking just at coefficients) is > rhs/2, or == rhs/2 and
4701 // the integer was odd then the result should be rem-rhs.
4702 if (op&REMNEAR) {
4703 Int compare, tarunits; // work
4704 Unit *up; // ..
4705 // calculate remainder*2 into the var1 buffer (which has
4706 // 'headroom' of an extra unit and hence enough space)
4707 // [a dedicated 'double' loop would be faster, here]
4708 tarunits=decUnitAddSub(accnext, accunits, accnext, accunits,
4709 0, accnext, 1);
4710 // decDumpAr('r', accnext, tarunits);
4712 // Here, accnext (var1) holds tarunits Units with twice the
4713 // remainder's coefficient, which must now be compared to the
4714 // RHS. The remainder's exponent may be smaller than the RHS's.
4715 compare=decUnitCompare(accnext, tarunits, rhs->lsu, D2U(rhs->digits),
4716 rhs->exponent-exponent);
4717 if (compare==BADINT) { // deep trouble
4718 *status|=DEC_Insufficient_storage;
4719 break;}
4721 // now restore the remainder by dividing by two; the lsu
4722 // is known to be even.
4723 for (up=accnext; up<accnext+tarunits; up++) {
4724 Int half; // half to add to lower unit
4725 half=*up & 0x01;
4726 *up/=2; // [shift]
4727 if (!half) continue;
4728 *(up-1)+=(DECDPUNMAX+1)/2;
4730 // [accunits still describes the original remainder length]
4732 if (compare>0 || (compare==0 && wasodd)) { // adjustment needed
4733 Int exp, expunits, exprem; // work
4734 // This is effectively causing round-up of the quotient,
4735 // so if it was the rare case where it was full and all
4736 // nines, it would overflow and hence division-impossible
4737 // should be raised
4738 Flag allnines=0; // 1 if quotient all nines
4739 if (quotdigits==reqdigits) { // could be borderline
4740 for (up=quotlsu; ; up++) {
4741 if (quotdigits>DECDPUN) {
4742 if (*up!=DECDPUNMAX) break;// non-nines
4744 else { // this is the last Unit
4745 if (*up==powers[quotdigits]-1) allnines=1;
4746 break;
4748 quotdigits-=DECDPUN; // checked those digits
4749 } // up
4750 } // borderline check
4751 if (allnines) {
4752 *status|=DEC_Division_impossible;
4753 break;}
4755 // rem-rhs is needed; the sign will invert. Again, var1
4756 // can safely be used for the working Units array.
4757 exp=rhs->exponent-exponent; // RHS padding needed
4758 // Calculate units and remainder from exponent.
4759 expunits=exp/DECDPUN;
4760 exprem=exp%DECDPUN;
4761 // subtract [A+B*(-m)]; the result will always be negative
4762 accunits=-decUnitAddSub(accnext, accunits,
4763 rhs->lsu, D2U(rhs->digits),
4764 expunits, accnext, -(Int)powers[exprem]);
4765 accdigits=decGetDigits(accnext, accunits); // count digits exactly
4766 accunits=D2U(accdigits); // and recalculate the units for copy
4767 // [exponent is as for original remainder]
4768 bits^=DECNEG; // flip the sign
4770 } // REMNEAR
4771 } // REMAINDER or REMNEAR
4772 } // not DIVIDE
4774 // Set exponent and bits
4775 res->exponent=exponent;
4776 res->bits=(uByte)(bits&DECNEG); // [cleaned]
4778 // Now the coefficient.
4779 decSetCoeff(res, set, accnext, accdigits, &residue, status);
4781 decFinish(res, set, &residue, status); // final cleanup
4783 #if DECSUBSET
4784 // If a divide then strip trailing zeros if subset [after round]
4785 if (!set->extended && (op==DIVIDE)) decTrim(res, set, 0, 1, &dropped);
4786 #endif
4787 } while(0); // end protected
4789 if (varalloc!=NULL) free(varalloc); // drop any storage used
4790 if (allocacc!=NULL) free(allocacc); // ..
4791 #if DECSUBSET
4792 if (allocrhs!=NULL) free(allocrhs); // ..
4793 if (alloclhs!=NULL) free(alloclhs); // ..
4794 #endif
4795 return res;
4796 } // decDivideOp
4798 /* ------------------------------------------------------------------ */
4799 /* decMultiplyOp -- multiplication operation */
4800 /* */
4801 /* This routine performs the multiplication C=A x B. */
4802 /* */
4803 /* res is C, the result. C may be A and/or B (e.g., X=X*X) */
4804 /* lhs is A */
4805 /* rhs is B */
4806 /* set is the context */
4807 /* status is the usual accumulator */
4808 /* */
4809 /* C must have space for set->digits digits. */
4810 /* */
4811 /* ------------------------------------------------------------------ */
4812 /* 'Classic' multiplication is used rather than Karatsuba, as the */
4813 /* latter would give only a minor improvement for the short numbers */
4814 /* expected to be handled most (and uses much more memory). */
4815 /* */
4816 /* There are two major paths here: the general-purpose ('old code') */
4817 /* path which handles all DECDPUN values, and a fastpath version */
4818 /* which is used if 64-bit ints are available, DECDPUN<=4, and more */
4819 /* than two calls to decUnitAddSub would be made. */
4820 /* */
4821 /* The fastpath version lumps units together into 8-digit or 9-digit */
4822 /* chunks, and also uses a lazy carry strategy to minimise expensive */
4823 /* 64-bit divisions. The chunks are then broken apart again into */
4824 /* units for continuing processing. Despite this overhead, the */
4825 /* fastpath can speed up some 16-digit operations by 10x (and much */
4826 /* more for higher-precision calculations). */
4827 /* */
4828 /* A buffer always has to be used for the accumulator; in the */
4829 /* fastpath, buffers are also always needed for the chunked copies of */
4830 /* of the operand coefficients. */
4831 /* Static buffers are larger than needed just for multiply, to allow */
4832 /* for calls from other operations (notably exp). */
4833 /* ------------------------------------------------------------------ */
4834 #define FASTMUL (DECUSE64 && DECDPUN<5)
4835 static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs,
4836 const decNumber *rhs, decContext *set,
4837 uInt *status) {
4838 Int accunits; // Units of accumulator in use
4839 Int exponent; // work
4840 Int residue=0; // rounding residue
4841 uByte bits; // result sign
4842 Unit *acc; // -> accumulator Unit array
4843 Int needbytes; // size calculator
4844 void *allocacc=NULL; // -> allocated accumulator, iff allocated
4845 Unit accbuff[SD2U(DECBUFFER*4+1)]; // buffer (+1 for DECBUFFER==0,
4846 // *4 for calls from other operations)
4847 const Unit *mer, *mermsup; // work
4848 Int madlength; // Units in multiplicand
4849 Int shift; // Units to shift multiplicand by
4851 #if FASTMUL
4852 // if DECDPUN is 1 or 3 work in base 10**9, otherwise
4853 // (DECDPUN is 2 or 4) then work in base 10**8
4854 #if DECDPUN & 1 // odd
4855 #define FASTBASE 1000000000 // base
4856 #define FASTDIGS 9 // digits in base
4857 #define FASTLAZY 18 // carry resolution point [1->18]
4858 #else
4859 #define FASTBASE 100000000
4860 #define FASTDIGS 8
4861 #define FASTLAZY 1844 // carry resolution point [1->1844]
4862 #endif
4863 // three buffers are used, two for chunked copies of the operands
4864 // (base 10**8 or base 10**9) and one base 2**64 accumulator with
4865 // lazy carry evaluation
4866 uInt zlhibuff[(DECBUFFER*2+1)/8+1]; // buffer (+1 for DECBUFFER==0)
4867 uInt *zlhi=zlhibuff; // -> lhs array
4868 uInt *alloclhi=NULL; // -> allocated buffer, iff allocated
4869 uInt zrhibuff[(DECBUFFER*2+1)/8+1]; // buffer (+1 for DECBUFFER==0)
4870 uInt *zrhi=zrhibuff; // -> rhs array
4871 uInt *allocrhi=NULL; // -> allocated buffer, iff allocated
4872 uLong zaccbuff[(DECBUFFER*2+1)/4+2]; // buffer (+1 for DECBUFFER==0)
4873 // [allocacc is shared for both paths, as only one will run]
4874 uLong *zacc=zaccbuff; // -> accumulator array for exact result
4875 #if DECDPUN==1
4876 Int zoff; // accumulator offset
4877 #endif
4878 uInt *lip, *rip; // item pointers
4879 uInt *lmsi, *rmsi; // most significant items
4880 Int ilhs, irhs, iacc; // item counts in the arrays
4881 Int lazy; // lazy carry counter
4882 uLong lcarry; // uLong carry
4883 uInt carry; // carry (NB not uLong)
4884 Int count; // work
4885 const Unit *cup; // ..
4886 Unit *up; // ..
4887 uLong *lp; // ..
4888 Int p; // ..
4889 #endif
4891 #if DECSUBSET
4892 decNumber *alloclhs=NULL; // -> allocated buffer, iff allocated
4893 decNumber *allocrhs=NULL; // -> allocated buffer, iff allocated
4894 #endif
4896 #if DECCHECK
4897 if (decCheckOperands(res, lhs, rhs, set)) return res;
4898 #endif
4900 // precalculate result sign
4901 bits=(uByte)((lhs->bits^rhs->bits)&DECNEG);
4903 // handle infinities and NaNs
4904 if (SPECIALARGS) { // a special bit set
4905 if (SPECIALARGS & (DECSNAN | DECNAN)) { // one or two NaNs
4906 decNaNs(res, lhs, rhs, set, status);
4907 return res;}
4908 // one or two infinities; Infinity * 0 is invalid
4909 if (((lhs->bits & DECINF)==0 && ISZERO(lhs))
4910 ||((rhs->bits & DECINF)==0 && ISZERO(rhs))) {
4911 *status|=DEC_Invalid_operation;
4912 return res;}
4913 decNumberZero(res);
4914 res->bits=bits|DECINF; // infinity
4915 return res;}
4917 // For best speed, as in DMSRCN [the original Rexx numerics
4918 // module], use the shorter number as the multiplier (rhs) and
4919 // the longer as the multiplicand (lhs) to minimise the number of
4920 // adds (partial products)
4921 if (lhs->digits<rhs->digits) { // swap...
4922 const decNumber *hold=lhs;
4923 lhs=rhs;
4924 rhs=hold;
4927 do { // protect allocated storage
4928 #if DECSUBSET
4929 if (!set->extended) {
4930 // reduce operands and set lostDigits status, as needed
4931 if (lhs->digits>set->digits) {
4932 alloclhs=decRoundOperand(lhs, set, status);
4933 if (alloclhs==NULL) break;
4934 lhs=alloclhs;
4936 if (rhs->digits>set->digits) {
4937 allocrhs=decRoundOperand(rhs, set, status);
4938 if (allocrhs==NULL) break;
4939 rhs=allocrhs;
4942 #endif
4943 // [following code does not require input rounding]
4945 #if FASTMUL // fastpath can be used
4946 // use the fast path if there are enough digits in the shorter
4947 // operand to make the setup and takedown worthwhile
4948 #define NEEDTWO (DECDPUN*2) // within two decUnitAddSub calls
4949 if (rhs->digits>NEEDTWO) { // use fastpath...
4950 // calculate the number of elements in each array
4951 ilhs=(lhs->digits+FASTDIGS-1)/FASTDIGS; // [ceiling]
4952 irhs=(rhs->digits+FASTDIGS-1)/FASTDIGS; // ..
4953 iacc=ilhs+irhs;
4955 // allocate buffers if required, as usual
4956 needbytes=ilhs*sizeof(uInt);
4957 if (needbytes>(Int)sizeof(zlhibuff)) {
4958 alloclhi=(uInt *)malloc(needbytes);
4959 zlhi=alloclhi;}
4960 needbytes=irhs*sizeof(uInt);
4961 if (needbytes>(Int)sizeof(zrhibuff)) {
4962 allocrhi=(uInt *)malloc(needbytes);
4963 zrhi=allocrhi;}
4965 // Allocating the accumulator space needs a special case when
4966 // DECDPUN=1 because when converting the accumulator to Units
4967 // after the multiplication each 8-byte item becomes 9 1-byte
4968 // units. Therefore iacc extra bytes are needed at the front
4969 // (rounded up to a multiple of 8 bytes), and the uLong
4970 // accumulator starts offset the appropriate number of units
4971 // to the right to avoid overwrite during the unchunking.
4972 needbytes=iacc*sizeof(uLong);
4973 #if DECDPUN==1
4974 zoff=(iacc+7)/8; // items to offset by
4975 needbytes+=zoff*8;
4976 #endif
4977 if (needbytes>(Int)sizeof(zaccbuff)) {
4978 allocacc=(uLong *)malloc(needbytes);
4979 zacc=(uLong *)allocacc;}
4980 if (zlhi==NULL||zrhi==NULL||zacc==NULL) {
4981 *status|=DEC_Insufficient_storage;
4982 break;}
4984 acc=(Unit *)zacc; // -> target Unit array
4985 #if DECDPUN==1
4986 zacc+=zoff; // start uLong accumulator to right
4987 #endif
4989 // assemble the chunked copies of the left and right sides
4990 for (count=lhs->digits, cup=lhs->lsu, lip=zlhi; count>0; lip++)
4991 for (p=0, *lip=0; p<FASTDIGS && count>0;
4992 p+=DECDPUN, cup++, count-=DECDPUN)
4993 *lip+=*cup*powers[p];
4994 lmsi=lip-1; // save -> msi
4995 for (count=rhs->digits, cup=rhs->lsu, rip=zrhi; count>0; rip++)
4996 for (p=0, *rip=0; p<FASTDIGS && count>0;
4997 p+=DECDPUN, cup++, count-=DECDPUN)
4998 *rip+=*cup*powers[p];
4999 rmsi=rip-1; // save -> msi
5001 // zero the accumulator
5002 for (lp=zacc; lp<zacc+iacc; lp++) *lp=0;
5004 /* Start the multiplication */
5005 // Resolving carries can dominate the cost of accumulating the
5006 // partial products, so this is only done when necessary.
5007 // Each uLong item in the accumulator can hold values up to
5008 // 2**64-1, and each partial product can be as large as
5009 // (10**FASTDIGS-1)**2. When FASTDIGS=9, this can be added to
5010 // itself 18.4 times in a uLong without overflowing, so during
5011 // the main calculation resolution is carried out every 18th
5012 // add -- every 162 digits. Similarly, when FASTDIGS=8, the
5013 // partial products can be added to themselves 1844.6 times in
5014 // a uLong without overflowing, so intermediate carry
5015 // resolution occurs only every 14752 digits. Hence for common
5016 // short numbers usually only the one final carry resolution
5017 // occurs.
5018 // (The count is set via FASTLAZY to simplify experiments to
5019 // measure the value of this approach: a 35% improvement on a
5020 // [34x34] multiply.)
5021 lazy=FASTLAZY; // carry delay count
5022 for (rip=zrhi; rip<=rmsi; rip++) { // over each item in rhs
5023 lp=zacc+(rip-zrhi); // where to add the lhs
5024 for (lip=zlhi; lip<=lmsi; lip++, lp++) { // over each item in lhs
5025 *lp+=(uLong)(*lip)*(*rip); // [this should in-line]
5026 } // lip loop
5027 lazy--;
5028 if (lazy>0 && rip!=rmsi) continue;
5029 lazy=FASTLAZY; // reset delay count
5030 // spin up the accumulator resolving overflows
5031 for (lp=zacc; lp<zacc+iacc; lp++) {
5032 if (*lp<FASTBASE) continue; // it fits
5033 lcarry=*lp/FASTBASE; // top part [slow divide]
5034 // lcarry can exceed 2**32-1, so check again; this check
5035 // and occasional extra divide (slow) is well worth it, as
5036 // it allows FASTLAZY to be increased to 18 rather than 4
5037 // in the FASTDIGS=9 case
5038 if (lcarry<FASTBASE) carry=(uInt)lcarry; // [usual]
5039 else { // two-place carry [fairly rare]
5040 uInt carry2=(uInt)(lcarry/FASTBASE); // top top part
5041 *(lp+2)+=carry2; // add to item+2
5042 *lp-=((uLong)FASTBASE*FASTBASE*carry2); // [slow]
5043 carry=(uInt)(lcarry-((uLong)FASTBASE*carry2)); // [inline]
5045 *(lp+1)+=carry; // add to item above [inline]
5046 *lp-=((uLong)FASTBASE*carry); // [inline]
5047 } // carry resolution
5048 } // rip loop
5050 // The multiplication is complete; time to convert back into
5051 // units. This can be done in-place in the accumulator and in
5052 // 32-bit operations, because carries were resolved after the
5053 // final add. This needs N-1 divides and multiplies for
5054 // each item in the accumulator (which will become up to N
5055 // units, where 2<=N<=9).
5056 for (lp=zacc, up=acc; lp<zacc+iacc; lp++) {
5057 uInt item=(uInt)*lp; // decapitate to uInt
5058 for (p=0; p<FASTDIGS-DECDPUN; p+=DECDPUN, up++) {
5059 uInt part=item/(DECDPUNMAX+1);
5060 *up=(Unit)(item-(part*(DECDPUNMAX+1)));
5061 item=part;
5062 } // p
5063 *up=(Unit)item; up++; // [final needs no division]
5064 } // lp
5065 accunits=up-acc; // count of units
5067 else { // here to use units directly, without chunking ['old code']
5068 #endif
5070 // if accumulator will be too long for local storage, then allocate
5071 acc=accbuff; // -> assume buffer for accumulator
5072 needbytes=(D2U(lhs->digits)+D2U(rhs->digits))*sizeof(Unit);
5073 if (needbytes>(Int)sizeof(accbuff)) {
5074 allocacc=(Unit *)malloc(needbytes);
5075 if (allocacc==NULL) {*status|=DEC_Insufficient_storage; break;}
5076 acc=(Unit *)allocacc; // use the allocated space
5079 /* Now the main long multiplication loop */
5080 // Unlike the equivalent in the IBM Java implementation, there
5081 // is no advantage in calculating from msu to lsu. So, do it
5082 // by the book, as it were.
5083 // Each iteration calculates ACC=ACC+MULTAND*MULT
5084 accunits=1; // accumulator starts at '0'
5085 *acc=0; // .. (lsu=0)
5086 shift=0; // no multiplicand shift at first
5087 madlength=D2U(lhs->digits); // this won't change
5088 mermsup=rhs->lsu+D2U(rhs->digits); // -> msu+1 of multiplier
5090 for (mer=rhs->lsu; mer<mermsup; mer++) {
5091 // Here, *mer is the next Unit in the multiplier to use
5092 // If non-zero [optimization] add it...
5093 if (*mer!=0) accunits=decUnitAddSub(&acc[shift], accunits-shift,
5094 lhs->lsu, madlength, 0,
5095 &acc[shift], *mer)
5096 + shift;
5097 else { // extend acc with a 0; it will be used shortly
5098 *(acc+accunits)=0; // [this avoids length of <=0 later]
5099 accunits++;
5101 // multiply multiplicand by 10**DECDPUN for next Unit to left
5102 shift++; // add this for 'logical length'
5103 } // n
5104 #if FASTMUL
5105 } // unchunked units
5106 #endif
5107 // common end-path
5108 #if DECTRACE
5109 decDumpAr('*', acc, accunits); // Show exact result
5110 #endif
5112 // acc now contains the exact result of the multiplication,
5113 // possibly with a leading zero unit; build the decNumber from
5114 // it, noting if any residue
5115 res->bits=bits; // set sign
5116 res->digits=decGetDigits(acc, accunits); // count digits exactly
5118 // There can be a 31-bit wrap in calculating the exponent.
5119 // This can only happen if both input exponents are negative and
5120 // both their magnitudes are large. If there was a wrap, set a
5121 // safe very negative exponent, from which decFinalize() will
5122 // raise a hard underflow shortly.
5123 exponent=lhs->exponent+rhs->exponent; // calculate exponent
5124 if (lhs->exponent<0 && rhs->exponent<0 && exponent>0)
5125 exponent=-2*DECNUMMAXE; // force underflow
5126 res->exponent=exponent; // OK to overwrite now
5129 // Set the coefficient. If any rounding, residue records
5130 decSetCoeff(res, set, acc, res->digits, &residue, status);
5131 decFinish(res, set, &residue, status); // final cleanup
5132 } while(0); // end protected
5134 if (allocacc!=NULL) free(allocacc); // drop any storage used
5135 #if DECSUBSET
5136 if (allocrhs!=NULL) free(allocrhs); // ..
5137 if (alloclhs!=NULL) free(alloclhs); // ..
5138 #endif
5139 #if FASTMUL
5140 if (allocrhi!=NULL) free(allocrhi); // ..
5141 if (alloclhi!=NULL) free(alloclhi); // ..
5142 #endif
5143 return res;
5144 } // decMultiplyOp
5146 /* ------------------------------------------------------------------ */
5147 /* decExpOp -- effect exponentiation */
5148 /* */
5149 /* This computes C = exp(A) */
5150 /* */
5151 /* res is C, the result. C may be A */
5152 /* rhs is A */
5153 /* set is the context; note that rounding mode has no effect */
5154 /* */
5155 /* C must have space for set->digits digits. status is updated but */
5156 /* not set. */
5157 /* */
5158 /* Restrictions: */
5159 /* */
5160 /* digits, emax, and -emin in the context must be less than */
5161 /* 2*DEC_MAX_MATH (1999998), and the rhs must be within these */
5162 /* bounds or a zero. This is an internal routine, so these */
5163 /* restrictions are contractual and not enforced. */
5164 /* */
5165 /* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will */
5166 /* almost always be correctly rounded, but may be up to 1 ulp in */
5167 /* error in rare cases. */
5168 /* */
5169 /* Finite results will always be full precision and Inexact, except */
5170 /* when A is a zero or -Infinity (giving 1 or 0 respectively). */
5171 /* ------------------------------------------------------------------ */
5172 /* This approach used here is similar to the algorithm described in */
5173 /* */
5174 /* Variable Precision Exponential Function, T. E. Hull and */
5175 /* A. Abrham, ACM Transactions on Mathematical Software, Vol 12 #2, */
5176 /* pp79-91, ACM, June 1986. */
5177 /* */
5178 /* with the main difference being that the iterations in the series */
5179 /* evaluation are terminated dynamically (which does not require the */
5180 /* extra variable-precision variables which are expensive in this */
5181 /* context). */
5182 /* */
5183 /* The error analysis in Hull & Abrham's paper applies except for the */
5184 /* round-off error accumulation during the series evaluation. This */
5185 /* code does not precalculate the number of iterations and so cannot */
5186 /* use Horner's scheme. Instead, the accumulation is done at double- */
5187 /* precision, which ensures that the additions of the terms are exact */
5188 /* and do not accumulate round-off (and any round-off errors in the */
5189 /* terms themselves move 'to the right' faster than they can */
5190 /* accumulate). This code also extends the calculation by allowing, */
5191 /* in the spirit of other decNumber operators, the input to be more */
5192 /* precise than the result (the precision used is based on the more */
5193 /* precise of the input or requested result). */
5194 /* */
5195 /* Implementation notes: */
5196 /* */
5197 /* 1. This is separated out as decExpOp so it can be called from */
5198 /* other Mathematical functions (notably Ln) with a wider range */
5199 /* than normal. In particular, it can handle the slightly wider */
5200 /* (double) range needed by Ln (which has to be able to calculate */
5201 /* exp(-x) where x can be the tiniest number (Ntiny). */
5202 /* */
5203 /* 2. Normalizing x to be <=0.1 (instead of <=1) reduces loop */
5204 /* iterations by appoximately a third with additional (although */
5205 /* diminishing) returns as the range is reduced to even smaller */
5206 /* fractions. However, h (the power of 10 used to correct the */
5207 /* result at the end, see below) must be kept <=8 as otherwise */
5208 /* the final result cannot be computed. Hence the leverage is a */
5209 /* sliding value (8-h), where potentially the range is reduced */
5210 /* more for smaller values. */
5211 /* */
5212 /* The leverage that can be applied in this way is severely */
5213 /* limited by the cost of the raise-to-the power at the end, */
5214 /* which dominates when the number of iterations is small (less */
5215 /* than ten) or when rhs is short. As an example, the adjustment */
5216 /* x**10,000,000 needs 31 multiplications, all but one full-width. */
5217 /* */
5218 /* 3. The restrictions (especially precision) could be raised with */
5219 /* care, but the full decNumber range seems very hard within the */
5220 /* 32-bit limits. */
5221 /* */
5222 /* 4. The working precisions for the static buffers are twice the */
5223 /* obvious size to allow for calls from decNumberPower. */
5224 /* ------------------------------------------------------------------ */
5225 decNumber * decExpOp(decNumber *res, const decNumber *rhs,
5226 decContext *set, uInt *status) {
5227 uInt ignore=0; // working status
5228 Int h; // adjusted exponent for 0.xxxx
5229 Int p; // working precision
5230 Int residue; // rounding residue
5231 uInt needbytes; // for space calculations
5232 const decNumber *x=rhs; // (may point to safe copy later)
5233 decContext aset, tset, dset; // working contexts
5234 Int comp; // work
5236 // the argument is often copied to normalize it, so (unusually) it
5237 // is treated like other buffers, using DECBUFFER, +1 in case
5238 // DECBUFFER is 0
5239 decNumber bufr[D2N(DECBUFFER*2+1)];
5240 decNumber *allocrhs=NULL; // non-NULL if rhs buffer allocated
5242 // the working precision will be no more than set->digits+8+1
5243 // so for on-stack buffers DECBUFFER+9 is used, +1 in case DECBUFFER
5244 // is 0 (and twice that for the accumulator)
5246 // buffer for t, term (working precision plus)
5247 decNumber buft[D2N(DECBUFFER*2+9+1)];
5248 decNumber *allocbuft=NULL; // -> allocated buft, iff allocated
5249 decNumber *t=buft; // term
5250 // buffer for a, accumulator (working precision * 2), at least 9
5251 decNumber bufa[D2N(DECBUFFER*4+18+1)];
5252 decNumber *allocbufa=NULL; // -> allocated bufa, iff allocated
5253 decNumber *a=bufa; // accumulator
5254 // decNumber for the divisor term; this needs at most 9 digits
5255 // and so can be fixed size [16 so can use standard context]
5256 decNumber bufd[D2N(16)];
5257 decNumber *d=bufd; // divisor
5258 decNumber numone; // constant 1
5260 #if DECCHECK
5261 Int iterations=0; // for later sanity check
5262 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
5263 #endif
5265 do { // protect allocated storage
5266 if (SPECIALARG) { // handle infinities and NaNs
5267 if (decNumberIsInfinite(rhs)) { // an infinity
5268 if (decNumberIsNegative(rhs)) // -Infinity -> +0
5269 decNumberZero(res);
5270 else decNumberCopy(res, rhs); // +Infinity -> self
5272 else decNaNs(res, rhs, NULL, set, status); // a NaN
5273 break;}
5275 if (ISZERO(rhs)) { // zeros -> exact 1
5276 decNumberZero(res); // make clean 1
5277 *res->lsu=1; // ..
5278 break;} // [no status to set]
5280 // e**x when 0 < x < 0.66 is < 1+3x/2, hence can fast-path
5281 // positive and negative tiny cases which will result in inexact
5282 // 1. This also allows the later add-accumulate to always be
5283 // exact (because its length will never be more than twice the
5284 // working precision).
5285 // The comparator (tiny) needs just one digit, so use the
5286 // decNumber d for it (reused as the divisor, etc., below); its
5287 // exponent is such that if x is positive it will have
5288 // set->digits-1 zeros between the decimal point and the digit,
5289 // which is 4, and if x is negative one more zero there as the
5290 // more precise result will be of the form 0.9999999 rather than
5291 // 1.0000001. Hence, tiny will be 0.0000004 if digits=7 and x>0
5292 // or 0.00000004 if digits=7 and x<0. If RHS not larger than
5293 // this then the result will be 1.000000
5294 decNumberZero(d); // clean
5295 *d->lsu=4; // set 4 ..
5296 d->exponent=-set->digits; // * 10**(-d)
5297 if (decNumberIsNegative(rhs)) d->exponent--; // negative case
5298 comp=decCompare(d, rhs, 1); // signless compare
5299 if (comp==BADINT) {
5300 *status|=DEC_Insufficient_storage;
5301 break;}
5302 if (comp>=0) { // rhs < d
5303 Int shift=set->digits-1;
5304 decNumberZero(res); // set 1
5305 *res->lsu=1; // ..
5306 res->digits=decShiftToMost(res->lsu, 1, shift);
5307 res->exponent=-shift; // make 1.0000...
5308 *status|=DEC_Inexact | DEC_Rounded; // .. inexactly
5309 break;} // tiny
5311 // set up the context to be used for calculating a, as this is
5312 // used on both paths below
5313 decContextDefault(&aset, DEC_INIT_DECIMAL64);
5314 // accumulator bounds are as requested (could underflow)
5315 aset.emax=set->emax; // usual bounds
5316 aset.emin=set->emin; // ..
5317 aset.clamp=0; // and no concrete format
5319 // calculate the adjusted (Hull & Abrham) exponent (where the
5320 // decimal point is just to the left of the coefficient msd)
5321 h=rhs->exponent+rhs->digits;
5322 // if h>8 then 10**h cannot be calculated safely; however, when
5323 // h=8 then exp(|rhs|) will be at least exp(1E+7) which is at
5324 // least 6.59E+4342944, so (due to the restriction on Emax/Emin)
5325 // overflow (or underflow to 0) is guaranteed -- so this case can
5326 // be handled by simply forcing the appropriate excess
5327 if (h>8) { // overflow/underflow
5328 // set up here so Power call below will over or underflow to
5329 // zero; set accumulator to either 2 or 0.02
5330 // [stack buffer for a is always big enough for this]
5331 decNumberZero(a);
5332 *a->lsu=2; // not 1 but < exp(1)
5333 if (decNumberIsNegative(rhs)) a->exponent=-2; // make 0.02
5334 h=8; // clamp so 10**h computable
5335 p=9; // set a working precision
5337 else { // h<=8
5338 Int maxlever=(rhs->digits>8?1:0);
5339 // [could/should increase this for precisions >40 or so, too]
5341 // if h is 8, cannot normalize to a lower upper limit because
5342 // the final result will not be computable (see notes above),
5343 // but leverage can be applied whenever h is less than 8.
5344 // Apply as much as possible, up to a MAXLEVER digits, which
5345 // sets the tradeoff against the cost of the later a**(10**h).
5346 // As h is increased, the working precision below also
5347 // increases to compensate for the "constant digits at the
5348 // front" effect.
5349 Int lever=MINI(8-h, maxlever); // leverage attainable
5350 Int use=-rhs->digits-lever; // exponent to use for RHS
5351 h+=lever; // apply leverage selected
5352 if (h<0) { // clamp
5353 use+=h; // [may end up subnormal]
5354 h=0;
5356 // Take a copy of RHS if it needs normalization (true whenever x>=1)
5357 if (rhs->exponent!=use) {
5358 decNumber *newrhs=bufr; // assume will fit on stack
5359 needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
5360 if (needbytes>sizeof(bufr)) { // need malloc space
5361 allocrhs=(decNumber *)malloc(needbytes);
5362 if (allocrhs==NULL) { // hopeless -- abandon
5363 *status|=DEC_Insufficient_storage;
5364 break;}
5365 newrhs=allocrhs; // use the allocated space
5367 decNumberCopy(newrhs, rhs); // copy to safe space
5368 newrhs->exponent=use; // normalize; now <1
5369 x=newrhs; // ready for use
5370 // decNumberShow(x);
5373 // Now use the usual power series to evaluate exp(x). The
5374 // series starts as 1 + x + x^2/2 ... so prime ready for the
5375 // third term by setting the term variable t=x, the accumulator
5376 // a=1, and the divisor d=2.
5378 // First determine the working precision. From Hull & Abrham
5379 // this is set->digits+h+2. However, if x is 'over-precise' we
5380 // need to allow for all its digits to potentially participate
5381 // (consider an x where all the excess digits are 9s) so in
5382 // this case use x->digits+h+2
5383 p=MAXI(x->digits, set->digits)+h+2; // [h<=8]
5385 // a and t are variable precision, and depend on p, so space
5386 // must be allocated for them if necessary
5388 // the accumulator needs to be able to hold 2p digits so that
5389 // the additions on the second and subsequent iterations are
5390 // sufficiently exact.
5391 needbytes=sizeof(decNumber)+(D2U(p*2)-1)*sizeof(Unit);
5392 if (needbytes>sizeof(bufa)) { // need malloc space
5393 allocbufa=(decNumber *)malloc(needbytes);
5394 if (allocbufa==NULL) { // hopeless -- abandon
5395 *status|=DEC_Insufficient_storage;
5396 break;}
5397 a=allocbufa; // use the allocated space
5399 // the term needs to be able to hold p digits (which is
5400 // guaranteed to be larger than x->digits, so the initial copy
5401 // is safe); it may also be used for the raise-to-power
5402 // calculation below, which needs an extra two digits
5403 needbytes=sizeof(decNumber)+(D2U(p+2)-1)*sizeof(Unit);
5404 if (needbytes>sizeof(buft)) { // need malloc space
5405 allocbuft=(decNumber *)malloc(needbytes);
5406 if (allocbuft==NULL) { // hopeless -- abandon
5407 *status|=DEC_Insufficient_storage;
5408 break;}
5409 t=allocbuft; // use the allocated space
5412 decNumberCopy(t, x); // term=x
5413 decNumberZero(a); *a->lsu=1; // accumulator=1
5414 decNumberZero(d); *d->lsu=2; // divisor=2
5415 decNumberZero(&numone); *numone.lsu=1; // constant 1 for increment
5417 // set up the contexts for calculating a, t, and d
5418 decContextDefault(&tset, DEC_INIT_DECIMAL64);
5419 dset=tset;
5420 // accumulator bounds are set above, set precision now
5421 aset.digits=p*2; // double
5422 // term bounds avoid any underflow or overflow
5423 tset.digits=p;
5424 tset.emin=DEC_MIN_EMIN; // [emax is plenty]
5425 // [dset.digits=16, etc., are sufficient]
5427 // finally ready to roll
5428 for (;;) {
5429 #if DECCHECK
5430 iterations++;
5431 #endif
5432 // only the status from the accumulation is interesting
5433 // [but it should remain unchanged after first add]
5434 decAddOp(a, a, t, &aset, 0, status); // a=a+t
5435 decMultiplyOp(t, t, x, &tset, &ignore); // t=t*x
5436 decDivideOp(t, t, d, &tset, DIVIDE, &ignore); // t=t/d
5437 // the iteration ends when the term cannot affect the result,
5438 // if rounded to p digits, which is when its value is smaller
5439 // than the accumulator by p+1 digits. There must also be
5440 // full precision in a.
5441 if (((a->digits+a->exponent)>=(t->digits+t->exponent+p+1))
5442 && (a->digits>=p)) break;
5443 decAddOp(d, d, &numone, &dset, 0, &ignore); // d=d+1
5444 } // iterate
5446 #if DECCHECK
5447 // just a sanity check; comment out test to show always
5448 if (iterations>p+3)
5449 printf("Exp iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
5450 (LI)iterations, (LI)*status, (LI)p, (LI)x->digits);
5451 #endif
5452 } // h<=8
5454 // apply postconditioning: a=a**(10**h) -- this is calculated
5455 // at a slightly higher precision than Hull & Abrham suggest
5456 if (h>0) {
5457 Int seenbit=0; // set once a 1-bit is seen
5458 Int i; // counter
5459 Int n=powers[h]; // always positive
5460 aset.digits=p+2; // sufficient precision
5461 // avoid the overhead and many extra digits of decNumberPower
5462 // as all that is needed is the short 'multipliers' loop; here
5463 // accumulate the answer into t
5464 decNumberZero(t); *t->lsu=1; // acc=1
5465 for (i=1;;i++){ // for each bit [top bit ignored]
5466 // abandon if have had overflow or terminal underflow
5467 if (*status & (DEC_Overflow|DEC_Underflow)) { // interesting?
5468 if (*status&DEC_Overflow || ISZERO(t)) break;}
5469 n=n<<1; // move next bit to testable position
5470 if (n<0) { // top bit is set
5471 seenbit=1; // OK, have a significant bit
5472 decMultiplyOp(t, t, a, &aset, status); // acc=acc*x
5474 if (i==31) break; // that was the last bit
5475 if (!seenbit) continue; // no need to square 1
5476 decMultiplyOp(t, t, t, &aset, status); // acc=acc*acc [square]
5477 } /*i*/ // 32 bits
5478 // decNumberShow(t);
5479 a=t; // and carry on using t instead of a
5482 // Copy and round the result to res
5483 residue=1; // indicate dirt to right ..
5484 if (ISZERO(a)) residue=0; // .. unless underflowed to 0
5485 aset.digits=set->digits; // [use default rounding]
5486 decCopyFit(res, a, &aset, &residue, status); // copy & shorten
5487 decFinish(res, set, &residue, status); // cleanup/set flags
5488 } while(0); // end protected
5490 if (allocrhs !=NULL) free(allocrhs); // drop any storage used
5491 if (allocbufa!=NULL) free(allocbufa); // ..
5492 if (allocbuft!=NULL) free(allocbuft); // ..
5493 // [status is handled by caller]
5494 return res;
5495 } // decExpOp
5497 /* ------------------------------------------------------------------ */
5498 /* Initial-estimate natural logarithm table */
5499 /* */
5500 /* LNnn -- 90-entry 16-bit table for values from .10 through .99. */
5501 /* The result is a 4-digit encode of the coefficient (c=the */
5502 /* top 14 bits encoding 0-9999) and a 2-digit encode of the */
5503 /* exponent (e=the bottom 2 bits encoding 0-3) */
5504 /* */
5505 /* The resulting value is given by: */
5506 /* */
5507 /* v = -c * 10**(-e-3) */
5508 /* */
5509 /* where e and c are extracted from entry k = LNnn[x-10] */
5510 /* where x is truncated (NB) into the range 10 through 99, */
5511 /* and then c = k>>2 and e = k&3. */
5512 /* ------------------------------------------------------------------ */
5513 const uShort LNnn[90]={9016, 8652, 8316, 8008, 7724, 7456, 7208,
5514 6972, 6748, 6540, 6340, 6148, 5968, 5792, 5628, 5464, 5312,
5515 5164, 5020, 4884, 4748, 4620, 4496, 4376, 4256, 4144, 4032,
5516 39233, 38181, 37157, 36157, 35181, 34229, 33297, 32389, 31501, 30629,
5517 29777, 28945, 28129, 27329, 26545, 25777, 25021, 24281, 23553, 22837,
5518 22137, 21445, 20769, 20101, 19445, 18801, 18165, 17541, 16925, 16321,
5519 15721, 15133, 14553, 13985, 13421, 12865, 12317, 11777, 11241, 10717,
5520 10197, 9685, 9177, 8677, 8185, 7697, 7213, 6737, 6269, 5801,
5521 5341, 4889, 4437, 39930, 35534, 31186, 26886, 22630, 18418, 14254,
5522 10130, 6046, 20055};
5524 /* ------------------------------------------------------------------ */
5525 /* decLnOp -- effect natural logarithm */
5526 /* */
5527 /* This computes C = ln(A) */
5528 /* */
5529 /* res is C, the result. C may be A */
5530 /* rhs is A */
5531 /* set is the context; note that rounding mode has no effect */
5532 /* */
5533 /* C must have space for set->digits digits. */
5534 /* */
5535 /* Notable cases: */
5536 /* A<0 -> Invalid */
5537 /* A=0 -> -Infinity (Exact) */
5538 /* A=+Infinity -> +Infinity (Exact) */
5539 /* A=1 exactly -> 0 (Exact) */
5540 /* */
5541 /* Restrictions (as for Exp): */
5542 /* */
5543 /* digits, emax, and -emin in the context must be less than */
5544 /* DEC_MAX_MATH+11 (1000010), and the rhs must be within these */
5545 /* bounds or a zero. This is an internal routine, so these */
5546 /* restrictions are contractual and not enforced. */
5547 /* */
5548 /* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will */
5549 /* almost always be correctly rounded, but may be up to 1 ulp in */
5550 /* error in rare cases. */
5551 /* ------------------------------------------------------------------ */
5552 /* The result is calculated using Newton's method, with each */
5553 /* iteration calculating a' = a + x * exp(-a) - 1. See, for example, */
5554 /* Epperson 1989. */
5555 /* */
5556 /* The iteration ends when the adjustment x*exp(-a)-1 is tiny enough. */
5557 /* This has to be calculated at the sum of the precision of x and the */
5558 /* working precision. */
5559 /* */
5560 /* Implementation notes: */
5561 /* */
5562 /* 1. This is separated out as decLnOp so it can be called from */
5563 /* other Mathematical functions (e.g., Log 10) with a wider range */
5564 /* than normal. In particular, it can handle the slightly wider */
5565 /* (+9+2) range needed by a power function. */
5566 /* */
5567 /* 2. The speed of this function is about 10x slower than exp, as */
5568 /* it typically needs 4-6 iterations for short numbers, and the */
5569 /* extra precision needed adds a squaring effect, twice. */
5570 /* */
5571 /* 3. Fastpaths are included for ln(10) and ln(2), up to length 40, */
5572 /* as these are common requests. ln(10) is used by log10(x). */
5573 /* */
5574 /* 4. An iteration might be saved by widening the LNnn table, and */
5575 /* would certainly save at least one if it were made ten times */
5576 /* bigger, too (for truncated fractions 0.100 through 0.999). */
5577 /* However, for most practical evaluations, at least four or five */
5578 /* iterations will be neede -- so this would only speed up by */
5579 /* 20-25% and that probably does not justify increasing the table */
5580 /* size. */
5581 /* */
5582 /* 5. The static buffers are larger than might be expected to allow */
5583 /* for calls from decNumberPower. */
5584 /* ------------------------------------------------------------------ */
5585 decNumber * decLnOp(decNumber *res, const decNumber *rhs,
5586 decContext *set, uInt *status) {
5587 uInt ignore=0; // working status accumulator
5588 uInt needbytes; // for space calculations
5589 Int residue; // rounding residue
5590 Int r; // rhs=f*10**r [see below]
5591 Int p; // working precision
5592 Int pp; // precision for iteration
5593 Int t; // work
5595 // buffers for a (accumulator, typically precision+2) and b
5596 // (adjustment calculator, same size)
5597 decNumber bufa[D2N(DECBUFFER+12)];
5598 decNumber *allocbufa=NULL; // -> allocated bufa, iff allocated
5599 decNumber *a=bufa; // accumulator/work
5600 decNumber bufb[D2N(DECBUFFER*2+2)];
5601 decNumber *allocbufb=NULL; // -> allocated bufa, iff allocated
5602 decNumber *b=bufb; // adjustment/work
5604 decNumber numone; // constant 1
5605 decNumber cmp; // work
5606 decContext aset, bset; // working contexts
5608 #if DECCHECK
5609 Int iterations=0; // for later sanity check
5610 if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
5611 #endif
5613 do { // protect allocated storage
5614 if (SPECIALARG) { // handle infinities and NaNs
5615 if (decNumberIsInfinite(rhs)) { // an infinity
5616 if (decNumberIsNegative(rhs)) // -Infinity -> error
5617 *status|=DEC_Invalid_operation;
5618 else decNumberCopy(res, rhs); // +Infinity -> self
5620 else decNaNs(res, rhs, NULL, set, status); // a NaN
5621 break;}
5623 if (ISZERO(rhs)) { // +/- zeros -> -Infinity
5624 decNumberZero(res); // make clean
5625 res->bits=DECINF|DECNEG; // set - infinity
5626 break;} // [no status to set]
5628 // Non-zero negatives are bad...
5629 if (decNumberIsNegative(rhs)) { // -x -> error
5630 *status|=DEC_Invalid_operation;
5631 break;}
5633 // Here, rhs is positive, finite, and in range
5635 // lookaside fastpath code for ln(2) and ln(10) at common lengths
5636 if (rhs->exponent==0 && set->digits<=40) {
5637 #if DECDPUN==1
5638 if (rhs->lsu[0]==0 && rhs->lsu[1]==1 && rhs->digits==2) { // ln(10)
5639 #else
5640 if (rhs->lsu[0]==10 && rhs->digits==2) { // ln(10)
5641 #endif
5642 aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
5643 #define LN10 "2.302585092994045684017991454684364207601"
5644 decNumberFromString(res, LN10, &aset);
5645 *status|=(DEC_Inexact | DEC_Rounded); // is inexact
5646 break;}
5647 if (rhs->lsu[0]==2 && rhs->digits==1) { // ln(2)
5648 aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
5649 #define LN2 "0.6931471805599453094172321214581765680755"
5650 decNumberFromString(res, LN2, &aset);
5651 *status|=(DEC_Inexact | DEC_Rounded);
5652 break;}
5653 } // integer and short
5655 // Determine the working precision. This is normally the
5656 // requested precision + 2, with a minimum of 9. However, if
5657 // the rhs is 'over-precise' then allow for all its digits to
5658 // potentially participate (consider an rhs where all the excess
5659 // digits are 9s) so in this case use rhs->digits+2.
5660 p=MAXI(rhs->digits, MAXI(set->digits, 7))+2;
5662 // Allocate space for the accumulator and the high-precision
5663 // adjustment calculator, if necessary. The accumulator must
5664 // be able to hold p digits, and the adjustment up to
5665 // rhs->digits+p digits. They are also made big enough for 16
5666 // digits so that they can be used for calculating the initial
5667 // estimate.
5668 needbytes=sizeof(decNumber)+(D2U(MAXI(p,16))-1)*sizeof(Unit);
5669 if (needbytes>sizeof(bufa)) { // need malloc space
5670 allocbufa=(decNumber *)malloc(needbytes);
5671 if (allocbufa==NULL) { // hopeless -- abandon
5672 *status|=DEC_Insufficient_storage;
5673 break;}
5674 a=allocbufa; // use the allocated space
5676 pp=p+rhs->digits;
5677 needbytes=sizeof(decNumber)+(D2U(MAXI(pp,16))-1)*sizeof(Unit);
5678 if (needbytes>sizeof(bufb)) { // need malloc space
5679 allocbufb=(decNumber *)malloc(needbytes);
5680 if (allocbufb==NULL) { // hopeless -- abandon
5681 *status|=DEC_Insufficient_storage;
5682 break;}
5683 b=allocbufb; // use the allocated space
5686 // Prepare an initial estimate in acc. Calculate this by
5687 // considering the coefficient of x to be a normalized fraction,
5688 // f, with the decimal point at far left and multiplied by
5689 // 10**r. Then, rhs=f*10**r and 0.1<=f<1, and
5690 // ln(x) = ln(f) + ln(10)*r
5691 // Get the initial estimate for ln(f) from a small lookup
5692 // table (see above) indexed by the first two digits of f,
5693 // truncated.
5695 decContextDefault(&aset, DEC_INIT_DECIMAL64); // 16-digit extended
5696 r=rhs->exponent+rhs->digits; // 'normalised' exponent
5697 decNumberFromInt32(a, r); // a=r
5698 decNumberFromInt32(b, 2302585); // b=ln(10) (2.302585)
5699 b->exponent=-6; // ..
5700 decMultiplyOp(a, a, b, &aset, &ignore); // a=a*b
5701 // now get top two digits of rhs into b by simple truncate and
5702 // force to integer
5703 residue=0; // (no residue)
5704 aset.digits=2; aset.round=DEC_ROUND_DOWN;
5705 decCopyFit(b, rhs, &aset, &residue, &ignore); // copy & shorten
5706 b->exponent=0; // make integer
5707 t=decGetInt(b); // [cannot fail]
5708 if (t<10) t=X10(t); // adjust single-digit b
5709 t=LNnn[t-10]; // look up ln(b)
5710 decNumberFromInt32(b, t>>2); // b=ln(b) coefficient
5711 b->exponent=-(t&3)-3; // set exponent
5712 b->bits=DECNEG; // ln(0.10)->ln(0.99) always -ve
5713 aset.digits=16; aset.round=DEC_ROUND_HALF_EVEN; // restore
5714 decAddOp(a, a, b, &aset, 0, &ignore); // acc=a+b
5715 // the initial estimate is now in a, with up to 4 digits correct.
5716 // When rhs is at or near Nmax the estimate will be low, so we
5717 // will approach it from below, avoiding overflow when calling exp.
5719 decNumberZero(&numone); *numone.lsu=1; // constant 1 for adjustment
5721 // accumulator bounds are as requested (could underflow, but
5722 // cannot overflow)
5723 aset.emax=set->emax;
5724 aset.emin=set->emin;
5725 aset.clamp=0; // no concrete format
5726 // set up a context to be used for the multiply and subtract
5727 bset=aset;
5728 bset.emax=DEC_MAX_MATH*2; // use double bounds for the
5729 bset.emin=-DEC_MAX_MATH*2; // adjustment calculation
5730 // [see decExpOp call below]
5731 // for each iteration double the number of digits to calculate,
5732 // up to a maximum of p
5733 pp=9; // initial precision
5734 // [initially 9 as then the sequence starts 7+2, 16+2, and
5735 // 34+2, which is ideal for standard-sized numbers]
5736 aset.digits=pp; // working context
5737 bset.digits=pp+rhs->digits; // wider context
5738 for (;;) { // iterate
5739 #if DECCHECK
5740 iterations++;
5741 if (iterations>24) break; // consider 9 * 2**24
5742 #endif
5743 // calculate the adjustment (exp(-a)*x-1) into b. This is a
5744 // catastrophic subtraction but it really is the difference
5745 // from 1 that is of interest.
5746 // Use the internal entry point to Exp as it allows the double
5747 // range for calculating exp(-a) when a is the tiniest subnormal.
5748 a->bits^=DECNEG; // make -a
5749 decExpOp(b, a, &bset, &ignore); // b=exp(-a)
5750 a->bits^=DECNEG; // restore sign of a
5751 // now multiply by rhs and subtract 1, at the wider precision
5752 decMultiplyOp(b, b, rhs, &bset, &ignore); // b=b*rhs
5753 decAddOp(b, b, &numone, &bset, DECNEG, &ignore); // b=b-1
5755 // the iteration ends when the adjustment cannot affect the
5756 // result by >=0.5 ulp (at the requested digits), which
5757 // is when its value is smaller than the accumulator by
5758 // set->digits+1 digits (or it is zero) -- this is a looser
5759 // requirement than for Exp because all that happens to the
5760 // accumulator after this is the final rounding (but note that
5761 // there must also be full precision in a, or a=0).
5763 if (decNumberIsZero(b) ||
5764 (a->digits+a->exponent)>=(b->digits+b->exponent+set->digits+1)) {
5765 if (a->digits==p) break;
5766 if (decNumberIsZero(a)) {
5767 decCompareOp(&cmp, rhs, &numone, &aset, COMPARE, &ignore); // rhs=1 ?
5768 if (cmp.lsu[0]==0) a->exponent=0; // yes, exact 0
5769 else *status|=(DEC_Inexact | DEC_Rounded); // no, inexact
5770 break;
5772 // force padding if adjustment has gone to 0 before full length
5773 if (decNumberIsZero(b)) b->exponent=a->exponent-p;
5776 // not done yet ...
5777 decAddOp(a, a, b, &aset, 0, &ignore); // a=a+b for next estimate
5778 if (pp==p) continue; // precision is at maximum
5779 // lengthen the next calculation
5780 pp=pp*2; // double precision
5781 if (pp>p) pp=p; // clamp to maximum
5782 aset.digits=pp; // working context
5783 bset.digits=pp+rhs->digits; // wider context
5784 } // Newton's iteration
5786 #if DECCHECK
5787 // just a sanity check; remove the test to show always
5788 if (iterations>24)
5789 printf("Ln iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
5790 (LI)iterations, (LI)*status, (LI)p, (LI)rhs->digits);
5791 #endif
5793 // Copy and round the result to res
5794 residue=1; // indicate dirt to right
5795 if (ISZERO(a)) residue=0; // .. unless underflowed to 0
5796 aset.digits=set->digits; // [use default rounding]
5797 decCopyFit(res, a, &aset, &residue, status); // copy & shorten
5798 decFinish(res, set, &residue, status); // cleanup/set flags
5799 } while(0); // end protected
5801 if (allocbufa!=NULL) free(allocbufa); // drop any storage used
5802 if (allocbufb!=NULL) free(allocbufb); // ..
5803 // [status is handled by caller]
5804 return res;
5805 } // decLnOp
5807 /* ------------------------------------------------------------------ */
5808 /* decQuantizeOp -- force exponent to requested value */
5809 /* */
5810 /* This computes C = op(A, B), where op adjusts the coefficient */
5811 /* of C (by rounding or shifting) such that the exponent (-scale) */
5812 /* of C has the value B or matches the exponent of B. */
5813 /* The numerical value of C will equal A, except for the effects of */
5814 /* any rounding that occurred. */
5815 /* */
5816 /* res is C, the result. C may be A or B */
5817 /* lhs is A, the number to adjust */
5818 /* rhs is B, the requested exponent */
5819 /* set is the context */
5820 /* quant is 1 for quantize or 0 for rescale */
5821 /* status is the status accumulator (this can be called without */
5822 /* risk of control loss) */
5823 /* */
5824 /* C must have space for set->digits digits. */
5825 /* */
5826 /* Unless there is an error or the result is infinite, the exponent */
5827 /* after the operation is guaranteed to be that requested. */
5828 /* ------------------------------------------------------------------ */
5829 static decNumber * decQuantizeOp(decNumber *res, const decNumber *lhs,
5830 const decNumber *rhs, decContext *set,
5831 Flag quant, uInt *status) {
5832 #if DECSUBSET
5833 decNumber *alloclhs=NULL; // non-NULL if rounded lhs allocated
5834 decNumber *allocrhs=NULL; // .., rhs
5835 #endif
5836 const decNumber *inrhs=rhs; // save original rhs
5837 Int reqdigits=set->digits; // requested DIGITS
5838 Int reqexp; // requested exponent [-scale]
5839 Int residue=0; // rounding residue
5840 Int etiny=set->emin-(reqdigits-1);
5842 #if DECCHECK
5843 if (decCheckOperands(res, lhs, rhs, set)) return res;
5844 #endif
5846 do { // protect allocated storage
5847 #if DECSUBSET
5848 if (!set->extended) {
5849 // reduce operands and set lostDigits status, as needed
5850 if (lhs->digits>reqdigits) {
5851 alloclhs=decRoundOperand(lhs, set, status);
5852 if (alloclhs==NULL) break;
5853 lhs=alloclhs;
5855 if (rhs->digits>reqdigits) { // [this only checks lostDigits]
5856 allocrhs=decRoundOperand(rhs, set, status);
5857 if (allocrhs==NULL) break;
5858 rhs=allocrhs;
5861 #endif
5862 // [following code does not require input rounding]
5864 // Handle special values
5865 if (SPECIALARGS) {
5866 // NaNs get usual processing
5867 if (SPECIALARGS & (DECSNAN | DECNAN))
5868 decNaNs(res, lhs, rhs, set, status);
5869 // one infinity but not both is bad
5870 else if ((lhs->bits ^ rhs->bits) & DECINF)
5871 *status|=DEC_Invalid_operation;
5872 // both infinity: return lhs
5873 else decNumberCopy(res, lhs); // [nop if in place]
5874 break;
5877 // set requested exponent
5878 if (quant) reqexp=inrhs->exponent; // quantize -- match exponents
5879 else { // rescale -- use value of rhs
5880 // Original rhs must be an integer that fits and is in range,
5881 // which could be from -1999999997 to +999999999, thanks to
5882 // subnormals
5883 reqexp=decGetInt(inrhs); // [cannot fail]
5886 #if DECSUBSET
5887 if (!set->extended) etiny=set->emin; // no subnormals
5888 #endif
5890 if (reqexp==BADINT // bad (rescale only) or ..
5891 || reqexp==BIGODD || reqexp==BIGEVEN // very big (ditto) or ..
5892 || (reqexp<etiny) // < lowest
5893 || (reqexp>set->emax)) { // > emax
5894 *status|=DEC_Invalid_operation;
5895 break;}
5897 // the RHS has been processed, so it can be overwritten now if necessary
5898 if (ISZERO(lhs)) { // zero coefficient unchanged
5899 decNumberCopy(res, lhs); // [nop if in place]
5900 res->exponent=reqexp; // .. just set exponent
5901 #if DECSUBSET
5902 if (!set->extended) res->bits=0; // subset specification; no -0
5903 #endif
5905 else { // non-zero lhs
5906 Int adjust=reqexp-lhs->exponent; // digit adjustment needed
5907 // if adjusted coefficient will definitely not fit, give up now
5908 if ((lhs->digits-adjust)>reqdigits) {
5909 *status|=DEC_Invalid_operation;
5910 break;
5913 if (adjust>0) { // increasing exponent
5914 // this will decrease the length of the coefficient by adjust
5915 // digits, and must round as it does so
5916 decContext workset; // work
5917 workset=*set; // clone rounding, etc.
5918 workset.digits=lhs->digits-adjust; // set requested length
5919 // [note that the latter can be <1, here]
5920 decCopyFit(res, lhs, &workset, &residue, status); // fit to result
5921 decApplyRound(res, &workset, residue, status); // .. and round
5922 residue=0; // [used]
5923 // If just rounded a 999s case, exponent will be off by one;
5924 // adjust back (after checking space), if so.
5925 if (res->exponent>reqexp) {
5926 // re-check needed, e.g., for quantize(0.9999, 0.001) under
5927 // set->digits==3
5928 if (res->digits==reqdigits) { // cannot shift by 1
5929 *status&=~(DEC_Inexact | DEC_Rounded); // [clean these]
5930 *status|=DEC_Invalid_operation;
5931 break;
5933 res->digits=decShiftToMost(res->lsu, res->digits, 1); // shift
5934 res->exponent--; // (re)adjust the exponent.
5936 #if DECSUBSET
5937 if (ISZERO(res) && !set->extended) res->bits=0; // subset; no -0
5938 #endif
5939 } // increase
5940 else /* adjust<=0 */ { // decreasing or = exponent
5941 // this will increase the length of the coefficient by -adjust
5942 // digits, by adding zero or more trailing zeros; this is
5943 // already checked for fit, above
5944 decNumberCopy(res, lhs); // [it will fit]
5945 // if padding needed (adjust<0), add it now...
5946 if (adjust<0) {
5947 res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
5948 res->exponent+=adjust; // adjust the exponent
5950 } // decrease
5951 } // non-zero
5953 // Check for overflow [do not use Finalize in this case, as an
5954 // overflow here is a "don't fit" situation]
5955 if (res->exponent>set->emax-res->digits+1) { // too big
5956 *status|=DEC_Invalid_operation;
5957 break;
5959 else {
5960 decFinalize(res, set, &residue, status); // set subnormal flags
5961 *status&=~DEC_Underflow; // suppress Underflow [as per 754]
5963 } while(0); // end protected
5965 #if DECSUBSET
5966 if (allocrhs!=NULL) free(allocrhs); // drop any storage used
5967 if (alloclhs!=NULL) free(alloclhs); // ..
5968 #endif
5969 return res;
5970 } // decQuantizeOp
5972 /* ------------------------------------------------------------------ */
5973 /* decCompareOp -- compare, min, or max two Numbers */
5974 /* */
5975 /* This computes C = A ? B and carries out one of four operations: */
5976 /* COMPARE -- returns the signum (as a number) giving the */
5977 /* result of a comparison unless one or both */
5978 /* operands is a NaN (in which case a NaN results) */
5979 /* COMPSIG -- as COMPARE except that a quiet NaN raises */
5980 /* Invalid operation. */
5981 /* COMPMAX -- returns the larger of the operands, using the */
5982 /* 754 maxnum operation */
5983 /* COMPMAXMAG -- ditto, comparing absolute values */
5984 /* COMPMIN -- the 754 minnum operation */
5985 /* COMPMINMAG -- ditto, comparing absolute values */
5986 /* COMTOTAL -- returns the signum (as a number) giving the */
5987 /* result of a comparison using 754 total ordering */
5988 /* */
5989 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
5990 /* lhs is A */
5991 /* rhs is B */
5992 /* set is the context */
5993 /* op is the operation flag */
5994 /* status is the usual accumulator */
5995 /* */
5996 /* C must have space for one digit for COMPARE or set->digits for */
5997 /* COMPMAX, COMPMIN, COMPMAXMAG, or COMPMINMAG. */
5998 /* ------------------------------------------------------------------ */
5999 /* The emphasis here is on speed for common cases, and avoiding */
6000 /* coefficient comparison if possible. */
6001 /* ------------------------------------------------------------------ */
6002 decNumber * decCompareOp(decNumber *res, const decNumber *lhs,
6003 const decNumber *rhs, decContext *set,
6004 Flag op, uInt *status) {
6005 #if DECSUBSET
6006 decNumber *alloclhs=NULL; // non-NULL if rounded lhs allocated
6007 decNumber *allocrhs=NULL; // .., rhs
6008 #endif
6009 Int result=0; // default result value
6010 uByte merged; // work
6012 #if DECCHECK
6013 if (decCheckOperands(res, lhs, rhs, set)) return res;
6014 #endif
6016 do { // protect allocated storage
6017 #if DECSUBSET
6018 if (!set->extended) {
6019 // reduce operands and set lostDigits status, as needed
6020 if (lhs->digits>set->digits) {
6021 alloclhs=decRoundOperand(lhs, set, status);
6022 if (alloclhs==NULL) {result=BADINT; break;}
6023 lhs=alloclhs;
6025 if (rhs->digits>set->digits) {
6026 allocrhs=decRoundOperand(rhs, set, status);
6027 if (allocrhs==NULL) {result=BADINT; break;}
6028 rhs=allocrhs;
6031 #endif
6032 // [following code does not require input rounding]
6034 // If total ordering then handle differing signs 'up front'
6035 if (op==COMPTOTAL) { // total ordering
6036 if (decNumberIsNegative(lhs) & !decNumberIsNegative(rhs)) {
6037 result=-1;
6038 break;
6040 if (!decNumberIsNegative(lhs) & decNumberIsNegative(rhs)) {
6041 result=+1;
6042 break;
6046 // handle NaNs specially; let infinities drop through
6047 // This assumes sNaN (even just one) leads to NaN.
6048 merged=(lhs->bits | rhs->bits) & (DECSNAN | DECNAN);
6049 if (merged) { // a NaN bit set
6050 if (op==COMPARE); // result will be NaN
6051 else if (op==COMPSIG) // treat qNaN as sNaN
6052 *status|=DEC_Invalid_operation | DEC_sNaN;
6053 else if (op==COMPTOTAL) { // total ordering, always finite
6054 // signs are known to be the same; compute the ordering here
6055 // as if the signs are both positive, then invert for negatives
6056 if (!decNumberIsNaN(lhs)) result=-1;
6057 else if (!decNumberIsNaN(rhs)) result=+1;
6058 // here if both NaNs
6059 else if (decNumberIsSNaN(lhs) && decNumberIsQNaN(rhs)) result=-1;
6060 else if (decNumberIsQNaN(lhs) && decNumberIsSNaN(rhs)) result=+1;
6061 else { // both NaN or both sNaN
6062 // now it just depends on the payload
6063 result=decUnitCompare(lhs->lsu, D2U(lhs->digits),
6064 rhs->lsu, D2U(rhs->digits), 0);
6065 // [Error not possible, as these are 'aligned']
6066 } // both same NaNs
6067 if (decNumberIsNegative(lhs)) result=-result;
6068 break;
6069 } // total order
6071 else if (merged & DECSNAN); // sNaN -> qNaN
6072 else { // here if MIN or MAX and one or two quiet NaNs
6073 // min or max -- 754 rules ignore single NaN
6074 if (!decNumberIsNaN(lhs) || !decNumberIsNaN(rhs)) {
6075 // just one NaN; force choice to be the non-NaN operand
6076 op=COMPMAX;
6077 if (lhs->bits & DECNAN) result=-1; // pick rhs
6078 else result=+1; // pick lhs
6079 break;
6081 } // max or min
6082 op=COMPNAN; // use special path
6083 decNaNs(res, lhs, rhs, set, status); // propagate NaN
6084 break;
6086 // have numbers
6087 if (op==COMPMAXMAG || op==COMPMINMAG) result=decCompare(lhs, rhs, 1);
6088 else result=decCompare(lhs, rhs, 0); // sign matters
6089 } while(0); // end protected
6091 if (result==BADINT) *status|=DEC_Insufficient_storage; // rare
6092 else {
6093 if (op==COMPARE || op==COMPSIG ||op==COMPTOTAL) { // returning signum
6094 if (op==COMPTOTAL && result==0) {
6095 // operands are numerically equal or same NaN (and same sign,
6096 // tested first); if identical, leave result 0
6097 if (lhs->exponent!=rhs->exponent) {
6098 if (lhs->exponent<rhs->exponent) result=-1;
6099 else result=+1;
6100 if (decNumberIsNegative(lhs)) result=-result;
6101 } // lexp!=rexp
6102 } // total-order by exponent
6103 decNumberZero(res); // [always a valid result]
6104 if (result!=0) { // must be -1 or +1
6105 *res->lsu=1;
6106 if (result<0) res->bits=DECNEG;
6109 else if (op==COMPNAN); // special, drop through
6110 else { // MAX or MIN, non-NaN result
6111 Int residue=0; // rounding accumulator
6112 // choose the operand for the result
6113 const decNumber *choice;
6114 if (result==0) { // operands are numerically equal
6115 // choose according to sign then exponent (see 754)
6116 uByte slhs=(lhs->bits & DECNEG);
6117 uByte srhs=(rhs->bits & DECNEG);
6118 #if DECSUBSET
6119 if (!set->extended) { // subset: force left-hand
6120 op=COMPMAX;
6121 result=+1;
6123 else
6124 #endif
6125 if (slhs!=srhs) { // signs differ
6126 if (slhs) result=-1; // rhs is max
6127 else result=+1; // lhs is max
6129 else if (slhs && srhs) { // both negative
6130 if (lhs->exponent<rhs->exponent) result=+1;
6131 else result=-1;
6132 // [if equal, use lhs, technically identical]
6134 else { // both positive
6135 if (lhs->exponent>rhs->exponent) result=+1;
6136 else result=-1;
6137 // [ditto]
6139 } // numerically equal
6140 // here result will be non-0; reverse if looking for MIN
6141 if (op==COMPMIN || op==COMPMINMAG) result=-result;
6142 choice=(result>0 ? lhs : rhs); // choose
6143 // copy chosen to result, rounding if need be
6144 decCopyFit(res, choice, set, &residue, status);
6145 decFinish(res, set, &residue, status);
6148 #if DECSUBSET
6149 if (allocrhs!=NULL) free(allocrhs); // free any storage used
6150 if (alloclhs!=NULL) free(alloclhs); // ..
6151 #endif
6152 return res;
6153 } // decCompareOp
6155 /* ------------------------------------------------------------------ */
6156 /* decCompare -- compare two decNumbers by numerical value */
6157 /* */
6158 /* This routine compares A ? B without altering them. */
6159 /* */
6160 /* Arg1 is A, a decNumber which is not a NaN */
6161 /* Arg2 is B, a decNumber which is not a NaN */
6162 /* Arg3 is 1 for a sign-independent compare, 0 otherwise */
6163 /* */
6164 /* returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure */
6165 /* (the only possible failure is an allocation error) */
6166 /* ------------------------------------------------------------------ */
6167 static Int decCompare(const decNumber *lhs, const decNumber *rhs,
6168 Flag abs) {
6169 Int result; // result value
6170 Int sigr; // rhs signum
6171 Int compare; // work
6173 result=1; // assume signum(lhs)
6174 if (ISZERO(lhs)) result=0;
6175 if (abs) {
6176 if (ISZERO(rhs)) return result; // LHS wins or both 0
6177 // RHS is non-zero
6178 if (result==0) return -1; // LHS is 0; RHS wins
6179 // [here, both non-zero, result=1]
6181 else { // signs matter
6182 if (result && decNumberIsNegative(lhs)) result=-1;
6183 sigr=1; // compute signum(rhs)
6184 if (ISZERO(rhs)) sigr=0;
6185 else if (decNumberIsNegative(rhs)) sigr=-1;
6186 if (result > sigr) return +1; // L > R, return 1
6187 if (result < sigr) return -1; // L < R, return -1
6188 if (result==0) return 0; // both 0
6191 // signums are the same; both are non-zero
6192 if ((lhs->bits | rhs->bits) & DECINF) { // one or more infinities
6193 if (decNumberIsInfinite(rhs)) {
6194 if (decNumberIsInfinite(lhs)) result=0;// both infinite
6195 else result=-result; // only rhs infinite
6197 return result;
6199 // must compare the coefficients, allowing for exponents
6200 if (lhs->exponent>rhs->exponent) { // LHS exponent larger
6201 // swap sides, and sign
6202 const decNumber *temp=lhs;
6203 lhs=rhs;
6204 rhs=temp;
6205 result=-result;
6207 compare=decUnitCompare(lhs->lsu, D2U(lhs->digits),
6208 rhs->lsu, D2U(rhs->digits),
6209 rhs->exponent-lhs->exponent);
6210 if (compare!=BADINT) compare*=result; // comparison succeeded
6211 return compare;
6212 } // decCompare
6214 /* ------------------------------------------------------------------ */
6215 /* decUnitCompare -- compare two >=0 integers in Unit arrays */
6216 /* */
6217 /* This routine compares A ? B*10**E where A and B are unit arrays */
6218 /* A is a plain integer */
6219 /* B has an exponent of E (which must be non-negative) */
6220 /* */
6221 /* Arg1 is A first Unit (lsu) */
6222 /* Arg2 is A length in Units */
6223 /* Arg3 is B first Unit (lsu) */
6224 /* Arg4 is B length in Units */
6225 /* Arg5 is E (0 if the units are aligned) */
6226 /* */
6227 /* returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure */
6228 /* (the only possible failure is an allocation error, which can */
6229 /* only occur if E!=0) */
6230 /* ------------------------------------------------------------------ */
6231 static Int decUnitCompare(const Unit *a, Int alength,
6232 const Unit *b, Int blength, Int exp) {
6233 Unit *acc; // accumulator for result
6234 Unit accbuff[SD2U(DECBUFFER*2+1)]; // local buffer
6235 Unit *allocacc=NULL; // -> allocated acc buffer, iff allocated
6236 Int accunits, need; // units in use or needed for acc
6237 const Unit *l, *r, *u; // work
6238 Int expunits, exprem, result; // ..
6240 if (exp==0) { // aligned; fastpath
6241 if (alength>blength) return 1;
6242 if (alength<blength) return -1;
6243 // same number of units in both -- need unit-by-unit compare
6244 l=a+alength-1;
6245 r=b+alength-1;
6246 for (;l>=a; l--, r--) {
6247 if (*l>*r) return 1;
6248 if (*l<*r) return -1;
6250 return 0; // all units match
6251 } // aligned
6253 // Unaligned. If one is >1 unit longer than the other, padded
6254 // approximately, then can return easily
6255 if (alength>blength+(Int)D2U(exp)) return 1;
6256 if (alength+1<blength+(Int)D2U(exp)) return -1;
6258 // Need to do a real subtract. For this, a result buffer is needed
6259 // even though only the sign is of interest. Its length needs
6260 // to be the larger of alength and padded blength, +2
6261 need=blength+D2U(exp); // maximum real length of B
6262 if (need<alength) need=alength;
6263 need+=2;
6264 acc=accbuff; // assume use local buffer
6265 if (need*sizeof(Unit)>sizeof(accbuff)) {
6266 allocacc=(Unit *)malloc(need*sizeof(Unit));
6267 if (allocacc==NULL) return BADINT; // hopeless -- abandon
6268 acc=allocacc;
6270 // Calculate units and remainder from exponent.
6271 expunits=exp/DECDPUN;
6272 exprem=exp%DECDPUN;
6273 // subtract [A+B*(-m)]
6274 accunits=decUnitAddSub(a, alength, b, blength, expunits, acc,
6275 -(Int)powers[exprem]);
6276 // [UnitAddSub result may have leading zeros, even on zero]
6277 if (accunits<0) result=-1; // negative result
6278 else { // non-negative result
6279 // check units of the result before freeing any storage
6280 for (u=acc; u<acc+accunits-1 && *u==0;) u++;
6281 result=(*u==0 ? 0 : +1);
6283 // clean up and return the result
6284 if (allocacc!=NULL) free(allocacc); // drop any storage used
6285 return result;
6286 } // decUnitCompare
6288 /* ------------------------------------------------------------------ */
6289 /* decUnitAddSub -- add or subtract two >=0 integers in Unit arrays */
6290 /* */
6291 /* This routine performs the calculation: */
6292 /* */
6293 /* C=A+(B*M) */
6294 /* */
6295 /* Where M is in the range -DECDPUNMAX through +DECDPUNMAX. */
6296 /* */
6297 /* A may be shorter or longer than B. */
6298 /* */
6299 /* Leading zeros are not removed after a calculation. The result is */
6300 /* either the same length as the longer of A and B (adding any */
6301 /* shift), or one Unit longer than that (if a Unit carry occurred). */
6302 /* */
6303 /* A and B content are not altered unless C is also A or B. */
6304 /* C may be the same array as A or B, but only if no zero padding is */
6305 /* requested (that is, C may be B only if bshift==0). */
6306 /* C is filled from the lsu; only those units necessary to complete */
6307 /* the calculation are referenced. */
6308 /* */
6309 /* Arg1 is A first Unit (lsu) */
6310 /* Arg2 is A length in Units */
6311 /* Arg3 is B first Unit (lsu) */
6312 /* Arg4 is B length in Units */
6313 /* Arg5 is B shift in Units (>=0; pads with 0 units if positive) */
6314 /* Arg6 is C first Unit (lsu) */
6315 /* Arg7 is M, the multiplier */
6316 /* */
6317 /* returns the count of Units written to C, which will be non-zero */
6318 /* and negated if the result is negative. That is, the sign of the */
6319 /* returned Int is the sign of the result (positive for zero) and */
6320 /* the absolute value of the Int is the count of Units. */
6321 /* */
6322 /* It is the caller's responsibility to make sure that C size is */
6323 /* safe, allowing space if necessary for a one-Unit carry. */
6324 /* */
6325 /* This routine is severely performance-critical; *any* change here */
6326 /* must be measured (timed) to assure no performance degradation. */
6327 /* In particular, trickery here tends to be counter-productive, as */
6328 /* increased complexity of code hurts register optimizations on */
6329 /* register-poor architectures. Avoiding divisions is nearly */
6330 /* always a Good Idea, however. */
6331 /* */
6332 /* Special thanks to Rick McGuire (IBM Cambridge, MA) and Dave Clark */
6333 /* (IBM Warwick, UK) for some of the ideas used in this routine. */
6334 /* ------------------------------------------------------------------ */
6335 static Int decUnitAddSub(const Unit *a, Int alength,
6336 const Unit *b, Int blength, Int bshift,
6337 Unit *c, Int m) {
6338 const Unit *alsu=a; // A lsu [need to remember it]
6339 Unit *clsu=c; // C ditto
6340 Unit *minC; // low water mark for C
6341 Unit *maxC; // high water mark for C
6342 eInt carry=0; // carry integer (could be Long)
6343 Int add; // work
6344 #if DECDPUN<=4 // myriadal, millenary, etc.
6345 Int est; // estimated quotient
6346 #endif
6348 #if DECTRACE
6349 if (alength<1 || blength<1)
6350 printf("decUnitAddSub: alen blen m %ld %ld [%ld]\n", alength, blength, m);
6351 #endif
6353 maxC=c+alength; // A is usually the longer
6354 minC=c+blength; // .. and B the shorter
6355 if (bshift!=0) { // B is shifted; low As copy across
6356 minC+=bshift;
6357 // if in place [common], skip copy unless there's a gap [rare]
6358 if (a==c && bshift<=alength) {
6359 c+=bshift;
6360 a+=bshift;
6362 else for (; c<clsu+bshift; a++, c++) { // copy needed
6363 if (a<alsu+alength) *c=*a;
6364 else *c=0;
6367 if (minC>maxC) { // swap
6368 Unit *hold=minC;
6369 minC=maxC;
6370 maxC=hold;
6373 // For speed, do the addition as two loops; the first where both A
6374 // and B contribute, and the second (if necessary) where only one or
6375 // other of the numbers contribute.
6376 // Carry handling is the same (i.e., duplicated) in each case.
6377 for (; c<minC; c++) {
6378 carry+=*a;
6379 a++;
6380 carry+=((eInt)*b)*m; // [special-casing m=1/-1
6381 b++; // here is not a win]
6382 // here carry is new Unit of digits; it could be +ve or -ve
6383 if ((ueInt)carry<=DECDPUNMAX) { // fastpath 0-DECDPUNMAX
6384 *c=(Unit)carry;
6385 carry=0;
6386 continue;
6388 #if DECDPUN==4 // use divide-by-multiply
6389 if (carry>=0) {
6390 est=(((ueInt)carry>>11)*53687)>>18;
6391 *c=(Unit)(carry-est*(DECDPUNMAX+1)); // remainder
6392 carry=est; // likely quotient [89%]
6393 if (*c<DECDPUNMAX+1) continue; // estimate was correct
6394 carry++;
6395 *c-=DECDPUNMAX+1;
6396 continue;
6398 // negative case
6399 carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); // make positive
6400 est=(((ueInt)carry>>11)*53687)>>18;
6401 *c=(Unit)(carry-est*(DECDPUNMAX+1));
6402 carry=est-(DECDPUNMAX+1); // correctly negative
6403 if (*c<DECDPUNMAX+1) continue; // was OK
6404 carry++;
6405 *c-=DECDPUNMAX+1;
6406 #elif DECDPUN==3
6407 if (carry>=0) {
6408 est=(((ueInt)carry>>3)*16777)>>21;
6409 *c=(Unit)(carry-est*(DECDPUNMAX+1)); // remainder
6410 carry=est; // likely quotient [99%]
6411 if (*c<DECDPUNMAX+1) continue; // estimate was correct
6412 carry++;
6413 *c-=DECDPUNMAX+1;
6414 continue;
6416 // negative case
6417 carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); // make positive
6418 est=(((ueInt)carry>>3)*16777)>>21;
6419 *c=(Unit)(carry-est*(DECDPUNMAX+1));
6420 carry=est-(DECDPUNMAX+1); // correctly negative
6421 if (*c<DECDPUNMAX+1) continue; // was OK
6422 carry++;
6423 *c-=DECDPUNMAX+1;
6424 #elif DECDPUN<=2
6425 // Can use QUOT10 as carry <= 4 digits
6426 if (carry>=0) {
6427 est=QUOT10(carry, DECDPUN);
6428 *c=(Unit)(carry-est*(DECDPUNMAX+1)); // remainder
6429 carry=est; // quotient
6430 continue;
6432 // negative case
6433 carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); // make positive
6434 est=QUOT10(carry, DECDPUN);
6435 *c=(Unit)(carry-est*(DECDPUNMAX+1));
6436 carry=est-(DECDPUNMAX+1); // correctly negative
6437 #else
6438 // remainder operator is undefined if negative, so must test
6439 if ((ueInt)carry<(DECDPUNMAX+1)*2) { // fastpath carry +1
6440 *c=(Unit)(carry-(DECDPUNMAX+1)); // [helps additions]
6441 carry=1;
6442 continue;
6444 if (carry>=0) {
6445 *c=(Unit)(carry%(DECDPUNMAX+1));
6446 carry=carry/(DECDPUNMAX+1);
6447 continue;
6449 // negative case
6450 carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); // make positive
6451 *c=(Unit)(carry%(DECDPUNMAX+1));
6452 carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
6453 #endif
6454 } // c
6456 // now may have one or other to complete
6457 // [pretest to avoid loop setup/shutdown]
6458 if (c<maxC) for (; c<maxC; c++) {
6459 if (a<alsu+alength) { // still in A
6460 carry+=*a;
6461 a++;
6463 else { // inside B
6464 carry+=((eInt)*b)*m;
6465 b++;
6467 // here carry is new Unit of digits; it could be +ve or -ve and
6468 // magnitude up to DECDPUNMAX squared
6469 if ((ueInt)carry<=DECDPUNMAX) { // fastpath 0-DECDPUNMAX
6470 *c=(Unit)carry;
6471 carry=0;
6472 continue;
6474 // result for this unit is negative or >DECDPUNMAX
6475 #if DECDPUN==4 // use divide-by-multiply
6476 if (carry>=0) {
6477 est=(((ueInt)carry>>11)*53687)>>18;
6478 *c=(Unit)(carry-est*(DECDPUNMAX+1)); // remainder
6479 carry=est; // likely quotient [79.7%]
6480 if (*c<DECDPUNMAX+1) continue; // estimate was correct
6481 carry++;
6482 *c-=DECDPUNMAX+1;
6483 continue;
6485 // negative case
6486 carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); // make positive
6487 est=(((ueInt)carry>>11)*53687)>>18;
6488 *c=(Unit)(carry-est*(DECDPUNMAX+1));
6489 carry=est-(DECDPUNMAX+1); // correctly negative
6490 if (*c<DECDPUNMAX+1) continue; // was OK
6491 carry++;
6492 *c-=DECDPUNMAX+1;
6493 #elif DECDPUN==3
6494 if (carry>=0) {
6495 est=(((ueInt)carry>>3)*16777)>>21;
6496 *c=(Unit)(carry-est*(DECDPUNMAX+1)); // remainder
6497 carry=est; // likely quotient [99%]
6498 if (*c<DECDPUNMAX+1) continue; // estimate was correct
6499 carry++;
6500 *c-=DECDPUNMAX+1;
6501 continue;
6503 // negative case
6504 carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); // make positive
6505 est=(((ueInt)carry>>3)*16777)>>21;
6506 *c=(Unit)(carry-est*(DECDPUNMAX+1));
6507 carry=est-(DECDPUNMAX+1); // correctly negative
6508 if (*c<DECDPUNMAX+1) continue; // was OK
6509 carry++;
6510 *c-=DECDPUNMAX+1;
6511 #elif DECDPUN<=2
6512 if (carry>=0) {
6513 est=QUOT10(carry, DECDPUN);
6514 *c=(Unit)(carry-est*(DECDPUNMAX+1)); // remainder
6515 carry=est; // quotient
6516 continue;
6518 // negative case
6519 carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); // make positive
6520 est=QUOT10(carry, DECDPUN);
6521 *c=(Unit)(carry-est*(DECDPUNMAX+1));
6522 carry=est-(DECDPUNMAX+1); // correctly negative
6523 #else
6524 if ((ueInt)carry<(DECDPUNMAX+1)*2){ // fastpath carry 1
6525 *c=(Unit)(carry-(DECDPUNMAX+1));
6526 carry=1;
6527 continue;
6529 // remainder operator is undefined if negative, so must test
6530 if (carry>=0) {
6531 *c=(Unit)(carry%(DECDPUNMAX+1));
6532 carry=carry/(DECDPUNMAX+1);
6533 continue;
6535 // negative case
6536 carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); // make positive
6537 *c=(Unit)(carry%(DECDPUNMAX+1));
6538 carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
6539 #endif
6540 } // c
6542 // OK, all A and B processed; might still have carry or borrow
6543 // return number of Units in the result, negated if a borrow
6544 if (carry==0) return c-clsu; // no carry, so no more to do
6545 if (carry>0) { // positive carry
6546 *c=(Unit)carry; // place as new unit
6547 c++; // ..
6548 return c-clsu;
6550 // -ve carry: it's a borrow; complement needed
6551 add=1; // temporary carry...
6552 for (c=clsu; c<maxC; c++) {
6553 add=DECDPUNMAX+add-*c;
6554 if (add<=DECDPUNMAX) {
6555 *c=(Unit)add;
6556 add=0;
6558 else {
6559 *c=0;
6560 add=1;
6563 // add an extra unit iff it would be non-zero
6564 #if DECTRACE
6565 printf("UAS borrow: add %ld, carry %ld\n", add, carry);
6566 #endif
6567 if ((add-carry-1)!=0) {
6568 *c=(Unit)(add-carry-1);
6569 c++; // interesting, include it
6571 return clsu-c; // -ve result indicates borrowed
6572 } // decUnitAddSub
6574 /* ------------------------------------------------------------------ */
6575 /* decTrim -- trim trailing zeros or normalize */
6576 /* */
6577 /* dn is the number to trim or normalize */
6578 /* set is the context to use to check for clamp */
6579 /* all is 1 to remove all trailing zeros, 0 for just fraction ones */
6580 /* noclamp is 1 to unconditional (unclamped) trim */
6581 /* dropped returns the number of discarded trailing zeros */
6582 /* returns dn */
6583 /* */
6584 /* If clamp is set in the context then the number of zeros trimmed */
6585 /* may be limited if the exponent is high. */
6586 /* All fields are updated as required. This is a utility operation, */
6587 /* so special values are unchanged and no error is possible. */
6588 /* ------------------------------------------------------------------ */
6589 static decNumber * decTrim(decNumber *dn, decContext *set, Flag all,
6590 Flag noclamp, Int *dropped) {
6591 Int d, exp; // work
6592 uInt cut; // ..
6593 Unit *up; // -> current Unit
6595 #if DECCHECK
6596 if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
6597 #endif
6599 *dropped=0; // assume no zeros dropped
6600 if ((dn->bits & DECSPECIAL) // fast exit if special ..
6601 || (*dn->lsu & 0x01)) return dn; // .. or odd
6602 if (ISZERO(dn)) { // .. or 0
6603 dn->exponent=0; // (sign is preserved)
6604 return dn;
6607 // have a finite number which is even
6608 exp=dn->exponent;
6609 cut=1; // digit (1-DECDPUN) in Unit
6610 up=dn->lsu; // -> current Unit
6611 for (d=0; d<dn->digits-1; d++) { // [don't strip the final digit]
6612 // slice by powers
6613 #if DECDPUN<=4
6614 uInt quot=QUOT10(*up, cut);
6615 if ((*up-quot*powers[cut])!=0) break; // found non-0 digit
6616 #else
6617 if (*up%powers[cut]!=0) break; // found non-0 digit
6618 #endif
6619 // have a trailing 0
6620 if (!all) { // trimming
6621 // [if exp>0 then all trailing 0s are significant for trim]
6622 if (exp<=0) { // if digit might be significant
6623 if (exp==0) break; // then quit
6624 exp++; // next digit might be significant
6627 cut++; // next power
6628 if (cut>DECDPUN) { // need new Unit
6629 up++;
6630 cut=1;
6632 } // d
6633 if (d==0) return dn; // none to drop
6635 // may need to limit drop if clamping
6636 if (set->clamp && !noclamp) {
6637 Int maxd=set->emax-set->digits+1-dn->exponent;
6638 if (maxd<=0) return dn; // nothing possible
6639 if (d>maxd) d=maxd;
6642 // effect the drop
6643 decShiftToLeast(dn->lsu, D2U(dn->digits), d);
6644 dn->exponent+=d; // maintain numerical value
6645 dn->digits-=d; // new length
6646 *dropped=d; // report the count
6647 return dn;
6648 } // decTrim
6650 /* ------------------------------------------------------------------ */
6651 /* decReverse -- reverse a Unit array in place */
6652 /* */
6653 /* ulo is the start of the array */
6654 /* uhi is the end of the array (highest Unit to include) */
6655 /* */
6656 /* The units ulo through uhi are reversed in place (if the number */
6657 /* of units is odd, the middle one is untouched). Note that the */
6658 /* digit(s) in each unit are unaffected. */
6659 /* ------------------------------------------------------------------ */
6660 static void decReverse(Unit *ulo, Unit *uhi) {
6661 Unit temp;
6662 for (; ulo<uhi; ulo++, uhi--) {
6663 temp=*ulo;
6664 *ulo=*uhi;
6665 *uhi=temp;
6667 return;
6668 } // decReverse
6670 /* ------------------------------------------------------------------ */
6671 /* decShiftToMost -- shift digits in array towards most significant */
6672 /* */
6673 /* uar is the array */
6674 /* digits is the count of digits in use in the array */
6675 /* shift is the number of zeros to pad with (least significant); */
6676 /* it must be zero or positive */
6677 /* */
6678 /* returns the new length of the integer in the array, in digits */
6679 /* */
6680 /* No overflow is permitted (that is, the uar array must be known to */
6681 /* be large enough to hold the result, after shifting). */
6682 /* ------------------------------------------------------------------ */
6683 static Int decShiftToMost(Unit *uar, Int digits, Int shift) {
6684 Unit *target, *source, *first; // work
6685 Int cut; // odd 0's to add
6686 uInt next; // work
6688 if (shift==0) return digits; // [fastpath] nothing to do
6689 if ((digits+shift)<=DECDPUN) { // [fastpath] single-unit case
6690 *uar=(Unit)(*uar*powers[shift]);
6691 return digits+shift;
6694 next=0; // all paths
6695 source=uar+D2U(digits)-1; // where msu comes from
6696 target=source+D2U(shift); // where upper part of first cut goes
6697 cut=DECDPUN-MSUDIGITS(shift); // where to slice
6698 if (cut==0) { // unit-boundary case
6699 for (; source>=uar; source--, target--) *target=*source;
6701 else {
6702 first=uar+D2U(digits+shift)-1; // where msu of source will end up
6703 for (; source>=uar; source--, target--) {
6704 // split the source Unit and accumulate remainder for next
6705 #if DECDPUN<=4
6706 uInt quot=QUOT10(*source, cut);
6707 uInt rem=*source-quot*powers[cut];
6708 next+=quot;
6709 #else
6710 uInt rem=*source%powers[cut];
6711 next+=*source/powers[cut];
6712 #endif
6713 if (target<=first) *target=(Unit)next; // write to target iff valid
6714 next=rem*powers[DECDPUN-cut]; // save remainder for next Unit
6716 } // shift-move
6718 // propagate any partial unit to one below and clear the rest
6719 for (; target>=uar; target--) {
6720 *target=(Unit)next;
6721 next=0;
6723 return digits+shift;
6724 } // decShiftToMost
6726 /* ------------------------------------------------------------------ */
6727 /* decShiftToLeast -- shift digits in array towards least significant */
6728 /* */
6729 /* uar is the array */
6730 /* units is length of the array, in units */
6731 /* shift is the number of digits to remove from the lsu end; it */
6732 /* must be zero or positive and <= than units*DECDPUN. */
6733 /* */
6734 /* returns the new length of the integer in the array, in units */
6735 /* */
6736 /* Removed digits are discarded (lost). Units not required to hold */
6737 /* the final result are unchanged. */
6738 /* ------------------------------------------------------------------ */
6739 static Int decShiftToLeast(Unit *uar, Int units, Int shift) {
6740 Unit *target, *up; // work
6741 Int cut, count; // work
6742 Int quot, rem; // for division
6744 if (shift==0) return units; // [fastpath] nothing to do
6745 if (shift==units*DECDPUN) { // [fastpath] little to do
6746 *uar=0; // all digits cleared gives zero
6747 return 1; // leaves just the one
6750 target=uar; // both paths
6751 cut=MSUDIGITS(shift);
6752 if (cut==DECDPUN) { // unit-boundary case; easy
6753 up=uar+D2U(shift);
6754 for (; up<uar+units; target++, up++) *target=*up;
6755 return target-uar;
6758 // messier
6759 up=uar+D2U(shift-cut); // source; correct to whole Units
6760 count=units*DECDPUN-shift; // the maximum new length
6761 #if DECDPUN<=4
6762 quot=QUOT10(*up, cut);
6763 #else
6764 quot=*up/powers[cut];
6765 #endif
6766 for (; ; target++) {
6767 *target=(Unit)quot;
6768 count-=(DECDPUN-cut);
6769 if (count<=0) break;
6770 up++;
6771 quot=*up;
6772 #if DECDPUN<=4
6773 quot=QUOT10(quot, cut);
6774 rem=*up-quot*powers[cut];
6775 #else
6776 rem=quot%powers[cut];
6777 quot=quot/powers[cut];
6778 #endif
6779 *target=(Unit)(*target+rem*powers[DECDPUN-cut]);
6780 count-=cut;
6781 if (count<=0) break;
6783 return target-uar+1;
6784 } // decShiftToLeast
6786 #if DECSUBSET
6787 /* ------------------------------------------------------------------ */
6788 /* decRoundOperand -- round an operand [used for subset only] */
6789 /* */
6790 /* dn is the number to round (dn->digits is > set->digits) */
6791 /* set is the relevant context */
6792 /* status is the status accumulator */
6793 /* */
6794 /* returns an allocated decNumber with the rounded result. */
6795 /* */
6796 /* lostDigits and other status may be set by this. */
6797 /* */
6798 /* Since the input is an operand, it must not be modified. */
6799 /* Instead, return an allocated decNumber, rounded as required. */
6800 /* It is the caller's responsibility to free the allocated storage. */
6801 /* */
6802 /* If no storage is available then the result cannot be used, so NULL */
6803 /* is returned. */
6804 /* ------------------------------------------------------------------ */
6805 static decNumber *decRoundOperand(const decNumber *dn, decContext *set,
6806 uInt *status) {
6807 decNumber *res; // result structure
6808 uInt newstatus=0; // status from round
6809 Int residue=0; // rounding accumulator
6811 // Allocate storage for the returned decNumber, big enough for the
6812 // length specified by the context
6813 res=(decNumber *)malloc(sizeof(decNumber)
6814 +(D2U(set->digits)-1)*sizeof(Unit));
6815 if (res==NULL) {
6816 *status|=DEC_Insufficient_storage;
6817 return NULL;
6819 decCopyFit(res, dn, set, &residue, &newstatus);
6820 decApplyRound(res, set, residue, &newstatus);
6822 // If that set Inexact then "lost digits" is raised...
6823 if (newstatus & DEC_Inexact) newstatus|=DEC_Lost_digits;
6824 *status|=newstatus;
6825 return res;
6826 } // decRoundOperand
6827 #endif
6829 /* ------------------------------------------------------------------ */
6830 /* decCopyFit -- copy a number, truncating the coefficient if needed */
6831 /* */
6832 /* dest is the target decNumber */
6833 /* src is the source decNumber */
6834 /* set is the context [used for length (digits) and rounding mode] */
6835 /* residue is the residue accumulator */
6836 /* status contains the current status to be updated */
6837 /* */
6838 /* (dest==src is allowed and will be a no-op if fits) */
6839 /* All fields are updated as required. */
6840 /* ------------------------------------------------------------------ */
6841 static void decCopyFit(decNumber *dest, const decNumber *src,
6842 decContext *set, Int *residue, uInt *status) {
6843 dest->bits=src->bits;
6844 dest->exponent=src->exponent;
6845 decSetCoeff(dest, set, src->lsu, src->digits, residue, status);
6846 } // decCopyFit
6848 /* ------------------------------------------------------------------ */
6849 /* decSetCoeff -- set the coefficient of a number */
6850 /* */
6851 /* dn is the number whose coefficient array is to be set. */
6852 /* It must have space for set->digits digits */
6853 /* set is the context [for size] */
6854 /* lsu -> lsu of the source coefficient [may be dn->lsu] */
6855 /* len is digits in the source coefficient [may be dn->digits] */
6856 /* residue is the residue accumulator. This has values as in */
6857 /* decApplyRound, and will be unchanged unless the */
6858 /* target size is less than len. In this case, the */
6859 /* coefficient is truncated and the residue is updated to */
6860 /* reflect the previous residue and the dropped digits. */
6861 /* status is the status accumulator, as usual */
6862 /* */
6863 /* The coefficient may already be in the number, or it can be an */
6864 /* external intermediate array. If it is in the number, lsu must == */
6865 /* dn->lsu and len must == dn->digits. */
6866 /* */
6867 /* Note that the coefficient length (len) may be < set->digits, and */
6868 /* in this case this merely copies the coefficient (or is a no-op */
6869 /* if dn->lsu==lsu). */
6870 /* */
6871 /* Note also that (only internally, from decQuantizeOp and */
6872 /* decSetSubnormal) the value of set->digits may be less than one, */
6873 /* indicating a round to left. This routine handles that case */
6874 /* correctly; caller ensures space. */
6875 /* */
6876 /* dn->digits, dn->lsu (and as required), and dn->exponent are */
6877 /* updated as necessary. dn->bits (sign) is unchanged. */
6878 /* */
6879 /* DEC_Rounded status is set if any digits are discarded. */
6880 /* DEC_Inexact status is set if any non-zero digits are discarded, or */
6881 /* incoming residue was non-0 (implies rounded) */
6882 /* ------------------------------------------------------------------ */
6883 // mapping array: maps 0-9 to canonical residues, so that a residue
6884 // can be adjusted in the range [-1, +1] and achieve correct rounding
6885 // 0 1 2 3 4 5 6 7 8 9
6886 static const uByte resmap[10]={0, 3, 3, 3, 3, 5, 7, 7, 7, 7};
6887 static void decSetCoeff(decNumber *dn, decContext *set, const Unit *lsu,
6888 Int len, Int *residue, uInt *status) {
6889 Int discard; // number of digits to discard
6890 uInt cut; // cut point in Unit
6891 const Unit *up; // work
6892 Unit *target; // ..
6893 Int count; // ..
6894 #if DECDPUN<=4
6895 uInt temp; // ..
6896 #endif
6898 discard=len-set->digits; // digits to discard
6899 if (discard<=0) { // no digits are being discarded
6900 if (dn->lsu!=lsu) { // copy needed
6901 // copy the coefficient array to the result number; no shift needed
6902 count=len; // avoids D2U
6903 up=lsu;
6904 for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
6905 *target=*up;
6906 dn->digits=len; // set the new length
6908 // dn->exponent and residue are unchanged, record any inexactitude
6909 if (*residue!=0) *status|=(DEC_Inexact | DEC_Rounded);
6910 return;
6913 // some digits must be discarded ...
6914 dn->exponent+=discard; // maintain numerical value
6915 *status|=DEC_Rounded; // accumulate Rounded status
6916 if (*residue>1) *residue=1; // previous residue now to right, so reduce
6918 if (discard>len) { // everything, +1, is being discarded
6919 // guard digit is 0
6920 // residue is all the number [NB could be all 0s]
6921 if (*residue<=0) { // not already positive
6922 count=len; // avoids D2U
6923 for (up=lsu; count>0; up++, count-=DECDPUN) if (*up!=0) { // found non-0
6924 *residue=1;
6925 break; // no need to check any others
6928 if (*residue!=0) *status|=DEC_Inexact; // record inexactitude
6929 *dn->lsu=0; // coefficient will now be 0
6930 dn->digits=1; // ..
6931 return;
6932 } // total discard
6934 // partial discard [most common case]
6935 // here, at least the first (most significant) discarded digit exists
6937 // spin up the number, noting residue during the spin, until get to
6938 // the Unit with the first discarded digit. When reach it, extract
6939 // it and remember its position
6940 count=0;
6941 for (up=lsu;; up++) {
6942 count+=DECDPUN;
6943 if (count>=discard) break; // full ones all checked
6944 if (*up!=0) *residue=1;
6945 } // up
6947 // here up -> Unit with first discarded digit
6948 cut=discard-(count-DECDPUN)-1;
6949 if (cut==DECDPUN-1) { // unit-boundary case (fast)
6950 Unit half=(Unit)powers[DECDPUN]>>1;
6951 // set residue directly
6952 if (*up>=half) {
6953 if (*up>half) *residue=7;
6954 else *residue+=5; // add sticky bit
6956 else { // <half
6957 if (*up!=0) *residue=3; // [else is 0, leave as sticky bit]
6959 if (set->digits<=0) { // special for Quantize/Subnormal :-(
6960 *dn->lsu=0; // .. result is 0
6961 dn->digits=1; // ..
6963 else { // shift to least
6964 count=set->digits; // now digits to end up with
6965 dn->digits=count; // set the new length
6966 up++; // move to next
6967 // on unit boundary, so shift-down copy loop is simple
6968 for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
6969 *target=*up;
6971 } // unit-boundary case
6973 else { // discard digit is in low digit(s), and not top digit
6974 uInt discard1; // first discarded digit
6975 uInt quot, rem; // for divisions
6976 if (cut==0) quot=*up; // is at bottom of unit
6977 else /* cut>0 */ { // it's not at bottom of unit
6978 #if DECDPUN<=4
6979 quot=QUOT10(*up, cut);
6980 rem=*up-quot*powers[cut];
6981 #else
6982 rem=*up%powers[cut];
6983 quot=*up/powers[cut];
6984 #endif
6985 if (rem!=0) *residue=1;
6987 // discard digit is now at bottom of quot
6988 #if DECDPUN<=4
6989 temp=(quot*6554)>>16; // fast /10
6990 // Vowels algorithm here not a win (9 instructions)
6991 discard1=quot-X10(temp);
6992 quot=temp;
6993 #else
6994 discard1=quot%10;
6995 quot=quot/10;
6996 #endif
6997 // here, discard1 is the guard digit, and residue is everything
6998 // else [use mapping array to accumulate residue safely]
6999 *residue+=resmap[discard1];
7000 cut++; // update cut
7001 // here: up -> Unit of the array with bottom digit
7002 // cut is the division point for each Unit
7003 // quot holds the uncut high-order digits for the current unit
7004 if (set->digits<=0) { // special for Quantize/Subnormal :-(
7005 *dn->lsu=0; // .. result is 0
7006 dn->digits=1; // ..
7008 else { // shift to least needed
7009 count=set->digits; // now digits to end up with
7010 dn->digits=count; // set the new length
7011 // shift-copy the coefficient array to the result number
7012 for (target=dn->lsu; ; target++) {
7013 *target=(Unit)quot;
7014 count-=(DECDPUN-cut);
7015 if (count<=0) break;
7016 up++;
7017 quot=*up;
7018 #if DECDPUN<=4
7019 quot=QUOT10(quot, cut);
7020 rem=*up-quot*powers[cut];
7021 #else
7022 rem=quot%powers[cut];
7023 quot=quot/powers[cut];
7024 #endif
7025 *target=(Unit)(*target+rem*powers[DECDPUN-cut]);
7026 count-=cut;
7027 if (count<=0) break;
7028 } // shift-copy loop
7029 } // shift to least
7030 } // not unit boundary
7032 if (*residue!=0) *status|=DEC_Inexact; // record inexactitude
7033 return;
7034 } // decSetCoeff
7036 /* ------------------------------------------------------------------ */
7037 /* decApplyRound -- apply pending rounding to a number */
7038 /* */
7039 /* dn is the number, with space for set->digits digits */
7040 /* set is the context [for size and rounding mode] */
7041 /* residue indicates pending rounding, being any accumulated */
7042 /* guard and sticky information. It may be: */
7043 /* 6-9: rounding digit is >5 */
7044 /* 5: rounding digit is exactly half-way */
7045 /* 1-4: rounding digit is <5 and >0 */
7046 /* 0: the coefficient is exact */
7047 /* -1: as 1, but the hidden digits are subtractive, that */
7048 /* is, of the opposite sign to dn. In this case the */
7049 /* coefficient must be non-0. This case occurs when */
7050 /* subtracting a small number (which can be reduced to */
7051 /* a sticky bit); see decAddOp. */
7052 /* status is the status accumulator, as usual */
7053 /* */
7054 /* This routine applies rounding while keeping the length of the */
7055 /* coefficient constant. The exponent and status are unchanged */
7056 /* except if: */
7057 /* */
7058 /* -- the coefficient was increased and is all nines (in which */
7059 /* case Overflow could occur, and is handled directly here so */
7060 /* the caller does not need to re-test for overflow) */
7061 /* */
7062 /* -- the coefficient was decreased and becomes all nines (in which */
7063 /* case Underflow could occur, and is also handled directly). */
7064 /* */
7065 /* All fields in dn are updated as required. */
7066 /* */
7067 /* ------------------------------------------------------------------ */
7068 static void decApplyRound(decNumber *dn, decContext *set, Int residue,
7069 uInt *status) {
7070 Int bump; // 1 if coefficient needs to be incremented
7071 // -1 if coefficient needs to be decremented
7073 if (residue==0) return; // nothing to apply
7075 bump=0; // assume a smooth ride
7077 // now decide whether, and how, to round, depending on mode
7078 switch (set->round) {
7079 case DEC_ROUND_05UP: { // round zero or five up (for reround)
7080 // This is the same as DEC_ROUND_DOWN unless there is a
7081 // positive residue and the lsd of dn is 0 or 5, in which case
7082 // it is bumped; when residue is <0, the number is therefore
7083 // bumped down unless the final digit was 1 or 6 (in which
7084 // case it is bumped down and then up -- a no-op)
7085 Int lsd5=*dn->lsu%5; // get lsd and quintate
7086 if (residue<0 && lsd5!=1) bump=-1;
7087 else if (residue>0 && lsd5==0) bump=1;
7088 // [bump==1 could be applied directly; use common path for clarity]
7089 break;} // r-05
7091 case DEC_ROUND_DOWN: {
7092 // no change, except if negative residue
7093 if (residue<0) bump=-1;
7094 break;} // r-d
7096 case DEC_ROUND_HALF_DOWN: {
7097 if (residue>5) bump=1;
7098 break;} // r-h-d
7100 case DEC_ROUND_HALF_EVEN: {
7101 if (residue>5) bump=1; // >0.5 goes up
7102 else if (residue==5) { // exactly 0.5000...
7103 // 0.5 goes up iff [new] lsd is odd
7104 if (*dn->lsu & 0x01) bump=1;
7106 break;} // r-h-e
7108 case DEC_ROUND_HALF_UP: {
7109 if (residue>=5) bump=1;
7110 break;} // r-h-u
7112 case DEC_ROUND_UP: {
7113 if (residue>0) bump=1;
7114 break;} // r-u
7116 case DEC_ROUND_CEILING: {
7117 // same as _UP for positive numbers, and as _DOWN for negatives
7118 // [negative residue cannot occur on 0]
7119 if (decNumberIsNegative(dn)) {
7120 if (residue<0) bump=-1;
7122 else {
7123 if (residue>0) bump=1;
7125 break;} // r-c
7127 case DEC_ROUND_FLOOR: {
7128 // same as _UP for negative numbers, and as _DOWN for positive
7129 // [negative residue cannot occur on 0]
7130 if (!decNumberIsNegative(dn)) {
7131 if (residue<0) bump=-1;
7133 else {
7134 if (residue>0) bump=1;
7136 break;} // r-f
7138 default: { // e.g., DEC_ROUND_MAX
7139 *status|=DEC_Invalid_context;
7140 #if DECTRACE || (DECCHECK && DECVERB)
7141 printf("Unknown rounding mode: %d\n", set->round);
7142 #endif
7143 break;}
7144 } // switch
7146 // now bump the number, up or down, if need be
7147 if (bump==0) return; // no action required
7149 // Simply use decUnitAddSub unless bumping up and the number is
7150 // all nines. In this special case set to 100... explicitly
7151 // and adjust the exponent by one (as otherwise could overflow
7152 // the array)
7153 // Similarly handle all-nines result if bumping down.
7154 if (bump>0) {
7155 Unit *up; // work
7156 uInt count=dn->digits; // digits to be checked
7157 for (up=dn->lsu; ; up++) {
7158 if (count<=DECDPUN) {
7159 // this is the last Unit (the msu)
7160 if (*up!=powers[count]-1) break; // not still 9s
7161 // here if it, too, is all nines
7162 *up=(Unit)powers[count-1]; // here 999 -> 100 etc.
7163 for (up=up-1; up>=dn->lsu; up--) *up=0; // others all to 0
7164 dn->exponent++; // and bump exponent
7165 // [which, very rarely, could cause Overflow...]
7166 if ((dn->exponent+dn->digits)>set->emax+1) {
7167 decSetOverflow(dn, set, status);
7169 return; // done
7171 // a full unit to check, with more to come
7172 if (*up!=DECDPUNMAX) break; // not still 9s
7173 count-=DECDPUN;
7174 } // up
7175 } // bump>0
7176 else { // -1
7177 // here checking for a pre-bump of 1000... (leading 1, all
7178 // other digits zero)
7179 Unit *up, *sup; // work
7180 uInt count=dn->digits; // digits to be checked
7181 for (up=dn->lsu; ; up++) {
7182 if (count<=DECDPUN) {
7183 // this is the last Unit (the msu)
7184 if (*up!=powers[count-1]) break; // not 100..
7185 // here if have the 1000... case
7186 sup=up; // save msu pointer
7187 *up=(Unit)powers[count]-1; // here 100 in msu -> 999
7188 // others all to all-nines, too
7189 for (up=up-1; up>=dn->lsu; up--) *up=(Unit)powers[DECDPUN]-1;
7190 dn->exponent--; // and bump exponent
7192 // iff the number was at the subnormal boundary (exponent=etiny)
7193 // then the exponent is now out of range, so it will in fact get
7194 // clamped to etiny and the final 9 dropped.
7195 // printf(">> emin=%d exp=%d sdig=%d\n", set->emin,
7196 // dn->exponent, set->digits);
7197 if (dn->exponent+1==set->emin-set->digits+1) {
7198 if (count==1 && dn->digits==1) *sup=0; // here 9 -> 0[.9]
7199 else {
7200 *sup=(Unit)powers[count-1]-1; // here 999.. in msu -> 99..
7201 dn->digits--;
7203 dn->exponent++;
7204 *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
7206 return; // done
7209 // a full unit to check, with more to come
7210 if (*up!=0) break; // not still 0s
7211 count-=DECDPUN;
7212 } // up
7214 } // bump<0
7216 // Actual bump needed. Do it.
7217 decUnitAddSub(dn->lsu, D2U(dn->digits), uarrone, 1, 0, dn->lsu, bump);
7218 } // decApplyRound
7220 #if DECSUBSET
7221 /* ------------------------------------------------------------------ */
7222 /* decFinish -- finish processing a number */
7223 /* */
7224 /* dn is the number */
7225 /* set is the context */
7226 /* residue is the rounding accumulator (as in decApplyRound) */
7227 /* status is the accumulator */
7228 /* */
7229 /* This finishes off the current number by: */
7230 /* 1. If not extended: */
7231 /* a. Converting a zero result to clean '0' */
7232 /* b. Reducing positive exponents to 0, if would fit in digits */
7233 /* 2. Checking for overflow and subnormals (always) */
7234 /* Note this is just Finalize when no subset arithmetic. */
7235 /* All fields are updated as required. */
7236 /* ------------------------------------------------------------------ */
7237 static void decFinish(decNumber *dn, decContext *set, Int *residue,
7238 uInt *status) {
7239 if (!set->extended) {
7240 if ISZERO(dn) { // value is zero
7241 dn->exponent=0; // clean exponent ..
7242 dn->bits=0; // .. and sign
7243 return; // no error possible
7245 if (dn->exponent>=0) { // non-negative exponent
7246 // >0; reduce to integer if possible
7247 if (set->digits >= (dn->exponent+dn->digits)) {
7248 dn->digits=decShiftToMost(dn->lsu, dn->digits, dn->exponent);
7249 dn->exponent=0;
7252 } // !extended
7254 decFinalize(dn, set, residue, status);
7255 } // decFinish
7256 #endif
7258 /* ------------------------------------------------------------------ */
7259 /* decFinalize -- final check, clamp, and round of a number */
7260 /* */
7261 /* dn is the number */
7262 /* set is the context */
7263 /* residue is the rounding accumulator (as in decApplyRound) */
7264 /* status is the status accumulator */
7265 /* */
7266 /* This finishes off the current number by checking for subnormal */
7267 /* results, applying any pending rounding, checking for overflow, */
7268 /* and applying any clamping. */
7269 /* Underflow and overflow conditions are raised as appropriate. */
7270 /* All fields are updated as required. */
7271 /* ------------------------------------------------------------------ */
7272 static void decFinalize(decNumber *dn, decContext *set, Int *residue,
7273 uInt *status) {
7274 Int shift; // shift needed if clamping
7275 Int tinyexp=set->emin-dn->digits+1; // precalculate subnormal boundary
7277 // Must be careful, here, when checking the exponent as the
7278 // adjusted exponent could overflow 31 bits [because it may already
7279 // be up to twice the expected].
7281 // First test for subnormal. This must be done before any final
7282 // round as the result could be rounded to Nmin or 0.
7283 if (dn->exponent<=tinyexp) { // prefilter
7284 Int comp;
7285 decNumber nmin;
7286 // A very nasty case here is dn == Nmin and residue<0
7287 if (dn->exponent<tinyexp) {
7288 // Go handle subnormals; this will apply round if needed.
7289 decSetSubnormal(dn, set, residue, status);
7290 return;
7292 // Equals case: only subnormal if dn=Nmin and negative residue
7293 decNumberZero(&nmin);
7294 nmin.lsu[0]=1;
7295 nmin.exponent=set->emin;
7296 comp=decCompare(dn, &nmin, 1); // (signless compare)
7297 if (comp==BADINT) { // oops
7298 *status|=DEC_Insufficient_storage; // abandon...
7299 return;
7301 if (*residue<0 && comp==0) { // neg residue and dn==Nmin
7302 decApplyRound(dn, set, *residue, status); // might force down
7303 decSetSubnormal(dn, set, residue, status);
7304 return;
7308 // now apply any pending round (this could raise overflow).
7309 if (*residue!=0) decApplyRound(dn, set, *residue, status);
7311 // Check for overflow [redundant in the 'rare' case] or clamp
7312 if (dn->exponent<=set->emax-set->digits+1) return; // neither needed
7315 // here when might have an overflow or clamp to do
7316 if (dn->exponent>set->emax-dn->digits+1) { // too big
7317 decSetOverflow(dn, set, status);
7318 return;
7320 // here when the result is normal but in clamp range
7321 if (!set->clamp) return;
7323 // here when need to apply the IEEE exponent clamp (fold-down)
7324 shift=dn->exponent-(set->emax-set->digits+1);
7326 // shift coefficient (if non-zero)
7327 if (!ISZERO(dn)) {
7328 dn->digits=decShiftToMost(dn->lsu, dn->digits, shift);
7330 dn->exponent-=shift; // adjust the exponent to match
7331 *status|=DEC_Clamped; // and record the dirty deed
7332 return;
7333 } // decFinalize
7335 /* ------------------------------------------------------------------ */
7336 /* decSetOverflow -- set number to proper overflow value */
7337 /* */
7338 /* dn is the number (used for sign [only] and result) */
7339 /* set is the context [used for the rounding mode, etc.] */
7340 /* status contains the current status to be updated */
7341 /* */
7342 /* This sets the sign of a number and sets its value to either */
7343 /* Infinity or the maximum finite value, depending on the sign of */
7344 /* dn and the rounding mode, following IEEE 754 rules. */
7345 /* ------------------------------------------------------------------ */
7346 static void decSetOverflow(decNumber *dn, decContext *set, uInt *status) {
7347 Flag needmax=0; // result is maximum finite value
7348 uByte sign=dn->bits&DECNEG; // clean and save sign bit
7350 if (ISZERO(dn)) { // zero does not overflow magnitude
7351 Int emax=set->emax; // limit value
7352 if (set->clamp) emax-=set->digits-1; // lower if clamping
7353 if (dn->exponent>emax) { // clamp required
7354 dn->exponent=emax;
7355 *status|=DEC_Clamped;
7357 return;
7360 decNumberZero(dn);
7361 switch (set->round) {
7362 case DEC_ROUND_DOWN: {
7363 needmax=1; // never Infinity
7364 break;} // r-d
7365 case DEC_ROUND_05UP: {
7366 needmax=1; // never Infinity
7367 break;} // r-05
7368 case DEC_ROUND_CEILING: {
7369 if (sign) needmax=1; // Infinity if non-negative
7370 break;} // r-c
7371 case DEC_ROUND_FLOOR: {
7372 if (!sign) needmax=1; // Infinity if negative
7373 break;} // r-f
7374 default: break; // Infinity in all other cases
7376 if (needmax) {
7377 decSetMaxValue(dn, set);
7378 dn->bits=sign; // set sign
7380 else dn->bits=sign|DECINF; // Value is +/-Infinity
7381 *status|=DEC_Overflow | DEC_Inexact | DEC_Rounded;
7382 } // decSetOverflow
7384 /* ------------------------------------------------------------------ */
7385 /* decSetMaxValue -- set number to +Nmax (maximum normal value) */
7386 /* */
7387 /* dn is the number to set */
7388 /* set is the context [used for digits and emax] */
7389 /* */
7390 /* This sets the number to the maximum positive value. */
7391 /* ------------------------------------------------------------------ */
7392 static void decSetMaxValue(decNumber *dn, decContext *set) {
7393 Unit *up; // work
7394 Int count=set->digits; // nines to add
7395 dn->digits=count;
7396 // fill in all nines to set maximum value
7397 for (up=dn->lsu; ; up++) {
7398 if (count>DECDPUN) *up=DECDPUNMAX; // unit full o'nines
7399 else { // this is the msu
7400 *up=(Unit)(powers[count]-1);
7401 break;
7403 count-=DECDPUN; // filled those digits
7404 } // up
7405 dn->bits=0; // + sign
7406 dn->exponent=set->emax-set->digits+1;
7407 } // decSetMaxValue
7409 /* ------------------------------------------------------------------ */
7410 /* decSetSubnormal -- process value whose exponent is <Emin */
7411 /* */
7412 /* dn is the number (used as input as well as output; it may have */
7413 /* an allowed subnormal value, which may need to be rounded) */
7414 /* set is the context [used for the rounding mode] */
7415 /* residue is any pending residue */
7416 /* status contains the current status to be updated */
7417 /* */
7418 /* If subset mode, set result to zero and set Underflow flags. */
7419 /* */
7420 /* Value may be zero with a low exponent; this does not set Subnormal */
7421 /* but the exponent will be clamped to Etiny. */
7422 /* */
7423 /* Otherwise ensure exponent is not out of range, and round as */
7424 /* necessary. Underflow is set if the result is Inexact. */
7425 /* ------------------------------------------------------------------ */
7426 static void decSetSubnormal(decNumber *dn, decContext *set, Int *residue,
7427 uInt *status) {
7428 decContext workset; // work
7429 Int etiny, adjust; // ..
7431 #if DECSUBSET
7432 // simple set to zero and 'hard underflow' for subset
7433 if (!set->extended) {
7434 decNumberZero(dn);
7435 // always full overflow
7436 *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
7437 return;
7439 #endif
7441 // Full arithmetic -- allow subnormals, rounded to minimum exponent
7442 // (Etiny) if needed
7443 etiny=set->emin-(set->digits-1); // smallest allowed exponent
7445 if ISZERO(dn) { // value is zero
7446 // residue can never be non-zero here
7447 #if DECCHECK
7448 if (*residue!=0) {
7449 printf("++ Subnormal 0 residue %ld\n", (LI)*residue);
7450 *status|=DEC_Invalid_operation;
7452 #endif
7453 if (dn->exponent<etiny) { // clamp required
7454 dn->exponent=etiny;
7455 *status|=DEC_Clamped;
7457 return;
7460 *status|=DEC_Subnormal; // have a non-zero subnormal
7461 adjust=etiny-dn->exponent; // calculate digits to remove
7462 if (adjust<=0) { // not out of range; unrounded
7463 // residue can never be non-zero here, except in the Nmin-residue
7464 // case (which is a subnormal result), so can take fast-path here
7465 // it may already be inexact (from setting the coefficient)
7466 if (*status&DEC_Inexact) *status|=DEC_Underflow;
7467 return;
7470 // adjust>0, so need to rescale the result so exponent becomes Etiny
7471 // [this code is similar to that in rescale]
7472 workset=*set; // clone rounding, etc.
7473 workset.digits=dn->digits-adjust; // set requested length
7474 workset.emin-=adjust; // and adjust emin to match
7475 // [note that the latter can be <1, here, similar to Rescale case]
7476 decSetCoeff(dn, &workset, dn->lsu, dn->digits, residue, status);
7477 decApplyRound(dn, &workset, *residue, status);
7479 // Use 754 default rule: Underflow is set iff Inexact
7480 // [independent of whether trapped]
7481 if (*status&DEC_Inexact) *status|=DEC_Underflow;
7483 // if rounded up a 999s case, exponent will be off by one; adjust
7484 // back if so [it will fit, because it was shortened earlier]
7485 if (dn->exponent>etiny) {
7486 dn->digits=decShiftToMost(dn->lsu, dn->digits, 1);
7487 dn->exponent--; // (re)adjust the exponent.
7490 // if rounded to zero, it is by definition clamped...
7491 if (ISZERO(dn)) *status|=DEC_Clamped;
7492 } // decSetSubnormal
7494 /* ------------------------------------------------------------------ */
7495 /* decCheckMath - check entry conditions for a math function */
7496 /* */
7497 /* This checks the context and the operand */
7498 /* */
7499 /* rhs is the operand to check */
7500 /* set is the context to check */
7501 /* status is unchanged if both are good */
7502 /* */
7503 /* returns non-zero if status is changed, 0 otherwise */
7504 /* */
7505 /* Restrictions enforced: */
7506 /* */
7507 /* digits, emax, and -emin in the context must be less than */
7508 /* DEC_MAX_MATH (999999), and A must be within these bounds if */
7509 /* non-zero. Invalid_operation is set in the status if a */
7510 /* restriction is violated. */
7511 /* ------------------------------------------------------------------ */
7512 static uInt decCheckMath(const decNumber *rhs, decContext *set,
7513 uInt *status) {
7514 uInt save=*status; // record
7515 if (set->digits>DEC_MAX_MATH
7516 || set->emax>DEC_MAX_MATH
7517 || -set->emin>DEC_MAX_MATH) *status|=DEC_Invalid_context;
7518 else if ((rhs->digits>DEC_MAX_MATH
7519 || rhs->exponent+rhs->digits>DEC_MAX_MATH+1
7520 || rhs->exponent+rhs->digits<2*(1-DEC_MAX_MATH))
7521 && !ISZERO(rhs)) *status|=DEC_Invalid_operation;
7522 return (*status!=save);
7523 } // decCheckMath
7525 /* ------------------------------------------------------------------ */
7526 /* decGetInt -- get integer from a number */
7527 /* */
7528 /* dn is the number [which will not be altered] */
7529 /* */
7530 /* returns one of: */
7531 /* BADINT if there is a non-zero fraction */
7532 /* the converted integer */
7533 /* BIGEVEN if the integer is even and magnitude > 2*10**9 */
7534 /* BIGODD if the integer is odd and magnitude > 2*10**9 */
7535 /* */
7536 /* This checks and gets a whole number from the input decNumber. */
7537 /* The sign can be determined from dn by the caller when BIGEVEN or */
7538 /* BIGODD is returned. */
7539 /* ------------------------------------------------------------------ */
7540 static Int decGetInt(const decNumber *dn) {
7541 Int theInt; // result accumulator
7542 const Unit *up; // work
7543 Int got; // digits (real or not) processed
7544 Int ilength=dn->digits+dn->exponent; // integral length
7545 Flag neg=decNumberIsNegative(dn); // 1 if -ve
7547 // The number must be an integer that fits in 10 digits
7548 // Assert, here, that 10 is enough for any rescale Etiny
7549 #if DEC_MAX_EMAX > 999999999
7550 #error GetInt may need updating [for Emax]
7551 #endif
7552 #if DEC_MIN_EMIN < -999999999
7553 #error GetInt may need updating [for Emin]
7554 #endif
7555 if (ISZERO(dn)) return 0; // zeros are OK, with any exponent
7557 up=dn->lsu; // ready for lsu
7558 theInt=0; // ready to accumulate
7559 if (dn->exponent>=0) { // relatively easy
7560 // no fractional part [usual]; allow for positive exponent
7561 got=dn->exponent;
7563 else { // -ve exponent; some fractional part to check and discard
7564 Int count=-dn->exponent; // digits to discard
7565 // spin up whole units until reach the Unit with the unit digit
7566 for (; count>=DECDPUN; up++) {
7567 if (*up!=0) return BADINT; // non-zero Unit to discard
7568 count-=DECDPUN;
7570 if (count==0) got=0; // [a multiple of DECDPUN]
7571 else { // [not multiple of DECDPUN]
7572 Int rem; // work
7573 // slice off fraction digits and check for non-zero
7574 #if DECDPUN<=4
7575 theInt=QUOT10(*up, count);
7576 rem=*up-theInt*powers[count];
7577 #else
7578 rem=*up%powers[count]; // slice off discards
7579 theInt=*up/powers[count];
7580 #endif
7581 if (rem!=0) return BADINT; // non-zero fraction
7582 // it looks good
7583 got=DECDPUN-count; // number of digits so far
7584 up++; // ready for next
7587 // now it's known there's no fractional part
7589 // tricky code now, to accumulate up to 9.3 digits
7590 if (got==0) {theInt=*up; got+=DECDPUN; up++;} // ensure lsu is there
7592 if (ilength<11) {
7593 Int save=theInt;
7594 // collect any remaining unit(s)
7595 for (; got<ilength; up++) {
7596 theInt+=*up*powers[got];
7597 got+=DECDPUN;
7599 if (ilength==10) { // need to check for wrap
7600 if (theInt/(Int)powers[got-DECDPUN]!=(Int)*(up-1)) ilength=11;
7601 // [that test also disallows the BADINT result case]
7602 else if (neg && theInt>1999999997) ilength=11;
7603 else if (!neg && theInt>999999999) ilength=11;
7604 if (ilength==11) theInt=save; // restore correct low bit
7608 if (ilength>10) { // too big
7609 if (theInt&1) return BIGODD; // bottom bit 1
7610 return BIGEVEN; // bottom bit 0
7613 if (neg) theInt=-theInt; // apply sign
7614 return theInt;
7615 } // decGetInt
7617 /* ------------------------------------------------------------------ */
7618 /* decDecap -- decapitate the coefficient of a number */
7619 /* */
7620 /* dn is the number to be decapitated */
7621 /* drop is the number of digits to be removed from the left of dn; */
7622 /* this must be <= dn->digits (if equal, the coefficient is */
7623 /* set to 0) */
7624 /* */
7625 /* Returns dn; dn->digits will be <= the initial digits less drop */
7626 /* (after removing drop digits there may be leading zero digits */
7627 /* which will also be removed). Only dn->lsu and dn->digits change. */
7628 /* ------------------------------------------------------------------ */
7629 static decNumber *decDecap(decNumber *dn, Int drop) {
7630 Unit *msu; // -> target cut point
7631 Int cut; // work
7632 if (drop>=dn->digits) { // losing the whole thing
7633 #if DECCHECK
7634 if (drop>dn->digits)
7635 printf("decDecap called with drop>digits [%ld>%ld]\n",
7636 (LI)drop, (LI)dn->digits);
7637 #endif
7638 dn->lsu[0]=0;
7639 dn->digits=1;
7640 return dn;
7642 msu=dn->lsu+D2U(dn->digits-drop)-1; // -> likely msu
7643 cut=MSUDIGITS(dn->digits-drop); // digits to be in use in msu
7644 if (cut!=DECDPUN) *msu%=powers[cut]; // clear left digits
7645 // that may have left leading zero digits, so do a proper count...
7646 dn->digits=decGetDigits(dn->lsu, msu-dn->lsu+1);
7647 return dn;
7648 } // decDecap
7650 /* ------------------------------------------------------------------ */
7651 /* decBiStr -- compare string with pairwise options */
7652 /* */
7653 /* targ is the string to compare */
7654 /* str1 is one of the strings to compare against (length may be 0) */
7655 /* str2 is the other; it must be the same length as str1 */
7656 /* */
7657 /* returns 1 if strings compare equal, (that is, it is the same */
7658 /* length as str1 and str2, and each character of targ is in either */
7659 /* str1 or str2 in the corresponding position), or 0 otherwise */
7660 /* */
7661 /* This is used for generic caseless compare, including the awkward */
7662 /* case of the Turkish dotted and dotless Is. Use as (for example): */
7663 /* if (decBiStr(test, "mike", "MIKE")) ... */
7664 /* ------------------------------------------------------------------ */
7665 static Flag decBiStr(const char *targ, const char *str1, const char *str2) {
7666 for (;;targ++, str1++, str2++) {
7667 if (*targ!=*str1 && *targ!=*str2) return 0;
7668 // *targ has a match in one (or both, if terminator)
7669 if (*targ=='\0') break;
7670 } // forever
7671 return 1;
7672 } // decBiStr
7674 /* ------------------------------------------------------------------ */
7675 /* decNaNs -- handle NaN operand or operands */
7676 /* */
7677 /* res is the result number */
7678 /* lhs is the first operand */
7679 /* rhs is the second operand, or NULL if none */
7680 /* context is used to limit payload length */
7681 /* status contains the current status */
7682 /* returns res in case convenient */
7683 /* */
7684 /* Called when one or both operands is a NaN, and propagates the */
7685 /* appropriate result to res. When an sNaN is found, it is changed */
7686 /* to a qNaN and Invalid operation is set. */
7687 /* ------------------------------------------------------------------ */
7688 static decNumber * decNaNs(decNumber *res, const decNumber *lhs,
7689 const decNumber *rhs, decContext *set,
7690 uInt *status) {
7691 // This decision tree ends up with LHS being the source pointer,
7692 // and status updated if need be
7693 if (lhs->bits & DECSNAN)
7694 *status|=DEC_Invalid_operation | DEC_sNaN;
7695 else if (rhs==NULL);
7696 else if (rhs->bits & DECSNAN) {
7697 lhs=rhs;
7698 *status|=DEC_Invalid_operation | DEC_sNaN;
7700 else if (lhs->bits & DECNAN);
7701 else lhs=rhs;
7703 // propagate the payload
7704 if (lhs->digits<=set->digits) decNumberCopy(res, lhs); // easy
7705 else { // too long
7706 const Unit *ul;
7707 Unit *ur, *uresp1;
7708 // copy safe number of units, then decapitate
7709 res->bits=lhs->bits; // need sign etc.
7710 uresp1=res->lsu+D2U(set->digits);
7711 for (ur=res->lsu, ul=lhs->lsu; ur<uresp1; ur++, ul++) *ur=*ul;
7712 res->digits=D2U(set->digits)*DECDPUN;
7713 // maybe still too long
7714 if (res->digits>set->digits) decDecap(res, res->digits-set->digits);
7717 res->bits&=~DECSNAN; // convert any sNaN to NaN, while
7718 res->bits|=DECNAN; // .. preserving sign
7719 res->exponent=0; // clean exponent
7720 // [coefficient was copied/decapitated]
7721 return res;
7722 } // decNaNs
7724 /* ------------------------------------------------------------------ */
7725 /* decStatus -- apply non-zero status */
7726 /* */
7727 /* dn is the number to set if error */
7728 /* status contains the current status (not yet in context) */
7729 /* set is the context */
7730 /* */
7731 /* If the status is an error status, the number is set to a NaN, */
7732 /* unless the error was an overflow, divide-by-zero, or underflow, */
7733 /* in which case the number will have already been set. */
7734 /* */
7735 /* The context status is then updated with the new status. Note that */
7736 /* this may raise a signal, so control may never return from this */
7737 /* routine (hence resources must be recovered before it is called). */
7738 /* ------------------------------------------------------------------ */
7739 static void decStatus(decNumber *dn, uInt status, decContext *set) {
7740 if (status & DEC_NaNs) { // error status -> NaN
7741 // if cause was an sNaN, clear and propagate [NaN is already set up]
7742 if (status & DEC_sNaN) status&=~DEC_sNaN;
7743 else {
7744 decNumberZero(dn); // other error: clean throughout
7745 dn->bits=DECNAN; // and make a quiet NaN
7748 decContextSetStatus(set, status); // [may not return]
7749 return;
7750 } // decStatus
7752 /* ------------------------------------------------------------------ */
7753 /* decGetDigits -- count digits in a Units array */
7754 /* */
7755 /* uar is the Unit array holding the number (this is often an */
7756 /* accumulator of some sort) */
7757 /* len is the length of the array in units [>=1] */
7758 /* */
7759 /* returns the number of (significant) digits in the array */
7760 /* */
7761 /* All leading zeros are excluded, except the last if the array has */
7762 /* only zero Units. */
7763 /* ------------------------------------------------------------------ */
7764 // This may be called twice during some operations.
7765 static Int decGetDigits(Unit *uar, Int len) {
7766 Unit *up=uar+(len-1); // -> msu
7767 Int digits=(len-1)*DECDPUN+1; // possible digits excluding msu
7768 #if DECDPUN>4
7769 uInt const *pow; // work
7770 #endif
7771 // (at least 1 in final msu)
7772 #if DECCHECK
7773 if (len<1) printf("decGetDigits called with len<1 [%ld]\n", (LI)len);
7774 #endif
7776 for (; up>=uar; up--) {
7777 if (*up==0) { // unit is all 0s
7778 if (digits==1) break; // a zero has one digit
7779 digits-=DECDPUN; // adjust for 0 unit
7780 continue;}
7781 // found the first (most significant) non-zero Unit
7782 #if DECDPUN>1 // not done yet
7783 if (*up<10) break; // is 1-9
7784 digits++;
7785 #if DECDPUN>2 // not done yet
7786 if (*up<100) break; // is 10-99
7787 digits++;
7788 #if DECDPUN>3 // not done yet
7789 if (*up<1000) break; // is 100-999
7790 digits++;
7791 #if DECDPUN>4 // count the rest ...
7792 for (pow=&powers[4]; *up>=*pow; pow++) digits++;
7793 #endif
7794 #endif
7795 #endif
7796 #endif
7797 break;
7798 } // up
7799 return digits;
7800 } // decGetDigits
7802 #if DECTRACE | DECCHECK
7803 /* ------------------------------------------------------------------ */
7804 /* decNumberShow -- display a number [debug aid] */
7805 /* dn is the number to show */
7806 /* */
7807 /* Shows: sign, exponent, coefficient (msu first), digits */
7808 /* or: sign, special-value */
7809 /* ------------------------------------------------------------------ */
7810 // this is public so other modules can use it
7811 void decNumberShow(const decNumber *dn) {
7812 const Unit *up; // work
7813 uInt u, d; // ..
7814 Int cut; // ..
7815 char isign='+'; // main sign
7816 if (dn==NULL) {
7817 printf("NULL\n");
7818 return;}
7819 if (decNumberIsNegative(dn)) isign='-';
7820 printf(" >> %c ", isign);
7821 if (dn->bits&DECSPECIAL) { // Is a special value
7822 if (decNumberIsInfinite(dn)) printf("Infinity");
7823 else { // a NaN
7824 if (dn->bits&DECSNAN) printf("sNaN"); // signalling NaN
7825 else printf("NaN");
7827 // if coefficient and exponent are 0, no more to do
7828 if (dn->exponent==0 && dn->digits==1 && *dn->lsu==0) {
7829 printf("\n");
7830 return;}
7831 // drop through to report other information
7832 printf(" ");
7835 // now carefully display the coefficient
7836 up=dn->lsu+D2U(dn->digits)-1; // msu
7837 printf("%ld", (LI)*up);
7838 for (up=up-1; up>=dn->lsu; up--) {
7839 u=*up;
7840 printf(":");
7841 for (cut=DECDPUN-1; cut>=0; cut--) {
7842 d=u/powers[cut];
7843 u-=d*powers[cut];
7844 printf("%ld", (LI)d);
7845 } // cut
7846 } // up
7847 if (dn->exponent!=0) {
7848 char esign='+';
7849 if (dn->exponent<0) esign='-';
7850 printf(" E%c%ld", esign, (LI)abs(dn->exponent));
7852 printf(" [%ld]\n", (LI)dn->digits);
7853 } // decNumberShow
7854 #endif
7856 #if DECTRACE || DECCHECK
7857 /* ------------------------------------------------------------------ */
7858 /* decDumpAr -- display a unit array [debug/check aid] */
7859 /* name is a single-character tag name */
7860 /* ar is the array to display */
7861 /* len is the length of the array in Units */
7862 /* ------------------------------------------------------------------ */
7863 static void decDumpAr(char name, const Unit *ar, Int len) {
7864 Int i;
7865 const char *spec;
7866 #if DECDPUN==9
7867 spec="%09d ";
7868 #elif DECDPUN==8
7869 spec="%08d ";
7870 #elif DECDPUN==7
7871 spec="%07d ";
7872 #elif DECDPUN==6
7873 spec="%06d ";
7874 #elif DECDPUN==5
7875 spec="%05d ";
7876 #elif DECDPUN==4
7877 spec="%04d ";
7878 #elif DECDPUN==3
7879 spec="%03d ";
7880 #elif DECDPUN==2
7881 spec="%02d ";
7882 #else
7883 spec="%d ";
7884 #endif
7885 printf(" :%c: ", name);
7886 for (i=len-1; i>=0; i--) {
7887 if (i==len-1) printf("%ld ", (LI)ar[i]);
7888 else printf(spec, ar[i]);
7890 printf("\n");
7891 return;}
7892 #endif
7894 #if DECCHECK
7895 /* ------------------------------------------------------------------ */
7896 /* decCheckOperands -- check operand(s) to a routine */
7897 /* res is the result structure (not checked; it will be set to */
7898 /* quiet NaN if error found (and it is not NULL)) */
7899 /* lhs is the first operand (may be DECUNRESU) */
7900 /* rhs is the second (may be DECUNUSED) */
7901 /* set is the context (may be DECUNCONT) */
7902 /* returns 0 if both operands, and the context are clean, or 1 */
7903 /* otherwise (in which case the context will show an error, */
7904 /* unless NULL). Note that res is not cleaned; caller should */
7905 /* handle this so res=NULL case is safe. */
7906 /* The caller is expected to abandon immediately if 1 is returned. */
7907 /* ------------------------------------------------------------------ */
7908 static Flag decCheckOperands(decNumber *res, const decNumber *lhs,
7909 const decNumber *rhs, decContext *set) {
7910 Flag bad=0;
7911 if (set==NULL) { // oops; hopeless
7912 #if DECTRACE || DECVERB
7913 printf("Reference to context is NULL.\n");
7914 #endif
7915 bad=1;
7916 return 1;}
7917 else if (set!=DECUNCONT
7918 && (set->digits<1 || set->round>=DEC_ROUND_MAX)) {
7919 bad=1;
7920 #if DECTRACE || DECVERB
7921 printf("Bad context [digits=%ld round=%ld].\n",
7922 (LI)set->digits, (LI)set->round);
7923 #endif
7925 else {
7926 if (res==NULL) {
7927 bad=1;
7928 #if DECTRACE
7929 // this one not DECVERB as standard tests include NULL
7930 printf("Reference to result is NULL.\n");
7931 #endif
7933 if (!bad && lhs!=DECUNUSED) bad=(decCheckNumber(lhs));
7934 if (!bad && rhs!=DECUNUSED) bad=(decCheckNumber(rhs));
7936 if (bad) {
7937 if (set!=DECUNCONT) decContextSetStatus(set, DEC_Invalid_operation);
7938 if (res!=DECUNRESU && res!=NULL) {
7939 decNumberZero(res);
7940 res->bits=DECNAN; // qNaN
7943 return bad;
7944 } // decCheckOperands
7946 /* ------------------------------------------------------------------ */
7947 /* decCheckNumber -- check a number */
7948 /* dn is the number to check */
7949 /* returns 0 if the number is clean, or 1 otherwise */
7950 /* */
7951 /* The number is considered valid if it could be a result from some */
7952 /* operation in some valid context. */
7953 /* ------------------------------------------------------------------ */
7954 static Flag decCheckNumber(const decNumber *dn) {
7955 const Unit *up; // work
7956 uInt maxuint; // ..
7957 Int ae, d, digits; // ..
7958 Int emin, emax; // ..
7960 if (dn==NULL) { // hopeless
7961 #if DECTRACE
7962 // this one not DECVERB as standard tests include NULL
7963 printf("Reference to decNumber is NULL.\n");
7964 #endif
7965 return 1;}
7967 // check special values
7968 if (dn->bits & DECSPECIAL) {
7969 if (dn->exponent!=0) {
7970 #if DECTRACE || DECVERB
7971 printf("Exponent %ld (not 0) for a special value [%02x].\n",
7972 (LI)dn->exponent, dn->bits);
7973 #endif
7974 return 1;}
7976 // 2003.09.08: NaNs may now have coefficients, so next tests Inf only
7977 if (decNumberIsInfinite(dn)) {
7978 if (dn->digits!=1) {
7979 #if DECTRACE || DECVERB
7980 printf("Digits %ld (not 1) for an infinity.\n", (LI)dn->digits);
7981 #endif
7982 return 1;}
7983 if (*dn->lsu!=0) {
7984 #if DECTRACE || DECVERB
7985 printf("LSU %ld (not 0) for an infinity.\n", (LI)*dn->lsu);
7986 #endif
7987 decDumpAr('I', dn->lsu, D2U(dn->digits));
7988 return 1;}
7989 } // Inf
7990 // 2002.12.26: negative NaNs can now appear through proposed IEEE
7991 // concrete formats (decimal64, etc.).
7992 return 0;
7995 // check the coefficient
7996 if (dn->digits<1 || dn->digits>DECNUMMAXP) {
7997 #if DECTRACE || DECVERB
7998 printf("Digits %ld in number.\n", (LI)dn->digits);
7999 #endif
8000 return 1;}
8002 d=dn->digits;
8004 for (up=dn->lsu; d>0; up++) {
8005 if (d>DECDPUN) maxuint=DECDPUNMAX;
8006 else { // reached the msu
8007 maxuint=powers[d]-1;
8008 if (dn->digits>1 && *up<powers[d-1]) {
8009 #if DECTRACE || DECVERB
8010 printf("Leading 0 in number.\n");
8011 decNumberShow(dn);
8012 #endif
8013 return 1;}
8015 if (*up>maxuint) {
8016 #if DECTRACE || DECVERB
8017 printf("Bad Unit [%08lx] in %ld-digit number at offset %ld [maxuint %ld].\n",
8018 (LI)*up, (LI)dn->digits, (LI)(up-dn->lsu), (LI)maxuint);
8019 #endif
8020 return 1;}
8021 d-=DECDPUN;
8024 // check the exponent. Note that input operands can have exponents
8025 // which are out of the set->emin/set->emax and set->digits range
8026 // (just as they can have more digits than set->digits).
8027 ae=dn->exponent+dn->digits-1; // adjusted exponent
8028 emax=DECNUMMAXE;
8029 emin=DECNUMMINE;
8030 digits=DECNUMMAXP;
8031 if (ae<emin-(digits-1)) {
8032 #if DECTRACE || DECVERB
8033 printf("Adjusted exponent underflow [%ld].\n", (LI)ae);
8034 decNumberShow(dn);
8035 #endif
8036 return 1;}
8037 if (ae>+emax) {
8038 #if DECTRACE || DECVERB
8039 printf("Adjusted exponent overflow [%ld].\n", (LI)ae);
8040 decNumberShow(dn);
8041 #endif
8042 return 1;}
8044 return 0; // it's OK
8045 } // decCheckNumber
8047 /* ------------------------------------------------------------------ */
8048 /* decCheckInexact -- check a normal finite inexact result has digits */
8049 /* dn is the number to check */
8050 /* set is the context (for status and precision) */
8051 /* sets Invalid operation, etc., if some digits are missing */
8052 /* [this check is not made for DECSUBSET compilation or when */
8053 /* subnormal is not set] */
8054 /* ------------------------------------------------------------------ */
8055 static void decCheckInexact(const decNumber *dn, decContext *set) {
8056 #if !DECSUBSET && DECEXTFLAG
8057 if ((set->status & (DEC_Inexact|DEC_Subnormal))==DEC_Inexact
8058 && (set->digits!=dn->digits) && !(dn->bits & DECSPECIAL)) {
8059 #if DECTRACE || DECVERB
8060 printf("Insufficient digits [%ld] on normal Inexact result.\n",
8061 (LI)dn->digits);
8062 decNumberShow(dn);
8063 #endif
8064 decContextSetStatus(set, DEC_Invalid_operation);
8066 #else
8067 // next is a noop for quiet compiler
8068 if (dn!=NULL && dn->digits==0) set->status|=DEC_Invalid_operation;
8069 #endif
8070 return;
8071 } // decCheckInexact
8072 #endif
8074 #if DECALLOC
8075 #undef malloc
8076 #undef free
8077 /* ------------------------------------------------------------------ */
8078 /* decMalloc -- accountable allocation routine */
8079 /* n is the number of bytes to allocate */
8080 /* */
8081 /* Semantics is the same as the stdlib malloc routine, but bytes */
8082 /* allocated are accounted for globally, and corruption fences are */
8083 /* added before and after the 'actual' storage. */
8084 /* ------------------------------------------------------------------ */
8085 /* This routine allocates storage with an extra twelve bytes; 8 are */
8086 /* at the start and hold: */
8087 /* 0-3 the original length requested */
8088 /* 4-7 buffer corruption detection fence (DECFENCE, x4) */
8089 /* The 4 bytes at the end also hold a corruption fence (DECFENCE, x4) */
8090 /* ------------------------------------------------------------------ */
8091 static void *decMalloc(size_t n) {
8092 uInt size=n+12; // true size
8093 void *alloc; // -> allocated storage
8094 uByte *b, *b0; // work
8095 uInt uiwork; // for macros
8097 alloc=malloc(size); // -> allocated storage
8098 if (alloc==NULL) return NULL; // out of strorage
8099 b0=(uByte *)alloc; // as bytes
8100 decAllocBytes+=n; // account for storage
8101 UBFROMUI(alloc, n); // save n
8102 // printf(" alloc ++ dAB: %ld (%ld)\n", (LI)decAllocBytes, (LI)n);
8103 for (b=b0+4; b<b0+8; b++) *b=DECFENCE;
8104 for (b=b0+n+8; b<b0+n+12; b++) *b=DECFENCE;
8105 return b0+8; // -> play area
8106 } // decMalloc
8108 /* ------------------------------------------------------------------ */
8109 /* decFree -- accountable free routine */
8110 /* alloc is the storage to free */
8111 /* */
8112 /* Semantics is the same as the stdlib malloc routine, except that */
8113 /* the global storage accounting is updated and the fences are */
8114 /* checked to ensure that no routine has written 'out of bounds'. */
8115 /* ------------------------------------------------------------------ */
8116 /* This routine first checks that the fences have not been corrupted. */
8117 /* It then frees the storage using the 'truw' storage address (that */
8118 /* is, offset by 8). */
8119 /* ------------------------------------------------------------------ */
8120 static void decFree(void *alloc) {
8121 uInt n; // original length
8122 uByte *b, *b0; // work
8123 uInt uiwork; // for macros
8125 if (alloc==NULL) return; // allowed; it's a nop
8126 b0=(uByte *)alloc; // as bytes
8127 b0-=8; // -> true start of storage
8128 n=UBTOUI(b0); // lift length
8129 for (b=b0+4; b<b0+8; b++) if (*b!=DECFENCE)
8130 printf("=== Corrupt byte [%02x] at offset %d from %ld ===\n", *b,
8131 b-b0-8, (LI)b0);
8132 for (b=b0+n+8; b<b0+n+12; b++) if (*b!=DECFENCE)
8133 printf("=== Corrupt byte [%02x] at offset +%d from %ld, n=%ld ===\n", *b,
8134 b-b0-8, (LI)b0, (LI)n);
8135 free(b0); // drop the storage
8136 decAllocBytes-=n; // account for storage
8137 // printf(" free -- dAB: %d (%d)\n", decAllocBytes, -n);
8138 } // decFree
8139 #define malloc(a) decMalloc(a)
8140 #define free(a) decFree(a)
8141 #endif