qemu

Форк
0
/
decNumber.c 
8323 строки · 328.2 Кб
1
/* Decimal number arithmetic module for the decNumber C Library.
2
   Copyright (C) 2005, 2007 Free Software Foundation, Inc.
3
   Contributed by IBM Corporation.  Author Mike Cowlishaw.
4

5
   This file is part of GCC.
6

7
   GCC is free software; you can redistribute it and/or modify it under
8
   the terms of the GNU General Public License as published by the Free
9
   Software Foundation; either version 2, or (at your option) any later
10
   version.
11

12
   In addition to the permissions in the GNU General Public License,
13
   the Free Software Foundation gives you unlimited permission to link
14
   the compiled version of this file into combinations with other
15
   programs, and to distribute those combinations without any
16
   restriction coming from the use of this file.  (The General Public
17
   License restrictions do apply in other respects; for example, they
18
   cover modification of the file, and distribution when not linked
19
   into a combine executable.)
20

21
   GCC is distributed in the hope that it will be useful, but WITHOUT ANY
22
   WARRANTY; without even the implied warranty of MERCHANTABILITY or
23
   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
24
   for more details.
25

26
   You should have received a copy of the GNU General Public License
27
   along with GCC; see the file COPYING.  If not, write to the Free
28
   Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
29
   02110-1301, USA.  */
30

31
/* ------------------------------------------------------------------ */
32
/* Decimal Number arithmetic module				      */
33
/* ------------------------------------------------------------------ */
34
/* This module comprises the routines for General Decimal Arithmetic  */
35
/* as defined in the specification which may be found on the	      */
36
/* http://www2.hursley.ibm.com/decimal web pages.  It implements both */
37
/* the full ('extended') arithmetic and the simpler ('subset')	      */
38
/* arithmetic.							      */
39
/*								      */
40
/* Usage notes:							      */
41
/*								      */
42
/* 1. This code is ANSI C89 except:				      */
43
/*								      */
44
/*       If DECDPUN>4 or DECUSE64=1, the C99 64-bit int64_t and	      */
45
/*	 uint64_t types may be used.  To avoid these, set DECUSE64=0  */
46
/*	 and DECDPUN<=4 (see documentation).			      */
47
/*								      */
48
/* 2. The decNumber format which this library uses is optimized for   */
49
/*    efficient processing of relatively short numbers; in particular */
50
/*    it allows the use of fixed sized structures and minimizes copy  */
51
/*    and move operations.  It does, however, support arbitrary	      */
52
/*    precision (up to 999,999,999 digits) and arbitrary exponent     */
53
/*    range (Emax in the range 0 through 999,999,999 and Emin in the  */
54
/*    range -999,999,999 through 0).  Mathematical functions (for     */
55
/*    example decNumberExp) as identified below are restricted more   */
56
/*    tightly: digits, emax, and -emin in the context must be <=      */
57
/*    DEC_MAX_MATH (999999), and their operand(s) must be within      */
58
/*    these bounds.						      */
59
/*								      */
60
/* 3. Logical functions are further restricted; their operands must   */
61
/*    be finite, positive, have an exponent of zero, and all digits   */
62
/*    must be either 0 or 1.  The result will only contain digits     */
63
/*    which are 0 or 1 (and will have exponent=0 and a sign of 0).    */
64
/*								      */
65
/* 4. Operands to operator functions are never modified unless they   */
66
/*    are also specified to be the result number (which is always     */
67
/*    permitted).  Other than that case, operands must not overlap.   */
68
/*								      */
69
/* 5. Error handling: the type of the error is ORed into the status   */
70
/*    flags in the current context (decContext structure).  The	      */
71
/*    SIGFPE signal is then raised if the corresponding trap-enabler  */
72
/*    flag in the decContext is set (is 1).			      */
73
/*								      */
74
/*    It is the responsibility of the caller to clear the status      */
75
/*    flags as required.					      */
76
/*								      */
77
/*    The result of any routine which returns a number will always    */
78
/*    be a valid number (which may be a special value, such as an     */
79
/*    Infinity or NaN).						      */
80
/*								      */
81
/* 6. The decNumber format is not an exchangeable concrete	      */
82
/*    representation as it comprises fields which may be machine-     */
83
/*    dependent (packed or unpacked, or special length, for example). */
84
/*    Canonical conversions to and from strings are provided; other   */
85
/*    conversions are available in separate modules.		      */
86
/*								      */
87
/* 7. Normally, input operands are assumed to be valid.	 Set DECCHECK */
88
/*    to 1 for extended operand checking (including NULL operands).   */
89
/*    Results are undefined if a badly-formed structure (or a NULL    */
90
/*    pointer to a structure) is provided, though with DECCHECK	      */
91
/*    enabled the operator routines are protected against exceptions. */
92
/*    (Except if the result pointer is NULL, which is unrecoverable.) */
93
/*								      */
94
/*    However, the routines will never cause exceptions if they are   */
95
/*    given well-formed operands, even if the value of the operands   */
96
/*    is inappropriate for the operation and DECCHECK is not set.     */
97
/*    (Except for SIGFPE, as and where documented.)		      */
98
/*								      */
99
/* 8. Subset arithmetic is available only if DECSUBSET is set to 1.   */
100
/* ------------------------------------------------------------------ */
101
/* Implementation notes for maintenance of this module:		      */
102
/*								      */
103
/* 1. Storage leak protection:	Routines which use malloc are not     */
104
/*    permitted to use return for fastpath or error exits (i.e.,      */
105
/*    they follow strict structured programming conventions).	      */
106
/*    Instead they have a do{}while(0); construct surrounding the     */
107
/*    code which is protected -- break may be used to exit this.      */
108
/*    Other routines can safely use the return statement inline.      */
109
/*								      */
110
/*    Storage leak accounting can be enabled using DECALLOC.	      */
111
/*								      */
112
/* 2. All loops use the for(;;) construct.  Any do construct does     */
113
/*    not loop; it is for allocation protection as just described.    */
114
/*								      */
115
/* 3. Setting status in the context must always be the very last      */
116
/*    action in a routine, as non-0 status may raise a trap and hence */
117
/*    the call to set status may not return (if the handler uses long */
118
/*    jump).  Therefore all cleanup must be done first.	 In general,  */
119
/*    to achieve this status is accumulated and is only applied just  */
120
/*    before return by calling decContextSetStatus (via decStatus).   */
121
/*								      */
122
/*    Routines which allocate storage cannot, in general, use the     */
123
/*    'top level' routines which could cause a non-returning	      */
124
/*    transfer of control.  The decXxxxOp routines are safe (do not   */
125
/*    call decStatus even if traps are set in the context) and should */
126
/*    be used instead (they are also a little faster).		      */
127
/*								      */
128
/* 4. Exponent checking is minimized by allowing the exponent to      */
129
/*    grow outside its limits during calculations, provided that      */
130
/*    the decFinalize function is called later.	 Multiplication and   */
131
/*    division, and intermediate calculations in exponentiation,      */
132
/*    require more careful checks because of the risk of 31-bit	      */
133
/*    overflow (the most negative valid exponent is -1999999997, for  */
134
/*    a 999999999-digit number with adjusted exponent of -999999999). */
135
/*								      */
136
/* 5. Rounding is deferred until finalization of results, with any    */
137
/*    'off to the right' data being represented as a single digit     */
138
/*    residue (in the range -1 through 9).  This avoids any double-   */
139
/*    rounding when more than one shortening takes place (for	      */
140
/*    example, when a result is subnormal).			      */
141
/*								      */
142
/* 6. The digits count is allowed to rise to a multiple of DECDPUN    */
143
/*    during many operations, so whole Units are handled and exact    */
144
/*    accounting of digits is not needed.  The correct digits value   */
145
/*    is found by decGetDigits, which accounts for leading zeros.     */
146
/*    This must be called before any rounding if the number of digits */
147
/*    is not known exactly.					      */
148
/*								      */
149
/* 7. The multiply-by-reciprocal 'trick' is used for partitioning     */
150
/*    numbers up to four digits, using appropriate constants.  This   */
151
/*    is not useful for longer numbers because overflow of 32 bits    */
152
/*    would lead to 4 multiplies, which is almost as expensive as     */
153
/*    a divide (unless a floating-point or 64-bit multiply is	      */
154
/*    assumed to be available).					      */
155
/*								      */
156
/* 8. Unusual abbreviations that may be used in the commentary:	      */
157
/*	lhs -- left hand side (operand, of an operation)	      */
158
/*	lsd -- least significant digit (of coefficient)		      */
159
/*	lsu -- least significant Unit (of coefficient)		      */
160
/*	msd -- most significant digit (of coefficient)		      */
161
/*	msi -- most significant item (in an array)		      */
162
/*	msu -- most significant Unit (of coefficient)		      */
163
/*	rhs -- right hand side (operand, of an operation)	      */
164
/*	+ve -- positive						      */
165
/*	-ve -- negative						      */
166
/*	**  -- raise to the power				      */
167
/* ------------------------------------------------------------------ */
168

169
#include "qemu/osdep.h"
170
#include "qemu/host-utils.h"
171
#include "libdecnumber/dconfig.h"
172
#include "libdecnumber/decNumber.h"
173
#include "libdecnumber/decNumberLocal.h"
174

175
/* Constants */
176
/* Public lookup table used by the D2U macro */
177
const uByte d2utable[DECMAXD2U+1]=D2UTABLE;
178

179
#define DECVERB	    1		   /* set to 1 for verbose DECCHECK */
180
#define powers	    DECPOWERS	   /* old internal name */
181

182
/* Local constants */
183
#define DIVIDE	    0x80	   /* Divide operators */
184
#define REMAINDER   0x40	   /* .. */
185
#define DIVIDEINT   0x20	   /* .. */
186
#define REMNEAR	    0x10	   /* .. */
187
#define COMPARE	    0x01	   /* Compare operators */
188
#define COMPMAX	    0x02	   /* .. */
189
#define COMPMIN	    0x03	   /* .. */
190
#define COMPTOTAL   0x04	   /* .. */
191
#define COMPNAN	    0x05	   /* .. [NaN processing] */
192
#define COMPSIG	    0x06	   /* .. [signaling COMPARE] */
193
#define COMPMAXMAG  0x07	   /* .. */
194
#define COMPMINMAG  0x08	   /* .. */
195

196
#define DEC_sNaN     0x40000000	   /* local status: sNaN signal */
197
#define BADINT	(Int)0x80000000	   /* most-negative Int; error indicator */
198
/* Next two indicate an integer >= 10**6, and its parity (bottom bit) */
199
#define BIGEVEN (Int)0x80000002
200
#define BIGODD	(Int)0x80000003
201

202
static Unit uarrone[1]={1};   /* Unit array of 1, used for incrementing */
203

204
/* Granularity-dependent code */
205
#if DECDPUN<=4
206
  #define eInt	Int	      /* extended integer */
207
  #define ueInt uInt	      /* unsigned extended integer */
208
  /* Constant multipliers for divide-by-power-of five using reciprocal */
209
  /* multiply, after removing powers of 2 by shifting, and final shift */
210
  /* of 17 [we only need up to **4] */
211
  static const uInt multies[]={131073, 26215, 5243, 1049, 210};
212
  /* QUOT10 -- macro to return the quotient of unit u divided by 10**n */
213
  #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
214
#else
215
  /* For DECDPUN>4 non-ANSI-89 64-bit types are needed. */
216
  #if !DECUSE64
217
    #error decNumber.c: DECUSE64 must be 1 when DECDPUN>4
218
  #endif
219
  #define eInt	Long	      /* extended integer */
220
  #define ueInt uLong	      /* unsigned extended integer */
221
#endif
222

223
/* Local routines */
224
static decNumber * decAddOp(decNumber *, const decNumber *, const decNumber *,
225
			      decContext *, uByte, uInt *);
226
static Flag	   decBiStr(const char *, const char *, const char *);
227
static uInt	   decCheckMath(const decNumber *, decContext *, uInt *);
228
static void	   decApplyRound(decNumber *, decContext *, Int, uInt *);
229
static Int	   decCompare(const decNumber *lhs, const decNumber *rhs, Flag);
230
static decNumber * decCompareOp(decNumber *, const decNumber *,
231
			      const decNumber *, decContext *,
232
			      Flag, uInt *);
233
static void	   decCopyFit(decNumber *, const decNumber *, decContext *,
234
			      Int *, uInt *);
235
static decNumber * decDecap(decNumber *, Int);
236
static decNumber * decDivideOp(decNumber *, const decNumber *,
237
			      const decNumber *, decContext *, Flag, uInt *);
238
static decNumber * decExpOp(decNumber *, const decNumber *,
239
			      decContext *, uInt *);
240
static void	   decFinalize(decNumber *, decContext *, Int *, uInt *);
241
static Int	   decGetDigits(Unit *, Int);
242
static Int	   decGetInt(const decNumber *);
243
static decNumber * decLnOp(decNumber *, const decNumber *,
244
			      decContext *, uInt *);
245
static decNumber * decMultiplyOp(decNumber *, const decNumber *,
246
			      const decNumber *, decContext *,
247
			      uInt *);
248
static decNumber * decNaNs(decNumber *, const decNumber *,
249
			      const decNumber *, decContext *, uInt *);
250
static decNumber * decQuantizeOp(decNumber *, const decNumber *,
251
			      const decNumber *, decContext *, Flag,
252
			      uInt *);
253
static void	   decReverse(Unit *, Unit *);
254
static void	   decSetCoeff(decNumber *, decContext *, const Unit *,
255
			      Int, Int *, uInt *);
256
static void	   decSetMaxValue(decNumber *, decContext *);
257
static void	   decSetOverflow(decNumber *, decContext *, uInt *);
258
static void	   decSetSubnormal(decNumber *, decContext *, Int *, uInt *);
259
static Int	   decShiftToLeast(Unit *, Int, Int);
260
static Int	   decShiftToMost(Unit *, Int, Int);
261
static void	   decStatus(decNumber *, uInt, decContext *);
262
static void	   decToString(const decNumber *, char[], Flag);
263
static decNumber * decTrim(decNumber *, decContext *, Flag, Int *);
264
static Int	   decUnitAddSub(const Unit *, Int, const Unit *, Int, Int,
265
			      Unit *, Int);
266
static Int	   decUnitCompare(const Unit *, Int, const Unit *, Int, Int);
267
static bool        mulUInt128ByPowOf10(uLong *, uLong *, uInt);
268

269
#if !DECSUBSET
270
/* decFinish == decFinalize when no subset arithmetic needed */
271
#define decFinish(a,b,c,d) decFinalize(a,b,c,d)
272
#else
273
static void	   decFinish(decNumber *, decContext *, Int *, uInt *);
274
static decNumber * decRoundOperand(const decNumber *, decContext *, uInt *);
275
#endif
276

277
/* Local macros */
278
/* masked special-values bits */
279
#define SPECIALARG  (rhs->bits & DECSPECIAL)
280
#define SPECIALARGS ((lhs->bits | rhs->bits) & DECSPECIAL)
281

282
/* Diagnostic macros, etc. */
283
#if DECALLOC
284
/* Handle malloc/free accounting.  If enabled, our accountable routines */
285
/* are used; otherwise the code just goes straight to the system malloc */
286
/* and free routines. */
287
#define malloc(a) decMalloc(a)
288
#define free(a) decFree(a)
289
#define DECFENCE 0x5a		   /* corruption detector */
290
/* 'Our' malloc and free: */
291
static void *decMalloc(size_t);
292
static void  decFree(void *);
293
uInt decAllocBytes=0;		   /* count of bytes allocated */
294
/* Note that DECALLOC code only checks for storage buffer overflow. */
295
/* To check for memory leaks, the decAllocBytes variable must be */
296
/* checked to be 0 at appropriate times (e.g., after the test */
297
/* harness completes a set of tests).  This checking may be unreliable */
298
/* if the testing is done in a multi-thread environment. */
299
#endif
300

301
#if DECCHECK
302
/* Optional checking routines.	Enabling these means that decNumber */
303
/* and decContext operands to operator routines are checked for */
304
/* correctness.	 This roughly doubles the execution time of the */
305
/* fastest routines (and adds 600+ bytes), so should not normally be */
306
/* used in 'production'. */
307
/* decCheckInexact is used to check that inexact results have a full */
308
/* complement of digits (where appropriate -- this is not the case */
309
/* for Quantize, for example) */
310
#define DECUNRESU ((decNumber *)(void *)0xffffffff)
311
#define DECUNUSED ((const decNumber *)(void *)0xffffffff)
312
#define DECUNCONT ((decContext *)(void *)(0xffffffff))
313
static Flag decCheckOperands(decNumber *, const decNumber *,
314
			     const decNumber *, decContext *);
315
static Flag decCheckNumber(const decNumber *);
316
static void decCheckInexact(const decNumber *, decContext *);
317
#endif
318

319
#if DECTRACE || DECCHECK
320
/* Optional trace/debugging routines (may or may not be used) */
321
void decNumberShow(const decNumber *);	/* displays the components of a number */
322
static void decDumpAr(char, const Unit *, Int);
323
#endif
324

325
/* ================================================================== */
326
/* Conversions							      */
327
/* ================================================================== */
328

329
/* ------------------------------------------------------------------ */
330
/* from-int32 -- conversion from Int or uInt			      */
331
/*								      */
332
/*  dn is the decNumber to receive the integer			      */
333
/*  in or uin is the integer to be converted			      */
334
/*  returns dn							      */
335
/*								      */
336
/* No error is possible.					      */
337
/* ------------------------------------------------------------------ */
338
decNumber * decNumberFromInt32(decNumber *dn, Int in) {
339
  uInt unsig;
340
  if (in>=0) unsig=in;
341
   else {				/* negative (possibly BADINT) */
342
    if (in==BADINT) unsig=(uInt)1073741824*2; /* special case */
343
     else unsig=-in;			/* invert */
344
    }
345
  /* in is now positive */
346
  decNumberFromUInt32(dn, unsig);
347
  if (in<0) dn->bits=DECNEG;		/* sign needed */
348
  return dn;
349
  } /* decNumberFromInt32 */
350

351
decNumber * decNumberFromUInt32(decNumber *dn, uInt uin) {
352
  Unit *up;				/* work pointer */
353
  decNumberZero(dn);			/* clean */
354
  if (uin==0) return dn;		/* [or decGetDigits bad call] */
355
  for (up=dn->lsu; uin>0; up++) {
356
    *up=(Unit)(uin%(DECDPUNMAX+1));
357
    uin=uin/(DECDPUNMAX+1);
358
    }
359
  dn->digits=decGetDigits(dn->lsu, up-dn->lsu);
360
  return dn;
361
  } /* decNumberFromUInt32 */
362

363
/* ------------------------------------------------------------------ */
364
/* to-int32 -- conversion to Int or uInt			      */
365
/*								      */
366
/*  dn is the decNumber to convert				      */
367
/*  set is the context for reporting errors			      */
368
/*  returns the converted decNumber, or 0 if Invalid is set	      */
369
/*								      */
370
/* Invalid is set if the decNumber does not have exponent==0 or if    */
371
/* it is a NaN, Infinite, or out-of-range.			      */
372
/* ------------------------------------------------------------------ */
373
Int decNumberToInt32(const decNumber *dn, decContext *set) {
374
  #if DECCHECK
375
  if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
376
  #endif
377

378
  /* special or too many digits, or bad exponent */
379
  if (dn->bits&DECSPECIAL || dn->digits>10 || dn->exponent!=0) ; /* bad */
380
   else { /* is a finite integer with 10 or fewer digits */
381
    Int d;			   /* work */
382
    const Unit *up;		   /* .. */
383
    uInt hi=0, lo;		   /* .. */
384
    up=dn->lsu;			   /* -> lsu */
385
    lo=*up;			   /* get 1 to 9 digits */
386
    #if DECDPUN>1		   /* split to higher */
387
      hi=lo/10;
388
      lo=lo%10;
389
    #endif
390
    up++;
391
    /* collect remaining Units, if any, into hi */
392
    for (d=DECDPUN; d<dn->digits; up++, d+=DECDPUN) hi+=*up*powers[d-1];
393
    /* now low has the lsd, hi the remainder */
394
    if (hi>214748364 || (hi==214748364 && lo>7)) { /* out of range? */
395
      /* most-negative is a reprieve */
396
      if (dn->bits&DECNEG && hi==214748364 && lo==8) return 0x80000000;
397
      /* bad -- drop through */
398
      }
399
     else { /* in-range always */
400
      Int i=X10(hi)+lo;
401
      if (dn->bits&DECNEG) return -i;
402
      return i;
403
      }
404
    } /* integer */
405
  decContextSetStatus(set, DEC_Invalid_operation); /* [may not return] */
406
  return 0;
407
  } /* decNumberToInt32 */
408

409
uInt decNumberToUInt32(const decNumber *dn, decContext *set) {
410
  #if DECCHECK
411
  if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
412
  #endif
413
  /* special or too many digits, or bad exponent, or negative (<0) */
414
  if (dn->bits&DECSPECIAL || dn->digits>10 || dn->exponent!=0
415
    || (dn->bits&DECNEG && !ISZERO(dn)));		    /* bad */
416
   else { /* is a finite integer with 10 or fewer digits */
417
    Int d;			   /* work */
418
    const Unit *up;		   /* .. */
419
    uInt hi=0, lo;		   /* .. */
420
    up=dn->lsu;			   /* -> lsu */
421
    lo=*up;			   /* get 1 to 9 digits */
422
    #if DECDPUN>1		   /* split to higher */
423
      hi=lo/10;
424
      lo=lo%10;
425
    #endif
426
    up++;
427
    /* collect remaining Units, if any, into hi */
428
    for (d=DECDPUN; d<dn->digits; up++, d+=DECDPUN) hi+=*up*powers[d-1];
429

430
    /* now low has the lsd, hi the remainder */
431
    if (hi>429496729 || (hi==429496729 && lo>5)) ; /* no reprieve possible */
432
     else return X10(hi)+lo;
433
    } /* integer */
434
  decContextSetStatus(set, DEC_Invalid_operation); /* [may not return] */
435
  return 0;
436
  } /* decNumberToUInt32 */
437

438
decNumber *decNumberFromInt64(decNumber *dn, int64_t in)
439
{
440
    uint64_t unsig = in;
441
    if (in < 0) {
442
        unsig = -unsig;
443
    }
444

445
    decNumberFromUInt64(dn, unsig);
446
    if (in < 0) {
447
        dn->bits = DECNEG;        /* sign needed */
448
    }
449
    return dn;
450
} /* decNumberFromInt64 */
451

452
decNumber *decNumberFromUInt64(decNumber *dn, uint64_t uin)
453
{
454
    Unit *up;                             /* work pointer */
455
    decNumberZero(dn);                    /* clean */
456
    if (uin == 0) {
457
        return dn;                /* [or decGetDigits bad call] */
458
    }
459
    for (up = dn->lsu; uin > 0; up++) {
460
        *up = (Unit)(uin % (DECDPUNMAX + 1));
461
        uin = uin / (DECDPUNMAX + 1);
462
    }
463
    dn->digits = decGetDigits(dn->lsu, up-dn->lsu);
464
    return dn;
465
} /* decNumberFromUInt64 */
466

467
decNumber *decNumberFromInt128(decNumber *dn, uint64_t lo, int64_t hi)
468
{
469
    uint64_t unsig_hi = hi;
470
    if (hi < 0) {
471
        if (lo == 0) {
472
            unsig_hi = -unsig_hi;
473
        } else {
474
            unsig_hi = ~unsig_hi;
475
            lo = -lo;
476
        }
477
    }
478

479
    decNumberFromUInt128(dn, lo, unsig_hi);
480
    if (hi < 0) {
481
        dn->bits = DECNEG;        /* sign needed */
482
    }
483
    return dn;
484
} /* decNumberFromInt128 */
485

486
decNumber *decNumberFromUInt128(decNumber *dn, uint64_t lo, uint64_t hi)
487
{
488
    uint64_t rem;
489
    Unit *up;                             /* work pointer */
490
    decNumberZero(dn);                    /* clean */
491
    if (lo == 0 && hi == 0) {
492
        return dn;                /* [or decGetDigits bad call] */
493
    }
494
    for (up = dn->lsu; hi > 0 || lo > 0; up++) {
495
        rem = divu128(&lo, &hi, DECDPUNMAX + 1);
496
        *up = (Unit)rem;
497
    }
498
    dn->digits = decGetDigits(dn->lsu, up - dn->lsu);
499
    return dn;
500
} /* decNumberFromUInt128 */
501

502
/* ------------------------------------------------------------------ */
503
/* to-int64 -- conversion to int64                                    */
504
/*                                                                    */
505
/*  dn is the decNumber to convert.  dn is assumed to have been       */
506
/*    rounded to a floating point integer value.                      */
507
/*  set is the context for reporting errors                           */
508
/*  returns the converted decNumber, or 0 if Invalid is set           */
509
/*                                                                    */
510
/* Invalid is set if the decNumber is a NaN, Infinite or is out of    */
511
/* range for a signed 64 bit integer.                                 */
512
/* ------------------------------------------------------------------ */
513

514
int64_t decNumberIntegralToInt64(const decNumber *dn, decContext *set)
515
{
516
    if (decNumberIsSpecial(dn) || (dn->exponent < 0) ||
517
       (dn->digits + dn->exponent > 19)) {
518
        goto Invalid;
519
    } else {
520
        int64_t d;        /* work */
521
        const Unit *up;   /* .. */
522
        uint64_t hi = 0;
523
        up = dn->lsu;     /* -> lsu */
524

525
        for (d = 1; d <= dn->digits; up++, d += DECDPUN) {
526
            uint64_t prev = hi;
527
            hi += *up * powers[d-1];
528
            if ((hi < prev) || (hi > INT64_MAX)) {
529
                goto Invalid;
530
            }
531
        }
532

533
        uint64_t prev = hi;
534
        hi *= (uint64_t)powers[dn->exponent];
535
        if ((hi < prev) || (hi > INT64_MAX)) {
536
            goto Invalid;
537
        }
538
        return (decNumberIsNegative(dn)) ? -((int64_t)hi) : (int64_t)hi;
539
    }
540

541
Invalid:
542
    decContextSetStatus(set, DEC_Invalid_operation);
543
    return 0;
544
} /* decNumberIntegralToInt64 */
545

546
/* ------------------------------------------------------------------ */
547
/* decNumberIntegralToInt128 -- conversion to int128                  */
548
/*                                                                    */
549
/*  dn is the decNumber to convert.  dn is assumed to have been       */
550
/*    rounded to a floating point integer value.                      */
551
/*  set is the context for reporting errors                           */
552
/*  returns the converted decNumber via plow and phigh                */
553
/*                                                                    */
554
/* Invalid is set if the decNumber is a NaN, Infinite or is out of    */
555
/* range for a signed 128 bit integer.                                */
556
/* ------------------------------------------------------------------ */
557

558
void decNumberIntegralToInt128(const decNumber *dn, decContext *set,
559
        uint64_t *plow, uint64_t *phigh)
560
{
561
    int d;        /* work */
562
    const Unit *up;   /* .. */
563
    uint64_t lo = 0, hi = 0;
564

565
    if (decNumberIsSpecial(dn) || (dn->exponent < 0) ||
566
       (dn->digits + dn->exponent > 39)) {
567
        goto Invalid;
568
    }
569

570
    up = dn->lsu;     /* -> lsu */
571

572
    for (d = (dn->digits - 1) / DECDPUN; d >= 0; d--) {
573
        if (mulu128(&lo, &hi, DECDPUNMAX + 1)) {
574
            /* overflow */
575
            goto Invalid;
576
        }
577
        if (uadd64_overflow(lo, up[d], &lo)) {
578
            if (uadd64_overflow(hi, 1, &hi)) {
579
                /* overflow */
580
                goto Invalid;
581
            }
582
        }
583
    }
584

585
    if (mulUInt128ByPowOf10(&lo, &hi, dn->exponent)) {
586
        /* overflow */
587
        goto Invalid;
588
    }
589

590
    if (decNumberIsNegative(dn)) {
591
        if (lo == 0) {
592
            *phigh = -hi;
593
            *plow = 0;
594
        } else {
595
            *phigh = ~hi;
596
            *plow = -lo;
597
        }
598
    } else {
599
        *plow = lo;
600
        *phigh = hi;
601
    }
602

603
    return;
604

605
Invalid:
606
    decContextSetStatus(set, DEC_Invalid_operation);
607
} /* decNumberIntegralToInt128 */
608

609
/* ------------------------------------------------------------------ */
610
/* to-scientific-string -- conversion to numeric string		      */
611
/* to-engineering-string -- conversion to numeric string	      */
612
/*								      */
613
/*   decNumberToString(dn, string);				      */
614
/*   decNumberToEngString(dn, string);				      */
615
/*								      */
616
/*  dn is the decNumber to convert				      */
617
/*  string is the string where the result will be laid out	      */
618
/*								      */
619
/*  string must be at least dn->digits+14 characters long	      */
620
/*								      */
621
/*  No error is possible, and no status can be set.		      */
622
/* ------------------------------------------------------------------ */
623
char * decNumberToString(const decNumber *dn, char *string){
624
  decToString(dn, string, 0);
625
  return string;
626
  } /* DecNumberToString */
627

628
char * decNumberToEngString(const decNumber *dn, char *string){
629
  decToString(dn, string, 1);
630
  return string;
631
  } /* DecNumberToEngString */
632

633
/* ------------------------------------------------------------------ */
634
/* to-number -- conversion from numeric string			      */
635
/*								      */
636
/* decNumberFromString -- convert string to decNumber		      */
637
/*   dn	       -- the number structure to fill			      */
638
/*   chars[]   -- the string to convert ('\0' terminated)	      */
639
/*   set       -- the context used for processing any error,	      */
640
/*		  determining the maximum precision available	      */
641
/*		  (set.digits), determining the maximum and minimum   */
642
/*		  exponent (set.emax and set.emin), determining if    */
643
/*		  extended values are allowed, and checking the	      */
644
/*		  rounding mode if overflow occurs or rounding is     */
645
/*		  needed.					      */
646
/*								      */
647
/* The length of the coefficient and the size of the exponent are     */
648
/* checked by this routine, so the correct error (Underflow or	      */
649
/* Overflow) can be reported or rounding applied, as necessary.	      */
650
/*								      */
651
/* If bad syntax is detected, the result will be a quiet NaN.	      */
652
/* ------------------------------------------------------------------ */
653
decNumber * decNumberFromString(decNumber *dn, const char chars[],
654
				decContext *set) {
655
  Int	exponent=0;		   /* working exponent [assume 0] */
656
  uByte bits=0;			   /* working flags [assume +ve] */
657
  Unit	*res;			   /* where result will be built */
658
  Unit	resbuff[SD2U(DECBUFFER+9)];/* local buffer in case need temporary */
659
				   /* [+9 allows for ln() constants] */
660
  Unit	*allocres=NULL;		   /* -> allocated result, iff allocated */
661
  Int	d=0;			   /* count of digits found in decimal part */
662
  const char *dotchar=NULL;	   /* where dot was found */
663
  const char *cfirst=chars;	   /* -> first character of decimal part */
664
  const char *last=NULL;	   /* -> last digit of decimal part */
665
  const char *c;		   /* work */
666
  Unit	*up;			   /* .. */
667
  #if DECDPUN>1
668
  Int	cut, out;		   /* .. */
669
  #endif
670
  Int	residue;		   /* rounding residue */
671
  uInt	status=0;		   /* error code */
672

673
  #if DECCHECK
674
  if (decCheckOperands(DECUNRESU, DECUNUSED, DECUNUSED, set))
675
    return decNumberZero(dn);
676
  #endif
677

678
  do {				   /* status & malloc protection */
679
    for (c=chars;; c++) {	   /* -> input character */
680
      if (*c>='0' && *c<='9') {	   /* test for Arabic digit */
681
	last=c;
682
	d++;			   /* count of real digits */
683
	continue;		   /* still in decimal part */
684
	}
685
      if (*c=='.' && dotchar==NULL) { /* first '.' */
686
	dotchar=c;		   /* record offset into decimal part */
687
	if (c==cfirst) cfirst++;   /* first digit must follow */
688
	continue;}
689
      if (c==chars) {		   /* first in string... */
690
	if (*c=='-') {		   /* valid - sign */
691
	  cfirst++;
692
	  bits=DECNEG;
693
	  continue;}
694
	if (*c=='+') {		   /* valid + sign */
695
	  cfirst++;
696
	  continue;}
697
	}
698
      /* *c is not a digit, or a valid +, -, or '.' */
699
      break;
700
      } /* c */
701

702
    if (last==NULL) {		   /* no digits yet */
703
      status=DEC_Conversion_syntax;/* assume the worst */
704
      if (*c=='\0') break;	   /* and no more to come... */
705
      #if DECSUBSET
706
      /* if subset then infinities and NaNs are not allowed */
707
      if (!set->extended) break;   /* hopeless */
708
      #endif
709
      /* Infinities and NaNs are possible, here */
710
      if (dotchar!=NULL) break;	   /* .. unless had a dot */
711
      decNumberZero(dn);	   /* be optimistic */
712
      if (decBiStr(c, "infinity", "INFINITY")
713
       || decBiStr(c, "inf", "INF")) {
714
	dn->bits=bits | DECINF;
715
	status=0;		   /* is OK */
716
	break; /* all done */
717
	}
718
      /* a NaN expected */
719
      /* 2003.09.10 NaNs are now permitted to have a sign */
720
      dn->bits=bits | DECNAN;	   /* assume simple NaN */
721
      if (*c=='s' || *c=='S') {	   /* looks like an sNaN */
722
	c++;
723
	dn->bits=bits | DECSNAN;
724
	}
725
      if (*c!='n' && *c!='N') break;	/* check caseless "NaN" */
726
      c++;
727
      if (*c!='a' && *c!='A') break;	/* .. */
728
      c++;
729
      if (*c!='n' && *c!='N') break;	/* .. */
730
      c++;
731
      /* now either nothing, or nnnn payload, expected */
732
      /* -> start of integer and skip leading 0s [including plain 0] */
733
      for (cfirst=c; *cfirst=='0';) cfirst++;
734
      if (*cfirst=='\0') {	   /* "NaN" or "sNaN", maybe with all 0s */
735
	status=0;		   /* it's good */
736
	break;			   /* .. */
737
	}
738
      /* something other than 0s; setup last and d as usual [no dots] */
739
      for (c=cfirst;; c++, d++) {
740
	if (*c<'0' || *c>'9') break; /* test for Arabic digit */
741
	last=c;
742
	}
743
      if (*c!='\0') break;	   /* not all digits */
744
      if (d>set->digits-1) {
745
	/* [NB: payload in a decNumber can be full length unless */
746
	/* clamped, in which case can only be digits-1] */
747
	if (set->clamp) break;
748
	if (d>set->digits) break;
749
	} /* too many digits? */
750
      /* good; drop through to convert the integer to coefficient */
751
      status=0;			   /* syntax is OK */
752
      bits=dn->bits;		   /* for copy-back */
753
      } /* last==NULL */
754

755
     else if (*c!='\0') {	   /* more to process... */
756
      /* had some digits; exponent is only valid sequence now */
757
      Flag nege;		   /* 1=negative exponent */
758
      const char *firstexp;	   /* -> first significant exponent digit */
759
      status=DEC_Conversion_syntax;/* assume the worst */
760
      if (*c!='e' && *c!='E') break;
761
      /* Found 'e' or 'E' -- now process explicit exponent */
762
      /* 1998.07.11: sign no longer required */
763
      nege=0;
764
      c++;			   /* to (possible) sign */
765
      if (*c=='-') {nege=1; c++;}
766
       else if (*c=='+') c++;
767
      if (*c=='\0') break;
768

769
      for (; *c=='0' && *(c+1)!='\0';) c++;  /* strip insignificant zeros */
770
      firstexp=c;			     /* save exponent digit place */
771
      for (; ;c++) {
772
	if (*c<'0' || *c>'9') break;	     /* not a digit */
773
	exponent=X10(exponent)+(Int)*c-(Int)'0';
774
	} /* c */
775
      /* if not now on a '\0', *c must not be a digit */
776
      if (*c!='\0') break;
777

778
      /* (this next test must be after the syntax checks) */
779
      /* if it was too long the exponent may have wrapped, so check */
780
      /* carefully and set it to a certain overflow if wrap possible */
781
      if (c>=firstexp+9+1) {
782
	if (c>firstexp+9+1 || *firstexp>'1') exponent=DECNUMMAXE*2;
783
	/* [up to 1999999999 is OK, for example 1E-1000000998] */
784
	}
785
      if (nege) exponent=-exponent;	/* was negative */
786
      status=0;				/* is OK */
787
      } /* stuff after digits */
788

789
    /* Here when whole string has been inspected; syntax is good */
790
    /* cfirst->first digit (never dot), last->last digit (ditto) */
791

792
    /* strip leading zeros/dot [leave final 0 if all 0's] */
793
    if (*cfirst=='0') {			/* [cfirst has stepped over .] */
794
      for (c=cfirst; c<last; c++, cfirst++) {
795
	if (*c=='.') continue;		/* ignore dots */
796
	if (*c!='0') break;		/* non-zero found */
797
	d--;				/* 0 stripped */
798
	} /* c */
799
      #if DECSUBSET
800
      /* make a rapid exit for easy zeros if !extended */
801
      if (*cfirst=='0' && !set->extended) {
802
	decNumberZero(dn);		/* clean result */
803
	break;				/* [could be return] */
804
	}
805
      #endif
806
      } /* at least one leading 0 */
807

808
    /* Handle decimal point... */
809
    if (dotchar!=NULL && dotchar<last)	/* non-trailing '.' found? */
810
      exponent-=(last-dotchar);		/* adjust exponent */
811
    /* [we can now ignore the .] */
812

813
    /* OK, the digits string is good.  Assemble in the decNumber, or in */
814
    /* a temporary units array if rounding is needed */
815
    if (d<=set->digits) res=dn->lsu;	/* fits into supplied decNumber */
816
     else {				/* rounding needed */
817
      Int needbytes=D2U(d)*sizeof(Unit);/* bytes needed */
818
      res=resbuff;			/* assume use local buffer */
819
      if (needbytes>(Int)sizeof(resbuff)) { /* too big for local */
820
	allocres=(Unit *)malloc(needbytes);
821
	if (allocres==NULL) {status|=DEC_Insufficient_storage; break;}
822
	res=allocres;
823
	}
824
      }
825
    /* res now -> number lsu, buffer, or allocated storage for Unit array */
826

827
    /* Place the coefficient into the selected Unit array */
828
    /* [this is often 70% of the cost of this function when DECDPUN>1] */
829
    #if DECDPUN>1
830
    out=0;			   /* accumulator */
831
    up=res+D2U(d)-1;		   /* -> msu */
832
    cut=d-(up-res)*DECDPUN;	   /* digits in top unit */
833
    for (c=cfirst;; c++) {	   /* along the digits */
834
      if (*c=='.') continue;	   /* ignore '.' [don't decrement cut] */
835
      out=X10(out)+(Int)*c-(Int)'0';
836
      if (c==last) break;	   /* done [never get to trailing '.'] */
837
      cut--;
838
      if (cut>0) continue;	   /* more for this unit */
839
      *up=(Unit)out;		   /* write unit */
840
      up--;			   /* prepare for unit below.. */
841
      cut=DECDPUN;		   /* .. */
842
      out=0;			   /* .. */
843
      } /* c */
844
    *up=(Unit)out;		   /* write lsu */
845

846
    #else
847
    /* DECDPUN==1 */
848
    up=res;			   /* -> lsu */
849
    for (c=last; c>=cfirst; c--) { /* over each character, from least */
850
      if (*c=='.') continue;	   /* ignore . [don't step up] */
851
      *up=(Unit)((Int)*c-(Int)'0');
852
      up++;
853
      } /* c */
854
    #endif
855

856
    dn->bits=bits;
857
    dn->exponent=exponent;
858
    dn->digits=d;
859

860
    /* if not in number (too long) shorten into the number */
861
    if (d>set->digits) {
862
      residue=0;
863
      decSetCoeff(dn, set, res, d, &residue, &status);
864
      /* always check for overflow or subnormal and round as needed */
865
      decFinalize(dn, set, &residue, &status);
866
      }
867
     else { /* no rounding, but may still have overflow or subnormal */
868
      /* [these tests are just for performance; finalize repeats them] */
869
      if ((dn->exponent-1<set->emin-dn->digits)
870
       || (dn->exponent-1>set->emax-set->digits)) {
871
	residue=0;
872
	decFinalize(dn, set, &residue, &status);
873
	}
874
      }
875
    /* decNumberShow(dn); */
876
    } while(0);				/* [for break] */
877

878
  if (allocres!=NULL) free(allocres);	/* drop any storage used */
879
  if (status!=0) decStatus(dn, status, set);
880
  return dn;
881
  } /* decNumberFromString */
882

883
/* ================================================================== */
884
/* Operators							      */
885
/* ================================================================== */
886

887
/* ------------------------------------------------------------------ */
888
/* decNumberAbs -- absolute value operator			      */
889
/*								      */
890
/*   This computes C = abs(A)					      */
891
/*								      */
892
/*   res is C, the result.  C may be A				      */
893
/*   rhs is A							      */
894
/*   set is the context						      */
895
/*								      */
896
/* See also decNumberCopyAbs for a quiet bitwise version of this.     */
897
/* C must have space for set->digits digits.			      */
898
/* ------------------------------------------------------------------ */
899
/* This has the same effect as decNumberPlus unless A is negative,    */
900
/* in which case it has the same effect as decNumberMinus.	      */
901
/* ------------------------------------------------------------------ */
902
decNumber * decNumberAbs(decNumber *res, const decNumber *rhs,
903
			 decContext *set) {
904
  decNumber dzero;			/* for 0 */
905
  uInt status=0;			/* accumulator */
906

907
  #if DECCHECK
908
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
909
  #endif
910

911
  decNumberZero(&dzero);		/* set 0 */
912
  dzero.exponent=rhs->exponent;		/* [no coefficient expansion] */
913
  decAddOp(res, &dzero, rhs, set, (uByte)(rhs->bits & DECNEG), &status);
914
  if (status!=0) decStatus(res, status, set);
915
  #if DECCHECK
916
  decCheckInexact(res, set);
917
  #endif
918
  return res;
919
  } /* decNumberAbs */
920

921
/* ------------------------------------------------------------------ */
922
/* decNumberAdd -- add two Numbers				      */
923
/*								      */
924
/*   This computes C = A + B					      */
925
/*								      */
926
/*   res is C, the result.  C may be A and/or B (e.g., X=X+X)	      */
927
/*   lhs is A							      */
928
/*   rhs is B							      */
929
/*   set is the context						      */
930
/*								      */
931
/* C must have space for set->digits digits.			      */
932
/* ------------------------------------------------------------------ */
933
/* This just calls the routine shared with Subtract		      */
934
decNumber * decNumberAdd(decNumber *res, const decNumber *lhs,
935
			 const decNumber *rhs, decContext *set) {
936
  uInt status=0;			/* accumulator */
937
  decAddOp(res, lhs, rhs, set, 0, &status);
938
  if (status!=0) decStatus(res, status, set);
939
  #if DECCHECK
940
  decCheckInexact(res, set);
941
  #endif
942
  return res;
943
  } /* decNumberAdd */
944

945
/* ------------------------------------------------------------------ */
946
/* decNumberAnd -- AND two Numbers, digitwise			      */
947
/*								      */
948
/*   This computes C = A & B					      */
949
/*								      */
950
/*   res is C, the result.  C may be A and/or B (e.g., X=X&X)	      */
951
/*   lhs is A							      */
952
/*   rhs is B							      */
953
/*   set is the context (used for result length and error report)     */
954
/*								      */
955
/* C must have space for set->digits digits.			      */
956
/*								      */
957
/* Logical function restrictions apply (see above); a NaN is	      */
958
/* returned with Invalid_operation if a restriction is violated.      */
959
/* ------------------------------------------------------------------ */
960
decNumber * decNumberAnd(decNumber *res, const decNumber *lhs,
961
			 const decNumber *rhs, decContext *set) {
962
  const Unit *ua, *ub;			/* -> operands */
963
  const Unit *msua, *msub;		/* -> operand msus */
964
  Unit *uc,  *msuc;			/* -> result and its msu */
965
  Int	msudigs;			/* digits in res msu */
966
  #if DECCHECK
967
  if (decCheckOperands(res, lhs, rhs, set)) return res;
968
  #endif
969

970
  if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
971
   || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
972
    decStatus(res, DEC_Invalid_operation, set);
973
    return res;
974
    }
975

976
  /* operands are valid */
977
  ua=lhs->lsu;				/* bottom-up */
978
  ub=rhs->lsu;				/* .. */
979
  uc=res->lsu;				/* .. */
980
  msua=ua+D2U(lhs->digits)-1;		/* -> msu of lhs */
981
  msub=ub+D2U(rhs->digits)-1;		/* -> msu of rhs */
982
  msuc=uc+D2U(set->digits)-1;		/* -> msu of result */
983
  msudigs=MSUDIGITS(set->digits);	/* [faster than remainder] */
984
  for (; uc<=msuc; ua++, ub++, uc++) {	/* Unit loop */
985
    Unit a, b;				/* extract units */
986
    if (ua>msua) a=0;
987
     else a=*ua;
988
    if (ub>msub) b=0;
989
     else b=*ub;
990
    *uc=0;				/* can now write back */
991
    if (a|b) {				/* maybe 1 bits to examine */
992
      Int i, j;
993
      *uc=0;				/* can now write back */
994
      /* This loop could be unrolled and/or use BIN2BCD tables */
995
      for (i=0; i<DECDPUN; i++) {
996
	if (a&b&1) *uc=*uc+(Unit)powers[i];  /* effect AND */
997
	j=a%10;
998
	a=a/10;
999
	j|=b%10;
1000
	b=b/10;
1001
	if (j>1) {
1002
	  decStatus(res, DEC_Invalid_operation, set);
1003
	  return res;
1004
	  }
1005
	if (uc==msuc && i==msudigs-1) break; /* just did final digit */
1006
	} /* each digit */
1007
      } /* both OK */
1008
    } /* each unit */
1009
  /* [here uc-1 is the msu of the result] */
1010
  res->digits=decGetDigits(res->lsu, uc-res->lsu);
1011
  res->exponent=0;			/* integer */
1012
  res->bits=0;				/* sign=0 */
1013
  return res;  /* [no status to set] */
1014
  } /* decNumberAnd */
1015

1016
/* ------------------------------------------------------------------ */
1017
/* decNumberCompare -- compare two Numbers			      */
1018
/*								      */
1019
/*   This computes C = A ? B					      */
1020
/*								      */
1021
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
1022
/*   lhs is A							      */
1023
/*   rhs is B							      */
1024
/*   set is the context						      */
1025
/*								      */
1026
/* C must have space for one digit (or NaN).			      */
1027
/* ------------------------------------------------------------------ */
1028
decNumber * decNumberCompare(decNumber *res, const decNumber *lhs,
1029
			     const decNumber *rhs, decContext *set) {
1030
  uInt status=0;			/* accumulator */
1031
  decCompareOp(res, lhs, rhs, set, COMPARE, &status);
1032
  if (status!=0) decStatus(res, status, set);
1033
  return res;
1034
  } /* decNumberCompare */
1035

1036
/* ------------------------------------------------------------------ */
1037
/* decNumberCompareSignal -- compare, signalling on all NaNs	      */
1038
/*								      */
1039
/*   This computes C = A ? B					      */
1040
/*								      */
1041
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
1042
/*   lhs is A							      */
1043
/*   rhs is B							      */
1044
/*   set is the context						      */
1045
/*								      */
1046
/* C must have space for one digit (or NaN).			      */
1047
/* ------------------------------------------------------------------ */
1048
decNumber * decNumberCompareSignal(decNumber *res, const decNumber *lhs,
1049
				   const decNumber *rhs, decContext *set) {
1050
  uInt status=0;			/* accumulator */
1051
  decCompareOp(res, lhs, rhs, set, COMPSIG, &status);
1052
  if (status!=0) decStatus(res, status, set);
1053
  return res;
1054
  } /* decNumberCompareSignal */
1055

1056
/* ------------------------------------------------------------------ */
1057
/* decNumberCompareTotal -- compare two Numbers, using total ordering */
1058
/*								      */
1059
/*   This computes C = A ? B, under total ordering		      */
1060
/*								      */
1061
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
1062
/*   lhs is A							      */
1063
/*   rhs is B							      */
1064
/*   set is the context						      */
1065
/*								      */
1066
/* C must have space for one digit; the result will always be one of  */
1067
/* -1, 0, or 1.							      */
1068
/* ------------------------------------------------------------------ */
1069
decNumber * decNumberCompareTotal(decNumber *res, const decNumber *lhs,
1070
				  const decNumber *rhs, decContext *set) {
1071
  uInt status=0;			/* accumulator */
1072
  decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
1073
  if (status!=0) decStatus(res, status, set);
1074
  return res;
1075
  } /* decNumberCompareTotal */
1076

1077
/* ------------------------------------------------------------------ */
1078
/* decNumberCompareTotalMag -- compare, total ordering of magnitudes  */
1079
/*								      */
1080
/*   This computes C = |A| ? |B|, under total ordering		      */
1081
/*								      */
1082
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
1083
/*   lhs is A							      */
1084
/*   rhs is B							      */
1085
/*   set is the context						      */
1086
/*								      */
1087
/* C must have space for one digit; the result will always be one of  */
1088
/* -1, 0, or 1.							      */
1089
/* ------------------------------------------------------------------ */
1090
decNumber * decNumberCompareTotalMag(decNumber *res, const decNumber *lhs,
1091
				     const decNumber *rhs, decContext *set) {
1092
  uInt status=0;		   /* accumulator */
1093
  uInt needbytes;		   /* for space calculations */
1094
  decNumber bufa[D2N(DECBUFFER+1)];/* +1 in case DECBUFFER=0 */
1095
  decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
1096
  decNumber bufb[D2N(DECBUFFER+1)];
1097
  decNumber *allocbufb=NULL;	   /* -> allocated bufb, iff allocated */
1098
  decNumber *a, *b;		   /* temporary pointers */
1099

1100
  #if DECCHECK
1101
  if (decCheckOperands(res, lhs, rhs, set)) return res;
1102
  #endif
1103

1104
  do {					/* protect allocated storage */
1105
    /* if either is negative, take a copy and absolute */
1106
    if (decNumberIsNegative(lhs)) {	/* lhs<0 */
1107
      a=bufa;
1108
      needbytes=sizeof(decNumber)+(D2U(lhs->digits)-1)*sizeof(Unit);
1109
      if (needbytes>sizeof(bufa)) {	/* need malloc space */
1110
	allocbufa=(decNumber *)malloc(needbytes);
1111
	if (allocbufa==NULL) {		/* hopeless -- abandon */
1112
	  status|=DEC_Insufficient_storage;
1113
	  break;}
1114
	a=allocbufa;			/* use the allocated space */
1115
	}
1116
      decNumberCopy(a, lhs);		/* copy content */
1117
      a->bits&=~DECNEG;			/* .. and clear the sign */
1118
      lhs=a;				/* use copy from here on */
1119
      }
1120
    if (decNumberIsNegative(rhs)) {	/* rhs<0 */
1121
      b=bufb;
1122
      needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
1123
      if (needbytes>sizeof(bufb)) {	/* need malloc space */
1124
	allocbufb=(decNumber *)malloc(needbytes);
1125
	if (allocbufb==NULL) {		/* hopeless -- abandon */
1126
	  status|=DEC_Insufficient_storage;
1127
	  break;}
1128
	b=allocbufb;			/* use the allocated space */
1129
	}
1130
      decNumberCopy(b, rhs);		/* copy content */
1131
      b->bits&=~DECNEG;			/* .. and clear the sign */
1132
      rhs=b;				/* use copy from here on */
1133
      }
1134
    decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
1135
    } while(0);				/* end protected */
1136

1137
  if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
1138
  if (allocbufb!=NULL) free(allocbufb); /* .. */
1139
  if (status!=0) decStatus(res, status, set);
1140
  return res;
1141
  } /* decNumberCompareTotalMag */
1142

1143
/* ------------------------------------------------------------------ */
1144
/* decNumberDivide -- divide one number by another		      */
1145
/*								      */
1146
/*   This computes C = A / B					      */
1147
/*								      */
1148
/*   res is C, the result.  C may be A and/or B (e.g., X=X/X)	      */
1149
/*   lhs is A							      */
1150
/*   rhs is B							      */
1151
/*   set is the context						      */
1152
/*								      */
1153
/* C must have space for set->digits digits.			      */
1154
/* ------------------------------------------------------------------ */
1155
decNumber * decNumberDivide(decNumber *res, const decNumber *lhs,
1156
			    const decNumber *rhs, decContext *set) {
1157
  uInt status=0;			/* accumulator */
1158
  decDivideOp(res, lhs, rhs, set, DIVIDE, &status);
1159
  if (status!=0) decStatus(res, status, set);
1160
  #if DECCHECK
1161
  decCheckInexact(res, set);
1162
  #endif
1163
  return res;
1164
  } /* decNumberDivide */
1165

1166
/* ------------------------------------------------------------------ */
1167
/* decNumberDivideInteger -- divide and return integer quotient	      */
1168
/*								      */
1169
/*   This computes C = A # B, where # is the integer divide operator  */
1170
/*								      */
1171
/*   res is C, the result.  C may be A and/or B (e.g., X=X#X)	      */
1172
/*   lhs is A							      */
1173
/*   rhs is B							      */
1174
/*   set is the context						      */
1175
/*								      */
1176
/* C must have space for set->digits digits.			      */
1177
/* ------------------------------------------------------------------ */
1178
decNumber * decNumberDivideInteger(decNumber *res, const decNumber *lhs,
1179
				   const decNumber *rhs, decContext *set) {
1180
  uInt status=0;			/* accumulator */
1181
  decDivideOp(res, lhs, rhs, set, DIVIDEINT, &status);
1182
  if (status!=0) decStatus(res, status, set);
1183
  return res;
1184
  } /* decNumberDivideInteger */
1185

1186
/* ------------------------------------------------------------------ */
1187
/* decNumberExp -- exponentiation				      */
1188
/*								      */
1189
/*   This computes C = exp(A)					      */
1190
/*								      */
1191
/*   res is C, the result.  C may be A				      */
1192
/*   rhs is A							      */
1193
/*   set is the context; note that rounding mode has no effect	      */
1194
/*								      */
1195
/* C must have space for set->digits digits.			      */
1196
/*								      */
1197
/* Mathematical function restrictions apply (see above); a NaN is     */
1198
/* returned with Invalid_operation if a restriction is violated.      */
1199
/*								      */
1200
/* Finite results will always be full precision and Inexact, except   */
1201
/* when A is a zero or -Infinity (giving 1 or 0 respectively).	      */
1202
/*								      */
1203
/* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
1204
/* almost always be correctly rounded, but may be up to 1 ulp in      */
1205
/* error in rare cases.						      */
1206
/* ------------------------------------------------------------------ */
1207
/* This is a wrapper for decExpOp which can handle the slightly wider */
1208
/* (double) range needed by Ln (which has to be able to calculate     */
1209
/* exp(-a) where a can be the tiniest number (Ntiny).		      */
1210
/* ------------------------------------------------------------------ */
1211
decNumber * decNumberExp(decNumber *res, const decNumber *rhs,
1212
			 decContext *set) {
1213
  uInt status=0;			/* accumulator */
1214
  #if DECSUBSET
1215
  decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
1216
  #endif
1217

1218
  #if DECCHECK
1219
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1220
  #endif
1221

1222
  /* Check restrictions; these restrictions ensure that if h=8 (see */
1223
  /* decExpOp) then the result will either overflow or underflow to 0. */
1224
  /* Other math functions restrict the input range, too, for inverses. */
1225
  /* If not violated then carry out the operation. */
1226
  if (!decCheckMath(rhs, set, &status)) do { /* protect allocation */
1227
    #if DECSUBSET
1228
    if (!set->extended) {
1229
      /* reduce operand and set lostDigits status, as needed */
1230
      if (rhs->digits>set->digits) {
1231
	allocrhs=decRoundOperand(rhs, set, &status);
1232
	if (allocrhs==NULL) break;
1233
	rhs=allocrhs;
1234
	}
1235
      }
1236
    #endif
1237
    decExpOp(res, rhs, set, &status);
1238
    } while(0);				/* end protected */
1239

1240
  #if DECSUBSET
1241
  if (allocrhs !=NULL) free(allocrhs);	/* drop any storage used */
1242
  #endif
1243
  /* apply significant status */
1244
  if (status!=0) decStatus(res, status, set);
1245
  #if DECCHECK
1246
  decCheckInexact(res, set);
1247
  #endif
1248
  return res;
1249
  } /* decNumberExp */
1250

1251
/* ------------------------------------------------------------------ */
1252
/* decNumberFMA -- fused multiply add				      */
1253
/*								      */
1254
/*   This computes D = (A * B) + C with only one rounding	      */
1255
/*								      */
1256
/*   res is D, the result.  D may be A or B or C (e.g., X=FMA(X,X,X)) */
1257
/*   lhs is A							      */
1258
/*   rhs is B							      */
1259
/*   fhs is C [far hand side]					      */
1260
/*   set is the context						      */
1261
/*								      */
1262
/* Mathematical function restrictions apply (see above); a NaN is     */
1263
/* returned with Invalid_operation if a restriction is violated.      */
1264
/*								      */
1265
/* C must have space for set->digits digits.			      */
1266
/* ------------------------------------------------------------------ */
1267
decNumber * decNumberFMA(decNumber *res, const decNumber *lhs,
1268
			 const decNumber *rhs, const decNumber *fhs,
1269
			 decContext *set) {
1270
  uInt status=0;		   /* accumulator */
1271
  decContext dcmul;		   /* context for the multiplication */
1272
  uInt needbytes;		   /* for space calculations */
1273
  decNumber bufa[D2N(DECBUFFER*2+1)];
1274
  decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
1275
  decNumber *acc;		   /* accumulator pointer */
1276
  decNumber dzero;		   /* work */
1277

1278
  #if DECCHECK
1279
  if (decCheckOperands(res, lhs, rhs, set)) return res;
1280
  if (decCheckOperands(res, fhs, DECUNUSED, set)) return res;
1281
  #endif
1282

1283
  do {					/* protect allocated storage */
1284
    #if DECSUBSET
1285
    if (!set->extended) {		/* [undefined if subset] */
1286
      status|=DEC_Invalid_operation;
1287
      break;}
1288
    #endif
1289
    /* Check math restrictions [these ensure no overflow or underflow] */
1290
    if ((!decNumberIsSpecial(lhs) && decCheckMath(lhs, set, &status))
1291
     || (!decNumberIsSpecial(rhs) && decCheckMath(rhs, set, &status))
1292
     || (!decNumberIsSpecial(fhs) && decCheckMath(fhs, set, &status))) break;
1293
    /* set up context for multiply */
1294
    dcmul=*set;
1295
    dcmul.digits=lhs->digits+rhs->digits; /* just enough */
1296
    /* [The above may be an over-estimate for subset arithmetic, but that's OK] */
1297
    dcmul.emax=DEC_MAX_EMAX;		/* effectively unbounded .. */
1298
    dcmul.emin=DEC_MIN_EMIN;		/* [thanks to Math restrictions] */
1299
    /* set up decNumber space to receive the result of the multiply */
1300
    acc=bufa;				/* may fit */
1301
    needbytes=sizeof(decNumber)+(D2U(dcmul.digits)-1)*sizeof(Unit);
1302
    if (needbytes>sizeof(bufa)) {	/* need malloc space */
1303
      allocbufa=(decNumber *)malloc(needbytes);
1304
      if (allocbufa==NULL) {		/* hopeless -- abandon */
1305
	status|=DEC_Insufficient_storage;
1306
	break;}
1307
      acc=allocbufa;			/* use the allocated space */
1308
      }
1309
    /* multiply with extended range and necessary precision */
1310
    /*printf("emin=%ld\n", dcmul.emin); */
1311
    decMultiplyOp(acc, lhs, rhs, &dcmul, &status);
1312
    /* Only Invalid operation (from sNaN or Inf * 0) is possible in */
1313
    /* status; if either is seen than ignore fhs (in case it is */
1314
    /* another sNaN) and set acc to NaN unless we had an sNaN */
1315
    /* [decMultiplyOp leaves that to caller] */
1316
    /* Note sNaN has to go through addOp to shorten payload if */
1317
    /* necessary */
1318
    if ((status&DEC_Invalid_operation)!=0) {
1319
      if (!(status&DEC_sNaN)) {		/* but be true invalid */
1320
	decNumberZero(res);		/* acc not yet set */
1321
	res->bits=DECNAN;
1322
	break;
1323
	}
1324
      decNumberZero(&dzero);		/* make 0 (any non-NaN would do) */
1325
      fhs=&dzero;			/* use that */
1326
      }
1327
    #if DECCHECK
1328
     else { /* multiply was OK */
1329
      if (status!=0) printf("Status=%08lx after FMA multiply\n", status);
1330
      }
1331
    #endif
1332
    /* add the third operand and result -> res, and all is done */
1333
    decAddOp(res, acc, fhs, set, 0, &status);
1334
    } while(0);				/* end protected */
1335

1336
  if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
1337
  if (status!=0) decStatus(res, status, set);
1338
  #if DECCHECK
1339
  decCheckInexact(res, set);
1340
  #endif
1341
  return res;
1342
  } /* decNumberFMA */
1343

1344
/* ------------------------------------------------------------------ */
1345
/* decNumberInvert -- invert a Number, digitwise		      */
1346
/*								      */
1347
/*   This computes C = ~A					      */
1348
/*								      */
1349
/*   res is C, the result.  C may be A (e.g., X=~X)		      */
1350
/*   rhs is A							      */
1351
/*   set is the context (used for result length and error report)     */
1352
/*								      */
1353
/* C must have space for set->digits digits.			      */
1354
/*								      */
1355
/* Logical function restrictions apply (see above); a NaN is	      */
1356
/* returned with Invalid_operation if a restriction is violated.      */
1357
/* ------------------------------------------------------------------ */
1358
decNumber * decNumberInvert(decNumber *res, const decNumber *rhs,
1359
			    decContext *set) {
1360
  const Unit *ua, *msua;		/* -> operand and its msu */
1361
  Unit	*uc, *msuc;			/* -> result and its msu */
1362
  Int	msudigs;			/* digits in res msu */
1363
  #if DECCHECK
1364
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1365
  #endif
1366

1367
  if (rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
1368
    decStatus(res, DEC_Invalid_operation, set);
1369
    return res;
1370
    }
1371
  /* operand is valid */
1372
  ua=rhs->lsu;				/* bottom-up */
1373
  uc=res->lsu;				/* .. */
1374
  msua=ua+D2U(rhs->digits)-1;		/* -> msu of rhs */
1375
  msuc=uc+D2U(set->digits)-1;		/* -> msu of result */
1376
  msudigs=MSUDIGITS(set->digits);	/* [faster than remainder] */
1377
  for (; uc<=msuc; ua++, uc++) {	/* Unit loop */
1378
    Unit a;				/* extract unit */
1379
    Int	 i, j;				/* work */
1380
    if (ua>msua) a=0;
1381
     else a=*ua;
1382
    *uc=0;				/* can now write back */
1383
    /* always need to examine all bits in rhs */
1384
    /* This loop could be unrolled and/or use BIN2BCD tables */
1385
    for (i=0; i<DECDPUN; i++) {
1386
      if ((~a)&1) *uc=*uc+(Unit)powers[i];   /* effect INVERT */
1387
      j=a%10;
1388
      a=a/10;
1389
      if (j>1) {
1390
	decStatus(res, DEC_Invalid_operation, set);
1391
	return res;
1392
	}
1393
      if (uc==msuc && i==msudigs-1) break;   /* just did final digit */
1394
      } /* each digit */
1395
    } /* each unit */
1396
  /* [here uc-1 is the msu of the result] */
1397
  res->digits=decGetDigits(res->lsu, uc-res->lsu);
1398
  res->exponent=0;			/* integer */
1399
  res->bits=0;				/* sign=0 */
1400
  return res;  /* [no status to set] */
1401
  } /* decNumberInvert */
1402

1403
/* ------------------------------------------------------------------ */
1404
/* decNumberLn -- natural logarithm				      */
1405
/*								      */
1406
/*   This computes C = ln(A)					      */
1407
/*								      */
1408
/*   res is C, the result.  C may be A				      */
1409
/*   rhs is A							      */
1410
/*   set is the context; note that rounding mode has no effect	      */
1411
/*								      */
1412
/* C must have space for set->digits digits.			      */
1413
/*								      */
1414
/* Notable cases:						      */
1415
/*   A<0 -> Invalid						      */
1416
/*   A=0 -> -Infinity (Exact)					      */
1417
/*   A=+Infinity -> +Infinity (Exact)				      */
1418
/*   A=1 exactly -> 0 (Exact)					      */
1419
/*								      */
1420
/* Mathematical function restrictions apply (see above); a NaN is     */
1421
/* returned with Invalid_operation if a restriction is violated.      */
1422
/*								      */
1423
/* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
1424
/* almost always be correctly rounded, but may be up to 1 ulp in      */
1425
/* error in rare cases.						      */
1426
/* ------------------------------------------------------------------ */
1427
/* This is a wrapper for decLnOp which can handle the slightly wider  */
1428
/* (+11) range needed by Ln, Log10, etc. (which may have to be able   */
1429
/* to calculate at p+e+2).					      */
1430
/* ------------------------------------------------------------------ */
1431
decNumber * decNumberLn(decNumber *res, const decNumber *rhs,
1432
			decContext *set) {
1433
  uInt status=0;		   /* accumulator */
1434
  #if DECSUBSET
1435
  decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
1436
  #endif
1437

1438
  #if DECCHECK
1439
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1440
  #endif
1441

1442
  /* Check restrictions; this is a math function; if not violated */
1443
  /* then carry out the operation. */
1444
  if (!decCheckMath(rhs, set, &status)) do { /* protect allocation */
1445
    #if DECSUBSET
1446
    if (!set->extended) {
1447
      /* reduce operand and set lostDigits status, as needed */
1448
      if (rhs->digits>set->digits) {
1449
	allocrhs=decRoundOperand(rhs, set, &status);
1450
	if (allocrhs==NULL) break;
1451
	rhs=allocrhs;
1452
	}
1453
      /* special check in subset for rhs=0 */
1454
      if (ISZERO(rhs)) {		/* +/- zeros -> error */
1455
	status|=DEC_Invalid_operation;
1456
	break;}
1457
      } /* extended=0 */
1458
    #endif
1459
    decLnOp(res, rhs, set, &status);
1460
    } while(0);				/* end protected */
1461

1462
  #if DECSUBSET
1463
  if (allocrhs !=NULL) free(allocrhs);	/* drop any storage used */
1464
  #endif
1465
  /* apply significant status */
1466
  if (status!=0) decStatus(res, status, set);
1467
  #if DECCHECK
1468
  decCheckInexact(res, set);
1469
  #endif
1470
  return res;
1471
  } /* decNumberLn */
1472

1473
/* ------------------------------------------------------------------ */
1474
/* decNumberLogB - get adjusted exponent, by 754r rules		      */
1475
/*								      */
1476
/*   This computes C = adjustedexponent(A)			      */
1477
/*								      */
1478
/*   res is C, the result.  C may be A				      */
1479
/*   rhs is A							      */
1480
/*   set is the context, used only for digits and status	      */
1481
/*								      */
1482
/* C must have space for 10 digits (A might have 10**9 digits and     */
1483
/* an exponent of +999999999, or one digit and an exponent of	      */
1484
/* -1999999999).						      */
1485
/*								      */
1486
/* This returns the adjusted exponent of A after (in theory) padding  */
1487
/* with zeros on the right to set->digits digits while keeping the    */
1488
/* same value.	The exponent is not limited by emin/emax.	      */
1489
/*								      */
1490
/* Notable cases:						      */
1491
/*   A<0 -> Use |A|						      */
1492
/*   A=0 -> -Infinity (Division by zero)			      */
1493
/*   A=Infinite -> +Infinity (Exact)				      */
1494
/*   A=1 exactly -> 0 (Exact)					      */
1495
/*   NaNs are propagated as usual				      */
1496
/* ------------------------------------------------------------------ */
1497
decNumber * decNumberLogB(decNumber *res, const decNumber *rhs,
1498
			  decContext *set) {
1499
  uInt status=0;		   /* accumulator */
1500

1501
  #if DECCHECK
1502
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1503
  #endif
1504

1505
  /* NaNs as usual; Infinities return +Infinity; 0->oops */
1506
  if (decNumberIsNaN(rhs)) decNaNs(res, rhs, NULL, set, &status);
1507
   else if (decNumberIsInfinite(rhs)) decNumberCopyAbs(res, rhs);
1508
   else if (decNumberIsZero(rhs)) {
1509
    decNumberZero(res);			/* prepare for Infinity */
1510
    res->bits=DECNEG|DECINF;		/* -Infinity */
1511
    status|=DEC_Division_by_zero;	/* as per 754r */
1512
    }
1513
   else { /* finite non-zero */
1514
    Int ae=rhs->exponent+rhs->digits-1; /* adjusted exponent */
1515
    decNumberFromInt32(res, ae);	/* lay it out */
1516
    }
1517

1518
  if (status!=0) decStatus(res, status, set);
1519
  return res;
1520
  } /* decNumberLogB */
1521

1522
/* ------------------------------------------------------------------ */
1523
/* decNumberLog10 -- logarithm in base 10			      */
1524
/*								      */
1525
/*   This computes C = log10(A)					      */
1526
/*								      */
1527
/*   res is C, the result.  C may be A				      */
1528
/*   rhs is A							      */
1529
/*   set is the context; note that rounding mode has no effect	      */
1530
/*								      */
1531
/* C must have space for set->digits digits.			      */
1532
/*								      */
1533
/* Notable cases:						      */
1534
/*   A<0 -> Invalid						      */
1535
/*   A=0 -> -Infinity (Exact)					      */
1536
/*   A=+Infinity -> +Infinity (Exact)				      */
1537
/*   A=10**n (if n is an integer) -> n (Exact)			      */
1538
/*								      */
1539
/* Mathematical function restrictions apply (see above); a NaN is     */
1540
/* returned with Invalid_operation if a restriction is violated.      */
1541
/*								      */
1542
/* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
1543
/* almost always be correctly rounded, but may be up to 1 ulp in      */
1544
/* error in rare cases.						      */
1545
/* ------------------------------------------------------------------ */
1546
/* This calculates ln(A)/ln(10) using appropriate precision.  For     */
1547
/* ln(A) this is the max(p, rhs->digits + t) + 3, where p is the      */
1548
/* requested digits and t is the number of digits in the exponent     */
1549
/* (maximum 6).	 For ln(10) it is p + 3; this is often handled by the */
1550
/* fastpath in decLnOp.	 The final division is done to the requested  */
1551
/* precision.							      */
1552
/* ------------------------------------------------------------------ */
1553
decNumber * decNumberLog10(decNumber *res, const decNumber *rhs,
1554
			  decContext *set) {
1555
  uInt status=0, ignore=0;	   /* status accumulators */
1556
  uInt needbytes;		   /* for space calculations */
1557
  Int p;			   /* working precision */
1558
  Int t;			   /* digits in exponent of A */
1559

1560
  /* buffers for a and b working decimals */
1561
  /* (adjustment calculator, same size) */
1562
  decNumber bufa[D2N(DECBUFFER+2)];
1563
  decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
1564
  decNumber *a=bufa;		   /* temporary a */
1565
  decNumber bufb[D2N(DECBUFFER+2)];
1566
  decNumber *allocbufb=NULL;	   /* -> allocated bufb, iff allocated */
1567
  decNumber *b=bufb;		   /* temporary b */
1568
  decNumber bufw[D2N(10)];	   /* working 2-10 digit number */
1569
  decNumber *w=bufw;		   /* .. */
1570
  #if DECSUBSET
1571
  decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
1572
  #endif
1573

1574
  decContext aset;		   /* working context */
1575

1576
  #if DECCHECK
1577
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1578
  #endif
1579

1580
  /* Check restrictions; this is a math function; if not violated */
1581
  /* then carry out the operation. */
1582
  if (!decCheckMath(rhs, set, &status)) do { /* protect malloc */
1583
    #if DECSUBSET
1584
    if (!set->extended) {
1585
      /* reduce operand and set lostDigits status, as needed */
1586
      if (rhs->digits>set->digits) {
1587
	allocrhs=decRoundOperand(rhs, set, &status);
1588
	if (allocrhs==NULL) break;
1589
	rhs=allocrhs;
1590
	}
1591
      /* special check in subset for rhs=0 */
1592
      if (ISZERO(rhs)) {		/* +/- zeros -> error */
1593
	status|=DEC_Invalid_operation;
1594
	break;}
1595
      } /* extended=0 */
1596
    #endif
1597

1598
    decContextDefault(&aset, DEC_INIT_DECIMAL64); /* clean context */
1599

1600
    /* handle exact powers of 10; only check if +ve finite */
1601
    if (!(rhs->bits&(DECNEG|DECSPECIAL)) && !ISZERO(rhs)) {
1602
      Int residue=0;		   /* (no residue) */
1603
      uInt copystat=0;		   /* clean status */
1604

1605
      /* round to a single digit... */
1606
      aset.digits=1;
1607
      decCopyFit(w, rhs, &aset, &residue, &copystat); /* copy & shorten */
1608
      /* if exact and the digit is 1, rhs is a power of 10 */
1609
      if (!(copystat&DEC_Inexact) && w->lsu[0]==1) {
1610
	/* the exponent, conveniently, is the power of 10; making */
1611
	/* this the result needs a little care as it might not fit, */
1612
	/* so first convert it into the working number, and then move */
1613
	/* to res */
1614
	decNumberFromInt32(w, w->exponent);
1615
	residue=0;
1616
	decCopyFit(res, w, set, &residue, &status); /* copy & round */
1617
	decFinish(res, set, &residue, &status);	    /* cleanup/set flags */
1618
	break;
1619
	} /* not a power of 10 */
1620
      } /* not a candidate for exact */
1621

1622
    /* simplify the information-content calculation to use 'total */
1623
    /* number of digits in a, including exponent' as compared to the */
1624
    /* requested digits, as increasing this will only rarely cost an */
1625
    /* iteration in ln(a) anyway */
1626
    t=6;				/* it can never be >6 */
1627

1628
    /* allocate space when needed... */
1629
    p=(rhs->digits+t>set->digits?rhs->digits+t:set->digits)+3;
1630
    needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
1631
    if (needbytes>sizeof(bufa)) {	/* need malloc space */
1632
      allocbufa=(decNumber *)malloc(needbytes);
1633
      if (allocbufa==NULL) {		/* hopeless -- abandon */
1634
	status|=DEC_Insufficient_storage;
1635
	break;}
1636
      a=allocbufa;			/* use the allocated space */
1637
      }
1638
    aset.digits=p;			/* as calculated */
1639
    aset.emax=DEC_MAX_MATH;		/* usual bounds */
1640
    aset.emin=-DEC_MAX_MATH;		/* .. */
1641
    aset.clamp=0;			/* and no concrete format */
1642
    decLnOp(a, rhs, &aset, &status);	/* a=ln(rhs) */
1643

1644
    /* skip the division if the result so far is infinite, NaN, or */
1645
    /* zero, or there was an error; note NaN from sNaN needs copy */
1646
    if (status&DEC_NaNs && !(status&DEC_sNaN)) break;
1647
    if (a->bits&DECSPECIAL || ISZERO(a)) {
1648
      decNumberCopy(res, a);		/* [will fit] */
1649
      break;}
1650

1651
    /* for ln(10) an extra 3 digits of precision are needed */
1652
    p=set->digits+3;
1653
    needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
1654
    if (needbytes>sizeof(bufb)) {	/* need malloc space */
1655
      allocbufb=(decNumber *)malloc(needbytes);
1656
      if (allocbufb==NULL) {		/* hopeless -- abandon */
1657
	status|=DEC_Insufficient_storage;
1658
	break;}
1659
      b=allocbufb;			/* use the allocated space */
1660
      }
1661
    decNumberZero(w);			/* set up 10... */
1662
    #if DECDPUN==1
1663
    w->lsu[1]=1; w->lsu[0]=0;		/* .. */
1664
    #else
1665
    w->lsu[0]=10;			/* .. */
1666
    #endif
1667
    w->digits=2;			/* .. */
1668

1669
    aset.digits=p;
1670
    decLnOp(b, w, &aset, &ignore);	/* b=ln(10) */
1671

1672
    aset.digits=set->digits;		/* for final divide */
1673
    decDivideOp(res, a, b, &aset, DIVIDE, &status); /* into result */
1674
    } while(0);				/* [for break] */
1675

1676
  if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
1677
  if (allocbufb!=NULL) free(allocbufb); /* .. */
1678
  #if DECSUBSET
1679
  if (allocrhs !=NULL) free(allocrhs);	/* .. */
1680
  #endif
1681
  /* apply significant status */
1682
  if (status!=0) decStatus(res, status, set);
1683
  #if DECCHECK
1684
  decCheckInexact(res, set);
1685
  #endif
1686
  return res;
1687
  } /* decNumberLog10 */
1688

1689
/* ------------------------------------------------------------------ */
1690
/* decNumberMax -- compare two Numbers and return the maximum	      */
1691
/*								      */
1692
/*   This computes C = A ? B, returning the maximum by 754R rules     */
1693
/*								      */
1694
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
1695
/*   lhs is A							      */
1696
/*   rhs is B							      */
1697
/*   set is the context						      */
1698
/*								      */
1699
/* C must have space for set->digits digits.			      */
1700
/* ------------------------------------------------------------------ */
1701
decNumber * decNumberMax(decNumber *res, const decNumber *lhs,
1702
			 const decNumber *rhs, decContext *set) {
1703
  uInt status=0;			/* accumulator */
1704
  decCompareOp(res, lhs, rhs, set, COMPMAX, &status);
1705
  if (status!=0) decStatus(res, status, set);
1706
  #if DECCHECK
1707
  decCheckInexact(res, set);
1708
  #endif
1709
  return res;
1710
  } /* decNumberMax */
1711

1712
/* ------------------------------------------------------------------ */
1713
/* decNumberMaxMag -- compare and return the maximum by magnitude     */
1714
/*								      */
1715
/*   This computes C = A ? B, returning the maximum by 754R rules     */
1716
/*								      */
1717
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
1718
/*   lhs is A							      */
1719
/*   rhs is B							      */
1720
/*   set is the context						      */
1721
/*								      */
1722
/* C must have space for set->digits digits.			      */
1723
/* ------------------------------------------------------------------ */
1724
decNumber * decNumberMaxMag(decNumber *res, const decNumber *lhs,
1725
			 const decNumber *rhs, decContext *set) {
1726
  uInt status=0;			/* accumulator */
1727
  decCompareOp(res, lhs, rhs, set, COMPMAXMAG, &status);
1728
  if (status!=0) decStatus(res, status, set);
1729
  #if DECCHECK
1730
  decCheckInexact(res, set);
1731
  #endif
1732
  return res;
1733
  } /* decNumberMaxMag */
1734

1735
/* ------------------------------------------------------------------ */
1736
/* decNumberMin -- compare two Numbers and return the minimum	      */
1737
/*								      */
1738
/*   This computes C = A ? B, returning the minimum by 754R rules     */
1739
/*								      */
1740
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
1741
/*   lhs is A							      */
1742
/*   rhs is B							      */
1743
/*   set is the context						      */
1744
/*								      */
1745
/* C must have space for set->digits digits.			      */
1746
/* ------------------------------------------------------------------ */
1747
decNumber * decNumberMin(decNumber *res, const decNumber *lhs,
1748
			 const decNumber *rhs, decContext *set) {
1749
  uInt status=0;			/* accumulator */
1750
  decCompareOp(res, lhs, rhs, set, COMPMIN, &status);
1751
  if (status!=0) decStatus(res, status, set);
1752
  #if DECCHECK
1753
  decCheckInexact(res, set);
1754
  #endif
1755
  return res;
1756
  } /* decNumberMin */
1757

1758
/* ------------------------------------------------------------------ */
1759
/* decNumberMinMag -- compare and return the minimum by magnitude     */
1760
/*								      */
1761
/*   This computes C = A ? B, returning the minimum by 754R rules     */
1762
/*								      */
1763
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
1764
/*   lhs is A							      */
1765
/*   rhs is B							      */
1766
/*   set is the context						      */
1767
/*								      */
1768
/* C must have space for set->digits digits.			      */
1769
/* ------------------------------------------------------------------ */
1770
decNumber * decNumberMinMag(decNumber *res, const decNumber *lhs,
1771
			 const decNumber *rhs, decContext *set) {
1772
  uInt status=0;			/* accumulator */
1773
  decCompareOp(res, lhs, rhs, set, COMPMINMAG, &status);
1774
  if (status!=0) decStatus(res, status, set);
1775
  #if DECCHECK
1776
  decCheckInexact(res, set);
1777
  #endif
1778
  return res;
1779
  } /* decNumberMinMag */
1780

1781
/* ------------------------------------------------------------------ */
1782
/* decNumberMinus -- prefix minus operator			      */
1783
/*								      */
1784
/*   This computes C = 0 - A					      */
1785
/*								      */
1786
/*   res is C, the result.  C may be A				      */
1787
/*   rhs is A							      */
1788
/*   set is the context						      */
1789
/*								      */
1790
/* See also decNumberCopyNegate for a quiet bitwise version of this.  */
1791
/* C must have space for set->digits digits.			      */
1792
/* ------------------------------------------------------------------ */
1793
/* Simply use AddOp for the subtract, which will do the necessary.    */
1794
/* ------------------------------------------------------------------ */
1795
decNumber * decNumberMinus(decNumber *res, const decNumber *rhs,
1796
			   decContext *set) {
1797
  decNumber dzero;
1798
  uInt status=0;			/* accumulator */
1799

1800
  #if DECCHECK
1801
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1802
  #endif
1803

1804
  decNumberZero(&dzero);		/* make 0 */
1805
  dzero.exponent=rhs->exponent;		/* [no coefficient expansion] */
1806
  decAddOp(res, &dzero, rhs, set, DECNEG, &status);
1807
  if (status!=0) decStatus(res, status, set);
1808
  #if DECCHECK
1809
  decCheckInexact(res, set);
1810
  #endif
1811
  return res;
1812
  } /* decNumberMinus */
1813

1814
/* ------------------------------------------------------------------ */
1815
/* decNumberNextMinus -- next towards -Infinity			      */
1816
/*								      */
1817
/*   This computes C = A - infinitesimal, rounded towards -Infinity   */
1818
/*								      */
1819
/*   res is C, the result.  C may be A				      */
1820
/*   rhs is A							      */
1821
/*   set is the context						      */
1822
/*								      */
1823
/* This is a generalization of 754r NextDown.			      */
1824
/* ------------------------------------------------------------------ */
1825
decNumber * decNumberNextMinus(decNumber *res, const decNumber *rhs,
1826
			       decContext *set) {
1827
  decNumber dtiny;			     /* constant */
1828
  decContext workset=*set;		     /* work */
1829
  uInt status=0;			     /* accumulator */
1830
  #if DECCHECK
1831
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1832
  #endif
1833

1834
  /* +Infinity is the special case */
1835
  if ((rhs->bits&(DECINF|DECNEG))==DECINF) {
1836
    decSetMaxValue(res, set);		     /* is +ve */
1837
    /* there is no status to set */
1838
    return res;
1839
    }
1840
  decNumberZero(&dtiny);		     /* start with 0 */
1841
  dtiny.lsu[0]=1;			     /* make number that is .. */
1842
  dtiny.exponent=DEC_MIN_EMIN-1;	     /* .. smaller than tiniest */
1843
  workset.round=DEC_ROUND_FLOOR;
1844
  decAddOp(res, rhs, &dtiny, &workset, DECNEG, &status);
1845
  status&=DEC_Invalid_operation|DEC_sNaN;    /* only sNaN Invalid please */
1846
  if (status!=0) decStatus(res, status, set);
1847
  return res;
1848
  } /* decNumberNextMinus */
1849

1850
/* ------------------------------------------------------------------ */
1851
/* decNumberNextPlus -- next towards +Infinity			      */
1852
/*								      */
1853
/*   This computes C = A + infinitesimal, rounded towards +Infinity   */
1854
/*								      */
1855
/*   res is C, the result.  C may be A				      */
1856
/*   rhs is A							      */
1857
/*   set is the context						      */
1858
/*								      */
1859
/* This is a generalization of 754r NextUp.			      */
1860
/* ------------------------------------------------------------------ */
1861
decNumber * decNumberNextPlus(decNumber *res, const decNumber *rhs,
1862
			      decContext *set) {
1863
  decNumber dtiny;			     /* constant */
1864
  decContext workset=*set;		     /* work */
1865
  uInt status=0;			     /* accumulator */
1866
  #if DECCHECK
1867
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1868
  #endif
1869

1870
  /* -Infinity is the special case */
1871
  if ((rhs->bits&(DECINF|DECNEG))==(DECINF|DECNEG)) {
1872
    decSetMaxValue(res, set);
1873
    res->bits=DECNEG;			     /* negative */
1874
    /* there is no status to set */
1875
    return res;
1876
    }
1877
  decNumberZero(&dtiny);		     /* start with 0 */
1878
  dtiny.lsu[0]=1;			     /* make number that is .. */
1879
  dtiny.exponent=DEC_MIN_EMIN-1;	     /* .. smaller than tiniest */
1880
  workset.round=DEC_ROUND_CEILING;
1881
  decAddOp(res, rhs, &dtiny, &workset, 0, &status);
1882
  status&=DEC_Invalid_operation|DEC_sNaN;    /* only sNaN Invalid please */
1883
  if (status!=0) decStatus(res, status, set);
1884
  return res;
1885
  } /* decNumberNextPlus */
1886

1887
/* ------------------------------------------------------------------ */
1888
/* decNumberNextToward -- next towards rhs			      */
1889
/*								      */
1890
/*   This computes C = A +/- infinitesimal, rounded towards	      */
1891
/*   +/-Infinity in the direction of B, as per 754r nextafter rules   */
1892
/*								      */
1893
/*   res is C, the result.  C may be A or B.			      */
1894
/*   lhs is A							      */
1895
/*   rhs is B							      */
1896
/*   set is the context						      */
1897
/*								      */
1898
/* This is a generalization of 754r NextAfter.			      */
1899
/* ------------------------------------------------------------------ */
1900
decNumber * decNumberNextToward(decNumber *res, const decNumber *lhs,
1901
				const decNumber *rhs, decContext *set) {
1902
  decNumber dtiny;			     /* constant */
1903
  decContext workset=*set;		     /* work */
1904
  Int result;				     /* .. */
1905
  uInt status=0;			     /* accumulator */
1906
  #if DECCHECK
1907
  if (decCheckOperands(res, lhs, rhs, set)) return res;
1908
  #endif
1909

1910
  if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs)) {
1911
    decNaNs(res, lhs, rhs, set, &status);
1912
    }
1913
   else { /* Is numeric, so no chance of sNaN Invalid, etc. */
1914
    result=decCompare(lhs, rhs, 0);	/* sign matters */
1915
    if (result==BADINT) status|=DEC_Insufficient_storage; /* rare */
1916
     else { /* valid compare */
1917
      if (result==0) decNumberCopySign(res, lhs, rhs); /* easy */
1918
       else { /* differ: need NextPlus or NextMinus */
1919
	uByte sub;			/* add or subtract */
1920
	if (result<0) {			/* lhs<rhs, do nextplus */
1921
	  /* -Infinity is the special case */
1922
	  if ((lhs->bits&(DECINF|DECNEG))==(DECINF|DECNEG)) {
1923
	    decSetMaxValue(res, set);
1924
	    res->bits=DECNEG;		/* negative */
1925
	    return res;			/* there is no status to set */
1926
	    }
1927
	  workset.round=DEC_ROUND_CEILING;
1928
	  sub=0;			/* add, please */
1929
	  } /* plus */
1930
	 else {				/* lhs>rhs, do nextminus */
1931
	  /* +Infinity is the special case */
1932
	  if ((lhs->bits&(DECINF|DECNEG))==DECINF) {
1933
	    decSetMaxValue(res, set);
1934
	    return res;			/* there is no status to set */
1935
	    }
1936
	  workset.round=DEC_ROUND_FLOOR;
1937
	  sub=DECNEG;			/* subtract, please */
1938
	  } /* minus */
1939
	decNumberZero(&dtiny);		/* start with 0 */
1940
	dtiny.lsu[0]=1;			/* make number that is .. */
1941
	dtiny.exponent=DEC_MIN_EMIN-1;	/* .. smaller than tiniest */
1942
	decAddOp(res, lhs, &dtiny, &workset, sub, &status); /* + or - */
1943
	/* turn off exceptions if the result is a normal number */
1944
	/* (including Nmin), otherwise let all status through */
1945
	if (decNumberIsNormal(res, set)) status=0;
1946
	} /* unequal */
1947
      } /* compare OK */
1948
    } /* numeric */
1949
  if (status!=0) decStatus(res, status, set);
1950
  return res;
1951
  } /* decNumberNextToward */
1952

1953
/* ------------------------------------------------------------------ */
1954
/* decNumberOr -- OR two Numbers, digitwise			      */
1955
/*								      */
1956
/*   This computes C = A | B					      */
1957
/*								      */
1958
/*   res is C, the result.  C may be A and/or B (e.g., X=X|X)	      */
1959
/*   lhs is A							      */
1960
/*   rhs is B							      */
1961
/*   set is the context (used for result length and error report)     */
1962
/*								      */
1963
/* C must have space for set->digits digits.			      */
1964
/*								      */
1965
/* Logical function restrictions apply (see above); a NaN is	      */
1966
/* returned with Invalid_operation if a restriction is violated.      */
1967
/* ------------------------------------------------------------------ */
1968
decNumber * decNumberOr(decNumber *res, const decNumber *lhs,
1969
			const decNumber *rhs, decContext *set) {
1970
  const Unit *ua, *ub;			/* -> operands */
1971
  const Unit *msua, *msub;		/* -> operand msus */
1972
  Unit	*uc, *msuc;			/* -> result and its msu */
1973
  Int	msudigs;			/* digits in res msu */
1974
  #if DECCHECK
1975
  if (decCheckOperands(res, lhs, rhs, set)) return res;
1976
  #endif
1977

1978
  if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
1979
   || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
1980
    decStatus(res, DEC_Invalid_operation, set);
1981
    return res;
1982
    }
1983
  /* operands are valid */
1984
  ua=lhs->lsu;				/* bottom-up */
1985
  ub=rhs->lsu;				/* .. */
1986
  uc=res->lsu;				/* .. */
1987
  msua=ua+D2U(lhs->digits)-1;		/* -> msu of lhs */
1988
  msub=ub+D2U(rhs->digits)-1;		/* -> msu of rhs */
1989
  msuc=uc+D2U(set->digits)-1;		/* -> msu of result */
1990
  msudigs=MSUDIGITS(set->digits);	/* [faster than remainder] */
1991
  for (; uc<=msuc; ua++, ub++, uc++) {	/* Unit loop */
1992
    Unit a, b;				/* extract units */
1993
    if (ua>msua) a=0;
1994
     else a=*ua;
1995
    if (ub>msub) b=0;
1996
     else b=*ub;
1997
    *uc=0;				/* can now write back */
1998
    if (a|b) {				/* maybe 1 bits to examine */
1999
      Int i, j;
2000
      /* This loop could be unrolled and/or use BIN2BCD tables */
2001
      for (i=0; i<DECDPUN; i++) {
2002
	if ((a|b)&1) *uc=*uc+(Unit)powers[i];	  /* effect OR */
2003
	j=a%10;
2004
	a=a/10;
2005
	j|=b%10;
2006
	b=b/10;
2007
	if (j>1) {
2008
	  decStatus(res, DEC_Invalid_operation, set);
2009
	  return res;
2010
	  }
2011
	if (uc==msuc && i==msudigs-1) break;	  /* just did final digit */
2012
	} /* each digit */
2013
      } /* non-zero */
2014
    } /* each unit */
2015
  /* [here uc-1 is the msu of the result] */
2016
  res->digits=decGetDigits(res->lsu, uc-res->lsu);
2017
  res->exponent=0;			/* integer */
2018
  res->bits=0;				/* sign=0 */
2019
  return res;  /* [no status to set] */
2020
  } /* decNumberOr */
2021

2022
/* ------------------------------------------------------------------ */
2023
/* decNumberPlus -- prefix plus operator			      */
2024
/*								      */
2025
/*   This computes C = 0 + A					      */
2026
/*								      */
2027
/*   res is C, the result.  C may be A				      */
2028
/*   rhs is A							      */
2029
/*   set is the context						      */
2030
/*								      */
2031
/* See also decNumberCopy for a quiet bitwise version of this.	      */
2032
/* C must have space for set->digits digits.			      */
2033
/* ------------------------------------------------------------------ */
2034
/* This simply uses AddOp; Add will take fast path after preparing A. */
2035
/* Performance is a concern here, as this routine is often used to    */
2036
/* check operands and apply rounding and overflow/underflow testing.  */
2037
/* ------------------------------------------------------------------ */
2038
decNumber * decNumberPlus(decNumber *res, const decNumber *rhs,
2039
			  decContext *set) {
2040
  decNumber dzero;
2041
  uInt status=0;			/* accumulator */
2042
  #if DECCHECK
2043
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
2044
  #endif
2045

2046
  decNumberZero(&dzero);		/* make 0 */
2047
  dzero.exponent=rhs->exponent;		/* [no coefficient expansion] */
2048
  decAddOp(res, &dzero, rhs, set, 0, &status);
2049
  if (status!=0) decStatus(res, status, set);
2050
  #if DECCHECK
2051
  decCheckInexact(res, set);
2052
  #endif
2053
  return res;
2054
  } /* decNumberPlus */
2055

2056
/* ------------------------------------------------------------------ */
2057
/* decNumberMultiply -- multiply two Numbers			      */
2058
/*								      */
2059
/*   This computes C = A x B					      */
2060
/*								      */
2061
/*   res is C, the result.  C may be A and/or B (e.g., X=X+X)	      */
2062
/*   lhs is A							      */
2063
/*   rhs is B							      */
2064
/*   set is the context						      */
2065
/*								      */
2066
/* C must have space for set->digits digits.			      */
2067
/* ------------------------------------------------------------------ */
2068
decNumber * decNumberMultiply(decNumber *res, const decNumber *lhs,
2069
			      const decNumber *rhs, decContext *set) {
2070
  uInt status=0;		   /* accumulator */
2071
  decMultiplyOp(res, lhs, rhs, set, &status);
2072
  if (status!=0) decStatus(res, status, set);
2073
  #if DECCHECK
2074
  decCheckInexact(res, set);
2075
  #endif
2076
  return res;
2077
  } /* decNumberMultiply */
2078

2079
/* ------------------------------------------------------------------ */
2080
/* decNumberPower -- raise a number to a power			      */
2081
/*								      */
2082
/*   This computes C = A ** B					      */
2083
/*								      */
2084
/*   res is C, the result.  C may be A and/or B (e.g., X=X**X)	      */
2085
/*   lhs is A							      */
2086
/*   rhs is B							      */
2087
/*   set is the context						      */
2088
/*								      */
2089
/* C must have space for set->digits digits.			      */
2090
/*								      */
2091
/* Mathematical function restrictions apply (see above); a NaN is     */
2092
/* returned with Invalid_operation if a restriction is violated.      */
2093
/*								      */
2094
/* However, if 1999999997<=B<=999999999 and B is an integer then the  */
2095
/* restrictions on A and the context are relaxed to the usual bounds, */
2096
/* for compatibility with the earlier (integer power only) version    */
2097
/* of this function.						      */
2098
/*								      */
2099
/* When B is an integer, the result may be exact, even if rounded.    */
2100
/*								      */
2101
/* The final result is rounded according to the context; it will      */
2102
/* almost always be correctly rounded, but may be up to 1 ulp in      */
2103
/* error in rare cases.						      */
2104
/* ------------------------------------------------------------------ */
2105
decNumber * decNumberPower(decNumber *res, const decNumber *lhs,
2106
			   const decNumber *rhs, decContext *set) {
2107
  #if DECSUBSET
2108
  decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
2109
  decNumber *allocrhs=NULL;	   /* .., rhs */
2110
  #endif
2111
  decNumber *allocdac=NULL;	   /* -> allocated acc buffer, iff used */
2112
  decNumber *allocinv=NULL;	   /* -> allocated 1/x buffer, iff used */
2113
  Int	reqdigits=set->digits;	   /* requested DIGITS */
2114
  Int	n;			   /* rhs in binary */
2115
  Flag	rhsint=0;		   /* 1 if rhs is an integer */
2116
  Flag	useint=0;		   /* 1 if can use integer calculation */
2117
  Flag	isoddint=0;		   /* 1 if rhs is an integer and odd */
2118
  Int	i;			   /* work */
2119
  #if DECSUBSET
2120
  Int	dropped;		   /* .. */
2121
  #endif
2122
  uInt	needbytes;		   /* buffer size needed */
2123
  Flag	seenbit;		   /* seen a bit while powering */
2124
  Int	residue=0;		   /* rounding residue */
2125
  uInt	status=0;		   /* accumulators */
2126
  uByte bits=0;			   /* result sign if errors */
2127
  decContext aset;		   /* working context */
2128
  decNumber dnOne;		   /* work value 1... */
2129
  /* local accumulator buffer [a decNumber, with digits+elength+1 digits] */
2130
  decNumber dacbuff[D2N(DECBUFFER+9)];
2131
  decNumber *dac=dacbuff;	   /* -> result accumulator */
2132
  /* same again for possible 1/lhs calculation */
2133
  decNumber invbuff[D2N(DECBUFFER+9)];
2134

2135
  #if DECCHECK
2136
  if (decCheckOperands(res, lhs, rhs, set)) return res;
2137
  #endif
2138

2139
  do {				   /* protect allocated storage */
2140
    #if DECSUBSET
2141
    if (!set->extended) { /* reduce operands and set status, as needed */
2142
      if (lhs->digits>reqdigits) {
2143
	alloclhs=decRoundOperand(lhs, set, &status);
2144
	if (alloclhs==NULL) break;
2145
	lhs=alloclhs;
2146
	}
2147
      if (rhs->digits>reqdigits) {
2148
	allocrhs=decRoundOperand(rhs, set, &status);
2149
	if (allocrhs==NULL) break;
2150
	rhs=allocrhs;
2151
	}
2152
      }
2153
    #endif
2154
    /* [following code does not require input rounding] */
2155

2156
    /* handle NaNs and rhs Infinity (lhs infinity is harder) */
2157
    if (SPECIALARGS) {
2158
      if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs)) { /* NaNs */
2159
	decNaNs(res, lhs, rhs, set, &status);
2160
	break;}
2161
      if (decNumberIsInfinite(rhs)) {	/* rhs Infinity */
2162
	Flag rhsneg=rhs->bits&DECNEG;	/* save rhs sign */
2163
	if (decNumberIsNegative(lhs)	/* lhs<0 */
2164
	 && !decNumberIsZero(lhs))	/* .. */
2165
	  status|=DEC_Invalid_operation;
2166
	 else {				/* lhs >=0 */
2167
	  decNumberZero(&dnOne);	/* set up 1 */
2168
	  dnOne.lsu[0]=1;
2169
	  decNumberCompare(dac, lhs, &dnOne, set); /* lhs ? 1 */
2170
	  decNumberZero(res);		/* prepare for 0/1/Infinity */
2171
	  if (decNumberIsNegative(dac)) {    /* lhs<1 */
2172
	    if (rhsneg) res->bits|=DECINF;   /* +Infinity [else is +0] */
2173
	    }
2174
	   else if (dac->lsu[0]==0) {	     /* lhs=1 */
2175
	    /* 1**Infinity is inexact, so return fully-padded 1.0000 */
2176
	    Int shift=set->digits-1;
2177
	    *res->lsu=1;		     /* was 0, make int 1 */
2178
	    res->digits=decShiftToMost(res->lsu, 1, shift);
2179
	    res->exponent=-shift;	     /* make 1.0000... */
2180
	    status|=DEC_Inexact|DEC_Rounded; /* deemed inexact */
2181
	    }
2182
	   else {			     /* lhs>1 */
2183
	    if (!rhsneg) res->bits|=DECINF;  /* +Infinity [else is +0] */
2184
	    }
2185
	  } /* lhs>=0 */
2186
	break;}
2187
      /* [lhs infinity drops through] */
2188
      } /* specials */
2189

2190
    /* Original rhs may be an integer that fits and is in range */
2191
    n=decGetInt(rhs);
2192
    if (n!=BADINT) {			/* it is an integer */
2193
      rhsint=1;				/* record the fact for 1**n */
2194
      isoddint=(Flag)n&1;		/* [works even if big] */
2195
      if (n!=BIGEVEN && n!=BIGODD)	/* can use integer path? */
2196
	useint=1;			/* looks good */
2197
      }
2198

2199
    if (decNumberIsNegative(lhs)	/* -x .. */
2200
      && isoddint) bits=DECNEG;		/* .. to an odd power */
2201

2202
    /* handle LHS infinity */
2203
    if (decNumberIsInfinite(lhs)) {	/* [NaNs already handled] */
2204
      uByte rbits=rhs->bits;		/* save */
2205
      decNumberZero(res);		/* prepare */
2206
      if (n==0) *res->lsu=1;		/* [-]Inf**0 => 1 */
2207
       else {
2208
	/* -Inf**nonint -> error */
2209
	if (!rhsint && decNumberIsNegative(lhs)) {
2210
	  status|=DEC_Invalid_operation;     /* -Inf**nonint is error */
2211
	  break;}
2212
	if (!(rbits & DECNEG)) bits|=DECINF; /* was not a **-n */
2213
	/* [otherwise will be 0 or -0] */
2214
	res->bits=bits;
2215
	}
2216
      break;}
2217

2218
    /* similarly handle LHS zero */
2219
    if (decNumberIsZero(lhs)) {
2220
      if (n==0) {			     /* 0**0 => Error */
2221
	#if DECSUBSET
2222
	if (!set->extended) {		     /* [unless subset] */
2223
	  decNumberZero(res);
2224
	  *res->lsu=1;			     /* return 1 */
2225
	  break;}
2226
	#endif
2227
	status|=DEC_Invalid_operation;
2228
	}
2229
       else {				     /* 0**x */
2230
	uByte rbits=rhs->bits;		     /* save */
2231
	if (rbits & DECNEG) {		     /* was a 0**(-n) */
2232
	  #if DECSUBSET
2233
	  if (!set->extended) {		     /* [bad if subset] */
2234
	    status|=DEC_Invalid_operation;
2235
	    break;}
2236
	  #endif
2237
	  bits|=DECINF;
2238
	  }
2239
	decNumberZero(res);		     /* prepare */
2240
	/* [otherwise will be 0 or -0] */
2241
	res->bits=bits;
2242
	}
2243
      break;}
2244

2245
    /* here both lhs and rhs are finite; rhs==0 is handled in the */
2246
    /* integer path.  Next handle the non-integer cases */
2247
    if (!useint) {			/* non-integral rhs */
2248
      /* any -ve lhs is bad, as is either operand or context out of */
2249
      /* bounds */
2250
      if (decNumberIsNegative(lhs)) {
2251
	status|=DEC_Invalid_operation;
2252
	break;}
2253
      if (decCheckMath(lhs, set, &status)
2254
       || decCheckMath(rhs, set, &status)) break; /* variable status */
2255

2256
      decContextDefault(&aset, DEC_INIT_DECIMAL64); /* clean context */
2257
      aset.emax=DEC_MAX_MATH;		/* usual bounds */
2258
      aset.emin=-DEC_MAX_MATH;		/* .. */
2259
      aset.clamp=0;			/* and no concrete format */
2260

2261
      /* calculate the result using exp(ln(lhs)*rhs), which can */
2262
      /* all be done into the accumulator, dac.	 The precision needed */
2263
      /* is enough to contain the full information in the lhs (which */
2264
      /* is the total digits, including exponent), or the requested */
2265
      /* precision, if larger, + 4; 6 is used for the exponent */
2266
      /* maximum length, and this is also used when it is shorter */
2267
      /* than the requested digits as it greatly reduces the >0.5 ulp */
2268
      /* cases at little cost (because Ln doubles digits each */
2269
      /* iteration so a few extra digits rarely causes an extra */
2270
      /* iteration) */
2271
      aset.digits=MAXI(lhs->digits, set->digits)+6+4;
2272
      } /* non-integer rhs */
2273

2274
     else { /* rhs is in-range integer */
2275
      if (n==0) {			/* x**0 = 1 */
2276
	/* (0**0 was handled above) */
2277
	decNumberZero(res);		/* result=1 */
2278
	*res->lsu=1;			/* .. */
2279
	break;}
2280
      /* rhs is a non-zero integer */
2281
      if (n<0) n=-n;			/* use abs(n) */
2282

2283
      aset=*set;			/* clone the context */
2284
      aset.round=DEC_ROUND_HALF_EVEN;	/* internally use balanced */
2285
      /* calculate the working DIGITS */
2286
      aset.digits=reqdigits+(rhs->digits+rhs->exponent)+2;
2287
      #if DECSUBSET
2288
      if (!set->extended) aset.digits--;     /* use classic precision */
2289
      #endif
2290
      /* it's an error if this is more than can be handled */
2291
      if (aset.digits>DECNUMMAXP) {status|=DEC_Invalid_operation; break;}
2292
      } /* integer path */
2293

2294
    /* aset.digits is the count of digits for the accumulator needed */
2295
    /* if accumulator is too long for local storage, then allocate */
2296
    needbytes=sizeof(decNumber)+(D2U(aset.digits)-1)*sizeof(Unit);
2297
    /* [needbytes also used below if 1/lhs needed] */
2298
    if (needbytes>sizeof(dacbuff)) {
2299
      allocdac=(decNumber *)malloc(needbytes);
2300
      if (allocdac==NULL) {   /* hopeless -- abandon */
2301
	status|=DEC_Insufficient_storage;
2302
	break;}
2303
      dac=allocdac;	      /* use the allocated space */
2304
      }
2305
    /* here, aset is set up and accumulator is ready for use */
2306

2307
    if (!useint) {			     /* non-integral rhs */
2308
      /* x ** y; special-case x=1 here as it will otherwise always */
2309
      /* reduce to integer 1; decLnOp has a fastpath which detects */
2310
      /* the case of x=1 */
2311
      decLnOp(dac, lhs, &aset, &status);     /* dac=ln(lhs) */
2312
      /* [no error possible, as lhs 0 already handled] */
2313
      if (ISZERO(dac)) {		     /* x==1, 1.0, etc. */
2314
	/* need to return fully-padded 1.0000 etc., but rhsint->1 */
2315
	*dac->lsu=1;			     /* was 0, make int 1 */
2316
	if (!rhsint) {			     /* add padding */
2317
	  Int shift=set->digits-1;
2318
	  dac->digits=decShiftToMost(dac->lsu, 1, shift);
2319
	  dac->exponent=-shift;		     /* make 1.0000... */
2320
	  status|=DEC_Inexact|DEC_Rounded;   /* deemed inexact */
2321
	  }
2322
	}
2323
       else {
2324
	decMultiplyOp(dac, dac, rhs, &aset, &status);  /* dac=dac*rhs */
2325
	decExpOp(dac, dac, &aset, &status);	       /* dac=exp(dac) */
2326
	}
2327
      /* and drop through for final rounding */
2328
      } /* non-integer rhs */
2329

2330
     else {				/* carry on with integer */
2331
      decNumberZero(dac);		/* acc=1 */
2332
      *dac->lsu=1;			/* .. */
2333

2334
      /* if a negative power the constant 1 is needed, and if not subset */
2335
      /* invert the lhs now rather than inverting the result later */
2336
      if (decNumberIsNegative(rhs)) {	/* was a **-n [hence digits>0] */
2337
	decNumber *inv=invbuff;		/* assume use fixed buffer */
2338
	decNumberCopy(&dnOne, dac);	/* dnOne=1;  [needed now or later] */
2339
	#if DECSUBSET
2340
	if (set->extended) {		/* need to calculate 1/lhs */
2341
	#endif
2342
	  /* divide lhs into 1, putting result in dac [dac=1/dac] */
2343
	  decDivideOp(dac, &dnOne, lhs, &aset, DIVIDE, &status);
2344
	  /* now locate or allocate space for the inverted lhs */
2345
	  if (needbytes>sizeof(invbuff)) {
2346
	    allocinv=(decNumber *)malloc(needbytes);
2347
	    if (allocinv==NULL) {	/* hopeless -- abandon */
2348
	      status|=DEC_Insufficient_storage;
2349
	      break;}
2350
	    inv=allocinv;		/* use the allocated space */
2351
	    }
2352
	  /* [inv now points to big-enough buffer or allocated storage] */
2353
	  decNumberCopy(inv, dac);	/* copy the 1/lhs */
2354
	  decNumberCopy(dac, &dnOne);	/* restore acc=1 */
2355
	  lhs=inv;			/* .. and go forward with new lhs */
2356
	#if DECSUBSET
2357
	  }
2358
	#endif
2359
	}
2360

2361
      /* Raise-to-the-power loop... */
2362
      seenbit=0;		   /* set once a 1-bit is encountered */
2363
      for (i=1;;i++){		   /* for each bit [top bit ignored] */
2364
	/* abandon if had overflow or terminal underflow */
2365
	if (status & (DEC_Overflow|DEC_Underflow)) { /* interesting? */
2366
	  if (status&DEC_Overflow || ISZERO(dac)) break;
2367
	  }
2368
	/* [the following two lines revealed an optimizer bug in a C++ */
2369
	/* compiler, with symptom: 5**3 -> 25, when n=n+n was used] */
2370
	n=n<<1;			   /* move next bit to testable position */
2371
	if (n<0) {		   /* top bit is set */
2372
	  seenbit=1;		   /* OK, significant bit seen */
2373
	  decMultiplyOp(dac, dac, lhs, &aset, &status); /* dac=dac*x */
2374
	  }
2375
	if (i==31) break;	   /* that was the last bit */
2376
	if (!seenbit) continue;	   /* no need to square 1 */
2377
	decMultiplyOp(dac, dac, dac, &aset, &status); /* dac=dac*dac [square] */
2378
	} /*i*/ /* 32 bits */
2379

2380
      /* complete internal overflow or underflow processing */
2381
      if (status & (DEC_Overflow|DEC_Underflow)) {
2382
	#if DECSUBSET
2383
	/* If subset, and power was negative, reverse the kind of -erflow */
2384
	/* [1/x not yet done] */
2385
	if (!set->extended && decNumberIsNegative(rhs)) {
2386
	  if (status & DEC_Overflow)
2387
	    status^=DEC_Overflow | DEC_Underflow | DEC_Subnormal;
2388
	   else { /* trickier -- Underflow may or may not be set */
2389
	    status&=~(DEC_Underflow | DEC_Subnormal); /* [one or both] */
2390
	    status|=DEC_Overflow;
2391
	    }
2392
	  }
2393
	#endif
2394
	dac->bits=(dac->bits & ~DECNEG) | bits; /* force correct sign */
2395
	/* round subnormals [to set.digits rather than aset.digits] */
2396
	/* or set overflow result similarly as required */
2397
	decFinalize(dac, set, &residue, &status);
2398
	decNumberCopy(res, dac);   /* copy to result (is now OK length) */
2399
	break;
2400
	}
2401

2402
      #if DECSUBSET
2403
      if (!set->extended &&		     /* subset math */
2404
	  decNumberIsNegative(rhs)) {	     /* was a **-n [hence digits>0] */
2405
	/* so divide result into 1 [dac=1/dac] */
2406
	decDivideOp(dac, &dnOne, dac, &aset, DIVIDE, &status);
2407
	}
2408
      #endif
2409
      } /* rhs integer path */
2410

2411
    /* reduce result to the requested length and copy to result */
2412
    decCopyFit(res, dac, set, &residue, &status);
2413
    decFinish(res, set, &residue, &status);  /* final cleanup */
2414
    #if DECSUBSET
2415
    if (!set->extended) decTrim(res, set, 0, &dropped); /* trailing zeros */
2416
    #endif
2417
    } while(0);				/* end protected */
2418

2419
  if (allocdac!=NULL) free(allocdac);	/* drop any storage used */
2420
  if (allocinv!=NULL) free(allocinv);	/* .. */
2421
  #if DECSUBSET
2422
  if (alloclhs!=NULL) free(alloclhs);	/* .. */
2423
  if (allocrhs!=NULL) free(allocrhs);	/* .. */
2424
  #endif
2425
  if (status!=0) decStatus(res, status, set);
2426
  #if DECCHECK
2427
  decCheckInexact(res, set);
2428
  #endif
2429
  return res;
2430
  } /* decNumberPower */
2431

2432
/* ------------------------------------------------------------------ */
2433
/* decNumberQuantize -- force exponent to requested value	      */
2434
/*								      */
2435
/*   This computes C = op(A, B), where op adjusts the coefficient     */
2436
/*   of C (by rounding or shifting) such that the exponent (-scale)   */
2437
/*   of C has exponent of B.  The numerical value of C will equal A,  */
2438
/*   except for the effects of any rounding that occurred.	      */
2439
/*								      */
2440
/*   res is C, the result.  C may be A or B			      */
2441
/*   lhs is A, the number to adjust				      */
2442
/*   rhs is B, the number with exponent to match		      */
2443
/*   set is the context						      */
2444
/*								      */
2445
/* C must have space for set->digits digits.			      */
2446
/*								      */
2447
/* Unless there is an error or the result is infinite, the exponent   */
2448
/* after the operation is guaranteed to be equal to that of B.	      */
2449
/* ------------------------------------------------------------------ */
2450
decNumber * decNumberQuantize(decNumber *res, const decNumber *lhs,
2451
			      const decNumber *rhs, decContext *set) {
2452
  uInt status=0;			/* accumulator */
2453
  decQuantizeOp(res, lhs, rhs, set, 1, &status);
2454
  if (status!=0) decStatus(res, status, set);
2455
  return res;
2456
  } /* decNumberQuantize */
2457

2458
/* ------------------------------------------------------------------ */
2459
/* decNumberReduce -- remove trailing zeros			      */
2460
/*								      */
2461
/*   This computes C = 0 + A, and normalizes the result		      */
2462
/*								      */
2463
/*   res is C, the result.  C may be A				      */
2464
/*   rhs is A							      */
2465
/*   set is the context						      */
2466
/*								      */
2467
/* C must have space for set->digits digits.			      */
2468
/* ------------------------------------------------------------------ */
2469
/* Previously known as Normalize */
2470
decNumber * decNumberNormalize(decNumber *res, const decNumber *rhs,
2471
			       decContext *set) {
2472
  return decNumberReduce(res, rhs, set);
2473
  } /* decNumberNormalize */
2474

2475
decNumber * decNumberReduce(decNumber *res, const decNumber *rhs,
2476
			    decContext *set) {
2477
  #if DECSUBSET
2478
  decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
2479
  #endif
2480
  uInt status=0;		   /* as usual */
2481
  Int  residue=0;		   /* as usual */
2482
  Int  dropped;			   /* work */
2483

2484
  #if DECCHECK
2485
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
2486
  #endif
2487

2488
  do {				   /* protect allocated storage */
2489
    #if DECSUBSET
2490
    if (!set->extended) {
2491
      /* reduce operand and set lostDigits status, as needed */
2492
      if (rhs->digits>set->digits) {
2493
	allocrhs=decRoundOperand(rhs, set, &status);
2494
	if (allocrhs==NULL) break;
2495
	rhs=allocrhs;
2496
	}
2497
      }
2498
    #endif
2499
    /* [following code does not require input rounding] */
2500

2501
    /* Infinities copy through; NaNs need usual treatment */
2502
    if (decNumberIsNaN(rhs)) {
2503
      decNaNs(res, rhs, NULL, set, &status);
2504
      break;
2505
      }
2506

2507
    /* reduce result to the requested length and copy to result */
2508
    decCopyFit(res, rhs, set, &residue, &status); /* copy & round */
2509
    decFinish(res, set, &residue, &status);	  /* cleanup/set flags */
2510
    decTrim(res, set, 1, &dropped);		  /* normalize in place */
2511
    } while(0);				     /* end protected */
2512

2513
  #if DECSUBSET
2514
  if (allocrhs !=NULL) free(allocrhs);	     /* .. */
2515
  #endif
2516
  if (status!=0) decStatus(res, status, set);/* then report status */
2517
  return res;
2518
  } /* decNumberReduce */
2519

2520
/* ------------------------------------------------------------------ */
2521
/* decNumberRescale -- force exponent to requested value	      */
2522
/*								      */
2523
/*   This computes C = op(A, B), where op adjusts the coefficient     */
2524
/*   of C (by rounding or shifting) such that the exponent (-scale)   */
2525
/*   of C has the value B.  The numerical value of C will equal A,    */
2526
/*   except for the effects of any rounding that occurred.	      */
2527
/*								      */
2528
/*   res is C, the result.  C may be A or B			      */
2529
/*   lhs is A, the number to adjust				      */
2530
/*   rhs is B, the requested exponent				      */
2531
/*   set is the context						      */
2532
/*								      */
2533
/* C must have space for set->digits digits.			      */
2534
/*								      */
2535
/* Unless there is an error or the result is infinite, the exponent   */
2536
/* after the operation is guaranteed to be equal to B.		      */
2537
/* ------------------------------------------------------------------ */
2538
decNumber * decNumberRescale(decNumber *res, const decNumber *lhs,
2539
			     const decNumber *rhs, decContext *set) {
2540
  uInt status=0;			/* accumulator */
2541
  decQuantizeOp(res, lhs, rhs, set, 0, &status);
2542
  if (status!=0) decStatus(res, status, set);
2543
  return res;
2544
  } /* decNumberRescale */
2545

2546
/* ------------------------------------------------------------------ */
2547
/* decNumberRemainder -- divide and return remainder		      */
2548
/*								      */
2549
/*   This computes C = A % B					      */
2550
/*								      */
2551
/*   res is C, the result.  C may be A and/or B (e.g., X=X%X)	      */
2552
/*   lhs is A							      */
2553
/*   rhs is B							      */
2554
/*   set is the context						      */
2555
/*								      */
2556
/* C must have space for set->digits digits.			      */
2557
/* ------------------------------------------------------------------ */
2558
decNumber * decNumberRemainder(decNumber *res, const decNumber *lhs,
2559
			       const decNumber *rhs, decContext *set) {
2560
  uInt status=0;			/* accumulator */
2561
  decDivideOp(res, lhs, rhs, set, REMAINDER, &status);
2562
  if (status!=0) decStatus(res, status, set);
2563
  #if DECCHECK
2564
  decCheckInexact(res, set);
2565
  #endif
2566
  return res;
2567
  } /* decNumberRemainder */
2568

2569
/* ------------------------------------------------------------------ */
2570
/* decNumberRemainderNear -- divide and return remainder from nearest */
2571
/*								      */
2572
/*   This computes C = A % B, where % is the IEEE remainder operator  */
2573
/*								      */
2574
/*   res is C, the result.  C may be A and/or B (e.g., X=X%X)	      */
2575
/*   lhs is A							      */
2576
/*   rhs is B							      */
2577
/*   set is the context						      */
2578
/*								      */
2579
/* C must have space for set->digits digits.			      */
2580
/* ------------------------------------------------------------------ */
2581
decNumber * decNumberRemainderNear(decNumber *res, const decNumber *lhs,
2582
				   const decNumber *rhs, decContext *set) {
2583
  uInt status=0;			/* accumulator */
2584
  decDivideOp(res, lhs, rhs, set, REMNEAR, &status);
2585
  if (status!=0) decStatus(res, status, set);
2586
  #if DECCHECK
2587
  decCheckInexact(res, set);
2588
  #endif
2589
  return res;
2590
  } /* decNumberRemainderNear */
2591

2592
/* ------------------------------------------------------------------ */
2593
/* decNumberRotate -- rotate the coefficient of a Number left/right   */
2594
/*								      */
2595
/*   This computes C = A rot B	(in base ten and rotating set->digits */
2596
/*   digits).							      */
2597
/*								      */
2598
/*   res is C, the result.  C may be A and/or B (e.g., X=XrotX)	      */
2599
/*   lhs is A							      */
2600
/*   rhs is B, the number of digits to rotate (-ve to right)	      */
2601
/*   set is the context						      */
2602
/*								      */
2603
/* The digits of the coefficient of A are rotated to the left (if B   */
2604
/* is positive) or to the right (if B is negative) without adjusting  */
2605
/* the exponent or the sign of A.  If lhs->digits is less than	      */
2606
/* set->digits the coefficient is padded with zeros on the left	      */
2607
/* before the rotate.  Any leading zeros in the result are removed    */
2608
/* as usual.							      */
2609
/*								      */
2610
/* B must be an integer (q=0) and in the range -set->digits through   */
2611
/* +set->digits.						      */
2612
/* C must have space for set->digits digits.			      */
2613
/* NaNs are propagated as usual.  Infinities are unaffected (but      */
2614
/* B must be valid).  No status is set unless B is invalid or an      */
2615
/* operand is an sNaN.						      */
2616
/* ------------------------------------------------------------------ */
2617
decNumber * decNumberRotate(decNumber *res, const decNumber *lhs,
2618
			   const decNumber *rhs, decContext *set) {
2619
  uInt status=0;	      /* accumulator */
2620
  Int  rotate;		      /* rhs as an Int */
2621

2622
  #if DECCHECK
2623
  if (decCheckOperands(res, lhs, rhs, set)) return res;
2624
  #endif
2625

2626
  /* NaNs propagate as normal */
2627
  if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
2628
    decNaNs(res, lhs, rhs, set, &status);
2629
   /* rhs must be an integer */
2630
   else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
2631
    status=DEC_Invalid_operation;
2632
   else { /* both numeric, rhs is an integer */
2633
    rotate=decGetInt(rhs);		     /* [cannot fail] */
2634
    if (rotate==BADINT			     /* something bad .. */
2635
     || rotate==BIGODD || rotate==BIGEVEN    /* .. very big .. */
2636
     || abs(rotate)>set->digits)	     /* .. or out of range */
2637
      status=DEC_Invalid_operation;
2638
     else {				     /* rhs is OK */
2639
      decNumberCopy(res, lhs);
2640
      /* convert -ve rotate to equivalent positive rotation */
2641
      if (rotate<0) rotate=set->digits+rotate;
2642
      if (rotate!=0 && rotate!=set->digits   /* zero or full rotation */
2643
       && !decNumberIsInfinite(res)) {	     /* lhs was infinite */
2644
	/* left-rotate to do; 0 < rotate < set->digits */
2645
	uInt units, shift;		     /* work */
2646
	uInt msudigits;			     /* digits in result msu */
2647
	Unit *msu=res->lsu+D2U(res->digits)-1;	  /* current msu */
2648
	Unit *msumax=res->lsu+D2U(set->digits)-1; /* rotation msu */
2649
	for (msu++; msu<=msumax; msu++) *msu=0;	  /* ensure high units=0 */
2650
	res->digits=set->digits;		  /* now full-length */
2651
	msudigits=MSUDIGITS(res->digits);	  /* actual digits in msu */
2652

2653
	/* rotation here is done in-place, in three steps */
2654
	/* 1. shift all to least up to one unit to unit-align final */
2655
	/*    lsd [any digits shifted out are rotated to the left, */
2656
	/*    abutted to the original msd (which may require split)] */
2657
	/* */
2658
	/*    [if there are no whole units left to rotate, the */
2659
	/*    rotation is now complete] */
2660
	/* */
2661
	/* 2. shift to least, from below the split point only, so that */
2662
	/*    the final msd is in the right place in its Unit [any */
2663
	/*    digits shifted out will fit exactly in the current msu, */
2664
	/*    left aligned, no split required] */
2665
	/* */
2666
	/* 3. rotate all the units by reversing left part, right */
2667
	/*    part, and then whole */
2668
	/* */
2669
	/* example: rotate right 8 digits (2 units + 2), DECDPUN=3. */
2670
	/* */
2671
	/*   start: 00a bcd efg hij klm npq */
2672
	/* */
2673
	/*	1a  000 0ab cde fgh|ijk lmn [pq saved] */
2674
	/*	1b  00p qab cde fgh|ijk lmn */
2675
	/* */
2676
	/*	2a  00p qab cde fgh|00i jkl [mn saved] */
2677
	/*	2b  mnp qab cde fgh|00i jkl */
2678
	/* */
2679
	/*	3a  fgh cde qab mnp|00i jkl */
2680
	/*	3b  fgh cde qab mnp|jkl 00i */
2681
	/*	3c  00i jkl mnp qab cde fgh */
2682

2683
	/* Step 1: amount to shift is the partial right-rotate count */
2684
	rotate=set->digits-rotate;	/* make it right-rotate */
2685
	units=rotate/DECDPUN;		/* whole units to rotate */
2686
	shift=rotate%DECDPUN;		/* left-over digits count */
2687
	if (shift>0) {			/* not an exact number of units */
2688
	  uInt save=res->lsu[0]%powers[shift];	  /* save low digit(s) */
2689
	  decShiftToLeast(res->lsu, D2U(res->digits), shift);
2690
	  if (shift>msudigits) {	/* msumax-1 needs >0 digits */
2691
	    uInt rem=save%powers[shift-msudigits];/* split save */
2692
	    *msumax=(Unit)(save/powers[shift-msudigits]); /* and insert */
2693
	    *(msumax-1)=*(msumax-1)
2694
		       +(Unit)(rem*powers[DECDPUN-(shift-msudigits)]); /* .. */
2695
	    }
2696
	   else { /* all fits in msumax */
2697
	    *msumax=*msumax+(Unit)(save*powers[msudigits-shift]); /* [maybe *1] */
2698
	    }
2699
	  } /* digits shift needed */
2700

2701
	/* If whole units to rotate... */
2702
	if (units>0) {			/* some to do */
2703
	  /* Step 2: the units to touch are the whole ones in rotate, */
2704
	  /*   if any, and the shift is DECDPUN-msudigits (which may be */
2705
	  /*   0, again) */
2706
	  shift=DECDPUN-msudigits;
2707
	  if (shift>0) {		/* not an exact number of units */
2708
	    uInt save=res->lsu[0]%powers[shift];  /* save low digit(s) */
2709
	    decShiftToLeast(res->lsu, units, shift);
2710
	    *msumax=*msumax+(Unit)(save*powers[msudigits]);
2711
	    } /* partial shift needed */
2712

2713
	  /* Step 3: rotate the units array using triple reverse */
2714
	  /* (reversing is easy and fast) */
2715
	  decReverse(res->lsu+units, msumax);	  /* left part */
2716
	  decReverse(res->lsu, res->lsu+units-1); /* right part */
2717
	  decReverse(res->lsu, msumax);		  /* whole */
2718
	  } /* whole units to rotate */
2719
	/* the rotation may have left an undetermined number of zeros */
2720
	/* on the left, so true length needs to be calculated */
2721
	res->digits=decGetDigits(res->lsu, msumax-res->lsu+1);
2722
	} /* rotate needed */
2723
      } /* rhs OK */
2724
    } /* numerics */
2725
  if (status!=0) decStatus(res, status, set);
2726
  return res;
2727
  } /* decNumberRotate */
2728

2729
/* ------------------------------------------------------------------ */
2730
/* decNumberSameQuantum -- test for equal exponents		      */
2731
/*								      */
2732
/*   res is the result number, which will contain either 0 or 1	      */
2733
/*   lhs is a number to test					      */
2734
/*   rhs is the second (usually a pattern)			      */
2735
/*								      */
2736
/* No errors are possible and no context is needed.		      */
2737
/* ------------------------------------------------------------------ */
2738
decNumber * decNumberSameQuantum(decNumber *res, const decNumber *lhs,
2739
				 const decNumber *rhs) {
2740
  Unit ret=0;			   /* return value */
2741

2742
  #if DECCHECK
2743
  if (decCheckOperands(res, lhs, rhs, DECUNCONT)) return res;
2744
  #endif
2745

2746
  if (SPECIALARGS) {
2747
    if (decNumberIsNaN(lhs) && decNumberIsNaN(rhs)) ret=1;
2748
     else if (decNumberIsInfinite(lhs) && decNumberIsInfinite(rhs)) ret=1;
2749
     /* [anything else with a special gives 0] */
2750
    }
2751
   else if (lhs->exponent==rhs->exponent) ret=1;
2752

2753
  decNumberZero(res);		   /* OK to overwrite an operand now */
2754
  *res->lsu=ret;
2755
  return res;
2756
  } /* decNumberSameQuantum */
2757

2758
/* ------------------------------------------------------------------ */
2759
/* decNumberScaleB -- multiply by a power of 10			      */
2760
/*								      */
2761
/* This computes C = A x 10**B where B is an integer (q=0) with	      */
2762
/* maximum magnitude 2*(emax+digits)				      */
2763
/*								      */
2764
/*   res is C, the result.  C may be A or B			      */
2765
/*   lhs is A, the number to adjust				      */
2766
/*   rhs is B, the requested power of ten to use		      */
2767
/*   set is the context						      */
2768
/*								      */
2769
/* C must have space for set->digits digits.			      */
2770
/*								      */
2771
/* The result may underflow or overflow.			      */
2772
/* ------------------------------------------------------------------ */
2773
decNumber * decNumberScaleB(decNumber *res, const decNumber *lhs,
2774
			    const decNumber *rhs, decContext *set) {
2775
  Int  reqexp;		      /* requested exponent change [B] */
2776
  uInt status=0;	      /* accumulator */
2777
  Int  residue;		      /* work */
2778

2779
  #if DECCHECK
2780
  if (decCheckOperands(res, lhs, rhs, set)) return res;
2781
  #endif
2782

2783
  /* Handle special values except lhs infinite */
2784
  if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
2785
    decNaNs(res, lhs, rhs, set, &status);
2786
    /* rhs must be an integer */
2787
   else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
2788
    status=DEC_Invalid_operation;
2789
   else {
2790
    /* lhs is a number; rhs is a finite with q==0 */
2791
    reqexp=decGetInt(rhs);		     /* [cannot fail] */
2792
    if (reqexp==BADINT			     /* something bad .. */
2793
     || reqexp==BIGODD || reqexp==BIGEVEN    /* .. very big .. */
2794
     || abs(reqexp)>(2*(set->digits+set->emax))) /* .. or out of range */
2795
      status=DEC_Invalid_operation;
2796
     else {				     /* rhs is OK */
2797
      decNumberCopy(res, lhs);		     /* all done if infinite lhs */
2798
      if (!decNumberIsInfinite(res)) {	     /* prepare to scale */
2799
	res->exponent+=reqexp;		     /* adjust the exponent */
2800
	residue=0;
2801
	decFinalize(res, set, &residue, &status); /* .. and check */
2802
	} /* finite LHS */
2803
      } /* rhs OK */
2804
    } /* rhs finite */
2805
  if (status!=0) decStatus(res, status, set);
2806
  return res;
2807
  } /* decNumberScaleB */
2808

2809
/* ------------------------------------------------------------------ */
2810
/* decNumberShift -- shift the coefficient of a Number left or right  */
2811
/*								      */
2812
/*   This computes C = A << B or C = A >> -B  (in base ten).	      */
2813
/*								      */
2814
/*   res is C, the result.  C may be A and/or B (e.g., X=X<<X)	      */
2815
/*   lhs is A							      */
2816
/*   rhs is B, the number of digits to shift (-ve to right)	      */
2817
/*   set is the context						      */
2818
/*								      */
2819
/* The digits of the coefficient of A are shifted to the left (if B   */
2820
/* is positive) or to the right (if B is negative) without adjusting  */
2821
/* the exponent or the sign of A.				      */
2822
/*								      */
2823
/* B must be an integer (q=0) and in the range -set->digits through   */
2824
/* +set->digits.						      */
2825
/* C must have space for set->digits digits.			      */
2826
/* NaNs are propagated as usual.  Infinities are unaffected (but      */
2827
/* B must be valid).  No status is set unless B is invalid or an      */
2828
/* operand is an sNaN.						      */
2829
/* ------------------------------------------------------------------ */
2830
decNumber * decNumberShift(decNumber *res, const decNumber *lhs,
2831
			   const decNumber *rhs, decContext *set) {
2832
  uInt status=0;	      /* accumulator */
2833
  Int  shift;		      /* rhs as an Int */
2834

2835
  #if DECCHECK
2836
  if (decCheckOperands(res, lhs, rhs, set)) return res;
2837
  #endif
2838

2839
  /* NaNs propagate as normal */
2840
  if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
2841
    decNaNs(res, lhs, rhs, set, &status);
2842
   /* rhs must be an integer */
2843
   else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
2844
    status=DEC_Invalid_operation;
2845
   else { /* both numeric, rhs is an integer */
2846
    shift=decGetInt(rhs);		     /* [cannot fail] */
2847
    if (shift==BADINT			     /* something bad .. */
2848
     || shift==BIGODD || shift==BIGEVEN	     /* .. very big .. */
2849
     || abs(shift)>set->digits)		     /* .. or out of range */
2850
      status=DEC_Invalid_operation;
2851
     else {				     /* rhs is OK */
2852
      decNumberCopy(res, lhs);
2853
      if (shift!=0 && !decNumberIsInfinite(res)) { /* something to do */
2854
	if (shift>0) {			     /* to left */
2855
	  if (shift==set->digits) {	     /* removing all */
2856
	    *res->lsu=0;		     /* so place 0 */
2857
	    res->digits=1;		     /* .. */
2858
	    }
2859
	   else {			     /* */
2860
	    /* first remove leading digits if necessary */
2861
	    if (res->digits+shift>set->digits) {
2862
	      decDecap(res, res->digits+shift-set->digits);
2863
	      /* that updated res->digits; may have gone to 1 (for a */
2864
	      /* single digit or for zero */
2865
	      }
2866
	    if (res->digits>1 || *res->lsu)  /* if non-zero.. */
2867
	      res->digits=decShiftToMost(res->lsu, res->digits, shift);
2868
	    } /* partial left */
2869
	  } /* left */
2870
	 else { /* to right */
2871
	  if (-shift>=res->digits) {	     /* discarding all */
2872
	    *res->lsu=0;		     /* so place 0 */
2873
	    res->digits=1;		     /* .. */
2874
	    }
2875
	   else {
2876
	    decShiftToLeast(res->lsu, D2U(res->digits), -shift);
2877
	    res->digits-=(-shift);
2878
	    }
2879
	  } /* to right */
2880
	} /* non-0 non-Inf shift */
2881
      } /* rhs OK */
2882
    } /* numerics */
2883
  if (status!=0) decStatus(res, status, set);
2884
  return res;
2885
  } /* decNumberShift */
2886

2887
/* ------------------------------------------------------------------ */
2888
/* decNumberSquareRoot -- square root operator			      */
2889
/*								      */
2890
/*   This computes C = squareroot(A)				      */
2891
/*								      */
2892
/*   res is C, the result.  C may be A				      */
2893
/*   rhs is A							      */
2894
/*   set is the context; note that rounding mode has no effect	      */
2895
/*								      */
2896
/* C must have space for set->digits digits.			      */
2897
/* ------------------------------------------------------------------ */
2898
/* This uses the following varying-precision algorithm in:	      */
2899
/*								      */
2900
/*   Properly Rounded Variable Precision Square Root, T. E. Hull and  */
2901
/*   A. Abrham, ACM Transactions on Mathematical Software, Vol 11 #3, */
2902
/*   pp229-237, ACM, September 1985.				      */
2903
/*								      */
2904
/* The square-root is calculated using Newton's method, after which   */
2905
/* a check is made to ensure the result is correctly rounded.	      */
2906
/*								      */
2907
/* % [Reformatted original Numerical Turing source code follows.]     */
2908
/* function sqrt(x : real) : real				      */
2909
/* % sqrt(x) returns the properly rounded approximation to the square */
2910
/* % root of x, in the precision of the calling environment, or it    */
2911
/* % fails if x < 0.						      */
2912
/* % t e hull and a abrham, august, 1984			      */
2913
/* if x <= 0 then						      */
2914
/*   if x < 0 then						      */
2915
/*     assert false						      */
2916
/*   else							      */
2917
/*     result 0							      */
2918
/*   end if							      */
2919
/* end if							      */
2920
/* var f := setexp(x, 0)  % fraction part of x	 [0.1 <= x < 1]	      */
2921
/* var e := getexp(x)	  % exponent part of x			      */
2922
/* var approx : real						      */
2923
/* if e mod 2 = 0  then						      */
2924
/*   approx := .259 + .819 * f	 % approx to root of f		      */
2925
/* else								      */
2926
/*   f := f/l0			 % adjustments			      */
2927
/*   e := e + 1			 %   for odd			      */
2928
/*   approx := .0819 + 2.59 * f	 %   exponent			      */
2929
/* end if							      */
2930
/*								      */
2931
/* var p:= 3							      */
2932
/* const maxp := currentprecision + 2				      */
2933
/* loop								      */
2934
/*   p := min(2*p - 2, maxp)	 % p = 4,6,10, . . . , maxp	      */
2935
/*   precision p						      */
2936
/*   approx := .5 * (approx + f/approx)				      */
2937
/*   exit when p = maxp						      */
2938
/* end loop							      */
2939
/*								      */
2940
/* % approx is now within 1 ulp of the properly rounded square root   */
2941
/* % of f; to ensure proper rounding, compare squares of (approx -    */
2942
/* % l/2 ulp) and (approx + l/2 ulp) with f.			      */
2943
/* p := currentprecision					      */
2944
/* begin							      */
2945
/*   precision p + 2						      */
2946
/*   const approxsubhalf := approx - setexp(.5, -p)		      */
2947
/*   if mulru(approxsubhalf, approxsubhalf) > f then		      */
2948
/*     approx := approx - setexp(.l, -p + 1)			      */
2949
/*   else							      */
2950
/*     const approxaddhalf := approx + setexp(.5, -p)		      */
2951
/*     if mulrd(approxaddhalf, approxaddhalf) < f then		      */
2952
/*	 approx := approx + setexp(.l, -p + 1)			      */
2953
/*     end if							      */
2954
/*   end if							      */
2955
/* end								      */
2956
/* result setexp(approx, e div 2)  % fix exponent		      */
2957
/* end sqrt							      */
2958
/* ------------------------------------------------------------------ */
2959
decNumber * decNumberSquareRoot(decNumber *res, const decNumber *rhs,
2960
				decContext *set) {
2961
  decContext workset, approxset;   /* work contexts */
2962
  decNumber dzero;		   /* used for constant zero */
2963
  Int  maxp;			   /* largest working precision */
2964
  Int  workp;			   /* working precision */
2965
  Int  residue=0;		   /* rounding residue */
2966
  uInt status=0, ignore=0;	   /* status accumulators */
2967
  uInt rstatus;			   /* .. */
2968
  Int  exp;			   /* working exponent */
2969
  Int  ideal;			   /* ideal (preferred) exponent */
2970
  Int  needbytes;		   /* work */
2971
  Int  dropped;			   /* .. */
2972

2973
  #if DECSUBSET
2974
  decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
2975
  #endif
2976
  /* buffer for f [needs +1 in case DECBUFFER 0] */
2977
  decNumber buff[D2N(DECBUFFER+1)];
2978
  /* buffer for a [needs +2 to match likely maxp] */
2979
  decNumber bufa[D2N(DECBUFFER+2)];
2980
  /* buffer for temporary, b [must be same size as a] */
2981
  decNumber bufb[D2N(DECBUFFER+2)];
2982
  decNumber *allocbuff=NULL;	   /* -> allocated buff, iff allocated */
2983
  decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
2984
  decNumber *allocbufb=NULL;	   /* -> allocated bufb, iff allocated */
2985
  decNumber *f=buff;		   /* reduced fraction */
2986
  decNumber *a=bufa;		   /* approximation to result */
2987
  decNumber *b=bufb;		   /* intermediate result */
2988
  /* buffer for temporary variable, up to 3 digits */
2989
  decNumber buft[D2N(3)];
2990
  decNumber *t=buft;		   /* up-to-3-digit constant or work */
2991

2992
  #if DECCHECK
2993
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
2994
  #endif
2995

2996
  do {				   /* protect allocated storage */
2997
    #if DECSUBSET
2998
    if (!set->extended) {
2999
      /* reduce operand and set lostDigits status, as needed */
3000
      if (rhs->digits>set->digits) {
3001
	allocrhs=decRoundOperand(rhs, set, &status);
3002
	if (allocrhs==NULL) break;
3003
	/* [Note: 'f' allocation below could reuse this buffer if */
3004
	/* used, but as this is rare they are kept separate for clarity.] */
3005
	rhs=allocrhs;
3006
	}
3007
      }
3008
    #endif
3009
    /* [following code does not require input rounding] */
3010

3011
    /* handle infinities and NaNs */
3012
    if (SPECIALARG) {
3013
      if (decNumberIsInfinite(rhs)) {	      /* an infinity */
3014
	if (decNumberIsNegative(rhs)) status|=DEC_Invalid_operation;
3015
	 else decNumberCopy(res, rhs);	      /* +Infinity */
3016
	}
3017
       else decNaNs(res, rhs, NULL, set, &status); /* a NaN */
3018
      break;
3019
      }
3020

3021
    /* calculate the ideal (preferred) exponent [floor(exp/2)] */
3022
    /* [We would like to write: ideal=rhs->exponent>>1, but this */
3023
    /* generates a compiler warning.  Generated code is the same.] */
3024
    ideal=(rhs->exponent&~1)/2;		/* target */
3025

3026
    /* handle zeros */
3027
    if (ISZERO(rhs)) {
3028
      decNumberCopy(res, rhs);		/* could be 0 or -0 */
3029
      res->exponent=ideal;		/* use the ideal [safe] */
3030
      /* use decFinish to clamp any out-of-range exponent, etc. */
3031
      decFinish(res, set, &residue, &status);
3032
      break;
3033
      }
3034

3035
    /* any other -x is an oops */
3036
    if (decNumberIsNegative(rhs)) {
3037
      status|=DEC_Invalid_operation;
3038
      break;
3039
      }
3040

3041
    /* space is needed for three working variables */
3042
    /*	 f -- the same precision as the RHS, reduced to 0.01->0.99... */
3043
    /*	 a -- Hull's approximation -- precision, when assigned, is */
3044
    /*	      currentprecision+1 or the input argument precision, */
3045
    /*	      whichever is larger (+2 for use as temporary) */
3046
    /*	 b -- intermediate temporary result (same size as a) */
3047
    /* if any is too long for local storage, then allocate */
3048
    workp=MAXI(set->digits+1, rhs->digits);  /* actual rounding precision */
3049
    maxp=workp+2;			     /* largest working precision */
3050

3051
    needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
3052
    if (needbytes>(Int)sizeof(buff)) {
3053
      allocbuff=(decNumber *)malloc(needbytes);
3054
      if (allocbuff==NULL) {  /* hopeless -- abandon */
3055
	status|=DEC_Insufficient_storage;
3056
	break;}
3057
      f=allocbuff;	      /* use the allocated space */
3058
      }
3059
    /* a and b both need to be able to hold a maxp-length number */
3060
    needbytes=sizeof(decNumber)+(D2U(maxp)-1)*sizeof(Unit);
3061
    if (needbytes>(Int)sizeof(bufa)) {		  /* [same applies to b] */
3062
      allocbufa=(decNumber *)malloc(needbytes);
3063
      allocbufb=(decNumber *)malloc(needbytes);
3064
      if (allocbufa==NULL || allocbufb==NULL) {	  /* hopeless */
3065
	status|=DEC_Insufficient_storage;
3066
	break;}
3067
      a=allocbufa;	      /* use the allocated spaces */
3068
      b=allocbufb;	      /* .. */
3069
      }
3070

3071
    /* copy rhs -> f, save exponent, and reduce so 0.1 <= f < 1 */
3072
    decNumberCopy(f, rhs);
3073
    exp=f->exponent+f->digits;		     /* adjusted to Hull rules */
3074
    f->exponent=-(f->digits);		     /* to range */
3075

3076
    /* set up working context */
3077
    decContextDefault(&workset, DEC_INIT_DECIMAL64);
3078

3079
    /* [Until further notice, no error is possible and status bits */
3080
    /* (Rounded, etc.) should be ignored, not accumulated.] */
3081

3082
    /* Calculate initial approximation, and allow for odd exponent */
3083
    workset.digits=workp;		     /* p for initial calculation */
3084
    t->bits=0; t->digits=3;
3085
    a->bits=0; a->digits=3;
3086
    if ((exp & 1)==0) {			     /* even exponent */
3087
      /* Set t=0.259, a=0.819 */
3088
      t->exponent=-3;
3089
      a->exponent=-3;
3090
      #if DECDPUN>=3
3091
	t->lsu[0]=259;
3092
	a->lsu[0]=819;
3093
      #elif DECDPUN==2
3094
	t->lsu[0]=59; t->lsu[1]=2;
3095
	a->lsu[0]=19; a->lsu[1]=8;
3096
      #else
3097
	t->lsu[0]=9; t->lsu[1]=5; t->lsu[2]=2;
3098
	a->lsu[0]=9; a->lsu[1]=1; a->lsu[2]=8;
3099
      #endif
3100
      }
3101
     else {				     /* odd exponent */
3102
      /* Set t=0.0819, a=2.59 */
3103
      f->exponent--;			     /* f=f/10 */
3104
      exp++;				     /* e=e+1 */
3105
      t->exponent=-4;
3106
      a->exponent=-2;
3107
      #if DECDPUN>=3
3108
	t->lsu[0]=819;
3109
	a->lsu[0]=259;
3110
      #elif DECDPUN==2
3111
	t->lsu[0]=19; t->lsu[1]=8;
3112
	a->lsu[0]=59; a->lsu[1]=2;
3113
      #else
3114
	t->lsu[0]=9; t->lsu[1]=1; t->lsu[2]=8;
3115
	a->lsu[0]=9; a->lsu[1]=5; a->lsu[2]=2;
3116
      #endif
3117
      }
3118
    decMultiplyOp(a, a, f, &workset, &ignore);	  /* a=a*f */
3119
    decAddOp(a, a, t, &workset, 0, &ignore);	  /* ..+t */
3120
    /* [a is now the initial approximation for sqrt(f), calculated with */
3121
    /* currentprecision, which is also a's precision.] */
3122

3123
    /* the main calculation loop */
3124
    decNumberZero(&dzero);		     /* make 0 */
3125
    decNumberZero(t);			     /* set t = 0.5 */
3126
    t->lsu[0]=5;			     /* .. */
3127
    t->exponent=-1;			     /* .. */
3128
    workset.digits=3;			     /* initial p */
3129
    for (;;) {
3130
      /* set p to min(2*p - 2, maxp)  [hence 3; or: 4, 6, 10, ... , maxp] */
3131
      workset.digits=workset.digits*2-2;
3132
      if (workset.digits>maxp) workset.digits=maxp;
3133
      /* a = 0.5 * (a + f/a) */
3134
      /* [calculated at p then rounded to currentprecision] */
3135
      decDivideOp(b, f, a, &workset, DIVIDE, &ignore); /* b=f/a */
3136
      decAddOp(b, b, a, &workset, 0, &ignore);	  /* b=b+a */
3137
      decMultiplyOp(a, b, t, &workset, &ignore);  /* a=b*0.5 */
3138
      if (a->digits==maxp) break;	     /* have required digits */
3139
      } /* loop */
3140

3141
    /* Here, 0.1 <= a < 1 [Hull], and a has maxp digits */
3142
    /* now reduce to length, etc.; this needs to be done with a */
3143
    /* having the correct exponent so as to handle subnormals */
3144
    /* correctly */
3145
    approxset=*set;			     /* get emin, emax, etc. */
3146
    approxset.round=DEC_ROUND_HALF_EVEN;
3147
    a->exponent+=exp/2;			     /* set correct exponent */
3148

3149
    rstatus=0;				     /* clear status */
3150
    residue=0;				     /* .. and accumulator */
3151
    decCopyFit(a, a, &approxset, &residue, &rstatus);  /* reduce (if needed) */
3152
    decFinish(a, &approxset, &residue, &rstatus);      /* clean and finalize */
3153

3154
    /* Overflow was possible if the input exponent was out-of-range, */
3155
    /* in which case quit */
3156
    if (rstatus&DEC_Overflow) {
3157
      status=rstatus;			     /* use the status as-is */
3158
      decNumberCopy(res, a);		     /* copy to result */
3159
      break;
3160
      }
3161

3162
    /* Preserve status except Inexact/Rounded */
3163
    status|=(rstatus & ~(DEC_Rounded|DEC_Inexact));
3164

3165
    /* Carry out the Hull correction */
3166
    a->exponent-=exp/2;			     /* back to 0.1->1 */
3167

3168
    /* a is now at final precision and within 1 ulp of the properly */
3169
    /* rounded square root of f; to ensure proper rounding, compare */
3170
    /* squares of (a - l/2 ulp) and (a + l/2 ulp) with f. */
3171
    /* Here workset.digits=maxp and t=0.5, and a->digits determines */
3172
    /* the ulp */
3173
    workset.digits--;				  /* maxp-1 is OK now */
3174
    t->exponent=-a->digits-1;			  /* make 0.5 ulp */
3175
    decAddOp(b, a, t, &workset, DECNEG, &ignore); /* b = a - 0.5 ulp */
3176
    workset.round=DEC_ROUND_UP;
3177
    decMultiplyOp(b, b, b, &workset, &ignore);	  /* b = mulru(b, b) */
3178
    decCompareOp(b, f, b, &workset, COMPARE, &ignore); /* b ? f, reversed */
3179
    if (decNumberIsNegative(b)) {		  /* f < b [i.e., b > f] */
3180
      /* this is the more common adjustment, though both are rare */
3181
      t->exponent++;				  /* make 1.0 ulp */
3182
      t->lsu[0]=1;				  /* .. */
3183
      decAddOp(a, a, t, &workset, DECNEG, &ignore); /* a = a - 1 ulp */
3184
      /* assign to approx [round to length] */
3185
      approxset.emin-=exp/2;			  /* adjust to match a */
3186
      approxset.emax-=exp/2;
3187
      decAddOp(a, &dzero, a, &approxset, 0, &ignore);
3188
      }
3189
     else {
3190
      decAddOp(b, a, t, &workset, 0, &ignore);	  /* b = a + 0.5 ulp */
3191
      workset.round=DEC_ROUND_DOWN;
3192
      decMultiplyOp(b, b, b, &workset, &ignore);  /* b = mulrd(b, b) */
3193
      decCompareOp(b, b, f, &workset, COMPARE, &ignore);   /* b ? f */
3194
      if (decNumberIsNegative(b)) {		  /* b < f */
3195
	t->exponent++;				  /* make 1.0 ulp */
3196
	t->lsu[0]=1;				  /* .. */
3197
	decAddOp(a, a, t, &workset, 0, &ignore);  /* a = a + 1 ulp */
3198
	/* assign to approx [round to length] */
3199
	approxset.emin-=exp/2;			  /* adjust to match a */
3200
	approxset.emax-=exp/2;
3201
	decAddOp(a, &dzero, a, &approxset, 0, &ignore);
3202
	}
3203
      }
3204
    /* [no errors are possible in the above, and rounding/inexact during */
3205
    /* estimation are irrelevant, so status was not accumulated] */
3206

3207
    /* Here, 0.1 <= a < 1  (still), so adjust back */
3208
    a->exponent+=exp/2;			     /* set correct exponent */
3209

3210
    /* count droppable zeros [after any subnormal rounding] by */
3211
    /* trimming a copy */
3212
    decNumberCopy(b, a);
3213
    decTrim(b, set, 1, &dropped);	     /* [drops trailing zeros] */
3214

3215
    /* Set Inexact and Rounded.	 The answer can only be exact if */
3216
    /* it is short enough so that squaring it could fit in workp digits, */
3217
    /* and it cannot have trailing zeros due to clamping, so these are */
3218
    /* the only (relatively rare) conditions a careful check is needed */
3219
    if (b->digits*2-1 > workp && !set->clamp) { /* cannot fit */
3220
      status|=DEC_Inexact|DEC_Rounded;
3221
      }
3222
     else {				     /* could be exact/unrounded */
3223
      uInt mstatus=0;			     /* local status */
3224
      decMultiplyOp(b, b, b, &workset, &mstatus); /* try the multiply */
3225
      if (mstatus&DEC_Overflow) {	     /* result just won't fit */
3226
	status|=DEC_Inexact|DEC_Rounded;
3227
	}
3228
       else {				     /* plausible */
3229
	decCompareOp(t, b, rhs, &workset, COMPARE, &mstatus); /* b ? rhs */
3230
	if (!ISZERO(t)) status|=DEC_Inexact|DEC_Rounded; /* not equal */
3231
	 else {				     /* is Exact */
3232
	  /* here, dropped is the count of trailing zeros in 'a' */
3233
	  /* use closest exponent to ideal... */
3234
	  Int todrop=ideal-a->exponent;	     /* most that can be dropped */
3235
	  if (todrop<0) status|=DEC_Rounded; /* ideally would add 0s */
3236
	   else {			     /* unrounded */
3237
	    if (dropped<todrop) {	     /* clamp to those available */
3238
	      todrop=dropped;
3239
	      status|=DEC_Clamped;
3240
	      }
3241
	    if (todrop>0) {		     /* have some to drop */
3242
	      decShiftToLeast(a->lsu, D2U(a->digits), todrop);
3243
	      a->exponent+=todrop;	     /* maintain numerical value */
3244
	      a->digits-=todrop;	     /* new length */
3245
	      }
3246
	    }
3247
	  }
3248
	}
3249
      }
3250

3251
    /* double-check Underflow, as perhaps the result could not have */
3252
    /* been subnormal (initial argument too big), or it is now Exact */
3253
    if (status&DEC_Underflow) {
3254
      Int ae=rhs->exponent+rhs->digits-1;    /* adjusted exponent */
3255
      /* check if truly subnormal */
3256
      #if DECEXTFLAG			     /* DEC_Subnormal too */
3257
	if (ae>=set->emin*2) status&=~(DEC_Subnormal|DEC_Underflow);
3258
      #else
3259
	if (ae>=set->emin*2) status&=~DEC_Underflow;
3260
      #endif
3261
      /* check if truly inexact */
3262
      if (!(status&DEC_Inexact)) status&=~DEC_Underflow;
3263
      }
3264

3265
    decNumberCopy(res, a);		     /* a is now the result */
3266
    } while(0);				     /* end protected */
3267

3268
  if (allocbuff!=NULL) free(allocbuff);	     /* drop any storage used */
3269
  if (allocbufa!=NULL) free(allocbufa);	     /* .. */
3270
  if (allocbufb!=NULL) free(allocbufb);	     /* .. */
3271
  #if DECSUBSET
3272
  if (allocrhs !=NULL) free(allocrhs);	     /* .. */
3273
  #endif
3274
  if (status!=0) decStatus(res, status, set);/* then report status */
3275
  #if DECCHECK
3276
  decCheckInexact(res, set);
3277
  #endif
3278
  return res;
3279
  } /* decNumberSquareRoot */
3280

3281
/* ------------------------------------------------------------------ */
3282
/* decNumberSubtract -- subtract two Numbers			      */
3283
/*								      */
3284
/*   This computes C = A - B					      */
3285
/*								      */
3286
/*   res is C, the result.  C may be A and/or B (e.g., X=X-X)	      */
3287
/*   lhs is A							      */
3288
/*   rhs is B							      */
3289
/*   set is the context						      */
3290
/*								      */
3291
/* C must have space for set->digits digits.			      */
3292
/* ------------------------------------------------------------------ */
3293
decNumber * decNumberSubtract(decNumber *res, const decNumber *lhs,
3294
			      const decNumber *rhs, decContext *set) {
3295
  uInt status=0;			/* accumulator */
3296

3297
  decAddOp(res, lhs, rhs, set, DECNEG, &status);
3298
  if (status!=0) decStatus(res, status, set);
3299
  #if DECCHECK
3300
  decCheckInexact(res, set);
3301
  #endif
3302
  return res;
3303
  } /* decNumberSubtract */
3304

3305
/* ------------------------------------------------------------------ */
3306
/* decNumberToIntegralExact -- round-to-integral-value with InExact   */
3307
/* decNumberToIntegralValue -- round-to-integral-value		      */
3308
/*								      */
3309
/*   res is the result						      */
3310
/*   rhs is input number					      */
3311
/*   set is the context						      */
3312
/*								      */
3313
/* res must have space for any value of rhs.			      */
3314
/*								      */
3315
/* This implements the IEEE special operators and therefore treats    */
3316
/* special values as valid.  For finite numbers it returns	      */
3317
/* rescale(rhs, 0) if rhs->exponent is <0.			      */
3318
/* Otherwise the result is rhs (so no error is possible, except for   */
3319
/* sNaN).							      */
3320
/*								      */
3321
/* The context is used for rounding mode and status after sNaN, but   */
3322
/* the digits setting is ignored.  The Exact version will signal      */
3323
/* Inexact if the result differs numerically from rhs; the other      */
3324
/* never signals Inexact.					      */
3325
/* ------------------------------------------------------------------ */
3326
decNumber * decNumberToIntegralExact(decNumber *res, const decNumber *rhs,
3327
				     decContext *set) {
3328
  decNumber dn;
3329
  decContext workset;		   /* working context */
3330
  uInt status=0;		   /* accumulator */
3331

3332
  #if DECCHECK
3333
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
3334
  #endif
3335

3336
  /* handle infinities and NaNs */
3337
  if (SPECIALARG) {
3338
    if (decNumberIsInfinite(rhs)) decNumberCopy(res, rhs); /* an Infinity */
3339
     else decNaNs(res, rhs, NULL, set, &status); /* a NaN */
3340
    }
3341
   else { /* finite */
3342
    /* have a finite number; no error possible (res must be big enough) */
3343
    if (rhs->exponent>=0) return decNumberCopy(res, rhs);
3344
    /* that was easy, but if negative exponent there is work to do... */
3345
    workset=*set;		   /* clone rounding, etc. */
3346
    workset.digits=rhs->digits;	   /* no length rounding */
3347
    workset.traps=0;		   /* no traps */
3348
    decNumberZero(&dn);		   /* make a number with exponent 0 */
3349
    decNumberQuantize(res, rhs, &dn, &workset);
3350
    status|=workset.status;
3351
    }
3352
  if (status!=0) decStatus(res, status, set);
3353
  return res;
3354
  } /* decNumberToIntegralExact */
3355

3356
decNumber * decNumberToIntegralValue(decNumber *res, const decNumber *rhs,
3357
				     decContext *set) {
3358
  decContext workset=*set;	   /* working context */
3359
  workset.traps=0;		   /* no traps */
3360
  decNumberToIntegralExact(res, rhs, &workset);
3361
  /* this never affects set, except for sNaNs; NaN will have been set */
3362
  /* or propagated already, so no need to call decStatus */
3363
  set->status|=workset.status&DEC_Invalid_operation;
3364
  return res;
3365
  } /* decNumberToIntegralValue */
3366

3367
/* ------------------------------------------------------------------ */
3368
/* decNumberXor -- XOR two Numbers, digitwise			      */
3369
/*								      */
3370
/*   This computes C = A ^ B					      */
3371
/*								      */
3372
/*   res is C, the result.  C may be A and/or B (e.g., X=X^X)	      */
3373
/*   lhs is A							      */
3374
/*   rhs is B							      */
3375
/*   set is the context (used for result length and error report)     */
3376
/*								      */
3377
/* C must have space for set->digits digits.			      */
3378
/*								      */
3379
/* Logical function restrictions apply (see above); a NaN is	      */
3380
/* returned with Invalid_operation if a restriction is violated.      */
3381
/* ------------------------------------------------------------------ */
3382
decNumber * decNumberXor(decNumber *res, const decNumber *lhs,
3383
			 const decNumber *rhs, decContext *set) {
3384
  const Unit *ua, *ub;			/* -> operands */
3385
  const Unit *msua, *msub;		/* -> operand msus */
3386
  Unit	*uc, *msuc;			/* -> result and its msu */
3387
  Int	msudigs;			/* digits in res msu */
3388
  #if DECCHECK
3389
  if (decCheckOperands(res, lhs, rhs, set)) return res;
3390
  #endif
3391

3392
  if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
3393
   || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
3394
    decStatus(res, DEC_Invalid_operation, set);
3395
    return res;
3396
    }
3397
  /* operands are valid */
3398
  ua=lhs->lsu;				/* bottom-up */
3399
  ub=rhs->lsu;				/* .. */
3400
  uc=res->lsu;				/* .. */
3401
  msua=ua+D2U(lhs->digits)-1;		/* -> msu of lhs */
3402
  msub=ub+D2U(rhs->digits)-1;		/* -> msu of rhs */
3403
  msuc=uc+D2U(set->digits)-1;		/* -> msu of result */
3404
  msudigs=MSUDIGITS(set->digits);	/* [faster than remainder] */
3405
  for (; uc<=msuc; ua++, ub++, uc++) {	/* Unit loop */
3406
    Unit a, b;				/* extract units */
3407
    if (ua>msua) a=0;
3408
     else a=*ua;
3409
    if (ub>msub) b=0;
3410
     else b=*ub;
3411
    *uc=0;				/* can now write back */
3412
    if (a|b) {				/* maybe 1 bits to examine */
3413
      Int i, j;
3414
      /* This loop could be unrolled and/or use BIN2BCD tables */
3415
      for (i=0; i<DECDPUN; i++) {
3416
	if ((a^b)&1) *uc=*uc+(Unit)powers[i];	  /* effect XOR */
3417
	j=a%10;
3418
	a=a/10;
3419
	j|=b%10;
3420
	b=b/10;
3421
	if (j>1) {
3422
	  decStatus(res, DEC_Invalid_operation, set);
3423
	  return res;
3424
	  }
3425
	if (uc==msuc && i==msudigs-1) break;	  /* just did final digit */
3426
	} /* each digit */
3427
      } /* non-zero */
3428
    } /* each unit */
3429
  /* [here uc-1 is the msu of the result] */
3430
  res->digits=decGetDigits(res->lsu, uc-res->lsu);
3431
  res->exponent=0;			/* integer */
3432
  res->bits=0;				/* sign=0 */
3433
  return res;  /* [no status to set] */
3434
  } /* decNumberXor */
3435

3436

3437
/* ================================================================== */
3438
/* Utility routines						      */
3439
/* ================================================================== */
3440

3441
/* ------------------------------------------------------------------ */
3442
/* decNumberClass -- return the decClass of a decNumber		      */
3443
/*   dn -- the decNumber to test				      */
3444
/*   set -- the context to use for Emin				      */
3445
/*   returns the decClass enum					      */
3446
/* ------------------------------------------------------------------ */
3447
enum decClass decNumberClass(const decNumber *dn, decContext *set) {
3448
  if (decNumberIsSpecial(dn)) {
3449
    if (decNumberIsQNaN(dn)) return DEC_CLASS_QNAN;
3450
    if (decNumberIsSNaN(dn)) return DEC_CLASS_SNAN;
3451
    /* must be an infinity */
3452
    if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_INF;
3453
    return DEC_CLASS_POS_INF;
3454
    }
3455
  /* is finite */
3456
  if (decNumberIsNormal(dn, set)) { /* most common */
3457
    if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_NORMAL;
3458
    return DEC_CLASS_POS_NORMAL;
3459
    }
3460
  /* is subnormal or zero */
3461
  if (decNumberIsZero(dn)) {	/* most common */
3462
    if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_ZERO;
3463
    return DEC_CLASS_POS_ZERO;
3464
    }
3465
  if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_SUBNORMAL;
3466
  return DEC_CLASS_POS_SUBNORMAL;
3467
  } /* decNumberClass */
3468

3469
/* ------------------------------------------------------------------ */
3470
/* decNumberClassToString -- convert decClass to a string	      */
3471
/*								      */
3472
/*  eclass is a valid decClass					      */
3473
/*  returns a constant string describing the class (max 13+1 chars)   */
3474
/* ------------------------------------------------------------------ */
3475
const char *decNumberClassToString(enum decClass eclass) {
3476
  if (eclass==DEC_CLASS_POS_NORMAL)    return DEC_ClassString_PN;
3477
  if (eclass==DEC_CLASS_NEG_NORMAL)    return DEC_ClassString_NN;
3478
  if (eclass==DEC_CLASS_POS_ZERO)      return DEC_ClassString_PZ;
3479
  if (eclass==DEC_CLASS_NEG_ZERO)      return DEC_ClassString_NZ;
3480
  if (eclass==DEC_CLASS_POS_SUBNORMAL) return DEC_ClassString_PS;
3481
  if (eclass==DEC_CLASS_NEG_SUBNORMAL) return DEC_ClassString_NS;
3482
  if (eclass==DEC_CLASS_POS_INF)       return DEC_ClassString_PI;
3483
  if (eclass==DEC_CLASS_NEG_INF)       return DEC_ClassString_NI;
3484
  if (eclass==DEC_CLASS_QNAN)	       return DEC_ClassString_QN;
3485
  if (eclass==DEC_CLASS_SNAN)	       return DEC_ClassString_SN;
3486
  return DEC_ClassString_UN;	       /* Unknown */
3487
  } /* decNumberClassToString */
3488

3489
/* ------------------------------------------------------------------ */
3490
/* decNumberCopy -- copy a number				      */
3491
/*								      */
3492
/*   dest is the target decNumber				      */
3493
/*   src  is the source decNumber				      */
3494
/*   returns dest						      */
3495
/*								      */
3496
/* (dest==src is allowed and is a no-op)			      */
3497
/* All fields are updated as required.	This is a utility operation,  */
3498
/* so special values are unchanged and no error is possible.	      */
3499
/* ------------------------------------------------------------------ */
3500
decNumber * decNumberCopy(decNumber *dest, const decNumber *src) {
3501

3502
  #if DECCHECK
3503
  if (src==NULL) return decNumberZero(dest);
3504
  #endif
3505

3506
  if (dest==src) return dest;		     /* no copy required */
3507

3508
  /* Use explicit assignments here as structure assignment could copy */
3509
  /* more than just the lsu (for small DECDPUN).  This would not affect */
3510
  /* the value of the results, but could disturb test harness spill */
3511
  /* checking. */
3512
  dest->bits=src->bits;
3513
  dest->exponent=src->exponent;
3514
  dest->digits=src->digits;
3515
  dest->lsu[0]=src->lsu[0];
3516
  if (src->digits>DECDPUN) {		     /* more Units to come */
3517
    const Unit *smsup, *s;		     /* work */
3518
    Unit  *d;				     /* .. */
3519
    /* memcpy for the remaining Units would be safe as they cannot */
3520
    /* overlap.	 However, this explicit loop is faster in short cases. */
3521
    d=dest->lsu+1;			     /* -> first destination */
3522
    smsup=src->lsu+D2U(src->digits);	     /* -> source msu+1 */
3523
    for (s=src->lsu+1; s<smsup; s++, d++) *d=*s;
3524
    }
3525
  return dest;
3526
  } /* decNumberCopy */
3527

3528
/* ------------------------------------------------------------------ */
3529
/* decNumberCopyAbs -- quiet absolute value operator		      */
3530
/*								      */
3531
/*   This sets C = abs(A)					      */
3532
/*								      */
3533
/*   res is C, the result.  C may be A				      */
3534
/*   rhs is A							      */
3535
/*								      */
3536
/* C must have space for set->digits digits.			      */
3537
/* No exception or error can occur; this is a quiet bitwise operation.*/
3538
/* See also decNumberAbs for a checking version of this.	      */
3539
/* ------------------------------------------------------------------ */
3540
decNumber * decNumberCopyAbs(decNumber *res, const decNumber *rhs) {
3541
  #if DECCHECK
3542
  if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
3543
  #endif
3544
  decNumberCopy(res, rhs);
3545
  res->bits&=~DECNEG;			/* turn off sign */
3546
  return res;
3547
  } /* decNumberCopyAbs */
3548

3549
/* ------------------------------------------------------------------ */
3550
/* decNumberCopyNegate -- quiet negate value operator		      */
3551
/*								      */
3552
/*   This sets C = negate(A)					      */
3553
/*								      */
3554
/*   res is C, the result.  C may be A				      */
3555
/*   rhs is A							      */
3556
/*								      */
3557
/* C must have space for set->digits digits.			      */
3558
/* No exception or error can occur; this is a quiet bitwise operation.*/
3559
/* See also decNumberMinus for a checking version of this.	      */
3560
/* ------------------------------------------------------------------ */
3561
decNumber * decNumberCopyNegate(decNumber *res, const decNumber *rhs) {
3562
  #if DECCHECK
3563
  if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
3564
  #endif
3565
  decNumberCopy(res, rhs);
3566
  res->bits^=DECNEG;			/* invert the sign */
3567
  return res;
3568
  } /* decNumberCopyNegate */
3569

3570
/* ------------------------------------------------------------------ */
3571
/* decNumberCopySign -- quiet copy and set sign operator	      */
3572
/*								      */
3573
/*   This sets C = A with the sign of B				      */
3574
/*								      */
3575
/*   res is C, the result.  C may be A				      */
3576
/*   lhs is A							      */
3577
/*   rhs is B							      */
3578
/*								      */
3579
/* C must have space for set->digits digits.			      */
3580
/* No exception or error can occur; this is a quiet bitwise operation.*/
3581
/* ------------------------------------------------------------------ */
3582
decNumber * decNumberCopySign(decNumber *res, const decNumber *lhs,
3583
			      const decNumber *rhs) {
3584
  uByte sign;				/* rhs sign */
3585
  #if DECCHECK
3586
  if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
3587
  #endif
3588
  sign=rhs->bits & DECNEG;		/* save sign bit */
3589
  decNumberCopy(res, lhs);
3590
  res->bits&=~DECNEG;			/* clear the sign */
3591
  res->bits|=sign;			/* set from rhs */
3592
  return res;
3593
  } /* decNumberCopySign */
3594

3595
/* ------------------------------------------------------------------ */
3596
/* decNumberGetBCD -- get the coefficient in BCD8		      */
3597
/*   dn is the source decNumber					      */
3598
/*   bcd is the uInt array that will receive dn->digits BCD bytes,    */
3599
/*     most-significant at offset 0				      */
3600
/*   returns bcd						      */
3601
/*								      */
3602
/* bcd must have at least dn->digits bytes.  No error is possible; if */
3603
/* dn is a NaN or Infinite, digits must be 1 and the coefficient 0.   */
3604
/* ------------------------------------------------------------------ */
3605
uByte * decNumberGetBCD(const decNumber *dn, uint8_t *bcd) {
3606
  uByte *ub=bcd+dn->digits-1;	   /* -> lsd */
3607
  const Unit *up=dn->lsu;	   /* Unit pointer, -> lsu */
3608

3609
  #if DECDPUN==1		   /* trivial simple copy */
3610
    for (; ub>=bcd; ub--, up++) *ub=*up;
3611
  #else				   /* chopping needed */
3612
    uInt u=*up;			   /* work */
3613
    uInt cut=DECDPUN;		   /* downcounter through unit */
3614
    for (; ub>=bcd; ub--) {
3615
      *ub=(uByte)(u%10);	   /* [*6554 trick inhibits, here] */
3616
      u=u/10;
3617
      cut--;
3618
      if (cut>0) continue;	   /* more in this unit */
3619
      up++;
3620
      u=*up;
3621
      cut=DECDPUN;
3622
      }
3623
  #endif
3624
  return bcd;
3625
  } /* decNumberGetBCD */
3626

3627
/* ------------------------------------------------------------------ */
3628
/* decNumberSetBCD -- set (replace) the coefficient from BCD8	      */
3629
/*   dn is the target decNumber					      */
3630
/*   bcd is the uInt array that will source n BCD bytes, most-	      */
3631
/*     significant at offset 0					      */
3632
/*   n is the number of digits in the source BCD array (bcd)	      */
3633
/*   returns dn							      */
3634
/*								      */
3635
/* dn must have space for at least n digits.  No error is possible;   */
3636
/* if dn is a NaN, or Infinite, or is to become a zero, n must be 1   */
3637
/* and bcd[0] zero.						      */
3638
/* ------------------------------------------------------------------ */
3639
decNumber * decNumberSetBCD(decNumber *dn, const uByte *bcd, uInt n) {
3640
  Unit *up = dn->lsu + D2U(n) - 1;      /* -> msu [target pointer] */
3641
  const uByte *ub=bcd;			/* -> source msd */
3642

3643
  #if DECDPUN==1			/* trivial simple copy */
3644
    for (; ub<bcd+n; ub++, up--) *up=*ub;
3645
  #else					/* some assembly needed */
3646
    /* calculate how many digits in msu, and hence first cut */
3647
    Int cut=MSUDIGITS(n);		/* [faster than remainder] */
3648
    for (;up>=dn->lsu; up--) {		/* each Unit from msu */
3649
      *up=0;				/* will take <=DECDPUN digits */
3650
      for (; cut>0; ub++, cut--) *up=X10(*up)+*ub;
3651
      cut=DECDPUN;			/* next Unit has all digits */
3652
      }
3653
  #endif
3654
  dn->digits=n;				/* set digit count */
3655
  return dn;
3656
  } /* decNumberSetBCD */
3657

3658
/* ------------------------------------------------------------------ */
3659
/* decNumberIsNormal -- test normality of a decNumber		      */
3660
/*   dn is the decNumber to test				      */
3661
/*   set is the context to use for Emin				      */
3662
/*   returns 1 if |dn| is finite and >=Nmin, 0 otherwise	      */
3663
/* ------------------------------------------------------------------ */
3664
Int decNumberIsNormal(const decNumber *dn, decContext *set) {
3665
  Int ae;				/* adjusted exponent */
3666
  #if DECCHECK
3667
  if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
3668
  #endif
3669

3670
  if (decNumberIsSpecial(dn)) return 0; /* not finite */
3671
  if (decNumberIsZero(dn)) return 0;	/* not non-zero */
3672

3673
  ae=dn->exponent+dn->digits-1;		/* adjusted exponent */
3674
  if (ae<set->emin) return 0;		/* is subnormal */
3675
  return 1;
3676
  } /* decNumberIsNormal */
3677

3678
/* ------------------------------------------------------------------ */
3679
/* decNumberIsSubnormal -- test subnormality of a decNumber	      */
3680
/*   dn is the decNumber to test				      */
3681
/*   set is the context to use for Emin				      */
3682
/*   returns 1 if |dn| is finite, non-zero, and <Nmin, 0 otherwise    */
3683
/* ------------------------------------------------------------------ */
3684
Int decNumberIsSubnormal(const decNumber *dn, decContext *set) {
3685
  Int ae;				/* adjusted exponent */
3686
  #if DECCHECK
3687
  if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
3688
  #endif
3689

3690
  if (decNumberIsSpecial(dn)) return 0; /* not finite */
3691
  if (decNumberIsZero(dn)) return 0;	/* not non-zero */
3692

3693
  ae=dn->exponent+dn->digits-1;		/* adjusted exponent */
3694
  if (ae<set->emin) return 1;		/* is subnormal */
3695
  return 0;
3696
  } /* decNumberIsSubnormal */
3697

3698
/* ------------------------------------------------------------------ */
3699
/* decNumberTrim -- remove insignificant zeros			      */
3700
/*								      */
3701
/*   dn is the number to trim					      */
3702
/*   returns dn							      */
3703
/*								      */
3704
/* All fields are updated as required.	This is a utility operation,  */
3705
/* so special values are unchanged and no error is possible.	      */
3706
/* ------------------------------------------------------------------ */
3707
decNumber * decNumberTrim(decNumber *dn) {
3708
  Int  dropped;			   /* work */
3709
  decContext set;		   /* .. */
3710
  #if DECCHECK
3711
  if (decCheckOperands(DECUNRESU, DECUNUSED, dn, DECUNCONT)) return dn;
3712
  #endif
3713
  decContextDefault(&set, DEC_INIT_BASE);    /* clamp=0 */
3714
  return decTrim(dn, &set, 0, &dropped);
3715
  } /* decNumberTrim */
3716

3717
/* ------------------------------------------------------------------ */
3718
/* decNumberVersion -- return the name and version of this module     */
3719
/*								      */
3720
/* No error is possible.					      */
3721
/* ------------------------------------------------------------------ */
3722
const char * decNumberVersion(void) {
3723
  return DECVERSION;
3724
  } /* decNumberVersion */
3725

3726
/* ------------------------------------------------------------------ */
3727
/* decNumberZero -- set a number to 0				      */
3728
/*								      */
3729
/*   dn is the number to set, with space for one digit		      */
3730
/*   returns dn							      */
3731
/*								      */
3732
/* No error is possible.					      */
3733
/* ------------------------------------------------------------------ */
3734
/* Memset is not used as it is much slower in some environments. */
3735
decNumber * decNumberZero(decNumber *dn) {
3736

3737
  #if DECCHECK
3738
  if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
3739
  #endif
3740

3741
  dn->bits=0;
3742
  dn->exponent=0;
3743
  dn->digits=1;
3744
  dn->lsu[0]=0;
3745
  return dn;
3746
  } /* decNumberZero */
3747

3748
/* ================================================================== */
3749
/* Local routines						      */
3750
/* ================================================================== */
3751

3752
/* ------------------------------------------------------------------ */
3753
/* decToString -- lay out a number into a string		      */
3754
/*								      */
3755
/*   dn	    is the number to lay out				      */
3756
/*   string is where to lay out the number			      */
3757
/*   eng    is 1 if Engineering, 0 if Scientific		      */
3758
/*								      */
3759
/* string must be at least dn->digits+14 characters long	      */
3760
/* No error is possible.					      */
3761
/*								      */
3762
/* Note that this routine can generate a -0 or 0.000.  These are      */
3763
/* never generated in subset to-number or arithmetic, but can occur   */
3764
/* in non-subset arithmetic (e.g., -1*0 or 1.234-1.234).	      */
3765
/* ------------------------------------------------------------------ */
3766
/* If DECCHECK is enabled the string "?" is returned if a number is */
3767
/* invalid. */
3768
static void decToString(const decNumber *dn, char *string, Flag eng) {
3769
  Int exp=dn->exponent;	      /* local copy */
3770
  Int e;		      /* E-part value */
3771
  Int pre;		      /* digits before the '.' */
3772
  Int cut;		      /* for counting digits in a Unit */
3773
  char *c=string;	      /* work [output pointer] */
3774
  const Unit *up=dn->lsu+D2U(dn->digits)-1; /* -> msu [input pointer] */
3775
  uInt u, pow;		      /* work */
3776

3777
  #if DECCHECK
3778
  if (decCheckOperands(DECUNRESU, dn, DECUNUSED, DECUNCONT)) {
3779
    strcpy(string, "?");
3780
    return;}
3781
  #endif
3782

3783
  if (decNumberIsNegative(dn)) {   /* Negatives get a minus */
3784
    *c='-';
3785
    c++;
3786
    }
3787
  if (dn->bits&DECSPECIAL) {	   /* Is a special value */
3788
    if (decNumberIsInfinite(dn)) {
3789
      strcpy(c,	  "Inf");
3790
      strcpy(c+3, "inity");
3791
      return;}
3792
    /* a NaN */
3793
    if (dn->bits&DECSNAN) {	   /* signalling NaN */
3794
      *c='s';
3795
      c++;
3796
      }
3797
    strcpy(c, "NaN");
3798
    c+=3;			   /* step past */
3799
    /* if not a clean non-zero coefficient, that's all there is in a */
3800
    /* NaN string */
3801
    if (exp!=0 || (*dn->lsu==0 && dn->digits==1)) return;
3802
    /* [drop through to add integer] */
3803
    }
3804

3805
  /* calculate how many digits in msu, and hence first cut */
3806
  cut=MSUDIGITS(dn->digits);	   /* [faster than remainder] */
3807
  cut--;			   /* power of ten for digit */
3808

3809
  if (exp==0) {			   /* simple integer [common fastpath] */
3810
    for (;up>=dn->lsu; up--) {	   /* each Unit from msu */
3811
      u=*up;			   /* contains DECDPUN digits to lay out */
3812
      for (; cut>=0; c++, cut--) TODIGIT(u, cut, c, pow);
3813
      cut=DECDPUN-1;		   /* next Unit has all digits */
3814
      }
3815
    *c='\0';			   /* terminate the string */
3816
    return;}
3817

3818
  /* non-0 exponent -- assume plain form */
3819
  pre=dn->digits+exp;		   /* digits before '.' */
3820
  e=0;				   /* no E */
3821
  if ((exp>0) || (pre<-5)) {	   /* need exponential form */
3822
    e=exp+dn->digits-1;		   /* calculate E value */
3823
    pre=1;			   /* assume one digit before '.' */
3824
    if (eng && (e!=0)) {	   /* engineering: may need to adjust */
3825
      Int adj;			   /* adjustment */
3826
      /* The C remainder operator is undefined for negative numbers, so */
3827
      /* a positive remainder calculation must be used here */
3828
      if (e<0) {
3829
	adj=(-e)%3;
3830
	if (adj!=0) adj=3-adj;
3831
	}
3832
       else { /* e>0 */
3833
	adj=e%3;
3834
	}
3835
      e=e-adj;
3836
      /* if dealing with zero still produce an exponent which is a */
3837
      /* multiple of three, as expected, but there will only be the */
3838
      /* one zero before the E, still.	Otherwise note the padding. */
3839
      if (!ISZERO(dn)) pre+=adj;
3840
       else {  /* is zero */
3841
	if (adj!=0) {		   /* 0.00Esnn needed */
3842
	  e=e+3;
3843
	  pre=-(2-adj);
3844
	  }
3845
	} /* zero */
3846
      } /* eng */
3847
    } /* need exponent */
3848

3849
  /* lay out the digits of the coefficient, adding 0s and . as needed */
3850
  u=*up;
3851
  if (pre>0) {			   /* xxx.xxx or xx00 (engineering) form */
3852
    Int n=pre;
3853
    for (; pre>0; pre--, c++, cut--) {
3854
      if (cut<0) {		   /* need new Unit */
3855
	if (up==dn->lsu) break;	   /* out of input digits (pre>digits) */
3856
	up--;
3857
	cut=DECDPUN-1;
3858
	u=*up;
3859
	}
3860
      TODIGIT(u, cut, c, pow);
3861
      }
3862
    if (n<dn->digits) {		   /* more to come, after '.' */
3863
      *c='.'; c++;
3864
      for (;; c++, cut--) {
3865
	if (cut<0) {		   /* need new Unit */
3866
	  if (up==dn->lsu) break;  /* out of input digits */
3867
	  up--;
3868
	  cut=DECDPUN-1;
3869
	  u=*up;
3870
	  }
3871
	TODIGIT(u, cut, c, pow);
3872
	}
3873
      }
3874
     else for (; pre>0; pre--, c++) *c='0'; /* 0 padding (for engineering) needed */
3875
    }
3876
   else {			   /* 0.xxx or 0.000xxx form */
3877
    *c='0'; c++;
3878
    *c='.'; c++;
3879
    for (; pre<0; pre++, c++) *c='0';	/* add any 0's after '.' */
3880
    for (; ; c++, cut--) {
3881
      if (cut<0) {		   /* need new Unit */
3882
	if (up==dn->lsu) break;	   /* out of input digits */
3883
	up--;
3884
	cut=DECDPUN-1;
3885
	u=*up;
3886
	}
3887
      TODIGIT(u, cut, c, pow);
3888
      }
3889
    }
3890

3891
  /* Finally add the E-part, if needed.	 It will never be 0, has a
3892
     base maximum and minimum of +999999999 through -999999999, but
3893
     could range down to -1999999998 for anormal numbers */
3894
  if (e!=0) {
3895
    Flag had=0;		      /* 1=had non-zero */
3896
    *c='E'; c++;
3897
    *c='+'; c++;	      /* assume positive */
3898
    u=e;		      /* .. */
3899
    if (e<0) {
3900
      *(c-1)='-';	      /* oops, need - */
3901
      u=-e;		      /* uInt, please */
3902
      }
3903
    /* lay out the exponent [_itoa or equivalent is not ANSI C] */
3904
    for (cut=9; cut>=0; cut--) {
3905
      TODIGIT(u, cut, c, pow);
3906
      if (*c=='0' && !had) continue;	/* skip leading zeros */
3907
      had=1;				/* had non-0 */
3908
      c++;				/* step for next */
3909
      } /* cut */
3910
    }
3911
  *c='\0';	    /* terminate the string (all paths) */
3912
  return;
3913
  } /* decToString */
3914

3915
/* ------------------------------------------------------------------ */
3916
/* decAddOp -- add/subtract operation				      */
3917
/*								      */
3918
/*   This computes C = A + B					      */
3919
/*								      */
3920
/*   res is C, the result.  C may be A and/or B (e.g., X=X+X)	      */
3921
/*   lhs is A							      */
3922
/*   rhs is B							      */
3923
/*   set is the context						      */
3924
/*   negate is DECNEG if rhs should be negated, or 0 otherwise	      */
3925
/*   status accumulates status for the caller			      */
3926
/*								      */
3927
/* C must have space for set->digits digits.			      */
3928
/* Inexact in status must be 0 for correct Exact zero sign in result  */
3929
/* ------------------------------------------------------------------ */
3930
/* If possible, the coefficient is calculated directly into C.	      */
3931
/* However, if:							      */
3932
/*   -- a digits+1 calculation is needed because the numbers are      */
3933
/*	unaligned and span more than set->digits digits		      */
3934
/*   -- a carry to digits+1 digits looks possible		      */
3935
/*   -- C is the same as A or B, and the result would destructively   */
3936
/*	overlap the A or B coefficient				      */
3937
/* then the result must be calculated into a temporary buffer.	In    */
3938
/* this case a local (stack) buffer is used if possible, and only if  */
3939
/* too long for that does malloc become the final resort.	      */
3940
/*								      */
3941
/* Misalignment is handled as follows:				      */
3942
/*   Apad: (AExp>BExp) Swap operands and proceed as for BExp>AExp.    */
3943
/*   BPad: Apply the padding by a combination of shifting (whole      */
3944
/*	   units) and multiplication (part units).		      */
3945
/*								      */
3946
/* Addition, especially x=x+1, is speed-critical.		      */
3947
/* The static buffer is larger than might be expected to allow for    */
3948
/* calls from higher-level functions (notably exp).		      */
3949
/* ------------------------------------------------------------------ */
3950
static decNumber * decAddOp(decNumber *res, const decNumber *lhs,
3951
			    const decNumber *rhs, decContext *set,
3952
			    uByte negate, uInt *status) {
3953
  #if DECSUBSET
3954
  decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
3955
  decNumber *allocrhs=NULL;	   /* .., rhs */
3956
  #endif
3957
  Int	rhsshift;		   /* working shift (in Units) */
3958
  Int	maxdigits;		   /* longest logical length */
3959
  Int	mult;			   /* multiplier */
3960
  Int	residue;		   /* rounding accumulator */
3961
  uByte bits;			   /* result bits */
3962
  Flag	diffsign;		   /* non-0 if arguments have different sign */
3963
  Unit	*acc;			   /* accumulator for result */
3964
  Unit	accbuff[SD2U(DECBUFFER*2+20)]; /* local buffer [*2+20 reduces many */
3965
				   /* allocations when called from */
3966
				   /* other operations, notable exp] */
3967
  Unit	*allocacc=NULL;		   /* -> allocated acc buffer, iff allocated */
3968
  Int	reqdigits=set->digits;	   /* local copy; requested DIGITS */
3969
  Int	padding;		   /* work */
3970

3971
  #if DECCHECK
3972
  if (decCheckOperands(res, lhs, rhs, set)) return res;
3973
  #endif
3974

3975
  do {				   /* protect allocated storage */
3976
    #if DECSUBSET
3977
    if (!set->extended) {
3978
      /* reduce operands and set lostDigits status, as needed */
3979
      if (lhs->digits>reqdigits) {
3980
	alloclhs=decRoundOperand(lhs, set, status);
3981
	if (alloclhs==NULL) break;
3982
	lhs=alloclhs;
3983
	}
3984
      if (rhs->digits>reqdigits) {
3985
	allocrhs=decRoundOperand(rhs, set, status);
3986
	if (allocrhs==NULL) break;
3987
	rhs=allocrhs;
3988
	}
3989
      }
3990
    #endif
3991
    /* [following code does not require input rounding] */
3992

3993
    /* note whether signs differ [used all paths] */
3994
    diffsign=(Flag)((lhs->bits^rhs->bits^negate)&DECNEG);
3995

3996
    /* handle infinities and NaNs */
3997
    if (SPECIALARGS) {			/* a special bit set */
3998
      if (SPECIALARGS & (DECSNAN | DECNAN))  /* a NaN */
3999
	decNaNs(res, lhs, rhs, set, status);
4000
       else { /* one or two infinities */
4001
	if (decNumberIsInfinite(lhs)) { /* LHS is infinity */
4002
	  /* two infinities with different signs is invalid */
4003
	  if (decNumberIsInfinite(rhs) && diffsign) {
4004
	    *status|=DEC_Invalid_operation;
4005
	    break;
4006
	    }
4007
	  bits=lhs->bits & DECNEG;	/* get sign from LHS */
4008
	  }
4009
	 else bits=(rhs->bits^negate) & DECNEG;/* RHS must be Infinity */
4010
	bits|=DECINF;
4011
	decNumberZero(res);
4012
	res->bits=bits;			/* set +/- infinity */
4013
	} /* an infinity */
4014
      break;
4015
      }
4016

4017
    /* Quick exit for add 0s; return the non-0, modified as need be */
4018
    if (ISZERO(lhs)) {
4019
      Int adjust;			/* work */
4020
      Int lexp=lhs->exponent;		/* save in case LHS==RES */
4021
      bits=lhs->bits;			/* .. */
4022
      residue=0;			/* clear accumulator */
4023
      decCopyFit(res, rhs, set, &residue, status); /* copy (as needed) */
4024
      res->bits^=negate;		/* flip if rhs was negated */
4025
      #if DECSUBSET
4026
      if (set->extended) {		/* exponents on zeros count */
4027
      #endif
4028
	/* exponent will be the lower of the two */
4029
	adjust=lexp-res->exponent;	/* adjustment needed [if -ve] */
4030
	if (ISZERO(res)) {		/* both 0: special IEEE 854 rules */
4031
	  if (adjust<0) res->exponent=lexp;  /* set exponent */
4032
	  /* 0-0 gives +0 unless rounding to -infinity, and -0-0 gives -0 */
4033
	  if (diffsign) {
4034
	    if (set->round!=DEC_ROUND_FLOOR) res->bits=0;
4035
	     else res->bits=DECNEG;	/* preserve 0 sign */
4036
	    }
4037
	  }
4038
	 else { /* non-0 res */
4039
	  if (adjust<0) {     /* 0-padding needed */
4040
	    if ((res->digits-adjust)>set->digits) {
4041
	      adjust=res->digits-set->digits;	  /* to fit exactly */
4042
	      *status|=DEC_Rounded;		  /* [but exact] */
4043
	      }
4044
	    res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
4045
	    res->exponent+=adjust;		  /* set the exponent. */
4046
	    }
4047
	  } /* non-0 res */
4048
      #if DECSUBSET
4049
	} /* extended */
4050
      #endif
4051
      decFinish(res, set, &residue, status);	  /* clean and finalize */
4052
      break;}
4053

4054
    if (ISZERO(rhs)) {			/* [lhs is non-zero] */
4055
      Int adjust;			/* work */
4056
      Int rexp=rhs->exponent;		/* save in case RHS==RES */
4057
      bits=rhs->bits;			/* be clean */
4058
      residue=0;			/* clear accumulator */
4059
      decCopyFit(res, lhs, set, &residue, status); /* copy (as needed) */
4060
      #if DECSUBSET
4061
      if (set->extended) {		/* exponents on zeros count */
4062
      #endif
4063
	/* exponent will be the lower of the two */
4064
	/* [0-0 case handled above] */
4065
	adjust=rexp-res->exponent;	/* adjustment needed [if -ve] */
4066
	if (adjust<0) {	    /* 0-padding needed */
4067
	  if ((res->digits-adjust)>set->digits) {
4068
	    adjust=res->digits-set->digits;	/* to fit exactly */
4069
	    *status|=DEC_Rounded;		/* [but exact] */
4070
	    }
4071
	  res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
4072
	  res->exponent+=adjust;		/* set the exponent. */
4073
	  }
4074
      #if DECSUBSET
4075
	} /* extended */
4076
      #endif
4077
      decFinish(res, set, &residue, status);	  /* clean and finalize */
4078
      break;}
4079

4080
    /* [NB: both fastpath and mainpath code below assume these cases */
4081
    /* (notably 0-0) have already been handled] */
4082

4083
    /* calculate the padding needed to align the operands */
4084
    padding=rhs->exponent-lhs->exponent;
4085

4086
    /* Fastpath cases where the numbers are aligned and normal, the RHS */
4087
    /* is all in one unit, no operand rounding is needed, and no carry, */
4088
    /* lengthening, or borrow is needed */
4089
    if (padding==0
4090
	&& rhs->digits<=DECDPUN
4091
	&& rhs->exponent>=set->emin	/* [some normals drop through] */
4092
	&& rhs->exponent<=set->emax-set->digits+1 /* [could clamp] */
4093
	&& rhs->digits<=reqdigits
4094
	&& lhs->digits<=reqdigits) {
4095
      Int partial=*lhs->lsu;
4096
      if (!diffsign) {			/* adding */
4097
	partial+=*rhs->lsu;
4098
	if ((partial<=DECDPUNMAX)	/* result fits in unit */
4099
	 && (lhs->digits>=DECDPUN ||	/* .. and no digits-count change */
4100
	     partial<(Int)powers[lhs->digits])) { /* .. */
4101
	  if (res!=lhs) decNumberCopy(res, lhs);  /* not in place */
4102
	  *res->lsu=(Unit)partial;	/* [copy could have overwritten RHS] */
4103
	  break;
4104
	  }
4105
	/* else drop out for careful add */
4106
	}
4107
       else {				/* signs differ */
4108
	partial-=*rhs->lsu;
4109
	if (partial>0) { /* no borrow needed, and non-0 result */
4110
	  if (res!=lhs) decNumberCopy(res, lhs);  /* not in place */
4111
	  *res->lsu=(Unit)partial;
4112
	  /* this could have reduced digits [but result>0] */
4113
	  res->digits=decGetDigits(res->lsu, D2U(res->digits));
4114
	  break;
4115
	  }
4116
	/* else drop out for careful subtract */
4117
	}
4118
      }
4119

4120
    /* Now align (pad) the lhs or rhs so they can be added or */
4121
    /* subtracted, as necessary.  If one number is much larger than */
4122
    /* the other (that is, if in plain form there is a least one */
4123
    /* digit between the lowest digit of one and the highest of the */
4124
    /* other) padding with up to DIGITS-1 trailing zeros may be */
4125
    /* needed; then apply rounding (as exotic rounding modes may be */
4126
    /* affected by the residue). */
4127
    rhsshift=0;		      /* rhs shift to left (padding) in Units */
4128
    bits=lhs->bits;	      /* assume sign is that of LHS */
4129
    mult=1;		      /* likely multiplier */
4130

4131
    /* [if padding==0 the operands are aligned; no padding is needed] */
4132
    if (padding!=0) {
4133
      /* some padding needed; always pad the RHS, as any required */
4134
      /* padding can then be effected by a simple combination of */
4135
      /* shifts and a multiply */
4136
      Flag swapped=0;
4137
      if (padding<0) {			/* LHS needs the padding */
4138
	const decNumber *t;
4139
	padding=-padding;		/* will be +ve */
4140
	bits=(uByte)(rhs->bits^negate); /* assumed sign is now that of RHS */
4141
	t=lhs; lhs=rhs; rhs=t;
4142
	swapped=1;
4143
	}
4144

4145
      /* If, after pad, rhs would be longer than lhs by digits+1 or */
4146
      /* more then lhs cannot affect the answer, except as a residue, */
4147
      /* so only need to pad up to a length of DIGITS+1. */
4148
      if (rhs->digits+padding > lhs->digits+reqdigits+1) {
4149
	/* The RHS is sufficient */
4150
	/* for residue use the relative sign indication... */
4151
	Int shift=reqdigits-rhs->digits;     /* left shift needed */
4152
	residue=1;			     /* residue for rounding */
4153
	if (diffsign) residue=-residue;	     /* signs differ */
4154
	/* copy, shortening if necessary */
4155
	decCopyFit(res, rhs, set, &residue, status);
4156
	/* if it was already shorter, then need to pad with zeros */
4157
	if (shift>0) {
4158
	  res->digits=decShiftToMost(res->lsu, res->digits, shift);
4159
	  res->exponent-=shift;		     /* adjust the exponent. */
4160
	  }
4161
	/* flip the result sign if unswapped and rhs was negated */
4162
	if (!swapped) res->bits^=negate;
4163
	decFinish(res, set, &residue, status);	  /* done */
4164
	break;}
4165

4166
      /* LHS digits may affect result */
4167
      rhsshift=D2U(padding+1)-1;	/* this much by Unit shift .. */
4168
      mult=powers[padding-(rhsshift*DECDPUN)]; /* .. this by multiplication */
4169
      } /* padding needed */
4170

4171
    if (diffsign) mult=-mult;		/* signs differ */
4172

4173
    /* determine the longer operand */
4174
    maxdigits=rhs->digits+padding;	/* virtual length of RHS */
4175
    if (lhs->digits>maxdigits) maxdigits=lhs->digits;
4176

4177
    /* Decide on the result buffer to use; if possible place directly */
4178
    /* into result. */
4179
    acc=res->lsu;			/* assume add direct to result */
4180
    /* If destructive overlap, or the number is too long, or a carry or */
4181
    /* borrow to DIGITS+1 might be possible, a buffer must be used. */
4182
    /* [Might be worth more sophisticated tests when maxdigits==reqdigits] */
4183
    if ((maxdigits>=reqdigits)		/* is, or could be, too large */
4184
     || (res==rhs && rhsshift>0)) {	/* destructive overlap */
4185
      /* buffer needed, choose it; units for maxdigits digits will be */
4186
      /* needed, +1 Unit for carry or borrow */
4187
      Int need=D2U(maxdigits)+1;
4188
      acc=accbuff;			/* assume use local buffer */
4189
      if (need*sizeof(Unit)>sizeof(accbuff)) {
4190
	/* printf("malloc add %ld %ld\n", need, sizeof(accbuff)); */
4191
	allocacc=(Unit *)malloc(need*sizeof(Unit));
4192
	if (allocacc==NULL) {		/* hopeless -- abandon */
4193
	  *status|=DEC_Insufficient_storage;
4194
	  break;}
4195
	acc=allocacc;
4196
	}
4197
      }
4198

4199
    res->bits=(uByte)(bits&DECNEG);	/* it's now safe to overwrite.. */
4200
    res->exponent=lhs->exponent;	/* .. operands (even if aliased) */
4201

4202
    #if DECTRACE
4203
      decDumpAr('A', lhs->lsu, D2U(lhs->digits));
4204
      decDumpAr('B', rhs->lsu, D2U(rhs->digits));
4205
      printf("	:h: %ld %ld\n", rhsshift, mult);
4206
    #endif
4207

4208
    /* add [A+B*m] or subtract [A+B*(-m)] */
4209
    res->digits=decUnitAddSub(lhs->lsu, D2U(lhs->digits),
4210
			      rhs->lsu, D2U(rhs->digits),
4211
			      rhsshift, acc, mult)
4212
	       *DECDPUN;	   /* [units -> digits] */
4213
    if (res->digits<0) {	   /* borrowed... */
4214
      res->digits=-res->digits;
4215
      res->bits^=DECNEG;	   /* flip the sign */
4216
      }
4217
    #if DECTRACE
4218
      decDumpAr('+', acc, D2U(res->digits));
4219
    #endif
4220

4221
    /* If a buffer was used the result must be copied back, possibly */
4222
    /* shortening.  (If no buffer was used then the result must have */
4223
    /* fit, so can't need rounding and residue must be 0.) */
4224
    residue=0;			   /* clear accumulator */
4225
    if (acc!=res->lsu) {
4226
      #if DECSUBSET
4227
      if (set->extended) {	   /* round from first significant digit */
4228
      #endif
4229
	/* remove leading zeros that were added due to rounding up to */
4230
	/* integral Units -- before the test for rounding. */
4231
	if (res->digits>reqdigits)
4232
	  res->digits=decGetDigits(acc, D2U(res->digits));
4233
	decSetCoeff(res, set, acc, res->digits, &residue, status);
4234
      #if DECSUBSET
4235
	}
4236
       else { /* subset arithmetic rounds from original significant digit */
4237
	/* May have an underestimate.  This only occurs when both */
4238
	/* numbers fit in DECDPUN digits and are padding with a */
4239
	/* negative multiple (-10, -100...) and the top digit(s) become */
4240
	/* 0.  (This only matters when using X3.274 rules where the */
4241
	/* leading zero could be included in the rounding.) */
4242
	if (res->digits<maxdigits) {
4243
	  *(acc+D2U(res->digits))=0; /* ensure leading 0 is there */
4244
	  res->digits=maxdigits;
4245
	  }
4246
	 else {
4247
	  /* remove leading zeros that added due to rounding up to */
4248
	  /* integral Units (but only those in excess of the original */
4249
	  /* maxdigits length, unless extended) before test for rounding. */
4250
	  if (res->digits>reqdigits) {
4251
	    res->digits=decGetDigits(acc, D2U(res->digits));
4252
	    if (res->digits<maxdigits) res->digits=maxdigits;
4253
	    }
4254
	  }
4255
	decSetCoeff(res, set, acc, res->digits, &residue, status);
4256
	/* Now apply rounding if needed before removing leading zeros. */
4257
	/* This is safe because subnormals are not a possibility */
4258
	if (residue!=0) {
4259
	  decApplyRound(res, set, residue, status);
4260
	  residue=0;		     /* did what needed to be done */
4261
	  }
4262
	} /* subset */
4263
      #endif
4264
      } /* used buffer */
4265

4266
    /* strip leading zeros [these were left on in case of subset subtract] */
4267
    res->digits=decGetDigits(res->lsu, D2U(res->digits));
4268

4269
    /* apply checks and rounding */
4270
    decFinish(res, set, &residue, status);
4271

4272
    /* "When the sum of two operands with opposite signs is exactly */
4273
    /* zero, the sign of that sum shall be '+' in all rounding modes */
4274
    /* except round toward -Infinity, in which mode that sign shall be */
4275
    /* '-'."  [Subset zeros also never have '-', set by decFinish.] */
4276
    if (ISZERO(res) && diffsign
4277
     #if DECSUBSET
4278
     && set->extended
4279
     #endif
4280
     && (*status&DEC_Inexact)==0) {
4281
      if (set->round==DEC_ROUND_FLOOR) res->bits|=DECNEG;   /* sign - */
4282
				  else res->bits&=~DECNEG;  /* sign + */
4283
      }
4284
    } while(0);				     /* end protected */
4285

4286
  if (allocacc!=NULL) free(allocacc);	     /* drop any storage used */
4287
  #if DECSUBSET
4288
  if (allocrhs!=NULL) free(allocrhs);	     /* .. */
4289
  if (alloclhs!=NULL) free(alloclhs);	     /* .. */
4290
  #endif
4291
  return res;
4292
  } /* decAddOp */
4293

4294
/* ------------------------------------------------------------------ */
4295
/* decDivideOp -- division operation				      */
4296
/*								      */
4297
/*  This routine performs the calculations for all four division      */
4298
/*  operators (divide, divideInteger, remainder, remainderNear).      */
4299
/*								      */
4300
/*  C=A op B							      */
4301
/*								      */
4302
/*   res is C, the result.  C may be A and/or B (e.g., X=X/X)	      */
4303
/*   lhs is A							      */
4304
/*   rhs is B							      */
4305
/*   set is the context						      */
4306
/*   op	 is DIVIDE, DIVIDEINT, REMAINDER, or REMNEAR respectively.    */
4307
/*   status is the usual accumulator				      */
4308
/*								      */
4309
/* C must have space for set->digits digits.			      */
4310
/*								      */
4311
/* ------------------------------------------------------------------ */
4312
/*   The underlying algorithm of this routine is the same as in the   */
4313
/*   1981 S/370 implementation, that is, non-restoring long division  */
4314
/*   with bi-unit (rather than bi-digit) estimation for each unit     */
4315
/*   multiplier.  In this pseudocode overview, complications for the  */
4316
/*   Remainder operators and division residues for exact rounding are */
4317
/*   omitted for clarity.					      */
4318
/*								      */
4319
/*     Prepare operands and handle special values		      */
4320
/*     Test for x/0 and then 0/x				      */
4321
/*     Exp =Exp1 - Exp2						      */
4322
/*     Exp =Exp +len(var1) -len(var2)				      */
4323
/*     Sign=Sign1 * Sign2					      */
4324
/*     Pad accumulator (Var1) to double-length with 0's (pad1)	      */
4325
/*     Pad Var2 to same length as Var1				      */
4326
/*     msu2pair/plus=1st 2 or 1 units of var2, +1 to allow for round  */
4327
/*     have=0							      */
4328
/*     Do until (have=digits+1 OR residue=0)			      */
4329
/*	 if exp<0 then if integer divide/residue then leave	      */
4330
/*	 this_unit=0						      */
4331
/*	 Do forever						      */
4332
/*	    compare numbers					      */
4333
/*	    if <0 then leave inner_loop				      */
4334
/*	    if =0 then (* quick exit without subtract *) do	      */
4335
/*	       this_unit=this_unit+1; output this_unit		      */
4336
/*	       leave outer_loop; end				      */
4337
/*	    Compare lengths of numbers (mantissae):		      */
4338
/*	    If same then tops2=msu2pair -- {units 1&2 of var2}	      */
4339
/*		    else tops2=msu2plus -- {0, unit 1 of var2}	      */
4340
/*	    tops1=first_unit_of_Var1*10**DECDPUN +second_unit_of_var1 */
4341
/*	    mult=tops1/tops2  -- Good and safe guess at divisor	      */
4342
/*	    if mult=0 then mult=1				      */
4343
/*	    this_unit=this_unit+mult				      */
4344
/*	    subtract						      */
4345
/*	    end inner_loop					      */
4346
/*	  if have\=0 | this_unit\=0 then do			      */
4347
/*	    output this_unit					      */
4348
/*	    have=have+1; end					      */
4349
/*	  var2=var2/10						      */
4350
/*	  exp=exp-1						      */
4351
/*	  end outer_loop					      */
4352
/*     exp=exp+1   -- set the proper exponent			      */
4353
/*     if have=0 then generate answer=0				      */
4354
/*     Return (Result is defined by Var1)			      */
4355
/*								      */
4356
/* ------------------------------------------------------------------ */
4357
/* Two working buffers are needed during the division; one (digits+   */
4358
/* 1) to accumulate the result, and the other (up to 2*digits+1) for  */
4359
/* long subtractions.  These are acc and var1 respectively.	      */
4360
/* var1 is a copy of the lhs coefficient, var2 is the rhs coefficient.*/
4361
/* The static buffers may be larger than might be expected to allow   */
4362
/* for calls from higher-level functions (notably exp).		      */
4363
/* ------------------------------------------------------------------ */
4364
static decNumber * decDivideOp(decNumber *res,
4365
			       const decNumber *lhs, const decNumber *rhs,
4366
			       decContext *set, Flag op, uInt *status) {
4367
  #if DECSUBSET
4368
  decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
4369
  decNumber *allocrhs=NULL;	   /* .., rhs */
4370
  #endif
4371
  Unit	accbuff[SD2U(DECBUFFER+DECDPUN+10)]; /* local buffer */
4372
  Unit	*acc=accbuff;		   /* -> accumulator array for result */
4373
  Unit	*allocacc=NULL;		   /* -> allocated buffer, iff allocated */
4374
  Unit	*accnext;		   /* -> where next digit will go */
4375
  Int	acclength;		   /* length of acc needed [Units] */
4376
  Int	accunits;		   /* count of units accumulated */
4377
  Int	accdigits;		   /* count of digits accumulated */
4378

4379
  Unit	varbuff[SD2U(DECBUFFER*2+DECDPUN)*sizeof(Unit)]; /* buffer for var1 */
4380
  Unit	*var1=varbuff;		   /* -> var1 array for long subtraction */
4381
  Unit	*varalloc=NULL;		   /* -> allocated buffer, iff used */
4382
  Unit	*msu1;			   /* -> msu of var1 */
4383

4384
  const Unit *var2;		   /* -> var2 array */
4385
  const Unit *msu2;		   /* -> msu of var2 */
4386
  Int	msu2plus;		   /* msu2 plus one [does not vary] */
4387
  eInt	msu2pair;		   /* msu2 pair plus one [does not vary] */
4388

4389
  Int	var1units, var2units;	   /* actual lengths */
4390
  Int	var2ulen;		   /* logical length (units) */
4391
  Int	var1initpad=0;		   /* var1 initial padding (digits) */
4392
  Int	maxdigits;		   /* longest LHS or required acc length */
4393
  Int	mult;			   /* multiplier for subtraction */
4394
  Unit	thisunit;		   /* current unit being accumulated */
4395
  Int	residue;		   /* for rounding */
4396
  Int	reqdigits=set->digits;	   /* requested DIGITS */
4397
  Int	exponent;		   /* working exponent */
4398
  Int	maxexponent=0;		   /* DIVIDE maximum exponent if unrounded */
4399
  uByte bits;			   /* working sign */
4400
  Unit	*target;		   /* work */
4401
  const Unit *source;		   /* .. */
4402
  uLong const *pow;                /* .. */
4403
  Int	shift, cut;		   /* .. */
4404
  #if DECSUBSET
4405
  Int	dropped;		   /* work */
4406
  #endif
4407

4408
  #if DECCHECK
4409
  if (decCheckOperands(res, lhs, rhs, set)) return res;
4410
  #endif
4411

4412
  do {				   /* protect allocated storage */
4413
    #if DECSUBSET
4414
    if (!set->extended) {
4415
      /* reduce operands and set lostDigits status, as needed */
4416
      if (lhs->digits>reqdigits) {
4417
	alloclhs=decRoundOperand(lhs, set, status);
4418
	if (alloclhs==NULL) break;
4419
	lhs=alloclhs;
4420
	}
4421
      if (rhs->digits>reqdigits) {
4422
	allocrhs=decRoundOperand(rhs, set, status);
4423
	if (allocrhs==NULL) break;
4424
	rhs=allocrhs;
4425
	}
4426
      }
4427
    #endif
4428
    /* [following code does not require input rounding] */
4429

4430
    bits=(lhs->bits^rhs->bits)&DECNEG;	/* assumed sign for divisions */
4431

4432
    /* handle infinities and NaNs */
4433
    if (SPECIALARGS) {			/* a special bit set */
4434
      if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs */
4435
	decNaNs(res, lhs, rhs, set, status);
4436
	break;
4437
	}
4438
      /* one or two infinities */
4439
      if (decNumberIsInfinite(lhs)) {	/* LHS (dividend) is infinite */
4440
	if (decNumberIsInfinite(rhs) || /* two infinities are invalid .. */
4441
	    op & (REMAINDER | REMNEAR)) { /* as is remainder of infinity */
4442
	  *status|=DEC_Invalid_operation;
4443
	  break;
4444
	  }
4445
	/* [Note that infinity/0 raises no exceptions] */
4446
	decNumberZero(res);
4447
	res->bits=bits|DECINF;		/* set +/- infinity */
4448
	break;
4449
	}
4450
       else {				/* RHS (divisor) is infinite */
4451
	residue=0;
4452
	if (op&(REMAINDER|REMNEAR)) {
4453
	  /* result is [finished clone of] lhs */
4454
	  decCopyFit(res, lhs, set, &residue, status);
4455
	  }
4456
	 else {	 /* a division */
4457
	  decNumberZero(res);
4458
	  res->bits=bits;		/* set +/- zero */
4459
	  /* for DIVIDEINT the exponent is always 0.  For DIVIDE, result */
4460
	  /* is a 0 with infinitely negative exponent, clamped to minimum */
4461
	  if (op&DIVIDE) {
4462
	    res->exponent=set->emin-set->digits+1;
4463
	    *status|=DEC_Clamped;
4464
	    }
4465
	  }
4466
	decFinish(res, set, &residue, status);
4467
	break;
4468
	}
4469
      }
4470

4471
    /* handle 0 rhs (x/0) */
4472
    if (ISZERO(rhs)) {			/* x/0 is always exceptional */
4473
      if (ISZERO(lhs)) {
4474
	decNumberZero(res);		/* [after lhs test] */
4475
	*status|=DEC_Division_undefined;/* 0/0 will become NaN */
4476
	}
4477
       else {
4478
	decNumberZero(res);
4479
	if (op&(REMAINDER|REMNEAR)) *status|=DEC_Invalid_operation;
4480
	 else {
4481
	  *status|=DEC_Division_by_zero; /* x/0 */
4482
	  res->bits=bits|DECINF;	 /* .. is +/- Infinity */
4483
	  }
4484
	}
4485
      break;}
4486

4487
    /* handle 0 lhs (0/x) */
4488
    if (ISZERO(lhs)) {			/* 0/x [x!=0] */
4489
      #if DECSUBSET
4490
      if (!set->extended) decNumberZero(res);
4491
       else {
4492
      #endif
4493
	if (op&DIVIDE) {
4494
	  residue=0;
4495
	  exponent=lhs->exponent-rhs->exponent; /* ideal exponent */
4496
	  decNumberCopy(res, lhs);	/* [zeros always fit] */
4497
	  res->bits=bits;		/* sign as computed */
4498
	  res->exponent=exponent;	/* exponent, too */
4499
	  decFinalize(res, set, &residue, status);   /* check exponent */
4500
	  }
4501
	 else if (op&DIVIDEINT) {
4502
	  decNumberZero(res);		/* integer 0 */
4503
	  res->bits=bits;		/* sign as computed */
4504
	  }
4505
	 else {				/* a remainder */
4506
	  exponent=rhs->exponent;	/* [save in case overwrite] */
4507
	  decNumberCopy(res, lhs);	/* [zeros always fit] */
4508
	  if (exponent<res->exponent) res->exponent=exponent; /* use lower */
4509
	  }
4510
      #if DECSUBSET
4511
	}
4512
      #endif
4513
      break;}
4514

4515
    /* Precalculate exponent.  This starts off adjusted (and hence fits */
4516
    /* in 31 bits) and becomes the usual unadjusted exponent as the */
4517
    /* division proceeds.  The order of evaluation is important, here, */
4518
    /* to avoid wrap. */
4519
    exponent=(lhs->exponent+lhs->digits)-(rhs->exponent+rhs->digits);
4520

4521
    /* If the working exponent is -ve, then some quick exits are */
4522
    /* possible because the quotient is known to be <1 */
4523
    /* [for REMNEAR, it needs to be < -1, as -0.5 could need work] */
4524
    if (exponent<0 && !(op==DIVIDE)) {
4525
      if (op&DIVIDEINT) {
4526
	decNumberZero(res);		     /* integer part is 0 */
4527
	#if DECSUBSET
4528
	if (set->extended)
4529
	#endif
4530
	  res->bits=bits;		     /* set +/- zero */
4531
	break;}
4532
      /* fastpath remainders so long as the lhs has the smaller */
4533
      /* (or equal) exponent */
4534
      if (lhs->exponent<=rhs->exponent) {
4535
	if (op&REMAINDER || exponent<-1) {
4536
	  /* It is REMAINDER or safe REMNEAR; result is [finished */
4537
	  /* clone of] lhs  (r = x - 0*y) */
4538
	  residue=0;
4539
	  decCopyFit(res, lhs, set, &residue, status);
4540
	  decFinish(res, set, &residue, status);
4541
	  break;
4542
	  }
4543
	/* [unsafe REMNEAR drops through] */
4544
	}
4545
      } /* fastpaths */
4546

4547
    /* Long (slow) division is needed; roll up the sleeves... */
4548

4549
    /* The accumulator will hold the quotient of the division. */
4550
    /* If it needs to be too long for stack storage, then allocate. */
4551
    acclength=D2U(reqdigits+DECDPUN);	/* in Units */
4552
    if (acclength*sizeof(Unit)>sizeof(accbuff)) {
4553
      /* printf("malloc dvacc %ld units\n", acclength); */
4554
      allocacc=(Unit *)malloc(acclength*sizeof(Unit));
4555
      if (allocacc==NULL) {		/* hopeless -- abandon */
4556
	*status|=DEC_Insufficient_storage;
4557
	break;}
4558
      acc=allocacc;			/* use the allocated space */
4559
      }
4560

4561
    /* var1 is the padded LHS ready for subtractions. */
4562
    /* If it needs to be too long for stack storage, then allocate. */
4563
    /* The maximum units needed for var1 (long subtraction) is: */
4564
    /* Enough for */
4565
    /*	   (rhs->digits+reqdigits-1) -- to allow full slide to right */
4566
    /* or  (lhs->digits)	     -- to allow for long lhs */
4567
    /* whichever is larger */
4568
    /*	 +1		   -- for rounding of slide to right */
4569
    /*	 +1		   -- for leading 0s */
4570
    /*	 +1		   -- for pre-adjust if a remainder or DIVIDEINT */
4571
    /* [Note: unused units do not participate in decUnitAddSub data] */
4572
    maxdigits=rhs->digits+reqdigits-1;
4573
    if (lhs->digits>maxdigits) maxdigits=lhs->digits;
4574
    var1units=D2U(maxdigits)+2;
4575
    /* allocate a guard unit above msu1 for REMAINDERNEAR */
4576
    if (!(op&DIVIDE)) var1units++;
4577
    if ((var1units+1)*sizeof(Unit)>sizeof(varbuff)) {
4578
      /* printf("malloc dvvar %ld units\n", var1units+1); */
4579
      varalloc=(Unit *)malloc((var1units+1)*sizeof(Unit));
4580
      if (varalloc==NULL) {		/* hopeless -- abandon */
4581
	*status|=DEC_Insufficient_storage;
4582
	break;}
4583
      var1=varalloc;			/* use the allocated space */
4584
      }
4585

4586
    /* Extend the lhs and rhs to full long subtraction length.	The lhs */
4587
    /* is truly extended into the var1 buffer, with 0 padding, so a */
4588
    /* subtract in place is always possible.  The rhs (var2) has */
4589
    /* virtual padding (implemented by decUnitAddSub). */
4590
    /* One guard unit was allocated above msu1 for rem=rem+rem in */
4591
    /* REMAINDERNEAR. */
4592
    msu1=var1+var1units-1;		/* msu of var1 */
4593
    source=lhs->lsu+D2U(lhs->digits)-1; /* msu of input array */
4594
    for (target=msu1; source>=lhs->lsu; source--, target--) *target=*source;
4595
    for (; target>=var1; target--) *target=0;
4596

4597
    /* rhs (var2) is left-aligned with var1 at the start */
4598
    var2ulen=var1units;			/* rhs logical length (units) */
4599
    var2units=D2U(rhs->digits);		/* rhs actual length (units) */
4600
    var2=rhs->lsu;			/* -> rhs array */
4601
    msu2=var2+var2units-1;		/* -> msu of var2 [never changes] */
4602
    /* now set up the variables which will be used for estimating the */
4603
    /* multiplication factor.  If these variables are not exact, add */
4604
    /* 1 to make sure that the multiplier is never overestimated. */
4605
    msu2plus=*msu2;			/* it's value .. */
4606
    if (var2units>1) msu2plus++;	/* .. +1 if any more */
4607
    msu2pair=(eInt)*msu2*(DECDPUNMAX+1);/* top two pair .. */
4608
    if (var2units>1) {			/* .. [else treat 2nd as 0] */
4609
      msu2pair+=*(msu2-1);		/* .. */
4610
      if (var2units>2) msu2pair++;	/* .. +1 if any more */
4611
      }
4612

4613
    /* The calculation is working in units, which may have leading zeros, */
4614
    /* but the exponent was calculated on the assumption that they are */
4615
    /* both left-aligned.  Adjust the exponent to compensate: add the */
4616
    /* number of leading zeros in var1 msu and subtract those in var2 msu. */
4617
    /* [This is actually done by counting the digits and negating, as */
4618
    /* lead1=DECDPUN-digits1, and similarly for lead2.] */
4619
    for (pow=&powers[1]; *msu1>=*pow; pow++) exponent--;
4620
    for (pow=&powers[1]; *msu2>=*pow; pow++) exponent++;
4621

4622
    /* Now, if doing an integer divide or remainder, ensure that */
4623
    /* the result will be Unit-aligned.	 To do this, shift the var1 */
4624
    /* accumulator towards least if need be.  (It's much easier to */
4625
    /* do this now than to reassemble the residue afterwards, if */
4626
    /* doing a remainder.)  Also ensure the exponent is not negative. */
4627
    if (!(op&DIVIDE)) {
4628
      Unit *u;				/* work */
4629
      /* save the initial 'false' padding of var1, in digits */
4630
      var1initpad=(var1units-D2U(lhs->digits))*DECDPUN;
4631
      /* Determine the shift to do. */
4632
      if (exponent<0) cut=-exponent;
4633
       else cut=DECDPUN-exponent%DECDPUN;
4634
      decShiftToLeast(var1, var1units, cut);
4635
      exponent+=cut;			/* maintain numerical value */
4636
      var1initpad-=cut;			/* .. and reduce padding */
4637
      /* clean any most-significant units which were just emptied */
4638
      for (u=msu1; cut>=DECDPUN; cut-=DECDPUN, u--) *u=0;
4639
      } /* align */
4640
     else { /* is DIVIDE */
4641
      maxexponent=lhs->exponent-rhs->exponent;	  /* save */
4642
      /* optimization: if the first iteration will just produce 0, */
4643
      /* preadjust to skip it [valid for DIVIDE only] */
4644
      if (*msu1<*msu2) {
4645
	var2ulen--;			/* shift down */
4646
	exponent-=DECDPUN;		/* update the exponent */
4647
	}
4648
      }
4649

4650
    /* ---- start the long-division loops ------------------------------ */
4651
    accunits=0;				/* no units accumulated yet */
4652
    accdigits=0;			/* .. or digits */
4653
    accnext=acc+acclength-1;		/* -> msu of acc [NB: allows digits+1] */
4654
    for (;;) {				/* outer forever loop */
4655
      thisunit=0;			/* current unit assumed 0 */
4656
      /* find the next unit */
4657
      for (;;) {			/* inner forever loop */
4658
	/* strip leading zero units [from either pre-adjust or from */
4659
	/* subtract last time around].	Leave at least one unit. */
4660
	for (; *msu1==0 && msu1>var1; msu1--) var1units--;
4661

4662
	if (var1units<var2ulen) break;	     /* var1 too low for subtract */
4663
	if (var1units==var2ulen) {	     /* unit-by-unit compare needed */
4664
	  /* compare the two numbers, from msu */
4665
	  const Unit *pv1, *pv2;
4666
	  Unit v2;			     /* units to compare */
4667
	  pv2=msu2;			     /* -> msu */
4668
	  for (pv1=msu1; ; pv1--, pv2--) {
4669
	    /* v1=*pv1 -- always OK */
4670
	    v2=0;			     /* assume in padding */
4671
	    if (pv2>=var2) v2=*pv2;	     /* in range */
4672
	    if (*pv1!=v2) break;	     /* no longer the same */
4673
	    if (pv1==var1) break;	     /* done; leave pv1 as is */
4674
	    }
4675
	  /* here when all inspected or a difference seen */
4676
	  if (*pv1<v2) break;		     /* var1 too low to subtract */
4677
	  if (*pv1==v2) {		     /* var1 == var2 */
4678
	    /* reach here if var1 and var2 are identical; subtraction */
4679
	    /* would increase digit by one, and the residue will be 0 so */
4680
	    /* the calculation is done; leave the loop with residue=0. */
4681
	    thisunit++;			     /* as though subtracted */
4682
	    *var1=0;			     /* set var1 to 0 */
4683
	    var1units=1;		     /* .. */
4684
	    break;  /* from inner */
4685
	    } /* var1 == var2 */
4686
	  /* *pv1>v2.  Prepare for real subtraction; the lengths are equal */
4687
	  /* Estimate the multiplier (there's always a msu1-1)... */
4688
	  /* Bring in two units of var2 to provide a good estimate. */
4689
	  mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2pair);
4690
	  } /* lengths the same */
4691
	 else { /* var1units > var2ulen, so subtraction is safe */
4692
	  /* The var2 msu is one unit towards the lsu of the var1 msu, */
4693
	  /* so only one unit for var2 can be used. */
4694
	  mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2plus);
4695
	  }
4696
	if (mult==0) mult=1;		     /* must always be at least 1 */
4697
	/* subtraction needed; var1 is > var2 */
4698
	thisunit=(Unit)(thisunit+mult);	     /* accumulate */
4699
	/* subtract var1-var2, into var1; only the overlap needs */
4700
	/* processing, as this is an in-place calculation */
4701
	shift=var2ulen-var2units;
4702
	#if DECTRACE
4703
	  decDumpAr('1', &var1[shift], var1units-shift);
4704
	  decDumpAr('2', var2, var2units);
4705
	  printf("m=%ld\n", -mult);
4706
	#endif
4707
	decUnitAddSub(&var1[shift], var1units-shift,
4708
		      var2, var2units, 0,
4709
		      &var1[shift], -mult);
4710
	#if DECTRACE
4711
	  decDumpAr('#', &var1[shift], var1units-shift);
4712
	#endif
4713
	/* var1 now probably has leading zeros; these are removed at the */
4714
	/* top of the inner loop. */
4715
	} /* inner loop */
4716

4717
      /* The next unit has been calculated in full; unless it's a */
4718
      /* leading zero, add to acc */
4719
      if (accunits!=0 || thisunit!=0) {	     /* is first or non-zero */
4720
	*accnext=thisunit;		     /* store in accumulator */
4721
	/* account exactly for the new digits */
4722
	if (accunits==0) {
4723
	  accdigits++;			     /* at least one */
4724
	  for (pow=&powers[1]; thisunit>=*pow; pow++) accdigits++;
4725
	  }
4726
	 else accdigits+=DECDPUN;
4727
	accunits++;			     /* update count */
4728
	accnext--;			     /* ready for next */
4729
	if (accdigits>reqdigits) break;	     /* have enough digits */
4730
	}
4731

4732
      /* if the residue is zero, the operation is done (unless divide */
4733
      /* or divideInteger and still not enough digits yet) */
4734
      if (*var1==0 && var1units==1) {	     /* residue is 0 */
4735
	if (op&(REMAINDER|REMNEAR)) break;
4736
	if ((op&DIVIDE) && (exponent<=maxexponent)) break;
4737
	/* [drop through if divideInteger] */
4738
	}
4739
      /* also done enough if calculating remainder or integer */
4740
      /* divide and just did the last ('units') unit */
4741
      if (exponent==0 && !(op&DIVIDE)) break;
4742

4743
      /* to get here, var1 is less than var2, so divide var2 by the per- */
4744
      /* Unit power of ten and go for the next digit */
4745
      var2ulen--;			     /* shift down */
4746
      exponent-=DECDPUN;		     /* update the exponent */
4747
      } /* outer loop */
4748

4749
    /* ---- division is complete --------------------------------------- */
4750
    /* here: acc      has at least reqdigits+1 of good results (or fewer */
4751
    /*		      if early stop), starting at accnext+1 (its lsu) */
4752
    /*	     var1     has any residue at the stopping point */
4753
    /*	     accunits is the number of digits collected in acc */
4754
    if (accunits==0) {		   /* acc is 0 */
4755
      accunits=1;		   /* show have a unit .. */
4756
      accdigits=1;		   /* .. */
4757
      *accnext=0;		   /* .. whose value is 0 */
4758
      }
4759
     else accnext++;		   /* back to last placed */
4760
    /* accnext now -> lowest unit of result */
4761

4762
    residue=0;			   /* assume no residue */
4763
    if (op&DIVIDE) {
4764
      /* record the presence of any residue, for rounding */
4765
      if (*var1!=0 || var1units>1) residue=1;
4766
       else { /* no residue */
4767
	/* Had an exact division; clean up spurious trailing 0s. */
4768
	/* There will be at most DECDPUN-1, from the final multiply, */
4769
	/* and then only if the result is non-0 (and even) and the */
4770
	/* exponent is 'loose'. */
4771
	#if DECDPUN>1
4772
	Unit lsu=*accnext;
4773
	if (!(lsu&0x01) && (lsu!=0)) {
4774
	  /* count the trailing zeros */
4775
	  Int drop=0;
4776
	  for (;; drop++) {    /* [will terminate because lsu!=0] */
4777
	    if (exponent>=maxexponent) break;	  /* don't chop real 0s */
4778
	    #if DECDPUN<=4
4779
	      if ((lsu-QUOT10(lsu, drop+1)
4780
		  *powers[drop+1])!=0) break;	  /* found non-0 digit */
4781
	    #else
4782
	      if (lsu%powers[drop+1]!=0) break;	  /* found non-0 digit */
4783
	    #endif
4784
	    exponent++;
4785
	    }
4786
	  if (drop>0) {
4787
	    accunits=decShiftToLeast(accnext, accunits, drop);
4788
	    accdigits=decGetDigits(accnext, accunits);
4789
	    accunits=D2U(accdigits);
4790
	    /* [exponent was adjusted in the loop] */
4791
	    }
4792
	  } /* neither odd nor 0 */
4793
	#endif
4794
	} /* exact divide */
4795
      } /* divide */
4796
     else /* op!=DIVIDE */ {
4797
      /* check for coefficient overflow */
4798
      if (accdigits+exponent>reqdigits) {
4799
	*status|=DEC_Division_impossible;
4800
	break;
4801
	}
4802
      if (op & (REMAINDER|REMNEAR)) {
4803
	/* [Here, the exponent will be 0, because var1 was adjusted */
4804
	/* appropriately.] */
4805
	Int postshift;			     /* work */
4806
	Flag wasodd=0;			     /* integer was odd */
4807
	Unit *quotlsu;			     /* for save */
4808
	Int  quotdigits;		     /* .. */
4809

4810
	bits=lhs->bits;			     /* remainder sign is always as lhs */
4811

4812
	/* Fastpath when residue is truly 0 is worthwhile [and */
4813
	/* simplifies the code below] */
4814
	if (*var1==0 && var1units==1) {	     /* residue is 0 */
4815
	  Int exp=lhs->exponent;	     /* save min(exponents) */
4816
	  if (rhs->exponent<exp) exp=rhs->exponent;
4817
	  decNumberZero(res);		     /* 0 coefficient */
4818
	  #if DECSUBSET
4819
	  if (set->extended)
4820
	  #endif
4821
	  res->exponent=exp;		     /* .. with proper exponent */
4822
	  res->bits=(uByte)(bits&DECNEG);	   /* [cleaned] */
4823
	  decFinish(res, set, &residue, status);   /* might clamp */
4824
	  break;
4825
	  }
4826
	/* note if the quotient was odd */
4827
	if (*accnext & 0x01) wasodd=1;	     /* acc is odd */
4828
	quotlsu=accnext;		     /* save in case need to reinspect */
4829
	quotdigits=accdigits;		     /* .. */
4830

4831
	/* treat the residue, in var1, as the value to return, via acc */
4832
	/* calculate the unused zero digits.  This is the smaller of: */
4833
	/*   var1 initial padding (saved above) */
4834
	/*   var2 residual padding, which happens to be given by: */
4835
	postshift=var1initpad+exponent-lhs->exponent+rhs->exponent;
4836
	/* [the 'exponent' term accounts for the shifts during divide] */
4837
	if (var1initpad<postshift) postshift=var1initpad;
4838

4839
	/* shift var1 the requested amount, and adjust its digits */
4840
	var1units=decShiftToLeast(var1, var1units, postshift);
4841
	accnext=var1;
4842
	accdigits=decGetDigits(var1, var1units);
4843
	accunits=D2U(accdigits);
4844

4845
	exponent=lhs->exponent;		/* exponent is smaller of lhs & rhs */
4846
	if (rhs->exponent<exponent) exponent=rhs->exponent;
4847

4848
	/* Now correct the result if doing remainderNear; if it */
4849
	/* (looking just at coefficients) is > rhs/2, or == rhs/2 and */
4850
	/* the integer was odd then the result should be rem-rhs. */
4851
	if (op&REMNEAR) {
4852
	  Int compare, tarunits;	/* work */
4853
	  Unit *up;			/* .. */
4854
	  /* calculate remainder*2 into the var1 buffer (which has */
4855
	  /* 'headroom' of an extra unit and hence enough space) */
4856
	  /* [a dedicated 'double' loop would be faster, here] */
4857
	  tarunits=decUnitAddSub(accnext, accunits, accnext, accunits,
4858
				 0, accnext, 1);
4859
	  /* decDumpAr('r', accnext, tarunits); */
4860

4861
	  /* Here, accnext (var1) holds tarunits Units with twice the */
4862
	  /* remainder's coefficient, which must now be compared to the */
4863
	  /* RHS.  The remainder's exponent may be smaller than the RHS's. */
4864
	  compare=decUnitCompare(accnext, tarunits, rhs->lsu, D2U(rhs->digits),
4865
				 rhs->exponent-exponent);
4866
	  if (compare==BADINT) {	     /* deep trouble */
4867
	    *status|=DEC_Insufficient_storage;
4868
	    break;}
4869

4870
	  /* now restore the remainder by dividing by two; the lsu */
4871
	  /* is known to be even. */
4872
	  for (up=accnext; up<accnext+tarunits; up++) {
4873
	    Int half;		   /* half to add to lower unit */
4874
	    half=*up & 0x01;
4875
	    *up/=2;		   /* [shift] */
4876
	    if (!half) continue;
4877
	    *(up-1)+=DIV_ROUND_UP(DECDPUNMAX, 2);
4878
	    }
4879
	  /* [accunits still describes the original remainder length] */
4880

4881
	  if (compare>0 || (compare==0 && wasodd)) { /* adjustment needed */
4882
	    Int exp, expunits, exprem;	     /* work */
4883
	    /* This is effectively causing round-up of the quotient, */
4884
	    /* so if it was the rare case where it was full and all */
4885
	    /* nines, it would overflow and hence division-impossible */
4886
	    /* should be raised */
4887
	    Flag allnines=0;		     /* 1 if quotient all nines */
4888
	    if (quotdigits==reqdigits) {     /* could be borderline */
4889
	      for (up=quotlsu; ; up++) {
4890
		if (quotdigits>DECDPUN) {
4891
		  if (*up!=DECDPUNMAX) break;/* non-nines */
4892
		  }
4893
		 else {			     /* this is the last Unit */
4894
		  if (*up==powers[quotdigits]-1) allnines=1;
4895
		  break;
4896
		  }
4897
		quotdigits-=DECDPUN;	     /* checked those digits */
4898
		} /* up */
4899
	      } /* borderline check */
4900
	    if (allnines) {
4901
	      *status|=DEC_Division_impossible;
4902
	      break;}
4903

4904
	    /* rem-rhs is needed; the sign will invert.	 Again, var1 */
4905
	    /* can safely be used for the working Units array. */
4906
	    exp=rhs->exponent-exponent;	     /* RHS padding needed */
4907
	    /* Calculate units and remainder from exponent. */
4908
	    expunits=exp/DECDPUN;
4909
	    exprem=exp%DECDPUN;
4910
	    /* subtract [A+B*(-m)]; the result will always be negative */
4911
	    accunits=-decUnitAddSub(accnext, accunits,
4912
				    rhs->lsu, D2U(rhs->digits),
4913
				    expunits, accnext, -(Int)powers[exprem]);
4914
	    accdigits=decGetDigits(accnext, accunits); /* count digits exactly */
4915
	    accunits=D2U(accdigits);	/* and recalculate the units for copy */
4916
	    /* [exponent is as for original remainder] */
4917
	    bits^=DECNEG;		/* flip the sign */
4918
	    }
4919
	  } /* REMNEAR */
4920
	} /* REMAINDER or REMNEAR */
4921
      } /* not DIVIDE */
4922

4923
    /* Set exponent and bits */
4924
    res->exponent=exponent;
4925
    res->bits=(uByte)(bits&DECNEG);	     /* [cleaned] */
4926

4927
    /* Now the coefficient. */
4928
    decSetCoeff(res, set, accnext, accdigits, &residue, status);
4929

4930
    decFinish(res, set, &residue, status);   /* final cleanup */
4931

4932
    #if DECSUBSET
4933
    /* If a divide then strip trailing zeros if subset [after round] */
4934
    if (!set->extended && (op==DIVIDE)) decTrim(res, set, 0, &dropped);
4935
    #endif
4936
    } while(0);				     /* end protected */
4937

4938
  if (varalloc!=NULL) free(varalloc);	/* drop any storage used */
4939
  if (allocacc!=NULL) free(allocacc);	/* .. */
4940
  #if DECSUBSET
4941
  if (allocrhs!=NULL) free(allocrhs);	/* .. */
4942
  if (alloclhs!=NULL) free(alloclhs);	/* .. */
4943
  #endif
4944
  return res;
4945
  } /* decDivideOp */
4946

4947
/* ------------------------------------------------------------------ */
4948
/* decMultiplyOp -- multiplication operation			      */
4949
/*								      */
4950
/*  This routine performs the multiplication C=A x B.		      */
4951
/*								      */
4952
/*   res is C, the result.  C may be A and/or B (e.g., X=X*X)	      */
4953
/*   lhs is A							      */
4954
/*   rhs is B							      */
4955
/*   set is the context						      */
4956
/*   status is the usual accumulator				      */
4957
/*								      */
4958
/* C must have space for set->digits digits.			      */
4959
/*								      */
4960
/* ------------------------------------------------------------------ */
4961
/* 'Classic' multiplication is used rather than Karatsuba, as the     */
4962
/* latter would give only a minor improvement for the short numbers   */
4963
/* expected to be handled most (and uses much more memory).	      */
4964
/*								      */
4965
/* There are two major paths here: the general-purpose ('old code')   */
4966
/* path which handles all DECDPUN values, and a fastpath version      */
4967
/* which is used if 64-bit ints are available, DECDPUN<=4, and more   */
4968
/* than two calls to decUnitAddSub would be made.		      */
4969
/*								      */
4970
/* The fastpath version lumps units together into 8-digit or 9-digit  */
4971
/* chunks, and also uses a lazy carry strategy to minimise expensive  */
4972
/* 64-bit divisions.  The chunks are then broken apart again into     */
4973
/* units for continuing processing.  Despite this overhead, the	      */
4974
/* fastpath can speed up some 16-digit operations by 10x (and much    */
4975
/* more for higher-precision calculations).			      */
4976
/*								      */
4977
/* A buffer always has to be used for the accumulator; in the	      */
4978
/* fastpath, buffers are also always needed for the chunked copies of */
4979
/* of the operand coefficients.					      */
4980
/* Static buffers are larger than needed just for multiply, to allow  */
4981
/* for calls from other operations (notably exp).		      */
4982
/* ------------------------------------------------------------------ */
4983
#define FASTMUL (DECUSE64 && DECDPUN<5)
4984
static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs,
4985
				 const decNumber *rhs, decContext *set,
4986
				 uInt *status) {
4987
  Int	 accunits;		   /* Units of accumulator in use */
4988
  Int	 exponent;		   /* work */
4989
  Int	 residue=0;		   /* rounding residue */
4990
  uByte	 bits;			   /* result sign */
4991
  Unit	*acc;			   /* -> accumulator Unit array */
4992
  Int	 needbytes;		   /* size calculator */
4993
  void	*allocacc=NULL;		   /* -> allocated accumulator, iff allocated */
4994
  Unit	accbuff[SD2U(DECBUFFER*4+1)]; /* buffer (+1 for DECBUFFER==0, */
4995
				   /* *4 for calls from other operations) */
4996
  const Unit *mer, *mermsup;	   /* work */
4997
  Int	madlength;		   /* Units in multiplicand */
4998
  Int	shift;			   /* Units to shift multiplicand by */
4999

5000
  #if FASTMUL
5001
    /* if DECDPUN is 1 or 3 work in base 10**9, otherwise */
5002
    /* (DECDPUN is 2 or 4) then work in base 10**8 */
5003
    #if DECDPUN & 1		   /* odd */
5004
      #define FASTBASE 1000000000  /* base */
5005
      #define FASTDIGS		9  /* digits in base */
5006
      #define FASTLAZY	       18  /* carry resolution point [1->18] */
5007
    #else
5008
      #define FASTBASE	100000000
5009
      #define FASTDIGS		8
5010
      #define FASTLAZY	     1844  /* carry resolution point [1->1844] */
5011
    #endif
5012
    /* three buffers are used, two for chunked copies of the operands */
5013
    /* (base 10**8 or base 10**9) and one base 2**64 accumulator with */
5014
    /* lazy carry evaluation */
5015
    uInt   zlhibuff[(DECBUFFER*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0) */
5016
    uInt  *zlhi=zlhibuff;		  /* -> lhs array */
5017
    uInt  *alloclhi=NULL;		  /* -> allocated buffer, iff allocated */
5018
    uInt   zrhibuff[(DECBUFFER*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0) */
5019
    uInt  *zrhi=zrhibuff;		  /* -> rhs array */
5020
    uInt  *allocrhi=NULL;		  /* -> allocated buffer, iff allocated */
5021
    uLong  zaccbuff[(DECBUFFER*2+1)/4+2]; /* buffer (+1 for DECBUFFER==0) */
5022
    /* [allocacc is shared for both paths, as only one will run] */
5023
    uLong *zacc=zaccbuff;	   /* -> accumulator array for exact result */
5024
    #if DECDPUN==1
5025
    Int	   zoff;		   /* accumulator offset */
5026
    #endif
5027
    uInt  *lip, *rip;		   /* item pointers */
5028
    uInt  *lmsi, *rmsi;		   /* most significant items */
5029
    Int	   ilhs, irhs, iacc;	   /* item counts in the arrays */
5030
    Int	   lazy;		   /* lazy carry counter */
5031
    uLong  lcarry;		   /* uLong carry */
5032
    uInt   carry;		   /* carry (NB not uLong) */
5033
    Int	   count;		   /* work */
5034
    const  Unit *cup;		   /* .. */
5035
    Unit  *up;			   /* .. */
5036
    uLong *lp;			   /* .. */
5037
    Int	   p;			   /* .. */
5038
  #endif
5039

5040
  #if DECSUBSET
5041
    decNumber *alloclhs=NULL;	   /* -> allocated buffer, iff allocated */
5042
    decNumber *allocrhs=NULL;	   /* -> allocated buffer, iff allocated */
5043
  #endif
5044

5045
  #if DECCHECK
5046
  if (decCheckOperands(res, lhs, rhs, set)) return res;
5047
  #endif
5048

5049
  /* precalculate result sign */
5050
  bits=(uByte)((lhs->bits^rhs->bits)&DECNEG);
5051

5052
  /* handle infinities and NaNs */
5053
  if (SPECIALARGS) {		   /* a special bit set */
5054
    if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs */
5055
      decNaNs(res, lhs, rhs, set, status);
5056
      return res;}
5057
    /* one or two infinities; Infinity * 0 is invalid */
5058
    if (((lhs->bits & DECINF)==0 && ISZERO(lhs))
5059
      ||((rhs->bits & DECINF)==0 && ISZERO(rhs))) {
5060
      *status|=DEC_Invalid_operation;
5061
      return res;}
5062
    decNumberZero(res);
5063
    res->bits=bits|DECINF;	   /* infinity */
5064
    return res;}
5065

5066
  /* For best speed, as in DMSRCN [the original Rexx numerics */
5067
  /* module], use the shorter number as the multiplier (rhs) and */
5068
  /* the longer as the multiplicand (lhs) to minimise the number of */
5069
  /* adds (partial products) */
5070
  if (lhs->digits<rhs->digits) {   /* swap... */
5071
    const decNumber *hold=lhs;
5072
    lhs=rhs;
5073
    rhs=hold;
5074
    }
5075

5076
  do {				   /* protect allocated storage */
5077
    #if DECSUBSET
5078
    if (!set->extended) {
5079
      /* reduce operands and set lostDigits status, as needed */
5080
      if (lhs->digits>set->digits) {
5081
	alloclhs=decRoundOperand(lhs, set, status);
5082
	if (alloclhs==NULL) break;
5083
	lhs=alloclhs;
5084
	}
5085
      if (rhs->digits>set->digits) {
5086
	allocrhs=decRoundOperand(rhs, set, status);
5087
	if (allocrhs==NULL) break;
5088
	rhs=allocrhs;
5089
	}
5090
      }
5091
    #endif
5092
    /* [following code does not require input rounding] */
5093

5094
    #if FASTMUL			   /* fastpath can be used */
5095
    /* use the fast path if there are enough digits in the shorter */
5096
    /* operand to make the setup and takedown worthwhile */
5097
    #define NEEDTWO (DECDPUN*2)	   /* within two decUnitAddSub calls */
5098
    if (rhs->digits>NEEDTWO) {	   /* use fastpath... */
5099
      /* calculate the number of elements in each array */
5100
      ilhs=(lhs->digits+FASTDIGS-1)/FASTDIGS; /* [ceiling] */
5101
      irhs=(rhs->digits+FASTDIGS-1)/FASTDIGS; /* .. */
5102
      iacc=ilhs+irhs;
5103

5104
      /* allocate buffers if required, as usual */
5105
      needbytes=ilhs*sizeof(uInt);
5106
      if (needbytes>(Int)sizeof(zlhibuff)) {
5107
	alloclhi=(uInt *)malloc(needbytes);
5108
	zlhi=alloclhi;}
5109
      needbytes=irhs*sizeof(uInt);
5110
      if (needbytes>(Int)sizeof(zrhibuff)) {
5111
	allocrhi=(uInt *)malloc(needbytes);
5112
	zrhi=allocrhi;}
5113

5114
      /* Allocating the accumulator space needs a special case when */
5115
      /* DECDPUN=1 because when converting the accumulator to Units */
5116
      /* after the multiplication each 8-byte item becomes 9 1-byte */
5117
      /* units.	 Therefore iacc extra bytes are needed at the front */
5118
      /* (rounded up to a multiple of 8 bytes), and the uLong */
5119
      /* accumulator starts offset the appropriate number of units */
5120
      /* to the right to avoid overwrite during the unchunking. */
5121
      needbytes=iacc*sizeof(uLong);
5122
      #if DECDPUN==1
5123
      zoff=(iacc+7)/8;	      /* items to offset by */
5124
      needbytes+=zoff*8;
5125
      #endif
5126
      if (needbytes>(Int)sizeof(zaccbuff)) {
5127
	allocacc=(uLong *)malloc(needbytes);
5128
	zacc=(uLong *)allocacc;}
5129
      if (zlhi==NULL||zrhi==NULL||zacc==NULL) {
5130
	*status|=DEC_Insufficient_storage;
5131
	break;}
5132

5133
      acc=(Unit *)zacc;	      /* -> target Unit array */
5134
      #if DECDPUN==1
5135
      zacc+=zoff;	      /* start uLong accumulator to right */
5136
      #endif
5137

5138
      /* assemble the chunked copies of the left and right sides */
5139
      for (count=lhs->digits, cup=lhs->lsu, lip=zlhi; count>0; lip++)
5140
	for (p=0, *lip=0; p<FASTDIGS && count>0;
5141
	     p+=DECDPUN, cup++, count-=DECDPUN)
5142
	  *lip+=*cup*powers[p];
5143
      lmsi=lip-1;     /* save -> msi */
5144
      for (count=rhs->digits, cup=rhs->lsu, rip=zrhi; count>0; rip++)
5145
	for (p=0, *rip=0; p<FASTDIGS && count>0;
5146
	     p+=DECDPUN, cup++, count-=DECDPUN)
5147
	  *rip+=*cup*powers[p];
5148
      rmsi=rip-1;     /* save -> msi */
5149

5150
      /* zero the accumulator */
5151
      for (lp=zacc; lp<zacc+iacc; lp++) *lp=0;
5152

5153
      /* Start the multiplication */
5154
      /* Resolving carries can dominate the cost of accumulating the */
5155
      /* partial products, so this is only done when necessary. */
5156
      /* Each uLong item in the accumulator can hold values up to */
5157
      /* 2**64-1, and each partial product can be as large as */
5158
      /* (10**FASTDIGS-1)**2.  When FASTDIGS=9, this can be added to */
5159
      /* itself 18.4 times in a uLong without overflowing, so during */
5160
      /* the main calculation resolution is carried out every 18th */
5161
      /* add -- every 162 digits.  Similarly, when FASTDIGS=8, the */
5162
      /* partial products can be added to themselves 1844.6 times in */
5163
      /* a uLong without overflowing, so intermediate carry */
5164
      /* resolution occurs only every 14752 digits.  Hence for common */
5165
      /* short numbers usually only the one final carry resolution */
5166
      /* occurs. */
5167
      /* (The count is set via FASTLAZY to simplify experiments to */
5168
      /* measure the value of this approach: a 35% improvement on a */
5169
      /* [34x34] multiply.) */
5170
      lazy=FASTLAZY;			     /* carry delay count */
5171
      for (rip=zrhi; rip<=rmsi; rip++) {     /* over each item in rhs */
5172
	lp=zacc+(rip-zrhi);		     /* where to add the lhs */
5173
	for (lip=zlhi; lip<=lmsi; lip++, lp++) { /* over each item in lhs */
5174
	  *lp+=(uLong)(*lip)*(*rip);	     /* [this should in-line] */
5175
	  } /* lip loop */
5176
	lazy--;
5177
	if (lazy>0 && rip!=rmsi) continue;
5178
	lazy=FASTLAZY;			     /* reset delay count */
5179
	/* spin up the accumulator resolving overflows */
5180
	for (lp=zacc; lp<zacc+iacc; lp++) {
5181
	  if (*lp<FASTBASE) continue;	     /* it fits */
5182
	  lcarry=*lp/FASTBASE;		     /* top part [slow divide] */
5183
	  /* lcarry can exceed 2**32-1, so check again; this check */
5184
	  /* and occasional extra divide (slow) is well worth it, as */
5185
	  /* it allows FASTLAZY to be increased to 18 rather than 4 */
5186
	  /* in the FASTDIGS=9 case */
5187
	  if (lcarry<FASTBASE) carry=(uInt)lcarry;  /* [usual] */
5188
	   else { /* two-place carry [fairly rare] */
5189
	    uInt carry2=(uInt)(lcarry/FASTBASE);    /* top top part */
5190
	    *(lp+2)+=carry2;			    /* add to item+2 */
5191
	    *lp-=((uLong)FASTBASE*FASTBASE*carry2); /* [slow] */
5192
	    carry=(uInt)(lcarry-((uLong)FASTBASE*carry2)); /* [inline] */
5193
	    }
5194
	  *(lp+1)+=carry;		     /* add to item above [inline] */
5195
	  *lp-=((uLong)FASTBASE*carry);	     /* [inline] */
5196
	  } /* carry resolution */
5197
	} /* rip loop */
5198

5199
      /* The multiplication is complete; time to convert back into */
5200
      /* units.	 This can be done in-place in the accumulator and in */
5201
      /* 32-bit operations, because carries were resolved after the */
5202
      /* final add.  This needs N-1 divides and multiplies for */
5203
      /* each item in the accumulator (which will become up to N */
5204
      /* units, where 2<=N<=9). */
5205
      for (lp=zacc, up=acc; lp<zacc+iacc; lp++) {
5206
	uInt item=(uInt)*lp;		     /* decapitate to uInt */
5207
	for (p=0; p<FASTDIGS-DECDPUN; p+=DECDPUN, up++) {
5208
	  uInt part=item/(DECDPUNMAX+1);
5209
	  *up=(Unit)(item-(part*(DECDPUNMAX+1)));
5210
	  item=part;
5211
	  } /* p */
5212
	*up=(Unit)item; up++;		     /* [final needs no division] */
5213
	} /* lp */
5214
      accunits=up-acc;			     /* count of units */
5215
      }
5216
     else { /* here to use units directly, without chunking ['old code'] */
5217
    #endif
5218

5219
      /* if accumulator will be too long for local storage, then allocate */
5220
      acc=accbuff;		   /* -> assume buffer for accumulator */
5221
      needbytes=(D2U(lhs->digits)+D2U(rhs->digits))*sizeof(Unit);
5222
      if (needbytes>(Int)sizeof(accbuff)) {
5223
	allocacc=(Unit *)malloc(needbytes);
5224
	if (allocacc==NULL) {*status|=DEC_Insufficient_storage; break;}
5225
	acc=(Unit *)allocacc;		     /* use the allocated space */
5226
	}
5227

5228
      /* Now the main long multiplication loop */
5229
      /* Unlike the equivalent in the IBM Java implementation, there */
5230
      /* is no advantage in calculating from msu to lsu.  So, do it */
5231
      /* by the book, as it were. */
5232
      /* Each iteration calculates ACC=ACC+MULTAND*MULT */
5233
      accunits=1;		   /* accumulator starts at '0' */
5234
      *acc=0;			   /* .. (lsu=0) */
5235
      shift=0;			   /* no multiplicand shift at first */
5236
      madlength=D2U(lhs->digits);  /* this won't change */
5237
      mermsup=rhs->lsu+D2U(rhs->digits); /* -> msu+1 of multiplier */
5238

5239
      for (mer=rhs->lsu; mer<mermsup; mer++) {
5240
	/* Here, *mer is the next Unit in the multiplier to use */
5241
	/* If non-zero [optimization] add it... */
5242
	if (*mer!=0) accunits=decUnitAddSub(&acc[shift], accunits-shift,
5243
					    lhs->lsu, madlength, 0,
5244
					    &acc[shift], *mer)
5245
					    + shift;
5246
	 else { /* extend acc with a 0; it will be used shortly */
5247
	  *(acc+accunits)=0;	   /* [this avoids length of <=0 later] */
5248
	  accunits++;
5249
	  }
5250
	/* multiply multiplicand by 10**DECDPUN for next Unit to left */
5251
	shift++;		   /* add this for 'logical length' */
5252
	} /* n */
5253
    #if FASTMUL
5254
      } /* unchunked units */
5255
    #endif
5256
    /* common end-path */
5257
    #if DECTRACE
5258
      decDumpAr('*', acc, accunits);	     /* Show exact result */
5259
    #endif
5260

5261
    /* acc now contains the exact result of the multiplication, */
5262
    /* possibly with a leading zero unit; build the decNumber from */
5263
    /* it, noting if any residue */
5264
    res->bits=bits;			     /* set sign */
5265
    res->digits=decGetDigits(acc, accunits); /* count digits exactly */
5266

5267
    /* There can be a 31-bit wrap in calculating the exponent. */
5268
    /* This can only happen if both input exponents are negative and */
5269
    /* both their magnitudes are large.	 If there was a wrap, set a */
5270
    /* safe very negative exponent, from which decFinalize() will */
5271
    /* raise a hard underflow shortly. */
5272
    exponent=lhs->exponent+rhs->exponent;    /* calculate exponent */
5273
    if (lhs->exponent<0 && rhs->exponent<0 && exponent>0)
5274
      exponent=-2*DECNUMMAXE;		     /* force underflow */
5275
    res->exponent=exponent;		     /* OK to overwrite now */
5276

5277

5278
    /* Set the coefficient.  If any rounding, residue records */
5279
    decSetCoeff(res, set, acc, res->digits, &residue, status);
5280
    decFinish(res, set, &residue, status);   /* final cleanup */
5281
    } while(0);				/* end protected */
5282

5283
  if (allocacc!=NULL) free(allocacc);	/* drop any storage used */
5284
  #if DECSUBSET
5285
  if (allocrhs!=NULL) free(allocrhs);	/* .. */
5286
  if (alloclhs!=NULL) free(alloclhs);	/* .. */
5287
  #endif
5288
  #if FASTMUL
5289
  if (allocrhi!=NULL) free(allocrhi);	/* .. */
5290
  if (alloclhi!=NULL) free(alloclhi);	/* .. */
5291
  #endif
5292
  return res;
5293
  } /* decMultiplyOp */
5294

5295
/* ------------------------------------------------------------------ */
5296
/* decExpOp -- effect exponentiation				      */
5297
/*								      */
5298
/*   This computes C = exp(A)					      */
5299
/*								      */
5300
/*   res is C, the result.  C may be A				      */
5301
/*   rhs is A							      */
5302
/*   set is the context; note that rounding mode has no effect	      */
5303
/*								      */
5304
/* C must have space for set->digits digits. status is updated but    */
5305
/* not set.							      */
5306
/*								      */
5307
/* Restrictions:						      */
5308
/*								      */
5309
/*   digits, emax, and -emin in the context must be less than	      */
5310
/*   2*DEC_MAX_MATH (1999998), and the rhs must be within these	      */
5311
/*   bounds or a zero.	This is an internal routine, so these	      */
5312
/*   restrictions are contractual and not enforced.		      */
5313
/*								      */
5314
/* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will      */
5315
/* almost always be correctly rounded, but may be up to 1 ulp in      */
5316
/* error in rare cases.						      */
5317
/*								      */
5318
/* Finite results will always be full precision and Inexact, except   */
5319
/* when A is a zero or -Infinity (giving 1 or 0 respectively).	      */
5320
/* ------------------------------------------------------------------ */
5321
/* This approach used here is similar to the algorithm described in   */
5322
/*								      */
5323
/*   Variable Precision Exponential Function, T. E. Hull and	      */
5324
/*   A. Abrham, ACM Transactions on Mathematical Software, Vol 12 #2, */
5325
/*   pp79-91, ACM, June 1986.					      */
5326
/*								      */
5327
/* with the main difference being that the iterations in the series   */
5328
/* evaluation are terminated dynamically (which does not require the  */
5329
/* extra variable-precision variables which are expensive in this     */
5330
/* context).							      */
5331
/*								      */
5332
/* The error analysis in Hull & Abrham's paper applies except for the */
5333
/* round-off error accumulation during the series evaluation.  This   */
5334
/* code does not precalculate the number of iterations and so cannot  */
5335
/* use Horner's scheme.	 Instead, the accumulation is done at double- */
5336
/* precision, which ensures that the additions of the terms are exact */
5337
/* and do not accumulate round-off (and any round-off errors in the   */
5338
/* terms themselves move 'to the right' faster than they can	      */
5339
/* accumulate).	 This code also extends the calculation by allowing,  */
5340
/* in the spirit of other decNumber operators, the input to be more   */
5341
/* precise than the result (the precision used is based on the more   */
5342
/* precise of the input or requested result).			      */
5343
/*								      */
5344
/* Implementation notes:					      */
5345
/*								      */
5346
/* 1. This is separated out as decExpOp so it can be called from      */
5347
/*    other Mathematical functions (notably Ln) with a wider range    */
5348
/*    than normal.  In particular, it can handle the slightly wider   */
5349
/*    (double) range needed by Ln (which has to be able to calculate  */
5350
/*    exp(-x) where x can be the tiniest number (Ntiny).	      */
5351
/*								      */
5352
/* 2. Normalizing x to be <=0.1 (instead of <=1) reduces loop	      */
5353
/*    iterations by approximately a third with additional (although    */
5354
/*    diminishing) returns as the range is reduced to even smaller    */
5355
/*    fractions.  However, h (the power of 10 used to correct the     */
5356
/*    result at the end, see below) must be kept <=8 as otherwise     */
5357
/*    the final result cannot be computed.  Hence the leverage is a   */
5358
/*    sliding value (8-h), where potentially the range is reduced     */
5359
/*    more for smaller values.					      */
5360
/*								      */
5361
/*    The leverage that can be applied in this way is severely	      */
5362
/*    limited by the cost of the raise-to-the power at the end,	      */
5363
/*    which dominates when the number of iterations is small (less    */
5364
/*    than ten) or when rhs is short.  As an example, the adjustment  */
5365
/*    x**10,000,000 needs 31 multiplications, all but one full-width. */
5366
/*								      */
5367
/* 3. The restrictions (especially precision) could be raised with    */
5368
/*    care, but the full decNumber range seems very hard within the   */
5369
/*    32-bit limits.						      */
5370
/*								      */
5371
/* 4. The working precisions for the static buffers are twice the     */
5372
/*    obvious size to allow for calls from decNumberPower.	      */
5373
/* ------------------------------------------------------------------ */
5374
static decNumber *decExpOp(decNumber *res, const decNumber *rhs,
5375
                           decContext *set, uInt *status) {
5376
  uInt ignore=0;		   /* working status */
5377
  Int h;			   /* adjusted exponent for 0.xxxx */
5378
  Int p;			   /* working precision */
5379
  Int residue;			   /* rounding residue */
5380
  uInt needbytes;		   /* for space calculations */
5381
  const decNumber *x=rhs;	   /* (may point to safe copy later) */
5382
  decContext aset, tset, dset;	   /* working contexts */
5383
  Int comp;			   /* work */
5384

5385
  /* the argument is often copied to normalize it, so (unusually) it */
5386
  /* is treated like other buffers, using DECBUFFER, +1 in case */
5387
  /* DECBUFFER is 0 */
5388
  decNumber bufr[D2N(DECBUFFER*2+1)];
5389
  decNumber *allocrhs=NULL;	   /* non-NULL if rhs buffer allocated */
5390

5391
  /* the working precision will be no more than set->digits+8+1 */
5392
  /* so for on-stack buffers DECBUFFER+9 is used, +1 in case DECBUFFER */
5393
  /* is 0 (and twice that for the accumulator) */
5394

5395
  /* buffer for t, term (working precision plus) */
5396
  decNumber buft[D2N(DECBUFFER*2+9+1)];
5397
  decNumber *allocbuft=NULL;	   /* -> allocated buft, iff allocated */
5398
  decNumber *t=buft;		   /* term */
5399
  /* buffer for a, accumulator (working precision * 2), at least 9 */
5400
  decNumber bufa[D2N(DECBUFFER*4+18+1)];
5401
  decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
5402
  decNumber *a=bufa;		   /* accumulator */
5403
  /* decNumber for the divisor term; this needs at most 9 digits */
5404
  /* and so can be fixed size [16 so can use standard context] */
5405
  decNumber bufd[D2N(16)];
5406
  decNumber *d=bufd;		   /* divisor */
5407
  decNumber numone;		   /* constant 1 */
5408

5409
  #if DECCHECK
5410
  Int iterations=0;		   /* for later sanity check */
5411
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
5412
  #endif
5413

5414
  do {					/* protect allocated storage */
5415
    if (SPECIALARG) {			/* handle infinities and NaNs */
5416
      if (decNumberIsInfinite(rhs)) {	/* an infinity */
5417
	if (decNumberIsNegative(rhs))	/* -Infinity -> +0 */
5418
	  decNumberZero(res);
5419
	 else decNumberCopy(res, rhs);	/* +Infinity -> self */
5420
	}
5421
       else decNaNs(res, rhs, NULL, set, status); /* a NaN */
5422
      break;}
5423

5424
    if (ISZERO(rhs)) {			/* zeros -> exact 1 */
5425
      decNumberZero(res);		/* make clean 1 */
5426
      *res->lsu=1;			/* .. */
5427
      break;}				/* [no status to set] */
5428

5429
    /* e**x when 0 < x < 0.66 is < 1+3x/2, hence can fast-path */
5430
    /* positive and negative tiny cases which will result in inexact */
5431
    /* 1.  This also allows the later add-accumulate to always be */
5432
    /* exact (because its length will never be more than twice the */
5433
    /* working precision). */
5434
    /* The comparator (tiny) needs just one digit, so use the */
5435
    /* decNumber d for it (reused as the divisor, etc., below); its */
5436
    /* exponent is such that if x is positive it will have */
5437
    /* set->digits-1 zeros between the decimal point and the digit, */
5438
    /* which is 4, and if x is negative one more zero there as the */
5439
    /* more precise result will be of the form 0.9999999 rather than */
5440
    /* 1.0000001.  Hence, tiny will be 0.0000004  if digits=7 and x>0 */
5441
    /* or 0.00000004 if digits=7 and x<0.  If RHS not larger than */
5442
    /* this then the result will be 1.000000 */
5443
    decNumberZero(d);			/* clean */
5444
    *d->lsu=4;				/* set 4 .. */
5445
    d->exponent=-set->digits;		/* * 10**(-d) */
5446
    if (decNumberIsNegative(rhs)) d->exponent--;  /* negative case */
5447
    comp=decCompare(d, rhs, 1);		/* signless compare */
5448
    if (comp==BADINT) {
5449
      *status|=DEC_Insufficient_storage;
5450
      break;}
5451
    if (comp>=0) {			/* rhs < d */
5452
      Int shift=set->digits-1;
5453
      decNumberZero(res);		/* set 1 */
5454
      *res->lsu=1;			/* .. */
5455
      res->digits=decShiftToMost(res->lsu, 1, shift);
5456
      res->exponent=-shift;		     /* make 1.0000... */
5457
      *status|=DEC_Inexact | DEC_Rounded;    /* .. inexactly */
5458
      break;} /* tiny */
5459

5460
    /* set up the context to be used for calculating a, as this is */
5461
    /* used on both paths below */
5462
    decContextDefault(&aset, DEC_INIT_DECIMAL64);
5463
    /* accumulator bounds are as requested (could underflow) */
5464
    aset.emax=set->emax;		/* usual bounds */
5465
    aset.emin=set->emin;		/* .. */
5466
    aset.clamp=0;			/* and no concrete format */
5467

5468
    /* calculate the adjusted (Hull & Abrham) exponent (where the */
5469
    /* decimal point is just to the left of the coefficient msd) */
5470
    h=rhs->exponent+rhs->digits;
5471
    /* if h>8 then 10**h cannot be calculated safely; however, when */
5472
    /* h=8 then exp(|rhs|) will be at least exp(1E+7) which is at */
5473
    /* least 6.59E+4342944, so (due to the restriction on Emax/Emin) */
5474
    /* overflow (or underflow to 0) is guaranteed -- so this case can */
5475
    /* be handled by simply forcing the appropriate excess */
5476
    if (h>8) {				/* overflow/underflow */
5477
      /* set up here so Power call below will over or underflow to */
5478
      /* zero; set accumulator to either 2 or 0.02 */
5479
      /* [stack buffer for a is always big enough for this] */
5480
      decNumberZero(a);
5481
      *a->lsu=2;			/* not 1 but < exp(1) */
5482
      if (decNumberIsNegative(rhs)) a->exponent=-2; /* make 0.02 */
5483
      h=8;				/* clamp so 10**h computable */
5484
      p=9;				/* set a working precision */
5485
      }
5486
     else {				/* h<=8 */
5487
      Int maxlever=(rhs->digits>8?1:0);
5488
      /* [could/should increase this for precisions >40 or so, too] */
5489

5490
      /* if h is 8, cannot normalize to a lower upper limit because */
5491
      /* the final result will not be computable (see notes above), */
5492
      /* but leverage can be applied whenever h is less than 8. */
5493
      /* Apply as much as possible, up to a MAXLEVER digits, which */
5494
      /* sets the tradeoff against the cost of the later a**(10**h). */
5495
      /* As h is increased, the working precision below also */
5496
      /* increases to compensate for the "constant digits at the */
5497
      /* front" effect. */
5498
      Int lever=MINI(8-h, maxlever);	/* leverage attainable */
5499
      Int use=-rhs->digits-lever;	/* exponent to use for RHS */
5500
      h+=lever;				/* apply leverage selected */
5501
      if (h<0) {			/* clamp */
5502
	use+=h;				/* [may end up subnormal] */
5503
	h=0;
5504
	}
5505
      /* Take a copy of RHS if it needs normalization (true whenever x>=1) */
5506
      if (rhs->exponent!=use) {
5507
	decNumber *newrhs=bufr;		/* assume will fit on stack */
5508
	needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
5509
	if (needbytes>sizeof(bufr)) {	/* need malloc space */
5510
	  allocrhs=(decNumber *)malloc(needbytes);
5511
	  if (allocrhs==NULL) {		/* hopeless -- abandon */
5512
	    *status|=DEC_Insufficient_storage;
5513
	    break;}
5514
	  newrhs=allocrhs;		/* use the allocated space */
5515
	  }
5516
	decNumberCopy(newrhs, rhs);	/* copy to safe space */
5517
	newrhs->exponent=use;		/* normalize; now <1 */
5518
	x=newrhs;			/* ready for use */
5519
	/* decNumberShow(x); */
5520
	}
5521

5522
      /* Now use the usual power series to evaluate exp(x).  The */
5523
      /* series starts as 1 + x + x^2/2 ... so prime ready for the */
5524
      /* third term by setting the term variable t=x, the accumulator */
5525
      /* a=1, and the divisor d=2. */
5526

5527
      /* First determine the working precision.	 From Hull & Abrham */
5528
      /* this is set->digits+h+2.  However, if x is 'over-precise' we */
5529
      /* need to allow for all its digits to potentially participate */
5530
      /* (consider an x where all the excess digits are 9s) so in */
5531
      /* this case use x->digits+h+2 */
5532
      p=MAXI(x->digits, set->digits)+h+2;    /* [h<=8] */
5533

5534
      /* a and t are variable precision, and depend on p, so space */
5535
      /* must be allocated for them if necessary */
5536

5537
      /* the accumulator needs to be able to hold 2p digits so that */
5538
      /* the additions on the second and subsequent iterations are */
5539
      /* sufficiently exact. */
5540
      needbytes=sizeof(decNumber)+(D2U(p*2)-1)*sizeof(Unit);
5541
      if (needbytes>sizeof(bufa)) {	/* need malloc space */
5542
	allocbufa=(decNumber *)malloc(needbytes);
5543
	if (allocbufa==NULL) {		/* hopeless -- abandon */
5544
	  *status|=DEC_Insufficient_storage;
5545
	  break;}
5546
	a=allocbufa;			/* use the allocated space */
5547
	}
5548
      /* the term needs to be able to hold p digits (which is */
5549
      /* guaranteed to be larger than x->digits, so the initial copy */
5550
      /* is safe); it may also be used for the raise-to-power */
5551
      /* calculation below, which needs an extra two digits */
5552
      needbytes=sizeof(decNumber)+(D2U(p+2)-1)*sizeof(Unit);
5553
      if (needbytes>sizeof(buft)) {	/* need malloc space */
5554
	allocbuft=(decNumber *)malloc(needbytes);
5555
	if (allocbuft==NULL) {		/* hopeless -- abandon */
5556
	  *status|=DEC_Insufficient_storage;
5557
	  break;}
5558
	t=allocbuft;			/* use the allocated space */
5559
	}
5560

5561
      decNumberCopy(t, x);		/* term=x */
5562
      decNumberZero(a); *a->lsu=1;	/* accumulator=1 */
5563
      decNumberZero(d); *d->lsu=2;	/* divisor=2 */
5564
      decNumberZero(&numone); *numone.lsu=1; /* constant 1 for increment */
5565

5566
      /* set up the contexts for calculating a, t, and d */
5567
      decContextDefault(&tset, DEC_INIT_DECIMAL64);
5568
      dset=tset;
5569
      /* accumulator bounds are set above, set precision now */
5570
      aset.digits=p*2;			/* double */
5571
      /* term bounds avoid any underflow or overflow */
5572
      tset.digits=p;
5573
      tset.emin=DEC_MIN_EMIN;		/* [emax is plenty] */
5574
      /* [dset.digits=16, etc., are sufficient] */
5575

5576
      /* finally ready to roll */
5577
      for (;;) {
5578
	#if DECCHECK
5579
	iterations++;
5580
	#endif
5581
	/* only the status from the accumulation is interesting */
5582
	/* [but it should remain unchanged after first add] */
5583
	decAddOp(a, a, t, &aset, 0, status);	       /* a=a+t */
5584
	decMultiplyOp(t, t, x, &tset, &ignore);	       /* t=t*x */
5585
	decDivideOp(t, t, d, &tset, DIVIDE, &ignore);  /* t=t/d */
5586
	/* the iteration ends when the term cannot affect the result, */
5587
	/* if rounded to p digits, which is when its value is smaller */
5588
	/* than the accumulator by p+1 digits.	There must also be */
5589
	/* full precision in a. */
5590
	if (((a->digits+a->exponent)>=(t->digits+t->exponent+p+1))
5591
	    && (a->digits>=p)) break;
5592
	decAddOp(d, d, &numone, &dset, 0, &ignore);    /* d=d+1 */
5593
	} /* iterate */
5594

5595
      #if DECCHECK
5596
      /* just a sanity check; comment out test to show always */
5597
      if (iterations>p+3)
5598
	printf("Exp iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
5599
	       iterations, *status, p, x->digits);
5600
      #endif
5601
      } /* h<=8 */
5602

5603
    /* apply postconditioning: a=a**(10**h) -- this is calculated */
5604
    /* at a slightly higher precision than Hull & Abrham suggest */
5605
    if (h>0) {
5606
      Int seenbit=0;		   /* set once a 1-bit is seen */
5607
      Int i;			   /* counter */
5608
      Int n=powers[h];		   /* always positive */
5609
      aset.digits=p+2;		   /* sufficient precision */
5610
      /* avoid the overhead and many extra digits of decNumberPower */
5611
      /* as all that is needed is the short 'multipliers' loop; here */
5612
      /* accumulate the answer into t */
5613
      decNumberZero(t); *t->lsu=1; /* acc=1 */
5614
      for (i=1;;i++){		   /* for each bit [top bit ignored] */
5615
	/* abandon if have had overflow or terminal underflow */
5616
	if (*status & (DEC_Overflow|DEC_Underflow)) { /* interesting? */
5617
	  if (*status&DEC_Overflow || ISZERO(t)) break;}
5618
	n=n<<1;			   /* move next bit to testable position */
5619
	if (n<0) {		   /* top bit is set */
5620
	  seenbit=1;		   /* OK, have a significant bit */
5621
	  decMultiplyOp(t, t, a, &aset, status); /* acc=acc*x */
5622
	  }
5623
	if (i==31) break;	   /* that was the last bit */
5624
	if (!seenbit) continue;	   /* no need to square 1 */
5625
	decMultiplyOp(t, t, t, &aset, status); /* acc=acc*acc [square] */
5626
	} /*i*/ /* 32 bits */
5627
      /* decNumberShow(t); */
5628
      a=t;			   /* and carry on using t instead of a */
5629
      }
5630

5631
    /* Copy and round the result to res */
5632
    residue=1;				/* indicate dirt to right .. */
5633
    if (ISZERO(a)) residue=0;		/* .. unless underflowed to 0 */
5634
    aset.digits=set->digits;		/* [use default rounding] */
5635
    decCopyFit(res, a, &aset, &residue, status); /* copy & shorten */
5636
    decFinish(res, set, &residue, status);	 /* cleanup/set flags */
5637
    } while(0);				/* end protected */
5638

5639
  if (allocrhs !=NULL) free(allocrhs);	/* drop any storage used */
5640
  if (allocbufa!=NULL) free(allocbufa); /* .. */
5641
  if (allocbuft!=NULL) free(allocbuft); /* .. */
5642
  /* [status is handled by caller] */
5643
  return res;
5644
  } /* decExpOp */
5645

5646
/* ------------------------------------------------------------------ */
5647
/* Initial-estimate natural logarithm table			      */
5648
/*								      */
5649
/*   LNnn -- 90-entry 16-bit table for values from .10 through .99.   */
5650
/*	     The result is a 4-digit encode of the coefficient (c=the */
5651
/*	     top 14 bits encoding 0-9999) and a 2-digit encode of the */
5652
/*	     exponent (e=the bottom 2 bits encoding 0-3)	      */
5653
/*								      */
5654
/*	     The resulting value is given by:			      */
5655
/*								      */
5656
/*	       v = -c * 10**(-e-3)				      */
5657
/*								      */
5658
/*	     where e and c are extracted from entry k = LNnn[x-10]    */
5659
/*	     where x is truncated (NB) into the range 10 through 99,  */
5660
/*	     and then c = k>>2 and e = k&3.			      */
5661
/* ------------------------------------------------------------------ */
5662
static const uShort LNnn[90] = {
5663
  9016,  8652,  8316,  8008,  7724,  7456,  7208,
5664
  6972,	 6748,	6540,  6340,  6148,  5968,  5792,  5628,  5464,	 5312,
5665
  5164,	 5020,	4884,  4748,  4620,  4496,  4376,  4256,  4144,	 4032,
5666
 39233, 38181, 37157, 36157, 35181, 34229, 33297, 32389, 31501, 30629,
5667
 29777, 28945, 28129, 27329, 26545, 25777, 25021, 24281, 23553, 22837,
5668
 22137, 21445, 20769, 20101, 19445, 18801, 18165, 17541, 16925, 16321,
5669
 15721, 15133, 14553, 13985, 13421, 12865, 12317, 11777, 11241, 10717,
5670
 10197,	 9685,	9177,  8677,  8185,  7697,  7213,  6737,  6269,	 5801,
5671
  5341,	 4889,	4437, 39930, 35534, 31186, 26886, 22630, 18418, 14254,
5672
 10130,	 6046, 20055};
5673

5674
/* ------------------------------------------------------------------ */
5675
/* decLnOp -- effect natural logarithm				      */
5676
/*								      */
5677
/*   This computes C = ln(A)					      */
5678
/*								      */
5679
/*   res is C, the result.  C may be A				      */
5680
/*   rhs is A							      */
5681
/*   set is the context; note that rounding mode has no effect	      */
5682
/*								      */
5683
/* C must have space for set->digits digits.			      */
5684
/*								      */
5685
/* Notable cases:						      */
5686
/*   A<0 -> Invalid						      */
5687
/*   A=0 -> -Infinity (Exact)					      */
5688
/*   A=+Infinity -> +Infinity (Exact)				      */
5689
/*   A=1 exactly -> 0 (Exact)					      */
5690
/*								      */
5691
/* Restrictions (as for Exp):					      */
5692
/*								      */
5693
/*   digits, emax, and -emin in the context must be less than	      */
5694
/*   DEC_MAX_MATH+11 (1000010), and the rhs must be within these      */
5695
/*   bounds or a zero.	This is an internal routine, so these	      */
5696
/*   restrictions are contractual and not enforced.		      */
5697
/*								      */
5698
/* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will      */
5699
/* almost always be correctly rounded, but may be up to 1 ulp in      */
5700
/* error in rare cases.						      */
5701
/* ------------------------------------------------------------------ */
5702
/* The result is calculated using Newton's method, with each	      */
5703
/* iteration calculating a' = a + x * exp(-a) - 1.  See, for example, */
5704
/* Epperson 1989.						      */
5705
/*								      */
5706
/* The iteration ends when the adjustment x*exp(-a)-1 is tiny enough. */
5707
/* This has to be calculated at the sum of the precision of x and the */
5708
/* working precision.						      */
5709
/*								      */
5710
/* Implementation notes:					      */
5711
/*								      */
5712
/* 1. This is separated out as decLnOp so it can be called from	      */
5713
/*    other Mathematical functions (e.g., Log 10) with a wider range  */
5714
/*    than normal.  In particular, it can handle the slightly wider   */
5715
/*    (+9+2) range needed by a power function.			      */
5716
/*								      */
5717
/* 2. The speed of this function is about 10x slower than exp, as     */
5718
/*    it typically needs 4-6 iterations for short numbers, and the    */
5719
/*    extra precision needed adds a squaring effect, twice.	      */
5720
/*								      */
5721
/* 3. Fastpaths are included for ln(10) and ln(2), up to length 40,   */
5722
/*    as these are common requests.  ln(10) is used by log10(x).      */
5723
/*								      */
5724
/* 4. An iteration might be saved by widening the LNnn table, and     */
5725
/*    would certainly save at least one if it were made ten times     */
5726
/*    bigger, too (for truncated fractions 0.100 through 0.999).      */
5727
/*    However, for most practical evaluations, at least four or five  */
5728
/*    iterations will be needed -- so this would only speed up by      */
5729
/*    20-25% and that probably does not justify increasing the table  */
5730
/*    size.							      */
5731
/*								      */
5732
/* 5. The static buffers are larger than might be expected to allow   */
5733
/*    for calls from decNumberPower.				      */
5734
/* ------------------------------------------------------------------ */
5735
static decNumber *decLnOp(decNumber *res, const decNumber *rhs,
5736
                          decContext *set, uInt *status) {
5737
  uInt ignore=0;		   /* working status accumulator */
5738
  uInt needbytes;		   /* for space calculations */
5739
  Int residue;			   /* rounding residue */
5740
  Int r;			   /* rhs=f*10**r [see below] */
5741
  Int p;			   /* working precision */
5742
  Int pp;			   /* precision for iteration */
5743
  Int t;			   /* work */
5744

5745
  /* buffers for a (accumulator, typically precision+2) and b */
5746
  /* (adjustment calculator, same size) */
5747
  decNumber bufa[D2N(DECBUFFER+12)];
5748
  decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
5749
  decNumber *a=bufa;		   /* accumulator/work */
5750
  decNumber bufb[D2N(DECBUFFER*2+2)];
5751
  decNumber *allocbufb=NULL;	   /* -> allocated bufa, iff allocated */
5752
  decNumber *b=bufb;		   /* adjustment/work */
5753

5754
  decNumber  numone;		   /* constant 1 */
5755
  decNumber  cmp;		   /* work */
5756
  decContext aset, bset;	   /* working contexts */
5757

5758
  #if DECCHECK
5759
  Int iterations=0;		   /* for later sanity check */
5760
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
5761
  #endif
5762

5763
  do {					/* protect allocated storage */
5764
    if (SPECIALARG) {			/* handle infinities and NaNs */
5765
      if (decNumberIsInfinite(rhs)) {	/* an infinity */
5766
	if (decNumberIsNegative(rhs))	/* -Infinity -> error */
5767
	  *status|=DEC_Invalid_operation;
5768
	 else decNumberCopy(res, rhs);	/* +Infinity -> self */
5769
	}
5770
       else decNaNs(res, rhs, NULL, set, status); /* a NaN */
5771
      break;}
5772

5773
    if (ISZERO(rhs)) {			/* +/- zeros -> -Infinity */
5774
      decNumberZero(res);		/* make clean */
5775
      res->bits=DECINF|DECNEG;		/* set - infinity */
5776
      break;}				/* [no status to set] */
5777

5778
    /* Non-zero negatives are bad... */
5779
    if (decNumberIsNegative(rhs)) {	/* -x -> error */
5780
      *status|=DEC_Invalid_operation;
5781
      break;}
5782

5783
    /* Here, rhs is positive, finite, and in range */
5784

5785
    /* lookaside fastpath code for ln(2) and ln(10) at common lengths */
5786
    if (rhs->exponent==0 && set->digits<=40) {
5787
      #if DECDPUN==1
5788
      if (rhs->lsu[0]==0 && rhs->lsu[1]==1 && rhs->digits==2) { /* ln(10) */
5789
      #else
5790
      if (rhs->lsu[0]==10 && rhs->digits==2) {			/* ln(10) */
5791
      #endif
5792
	aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
5793
	#define LN10 "2.302585092994045684017991454684364207601"
5794
	decNumberFromString(res, LN10, &aset);
5795
	*status|=(DEC_Inexact | DEC_Rounded); /* is inexact */
5796
	break;}
5797
      if (rhs->lsu[0]==2 && rhs->digits==1) { /* ln(2) */
5798
	aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
5799
	#define LN2 "0.6931471805599453094172321214581765680755"
5800
	decNumberFromString(res, LN2, &aset);
5801
	*status|=(DEC_Inexact | DEC_Rounded);
5802
	break;}
5803
      } /* integer and short */
5804

5805
    /* Determine the working precision.	 This is normally the */
5806
    /* requested precision + 2, with a minimum of 9.  However, if */
5807
    /* the rhs is 'over-precise' then allow for all its digits to */
5808
    /* potentially participate (consider an rhs where all the excess */
5809
    /* digits are 9s) so in this case use rhs->digits+2. */
5810
    p=MAXI(rhs->digits, MAXI(set->digits, 7))+2;
5811

5812
    /* Allocate space for the accumulator and the high-precision */
5813
    /* adjustment calculator, if necessary.  The accumulator must */
5814
    /* be able to hold p digits, and the adjustment up to */
5815
    /* rhs->digits+p digits.  They are also made big enough for 16 */
5816
    /* digits so that they can be used for calculating the initial */
5817
    /* estimate. */
5818
    needbytes=sizeof(decNumber)+(D2U(MAXI(p,16))-1)*sizeof(Unit);
5819
    if (needbytes>sizeof(bufa)) {     /* need malloc space */
5820
      allocbufa=(decNumber *)malloc(needbytes);
5821
      if (allocbufa==NULL) {	      /* hopeless -- abandon */
5822
	*status|=DEC_Insufficient_storage;
5823
	break;}
5824
      a=allocbufa;		      /* use the allocated space */
5825
      }
5826
    pp=p+rhs->digits;
5827
    needbytes=sizeof(decNumber)+(D2U(MAXI(pp,16))-1)*sizeof(Unit);
5828
    if (needbytes>sizeof(bufb)) {     /* need malloc space */
5829
      allocbufb=(decNumber *)malloc(needbytes);
5830
      if (allocbufb==NULL) {	      /* hopeless -- abandon */
5831
	*status|=DEC_Insufficient_storage;
5832
	break;}
5833
      b=allocbufb;		      /* use the allocated space */
5834
      }
5835

5836
    /* Prepare an initial estimate in acc. Calculate this by */
5837
    /* considering the coefficient of x to be a normalized fraction, */
5838
    /* f, with the decimal point at far left and multiplied by */
5839
    /* 10**r.  Then, rhs=f*10**r and 0.1<=f<1, and */
5840
    /*	 ln(x) = ln(f) + ln(10)*r */
5841
    /* Get the initial estimate for ln(f) from a small lookup */
5842
    /* table (see above) indexed by the first two digits of f, */
5843
    /* truncated. */
5844

5845
    decContextDefault(&aset, DEC_INIT_DECIMAL64); /* 16-digit extended */
5846
    r=rhs->exponent+rhs->digits;	/* 'normalised' exponent */
5847
    decNumberFromInt32(a, r);		/* a=r */
5848
    decNumberFromInt32(b, 2302585);	/* b=ln(10) (2.302585) */
5849
    b->exponent=-6;			/*  .. */
5850
    decMultiplyOp(a, a, b, &aset, &ignore);  /* a=a*b */
5851
    /* now get top two digits of rhs into b by simple truncate and */
5852
    /* force to integer */
5853
    residue=0;				/* (no residue) */
5854
    aset.digits=2; aset.round=DEC_ROUND_DOWN;
5855
    decCopyFit(b, rhs, &aset, &residue, &ignore); /* copy & shorten */
5856
    b->exponent=0;			/* make integer */
5857
    t=decGetInt(b);			/* [cannot fail] */
5858
    if (t<10) t=X10(t);			/* adjust single-digit b */
5859
    t=LNnn[t-10];			/* look up ln(b) */
5860
    decNumberFromInt32(b, t>>2);	/* b=ln(b) coefficient */
5861
    b->exponent=-(t&3)-3;		/* set exponent */
5862
    b->bits=DECNEG;			/* ln(0.10)->ln(0.99) always -ve */
5863
    aset.digits=16; aset.round=DEC_ROUND_HALF_EVEN; /* restore */
5864
    decAddOp(a, a, b, &aset, 0, &ignore); /* acc=a+b */
5865
    /* the initial estimate is now in a, with up to 4 digits correct. */
5866
    /* When rhs is at or near Nmax the estimate will be low, so we */
5867
    /* will approach it from below, avoiding overflow when calling exp. */
5868

5869
    decNumberZero(&numone); *numone.lsu=1;   /* constant 1 for adjustment */
5870

5871
    /* accumulator bounds are as requested (could underflow, but */
5872
    /* cannot overflow) */
5873
    aset.emax=set->emax;
5874
    aset.emin=set->emin;
5875
    aset.clamp=0;			/* no concrete format */
5876
    /* set up a context to be used for the multiply and subtract */
5877
    bset=aset;
5878
    bset.emax=DEC_MAX_MATH*2;		/* use double bounds for the */
5879
    bset.emin=-DEC_MAX_MATH*2;		/* adjustment calculation */
5880
					/* [see decExpOp call below] */
5881
    /* for each iteration double the number of digits to calculate, */
5882
    /* up to a maximum of p */
5883
    pp=9;				/* initial precision */
5884
    /* [initially 9 as then the sequence starts 7+2, 16+2, and */
5885
    /* 34+2, which is ideal for standard-sized numbers] */
5886
    aset.digits=pp;			/* working context */
5887
    bset.digits=pp+rhs->digits;		/* wider context */
5888
    for (;;) {				/* iterate */
5889
      #if DECCHECK
5890
      iterations++;
5891
      if (iterations>24) break;		/* consider 9 * 2**24 */
5892
      #endif
5893
      /* calculate the adjustment (exp(-a)*x-1) into b.	 This is a */
5894
      /* catastrophic subtraction but it really is the difference */
5895
      /* from 1 that is of interest. */
5896
      /* Use the internal entry point to Exp as it allows the double */
5897
      /* range for calculating exp(-a) when a is the tiniest subnormal. */
5898
      a->bits^=DECNEG;			/* make -a */
5899
      decExpOp(b, a, &bset, &ignore);	/* b=exp(-a) */
5900
      a->bits^=DECNEG;			/* restore sign of a */
5901
      /* now multiply by rhs and subtract 1, at the wider precision */
5902
      decMultiplyOp(b, b, rhs, &bset, &ignore);	       /* b=b*rhs */
5903
      decAddOp(b, b, &numone, &bset, DECNEG, &ignore); /* b=b-1 */
5904

5905
      /* the iteration ends when the adjustment cannot affect the */
5906
      /* result by >=0.5 ulp (at the requested digits), which */
5907
      /* is when its value is smaller than the accumulator by */
5908
      /* set->digits+1 digits (or it is zero) -- this is a looser */
5909
      /* requirement than for Exp because all that happens to the */
5910
      /* accumulator after this is the final rounding (but note that */
5911
      /* there must also be full precision in a, or a=0). */
5912

5913
      if (decNumberIsZero(b) ||
5914
	  (a->digits+a->exponent)>=(b->digits+b->exponent+set->digits+1)) {
5915
	if (a->digits==p) break;
5916
	if (decNumberIsZero(a)) {
5917
	  decCompareOp(&cmp, rhs, &numone, &aset, COMPARE, &ignore); /* rhs=1 ? */
5918
	  if (cmp.lsu[0]==0) a->exponent=0;	       /* yes, exact 0 */
5919
	   else *status|=(DEC_Inexact | DEC_Rounded);  /* no, inexact */
5920
	  break;
5921
	  }
5922
	/* force padding if adjustment has gone to 0 before full length */
5923
	if (decNumberIsZero(b)) b->exponent=a->exponent-p;
5924
	}
5925

5926
      /* not done yet ... */
5927
      decAddOp(a, a, b, &aset, 0, &ignore);  /* a=a+b for next estimate */
5928
      if (pp==p) continue;		     /* precision is at maximum */
5929
      /* lengthen the next calculation */
5930
      pp=pp*2;				     /* double precision */
5931
      if (pp>p) pp=p;			     /* clamp to maximum */
5932
      aset.digits=pp;			     /* working context */
5933
      bset.digits=pp+rhs->digits;	     /* wider context */
5934
      } /* Newton's iteration */
5935

5936
    #if DECCHECK
5937
    /* just a sanity check; remove the test to show always */
5938
    if (iterations>24)
5939
      printf("Ln iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
5940
	    iterations, *status, p, rhs->digits);
5941
    #endif
5942

5943
    /* Copy and round the result to res */
5944
    residue=1;				/* indicate dirt to right */
5945
    if (ISZERO(a)) residue=0;		/* .. unless underflowed to 0 */
5946
    aset.digits=set->digits;		/* [use default rounding] */
5947
    decCopyFit(res, a, &aset, &residue, status); /* copy & shorten */
5948
    decFinish(res, set, &residue, status);	 /* cleanup/set flags */
5949
    } while(0);				/* end protected */
5950

5951
  if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
5952
  if (allocbufb!=NULL) free(allocbufb); /* .. */
5953
  /* [status is handled by caller] */
5954
  return res;
5955
  } /* decLnOp */
5956

5957
/* ------------------------------------------------------------------ */
5958
/* decQuantizeOp  -- force exponent to requested value		      */
5959
/*								      */
5960
/*   This computes C = op(A, B), where op adjusts the coefficient     */
5961
/*   of C (by rounding or shifting) such that the exponent (-scale)   */
5962
/*   of C has the value B or matches the exponent of B.		      */
5963
/*   The numerical value of C will equal A, except for the effects of */
5964
/*   any rounding that occurred.				      */
5965
/*								      */
5966
/*   res is C, the result.  C may be A or B			      */
5967
/*   lhs is A, the number to adjust				      */
5968
/*   rhs is B, the requested exponent				      */
5969
/*   set is the context						      */
5970
/*   quant is 1 for quantize or 0 for rescale			      */
5971
/*   status is the status accumulator (this can be called without     */
5972
/*	    risk of control loss)				      */
5973
/*								      */
5974
/* C must have space for set->digits digits.			      */
5975
/*								      */
5976
/* Unless there is an error or the result is infinite, the exponent   */
5977
/* after the operation is guaranteed to be that requested.	      */
5978
/* ------------------------------------------------------------------ */
5979
static decNumber * decQuantizeOp(decNumber *res, const decNumber *lhs,
5980
				 const decNumber *rhs, decContext *set,
5981
				 Flag quant, uInt *status) {
5982
  #if DECSUBSET
5983
  decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
5984
  decNumber *allocrhs=NULL;	   /* .., rhs */
5985
  #endif
5986
  const decNumber *inrhs=rhs;	   /* save original rhs */
5987
  Int	reqdigits=set->digits;	   /* requested DIGITS */
5988
  Int	reqexp;			   /* requested exponent [-scale] */
5989
  Int	residue=0;		   /* rounding residue */
5990
  Int	etiny=set->emin-(reqdigits-1);
5991

5992
  #if DECCHECK
5993
  if (decCheckOperands(res, lhs, rhs, set)) return res;
5994
  #endif
5995

5996
  do {				   /* protect allocated storage */
5997
    #if DECSUBSET
5998
    if (!set->extended) {
5999
      /* reduce operands and set lostDigits status, as needed */
6000
      if (lhs->digits>reqdigits) {
6001
	alloclhs=decRoundOperand(lhs, set, status);
6002
	if (alloclhs==NULL) break;
6003
	lhs=alloclhs;
6004
	}
6005
      if (rhs->digits>reqdigits) { /* [this only checks lostDigits] */
6006
	allocrhs=decRoundOperand(rhs, set, status);
6007
	if (allocrhs==NULL) break;
6008
	rhs=allocrhs;
6009
	}
6010
      }
6011
    #endif
6012
    /* [following code does not require input rounding] */
6013

6014
    /* Handle special values */
6015
    if (SPECIALARGS) {
6016
      /* NaNs get usual processing */
6017
      if (SPECIALARGS & (DECSNAN | DECNAN))
6018
	decNaNs(res, lhs, rhs, set, status);
6019
      /* one infinity but not both is bad */
6020
      else if ((lhs->bits ^ rhs->bits) & DECINF)
6021
	*status|=DEC_Invalid_operation;
6022
      /* both infinity: return lhs */
6023
      else decNumberCopy(res, lhs);	     /* [nop if in place] */
6024
      break;
6025
      }
6026

6027
    /* set requested exponent */
6028
    if (quant) reqexp=inrhs->exponent;	/* quantize -- match exponents */
6029
     else {				/* rescale -- use value of rhs */
6030
      /* Original rhs must be an integer that fits and is in range, */
6031
      /* which could be from -1999999997 to +999999999, thanks to */
6032
      /* subnormals */
6033
      reqexp=decGetInt(inrhs);		     /* [cannot fail] */
6034
      }
6035

6036
    #if DECSUBSET
6037
    if (!set->extended) etiny=set->emin;     /* no subnormals */
6038
    #endif
6039

6040
    if (reqexp==BADINT			     /* bad (rescale only) or .. */
6041
     || reqexp==BIGODD || reqexp==BIGEVEN    /* very big (ditto) or .. */
6042
     || (reqexp<etiny)			     /* < lowest */
6043
     || (reqexp>set->emax)) {		     /* > emax */
6044
      *status|=DEC_Invalid_operation;
6045
      break;}
6046

6047
    /* the RHS has been processed, so it can be overwritten now if necessary */
6048
    if (ISZERO(lhs)) {			     /* zero coefficient unchanged */
6049
      decNumberCopy(res, lhs);		     /* [nop if in place] */
6050
      res->exponent=reqexp;		     /* .. just set exponent */
6051
      #if DECSUBSET
6052
      if (!set->extended) res->bits=0;	     /* subset specification; no -0 */
6053
      #endif
6054
      }
6055
     else {				     /* non-zero lhs */
6056
      Int adjust=reqexp-lhs->exponent;	     /* digit adjustment needed */
6057
      /* if adjusted coefficient will definitely not fit, give up now */
6058
      if ((lhs->digits-adjust)>reqdigits) {
6059
	*status|=DEC_Invalid_operation;
6060
	break;
6061
	}
6062

6063
      if (adjust>0) {			     /* increasing exponent */
6064
	/* this will decrease the length of the coefficient by adjust */
6065
	/* digits, and must round as it does so */
6066
	decContext workset;		     /* work */
6067
	workset=*set;			     /* clone rounding, etc. */
6068
	workset.digits=lhs->digits-adjust;   /* set requested length */
6069
	/* [note that the latter can be <1, here] */
6070
	decCopyFit(res, lhs, &workset, &residue, status); /* fit to result */
6071
	decApplyRound(res, &workset, residue, status);	  /* .. and round */
6072
	residue=0;					  /* [used] */
6073
	/* If just rounded a 999s case, exponent will be off by one; */
6074
	/* adjust back (after checking space), if so. */
6075
	if (res->exponent>reqexp) {
6076
	  /* re-check needed, e.g., for quantize(0.9999, 0.001) under */
6077
	  /* set->digits==3 */
6078
	  if (res->digits==reqdigits) {	     /* cannot shift by 1 */
6079
	    *status&=~(DEC_Inexact | DEC_Rounded); /* [clean these] */
6080
	    *status|=DEC_Invalid_operation;
6081
	    break;
6082
	    }
6083
	  res->digits=decShiftToMost(res->lsu, res->digits, 1); /* shift */
6084
	  res->exponent--;		     /* (re)adjust the exponent. */
6085
	  }
6086
	#if DECSUBSET
6087
	if (ISZERO(res) && !set->extended) res->bits=0; /* subset; no -0 */
6088
	#endif
6089
	} /* increase */
6090
       else /* adjust<=0 */ {		     /* decreasing or = exponent */
6091
	/* this will increase the length of the coefficient by -adjust */
6092
	/* digits, by adding zero or more trailing zeros; this is */
6093
	/* already checked for fit, above */
6094
	decNumberCopy(res, lhs);	     /* [it will fit] */
6095
	/* if padding needed (adjust<0), add it now... */
6096
	if (adjust<0) {
6097
	  res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
6098
	  res->exponent+=adjust;	     /* adjust the exponent */
6099
	  }
6100
	} /* decrease */
6101
      } /* non-zero */
6102

6103
    /* Check for overflow [do not use Finalize in this case, as an */
6104
    /* overflow here is a "don't fit" situation] */
6105
    if (res->exponent>set->emax-res->digits+1) {  /* too big */
6106
      *status|=DEC_Invalid_operation;
6107
      break;
6108
      }
6109
     else {
6110
      decFinalize(res, set, &residue, status);	  /* set subnormal flags */
6111
      *status&=~DEC_Underflow;		/* suppress Underflow [754r] */
6112
      }
6113
    } while(0);				/* end protected */
6114

6115
  #if DECSUBSET
6116
  if (allocrhs!=NULL) free(allocrhs);	/* drop any storage used */
6117
  if (alloclhs!=NULL) free(alloclhs);	/* .. */
6118
  #endif
6119
  return res;
6120
  } /* decQuantizeOp */
6121

6122
/* ------------------------------------------------------------------ */
6123
/* decCompareOp -- compare, min, or max two Numbers		      */
6124
/*								      */
6125
/*   This computes C = A ? B and carries out one of four operations:  */
6126
/*     COMPARE	  -- returns the signum (as a number) giving the      */
6127
/*		     result of a comparison unless one or both	      */
6128
/*		     operands is a NaN (in which case a NaN results)  */
6129
/*     COMPSIG	  -- as COMPARE except that a quiet NaN raises	      */
6130
/*		     Invalid operation.				      */
6131
/*     COMPMAX	  -- returns the larger of the operands, using the    */
6132
/*		     754r maxnum operation			      */
6133
/*     COMPMAXMAG -- ditto, comparing absolute values		      */
6134
/*     COMPMIN	  -- the 754r minnum operation			      */
6135
/*     COMPMINMAG -- ditto, comparing absolute values		      */
6136
/*     COMTOTAL	  -- returns the signum (as a number) giving the      */
6137
/*		     result of a comparison using 754r total ordering */
6138
/*								      */
6139
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
6140
/*   lhs is A							      */
6141
/*   rhs is B							      */
6142
/*   set is the context						      */
6143
/*   op	 is the operation flag					      */
6144
/*   status is the usual accumulator				      */
6145
/*								      */
6146
/* C must have space for one digit for COMPARE or set->digits for     */
6147
/* COMPMAX, COMPMIN, COMPMAXMAG, or COMPMINMAG.			      */
6148
/* ------------------------------------------------------------------ */
6149
/* The emphasis here is on speed for common cases, and avoiding	      */
6150
/* coefficient comparison if possible.				      */
6151
/* ------------------------------------------------------------------ */
6152
static decNumber *decCompareOp(decNumber *res, const decNumber *lhs,
6153
                               const decNumber *rhs, decContext *set,
6154
                               Flag op, uInt *status) {
6155
  #if DECSUBSET
6156
  decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
6157
  decNumber *allocrhs=NULL;	   /* .., rhs */
6158
  #endif
6159
  Int	result=0;		   /* default result value */
6160
  uByte merged;			   /* work */
6161

6162
  #if DECCHECK
6163
  if (decCheckOperands(res, lhs, rhs, set)) return res;
6164
  #endif
6165

6166
  do {				   /* protect allocated storage */
6167
    #if DECSUBSET
6168
    if (!set->extended) {
6169
      /* reduce operands and set lostDigits status, as needed */
6170
      if (lhs->digits>set->digits) {
6171
	alloclhs=decRoundOperand(lhs, set, status);
6172
	if (alloclhs==NULL) {result=BADINT; break;}
6173
	lhs=alloclhs;
6174
	}
6175
      if (rhs->digits>set->digits) {
6176
	allocrhs=decRoundOperand(rhs, set, status);
6177
	if (allocrhs==NULL) {result=BADINT; break;}
6178
	rhs=allocrhs;
6179
	}
6180
      }
6181
    #endif
6182
    /* [following code does not require input rounding] */
6183

6184
    /* If total ordering then handle differing signs 'up front' */
6185
    if (op==COMPTOTAL) {		/* total ordering */
6186
      if (decNumberIsNegative(lhs) && !decNumberIsNegative(rhs)) {
6187
	result=-1;
6188
	break;
6189
	}
6190
      if (!decNumberIsNegative(lhs) && decNumberIsNegative(rhs)) {
6191
	result=+1;
6192
	break;
6193
	}
6194
      }
6195

6196
    /* handle NaNs specially; let infinities drop through */
6197
    /* This assumes sNaN (even just one) leads to NaN. */
6198
    merged=(lhs->bits | rhs->bits) & (DECSNAN | DECNAN);
6199
    if (merged) {			/* a NaN bit set */
6200
      if (op==COMPARE);			/* result will be NaN */
6201
       else if (op==COMPSIG)		/* treat qNaN as sNaN */
6202
	*status|=DEC_Invalid_operation | DEC_sNaN;
6203
       else if (op==COMPTOTAL) {	/* total ordering, always finite */
6204
	/* signs are known to be the same; compute the ordering here */
6205
	/* as if the signs are both positive, then invert for negatives */
6206
	if (!decNumberIsNaN(lhs)) result=-1;
6207
	 else if (!decNumberIsNaN(rhs)) result=+1;
6208
	 /* here if both NaNs */
6209
	 else if (decNumberIsSNaN(lhs) && decNumberIsQNaN(rhs)) result=-1;
6210
	 else if (decNumberIsQNaN(lhs) && decNumberIsSNaN(rhs)) result=+1;
6211
	 else { /* both NaN or both sNaN */
6212
	  /* now it just depends on the payload */
6213
	  result=decUnitCompare(lhs->lsu, D2U(lhs->digits),
6214
				rhs->lsu, D2U(rhs->digits), 0);
6215
	  /* [Error not possible, as these are 'aligned'] */
6216
	  } /* both same NaNs */
6217
	if (decNumberIsNegative(lhs)) result=-result;
6218
	break;
6219
	} /* total order */
6220

6221
       else if (merged & DECSNAN);	     /* sNaN -> qNaN */
6222
       else { /* here if MIN or MAX and one or two quiet NaNs */
6223
	/* min or max -- 754r rules ignore single NaN */
6224
	if (!decNumberIsNaN(lhs) || !decNumberIsNaN(rhs)) {
6225
	  /* just one NaN; force choice to be the non-NaN operand */
6226
	  op=COMPMAX;
6227
	  if (lhs->bits & DECNAN) result=-1; /* pick rhs */
6228
			     else result=+1; /* pick lhs */
6229
	  break;
6230
	  }
6231
	} /* max or min */
6232
      op=COMPNAN;			     /* use special path */
6233
      decNaNs(res, lhs, rhs, set, status);   /* propagate NaN */
6234
      break;
6235
      }
6236
    /* have numbers */
6237
    if (op==COMPMAXMAG || op==COMPMINMAG) result=decCompare(lhs, rhs, 1);
6238
     else result=decCompare(lhs, rhs, 0);    /* sign matters */
6239
    } while(0);				     /* end protected */
6240

6241
  if (result==BADINT) *status|=DEC_Insufficient_storage; /* rare */
6242
   else {
6243
    if (op==COMPARE || op==COMPSIG ||op==COMPTOTAL) { /* returning signum */
6244
      if (op==COMPTOTAL && result==0) {
6245
	/* operands are numerically equal or same NaN (and same sign, */
6246
	/* tested first); if identical, leave result 0 */
6247
	if (lhs->exponent!=rhs->exponent) {
6248
	  if (lhs->exponent<rhs->exponent) result=-1;
6249
	   else result=+1;
6250
	  if (decNumberIsNegative(lhs)) result=-result;
6251
	  } /* lexp!=rexp */
6252
	} /* total-order by exponent */
6253
      decNumberZero(res);		/* [always a valid result] */
6254
      if (result!=0) {			/* must be -1 or +1 */
6255
	*res->lsu=1;
6256
	if (result<0) res->bits=DECNEG;
6257
	}
6258
      }
6259
     else if (op==COMPNAN);		/* special, drop through */
6260
     else {				/* MAX or MIN, non-NaN result */
6261
      Int residue=0;			/* rounding accumulator */
6262
      /* choose the operand for the result */
6263
      const decNumber *choice;
6264
      if (result==0) { /* operands are numerically equal */
6265
	/* choose according to sign then exponent (see 754r) */
6266
	uByte slhs=(lhs->bits & DECNEG);
6267
	uByte srhs=(rhs->bits & DECNEG);
6268
	#if DECSUBSET
6269
	if (!set->extended) {		/* subset: force left-hand */
6270
	  op=COMPMAX;
6271
	  result=+1;
6272
	  }
6273
	else
6274
	#endif
6275
	if (slhs!=srhs) {	   /* signs differ */
6276
	  if (slhs) result=-1;	   /* rhs is max */
6277
	       else result=+1;	   /* lhs is max */
6278
	  }
6279
	 else if (slhs && srhs) {  /* both negative */
6280
	  if (lhs->exponent<rhs->exponent) result=+1;
6281
				      else result=-1;
6282
	  /* [if equal, use lhs, technically identical] */
6283
	  }
6284
	 else {			   /* both positive */
6285
	  if (lhs->exponent>rhs->exponent) result=+1;
6286
				      else result=-1;
6287
	  /* [ditto] */
6288
	  }
6289
	} /* numerically equal */
6290
      /* here result will be non-0; reverse if looking for MIN */
6291
      if (op==COMPMIN || op==COMPMINMAG) result=-result;
6292
      choice=(result>0 ? lhs : rhs);	/* choose */
6293
      /* copy chosen to result, rounding if need be */
6294
      decCopyFit(res, choice, set, &residue, status);
6295
      decFinish(res, set, &residue, status);
6296
      }
6297
    }
6298
  #if DECSUBSET
6299
  if (allocrhs!=NULL) free(allocrhs);	/* free any storage used */
6300
  if (alloclhs!=NULL) free(alloclhs);	/* .. */
6301
  #endif
6302
  return res;
6303
  } /* decCompareOp */
6304

6305
/* ------------------------------------------------------------------ */
6306
/* decCompare -- compare two decNumbers by numerical value	      */
6307
/*								      */
6308
/*  This routine compares A ? B without altering them.		      */
6309
/*								      */
6310
/*  Arg1 is A, a decNumber which is not a NaN			      */
6311
/*  Arg2 is B, a decNumber which is not a NaN			      */
6312
/*  Arg3 is 1 for a sign-independent compare, 0 otherwise	      */
6313
/*								      */
6314
/*  returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure   */
6315
/*  (the only possible failure is an allocation error)		      */
6316
/* ------------------------------------------------------------------ */
6317
static Int decCompare(const decNumber *lhs, const decNumber *rhs,
6318
		      Flag abs) {
6319
  Int	result;			   /* result value */
6320
  Int	sigr;			   /* rhs signum */
6321
  Int	compare;		   /* work */
6322

6323
  result=1;				     /* assume signum(lhs) */
6324
  if (ISZERO(lhs)) result=0;
6325
  if (abs) {
6326
    if (ISZERO(rhs)) return result;	     /* LHS wins or both 0 */
6327
    /* RHS is non-zero */
6328
    if (result==0) return -1;		     /* LHS is 0; RHS wins */
6329
    /* [here, both non-zero, result=1] */
6330
    }
6331
   else {				     /* signs matter */
6332
    if (result && decNumberIsNegative(lhs)) result=-1;
6333
    sigr=1;				     /* compute signum(rhs) */
6334
    if (ISZERO(rhs)) sigr=0;
6335
     else if (decNumberIsNegative(rhs)) sigr=-1;
6336
    if (result > sigr) return +1;	     /* L > R, return 1 */
6337
    if (result < sigr) return -1;	     /* L < R, return -1 */
6338
    if (result==0) return 0;		       /* both 0 */
6339
    }
6340

6341
  /* signums are the same; both are non-zero */
6342
  if ((lhs->bits | rhs->bits) & DECINF) {    /* one or more infinities */
6343
    if (decNumberIsInfinite(rhs)) {
6344
      if (decNumberIsInfinite(lhs)) result=0;/* both infinite */
6345
       else result=-result;		     /* only rhs infinite */
6346
      }
6347
    return result;
6348
    }
6349
  /* must compare the coefficients, allowing for exponents */
6350
  if (lhs->exponent>rhs->exponent) {	     /* LHS exponent larger */
6351
    /* swap sides, and sign */
6352
    const decNumber *temp=lhs;
6353
    lhs=rhs;
6354
    rhs=temp;
6355
    result=-result;
6356
    }
6357
  compare=decUnitCompare(lhs->lsu, D2U(lhs->digits),
6358
			 rhs->lsu, D2U(rhs->digits),
6359
			 rhs->exponent-lhs->exponent);
6360
  if (compare!=BADINT) compare*=result;	     /* comparison succeeded */
6361
  return compare;
6362
  } /* decCompare */
6363

6364
/* ------------------------------------------------------------------ */
6365
/* decUnitCompare -- compare two >=0 integers in Unit arrays	      */
6366
/*								      */
6367
/*  This routine compares A ? B*10**E where A and B are unit arrays   */
6368
/*  A is a plain integer					      */
6369
/*  B has an exponent of E (which must be non-negative)		      */
6370
/*								      */
6371
/*  Arg1 is A first Unit (lsu)					      */
6372
/*  Arg2 is A length in Units					      */
6373
/*  Arg3 is B first Unit (lsu)					      */
6374
/*  Arg4 is B length in Units					      */
6375
/*  Arg5 is E (0 if the units are aligned)			      */
6376
/*								      */
6377
/*  returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure   */
6378
/*  (the only possible failure is an allocation error, which can      */
6379
/*  only occur if E!=0)						      */
6380
/* ------------------------------------------------------------------ */
6381
static Int decUnitCompare(const Unit *a, Int alength,
6382
			  const Unit *b, Int blength, Int exp) {
6383
  Unit	*acc;			   /* accumulator for result */
6384
  Unit	accbuff[SD2U(DECBUFFER*2+1)]; /* local buffer */
6385
  Unit	*allocacc=NULL;		   /* -> allocated acc buffer, iff allocated */
6386
  Int	accunits, need;		   /* units in use or needed for acc */
6387
  const Unit *l, *r, *u;	   /* work */
6388
  Int	expunits, exprem, result;  /* .. */
6389

6390
  if (exp==0) {			   /* aligned; fastpath */
6391
    if (alength>blength) return 1;
6392
    if (alength<blength) return -1;
6393
    /* same number of units in both -- need unit-by-unit compare */
6394
    l=a+alength-1;
6395
    r=b+alength-1;
6396
    for (;l>=a; l--, r--) {
6397
      if (*l>*r) return 1;
6398
      if (*l<*r) return -1;
6399
      }
6400
    return 0;			   /* all units match */
6401
    } /* aligned */
6402

6403
  /* Unaligned.	 If one is >1 unit longer than the other, padded */
6404
  /* approximately, then can return easily */
6405
  if (alength>blength+(Int)D2U(exp)) return 1;
6406
  if (alength+1<blength+(Int)D2U(exp)) return -1;
6407

6408
  /* Need to do a real subtract.  For this, a result buffer is needed */
6409
  /* even though only the sign is of interest.	Its length needs */
6410
  /* to be the larger of alength and padded blength, +2 */
6411
  need=blength+D2U(exp);		/* maximum real length of B */
6412
  if (need<alength) need=alength;
6413
  need+=2;
6414
  acc=accbuff;				/* assume use local buffer */
6415
  if (need*sizeof(Unit)>sizeof(accbuff)) {
6416
    allocacc=(Unit *)malloc(need*sizeof(Unit));
6417
    if (allocacc==NULL) return BADINT;	/* hopeless -- abandon */
6418
    acc=allocacc;
6419
    }
6420
  /* Calculate units and remainder from exponent. */
6421
  expunits=exp/DECDPUN;
6422
  exprem=exp%DECDPUN;
6423
  /* subtract [A+B*(-m)] */
6424
  accunits=decUnitAddSub(a, alength, b, blength, expunits, acc,
6425
			 -(Int)powers[exprem]);
6426
  /* [UnitAddSub result may have leading zeros, even on zero] */
6427
  if (accunits<0) result=-1;		/* negative result */
6428
   else {				/* non-negative result */
6429
    /* check units of the result before freeing any storage */
6430
    for (u=acc; u<acc+accunits-1 && *u==0;) u++;
6431
    result=(*u==0 ? 0 : +1);
6432
    }
6433
  /* clean up and return the result */
6434
  if (allocacc!=NULL) free(allocacc);	/* drop any storage used */
6435
  return result;
6436
  } /* decUnitCompare */
6437

6438
/* ------------------------------------------------------------------ */
6439
/* decUnitAddSub -- add or subtract two >=0 integers in Unit arrays   */
6440
/*								      */
6441
/*  This routine performs the calculation:			      */
6442
/*								      */
6443
/*  C=A+(B*M)							      */
6444
/*								      */
6445
/*  Where M is in the range -DECDPUNMAX through +DECDPUNMAX.	      */
6446
/*								      */
6447
/*  A may be shorter or longer than B.				      */
6448
/*								      */
6449
/*  Leading zeros are not removed after a calculation.	The result is */
6450
/*  either the same length as the longer of A and B (adding any	      */
6451
/*  shift), or one Unit longer than that (if a Unit carry occurred).  */
6452
/*								      */
6453
/*  A and B content are not altered unless C is also A or B.	      */
6454
/*  C may be the same array as A or B, but only if no zero padding is */
6455
/*  requested (that is, C may be B only if bshift==0).		      */
6456
/*  C is filled from the lsu; only those units necessary to complete  */
6457
/*  the calculation are referenced.				      */
6458
/*								      */
6459
/*  Arg1 is A first Unit (lsu)					      */
6460
/*  Arg2 is A length in Units					      */
6461
/*  Arg3 is B first Unit (lsu)					      */
6462
/*  Arg4 is B length in Units					      */
6463
/*  Arg5 is B shift in Units  (>=0; pads with 0 units if positive)    */
6464
/*  Arg6 is C first Unit (lsu)					      */
6465
/*  Arg7 is M, the multiplier					      */
6466
/*								      */
6467
/*  returns the count of Units written to C, which will be non-zero   */
6468
/*  and negated if the result is negative.  That is, the sign of the  */
6469
/*  returned Int is the sign of the result (positive for zero) and    */
6470
/*  the absolute value of the Int is the count of Units.	      */
6471
/*								      */
6472
/*  It is the caller's responsibility to make sure that C size is     */
6473
/*  safe, allowing space if necessary for a one-Unit carry.	      */
6474
/*								      */
6475
/*  This routine is severely performance-critical; *any* change here  */
6476
/*  must be measured (timed) to assure no performance degradation.    */
6477
/*  In particular, trickery here tends to be counter-productive, as   */
6478
/*  increased complexity of code hurts register optimizations on      */
6479
/*  register-poor architectures.  Avoiding divisions is nearly	      */
6480
/*  always a Good Idea, however.				      */
6481
/*								      */
6482
/* Special thanks to Rick McGuire (IBM Cambridge, MA) and Dave Clark  */
6483
/* (IBM Warwick, UK) for some of the ideas used in this routine.      */
6484
/* ------------------------------------------------------------------ */
6485
static Int decUnitAddSub(const Unit *a, Int alength,
6486
			 const Unit *b, Int blength, Int bshift,
6487
			 Unit *c, Int m) {
6488
  const Unit *alsu=a;		   /* A lsu [need to remember it] */
6489
  Unit *clsu=c;			   /* C ditto */
6490
  Unit *minC;			   /* low water mark for C */
6491
  Unit *maxC;			   /* high water mark for C */
6492
  eInt carry=0;			   /* carry integer (could be Long) */
6493
  Int  add;			   /* work */
6494
  #if DECDPUN<=4		   /* myriadal, millenary, etc. */
6495
  Int  est;			   /* estimated quotient */
6496
  #endif
6497

6498
  #if DECTRACE
6499
  if (alength<1 || blength<1)
6500
    printf("decUnitAddSub: alen blen m %ld %ld [%ld]\n", alength, blength, m);
6501
  #endif
6502

6503
  maxC=c+alength;		   /* A is usually the longer */
6504
  minC=c+blength;		   /* .. and B the shorter */
6505
  if (bshift!=0) {		   /* B is shifted; low As copy across */
6506
    minC+=bshift;
6507
    /* if in place [common], skip copy unless there's a gap [rare] */
6508
    if (a==c && bshift<=alength) {
6509
      c+=bshift;
6510
      a+=bshift;
6511
      }
6512
     else for (; c<clsu+bshift; a++, c++) {  /* copy needed */
6513
      if (a<alsu+alength) *c=*a;
6514
       else *c=0;
6515
      }
6516
    }
6517
  if (minC>maxC) { /* swap */
6518
    Unit *hold=minC;
6519
    minC=maxC;
6520
    maxC=hold;
6521
    }
6522

6523
  /* For speed, do the addition as two loops; the first where both A */
6524
  /* and B contribute, and the second (if necessary) where only one or */
6525
  /* other of the numbers contribute. */
6526
  /* Carry handling is the same (i.e., duplicated) in each case. */
6527
  for (; c<minC; c++) {
6528
    carry+=*a;
6529
    a++;
6530
    carry+=((eInt)*b)*m;		/* [special-casing m=1/-1 */
6531
    b++;				/* here is not a win] */
6532
    /* here carry is new Unit of digits; it could be +ve or -ve */
6533
    if ((ueInt)carry<=DECDPUNMAX) {	/* fastpath 0-DECDPUNMAX */
6534
      *c=(Unit)carry;
6535
      carry=0;
6536
      continue;
6537
      }
6538
    #if DECDPUN==4			     /* use divide-by-multiply */
6539
      if (carry>=0) {
6540
	est=(((ueInt)carry>>11)*53687)>>18;
6541
	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6542
	carry=est;			     /* likely quotient [89%] */
6543
	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
6544
	carry++;
6545
	*c-=DECDPUNMAX+1;
6546
	continue;
6547
	}
6548
      /* negative case */
6549
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6550
      est=(((ueInt)carry>>11)*53687)>>18;
6551
      *c=(Unit)(carry-est*(DECDPUNMAX+1));
6552
      carry=est-(DECDPUNMAX+1);		     /* correctly negative */
6553
      if (*c<DECDPUNMAX+1) continue;	     /* was OK */
6554
      carry++;
6555
      *c-=DECDPUNMAX+1;
6556
    #elif DECDPUN==3
6557
      if (carry>=0) {
6558
	est=(((ueInt)carry>>3)*16777)>>21;
6559
	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6560
	carry=est;			     /* likely quotient [99%] */
6561
	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
6562
	carry++;
6563
	*c-=DECDPUNMAX+1;
6564
	continue;
6565
	}
6566
      /* negative case */
6567
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6568
      est=(((ueInt)carry>>3)*16777)>>21;
6569
      *c=(Unit)(carry-est*(DECDPUNMAX+1));
6570
      carry=est-(DECDPUNMAX+1);		     /* correctly negative */
6571
      if (*c<DECDPUNMAX+1) continue;	     /* was OK */
6572
      carry++;
6573
      *c-=DECDPUNMAX+1;
6574
    #elif DECDPUN<=2
6575
      /* Can use QUOT10 as carry <= 4 digits */
6576
      if (carry>=0) {
6577
	est=QUOT10(carry, DECDPUN);
6578
	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6579
	carry=est;			     /* quotient */
6580
	continue;
6581
	}
6582
      /* negative case */
6583
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6584
      est=QUOT10(carry, DECDPUN);
6585
      *c=(Unit)(carry-est*(DECDPUNMAX+1));
6586
      carry=est-(DECDPUNMAX+1);		     /* correctly negative */
6587
    #else
6588
      /* remainder operator is undefined if negative, so must test */
6589
      if ((ueInt)carry<(DECDPUNMAX+1)*2) {   /* fastpath carry +1 */
6590
	*c=(Unit)(carry-(DECDPUNMAX+1));     /* [helps additions] */
6591
	carry=1;
6592
	continue;
6593
	}
6594
      if (carry>=0) {
6595
	*c=(Unit)(carry%(DECDPUNMAX+1));
6596
	carry=carry/(DECDPUNMAX+1);
6597
	continue;
6598
	}
6599
      /* negative case */
6600
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6601
      *c=(Unit)(carry%(DECDPUNMAX+1));
6602
      carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
6603
    #endif
6604
    } /* c */
6605

6606
  /* now may have one or other to complete */
6607
  /* [pretest to avoid loop setup/shutdown] */
6608
  if (c<maxC) for (; c<maxC; c++) {
6609
    if (a<alsu+alength) {		/* still in A */
6610
      carry+=*a;
6611
      a++;
6612
      }
6613
     else {				/* inside B */
6614
      carry+=((eInt)*b)*m;
6615
      b++;
6616
      }
6617
    /* here carry is new Unit of digits; it could be +ve or -ve and */
6618
    /* magnitude up to DECDPUNMAX squared */
6619
    if ((ueInt)carry<=DECDPUNMAX) {	/* fastpath 0-DECDPUNMAX */
6620
      *c=(Unit)carry;
6621
      carry=0;
6622
      continue;
6623
      }
6624
    /* result for this unit is negative or >DECDPUNMAX */
6625
    #if DECDPUN==4			     /* use divide-by-multiply */
6626
      if (carry>=0) {
6627
	est=(((ueInt)carry>>11)*53687)>>18;
6628
	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6629
	carry=est;			     /* likely quotient [79.7%] */
6630
	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
6631
	carry++;
6632
	*c-=DECDPUNMAX+1;
6633
	continue;
6634
	}
6635
      /* negative case */
6636
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6637
      est=(((ueInt)carry>>11)*53687)>>18;
6638
      *c=(Unit)(carry-est*(DECDPUNMAX+1));
6639
      carry=est-(DECDPUNMAX+1);		     /* correctly negative */
6640
      if (*c<DECDPUNMAX+1) continue;	     /* was OK */
6641
      carry++;
6642
      *c-=DECDPUNMAX+1;
6643
    #elif DECDPUN==3
6644
      if (carry>=0) {
6645
	est=(((ueInt)carry>>3)*16777)>>21;
6646
	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6647
	carry=est;			     /* likely quotient [99%] */
6648
	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
6649
	carry++;
6650
	*c-=DECDPUNMAX+1;
6651
	continue;
6652
	}
6653
      /* negative case */
6654
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6655
      est=(((ueInt)carry>>3)*16777)>>21;
6656
      *c=(Unit)(carry-est*(DECDPUNMAX+1));
6657
      carry=est-(DECDPUNMAX+1);		     /* correctly negative */
6658
      if (*c<DECDPUNMAX+1) continue;	     /* was OK */
6659
      carry++;
6660
      *c-=DECDPUNMAX+1;
6661
    #elif DECDPUN<=2
6662
      if (carry>=0) {
6663
	est=QUOT10(carry, DECDPUN);
6664
	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6665
	carry=est;			     /* quotient */
6666
	continue;
6667
	}
6668
      /* negative case */
6669
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6670
      est=QUOT10(carry, DECDPUN);
6671
      *c=(Unit)(carry-est*(DECDPUNMAX+1));
6672
      carry=est-(DECDPUNMAX+1);		     /* correctly negative */
6673
    #else
6674
      if ((ueInt)carry<(DECDPUNMAX+1)*2){    /* fastpath carry 1 */
6675
	*c=(Unit)(carry-(DECDPUNMAX+1));
6676
	carry=1;
6677
	continue;
6678
	}
6679
      /* remainder operator is undefined if negative, so must test */
6680
      if (carry>=0) {
6681
	*c=(Unit)(carry%(DECDPUNMAX+1));
6682
	carry=carry/(DECDPUNMAX+1);
6683
	continue;
6684
	}
6685
      /* negative case */
6686
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6687
      *c=(Unit)(carry%(DECDPUNMAX+1));
6688
      carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
6689
    #endif
6690
    } /* c */
6691

6692
  /* OK, all A and B processed; might still have carry or borrow */
6693
  /* return number of Units in the result, negated if a borrow */
6694
  if (carry==0) return c-clsu;	   /* no carry, so no more to do */
6695
  if (carry>0) {		   /* positive carry */
6696
    *c=(Unit)carry;		   /* place as new unit */
6697
    c++;			   /* .. */
6698
    return c-clsu;
6699
    }
6700
  /* -ve carry: it's a borrow; complement needed */
6701
  add=1;			   /* temporary carry... */
6702
  for (c=clsu; c<maxC; c++) {
6703
    add=DECDPUNMAX+add-*c;
6704
    if (add<=DECDPUNMAX) {
6705
      *c=(Unit)add;
6706
      add=0;
6707
      }
6708
     else {
6709
      *c=0;
6710
      add=1;
6711
      }
6712
    }
6713
  /* add an extra unit iff it would be non-zero */
6714
  #if DECTRACE
6715
    printf("UAS borrow: add %ld, carry %ld\n", add, carry);
6716
  #endif
6717
  if ((add-carry-1)!=0) {
6718
    *c=(Unit)(add-carry-1);
6719
    c++;		      /* interesting, include it */
6720
    }
6721
  return clsu-c;	      /* -ve result indicates borrowed */
6722
  } /* decUnitAddSub */
6723

6724
/* ------------------------------------------------------------------ */
6725
/* decTrim -- trim trailing zeros or normalize			      */
6726
/*								      */
6727
/*   dn is the number to trim or normalize			      */
6728
/*   set is the context to use to check for clamp		      */
6729
/*   all is 1 to remove all trailing zeros, 0 for just fraction ones  */
6730
/*   dropped returns the number of discarded trailing zeros	      */
6731
/*   returns dn							      */
6732
/*								      */
6733
/* If clamp is set in the context then the number of zeros trimmed    */
6734
/* may be limited if the exponent is high.			      */
6735
/* All fields are updated as required.	This is a utility operation,  */
6736
/* so special values are unchanged and no error is possible.	      */
6737
/* ------------------------------------------------------------------ */
6738
static decNumber * decTrim(decNumber *dn, decContext *set, Flag all,
6739
			   Int *dropped) {
6740
  Int	d, exp;			   /* work */
6741
  uInt	cut;			   /* .. */
6742
  Unit	*up;			   /* -> current Unit */
6743

6744
  #if DECCHECK
6745
  if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
6746
  #endif
6747

6748
  *dropped=0;				/* assume no zeros dropped */
6749
  if ((dn->bits & DECSPECIAL)		/* fast exit if special .. */
6750
    || (*dn->lsu & 0x01)) return dn;	/* .. or odd */
6751
  if (ISZERO(dn)) {			/* .. or 0 */
6752
    dn->exponent=0;			/* (sign is preserved) */
6753
    return dn;
6754
    }
6755

6756
  /* have a finite number which is even */
6757
  exp=dn->exponent;
6758
  cut=1;			   /* digit (1-DECDPUN) in Unit */
6759
  up=dn->lsu;			   /* -> current Unit */
6760
  for (d=0; d<dn->digits-1; d++) { /* [don't strip the final digit] */
6761
    /* slice by powers */
6762
    #if DECDPUN<=4
6763
      uInt quot=QUOT10(*up, cut);
6764
      if ((*up-quot*powers[cut])!=0) break;  /* found non-0 digit */
6765
    #else
6766
      if (*up%powers[cut]!=0) break;	     /* found non-0 digit */
6767
    #endif
6768
    /* have a trailing 0 */
6769
    if (!all) {			   /* trimming */
6770
      /* [if exp>0 then all trailing 0s are significant for trim] */
6771
      if (exp<=0) {		   /* if digit might be significant */
6772
	if (exp==0) break;	   /* then quit */
6773
	exp++;			   /* next digit might be significant */
6774
	}
6775
      }
6776
    cut++;			   /* next power */
6777
    if (cut>DECDPUN) {		   /* need new Unit */
6778
      up++;
6779
      cut=1;
6780
      }
6781
    } /* d */
6782
  if (d==0) return dn;		   /* none to drop */
6783

6784
  /* may need to limit drop if clamping */
6785
  if (set->clamp) {
6786
    Int maxd=set->emax-set->digits+1-dn->exponent;
6787
    if (maxd<=0) return dn;	   /* nothing possible */
6788
    if (d>maxd) d=maxd;
6789
    }
6790

6791
  /* effect the drop */
6792
  decShiftToLeast(dn->lsu, D2U(dn->digits), d);
6793
  dn->exponent+=d;		   /* maintain numerical value */
6794
  dn->digits-=d;		   /* new length */
6795
  *dropped=d;			   /* report the count */
6796
  return dn;
6797
  } /* decTrim */
6798

6799
/* ------------------------------------------------------------------ */
6800
/* decReverse -- reverse a Unit array in place			      */
6801
/*								      */
6802
/*   ulo    is the start of the array				      */
6803
/*   uhi    is the end of the array (highest Unit to include)	      */
6804
/*								      */
6805
/* The units ulo through uhi are reversed in place (if the number     */
6806
/* of units is odd, the middle one is untouched).  Note that the      */
6807
/* digit(s) in each unit are unaffected.			      */
6808
/* ------------------------------------------------------------------ */
6809
static void decReverse(Unit *ulo, Unit *uhi) {
6810
  Unit temp;
6811
  for (; ulo<uhi; ulo++, uhi--) {
6812
    temp=*ulo;
6813
    *ulo=*uhi;
6814
    *uhi=temp;
6815
    }
6816
  return;
6817
  } /* decReverse */
6818

6819
/* ------------------------------------------------------------------ */
6820
/* decShiftToMost -- shift digits in array towards most significant   */
6821
/*								      */
6822
/*   uar    is the array					      */
6823
/*   digits is the count of digits in use in the array		      */
6824
/*   shift  is the number of zeros to pad with (least significant);   */
6825
/*     it must be zero or positive				      */
6826
/*								      */
6827
/*   returns the new length of the integer in the array, in digits    */
6828
/*								      */
6829
/* No overflow is permitted (that is, the uar array must be known to  */
6830
/* be large enough to hold the result, after shifting).		      */
6831
/* ------------------------------------------------------------------ */
6832
static Int decShiftToMost(Unit *uar, Int digits, Int shift) {
6833
  Unit	*target, *source, *first;  /* work */
6834
  Int	cut;			   /* odd 0's to add */
6835
  uInt	next;			   /* work */
6836

6837
  if (shift==0) return digits;	   /* [fastpath] nothing to do */
6838
  if ((digits+shift)<=DECDPUN) {   /* [fastpath] single-unit case */
6839
    *uar=(Unit)(*uar*powers[shift]);
6840
    return digits+shift;
6841
    }
6842

6843
  next=0;			   /* all paths */
6844
  source=uar+D2U(digits)-1;	   /* where msu comes from */
6845
  target=source+D2U(shift);	   /* where upper part of first cut goes */
6846
  cut=DECDPUN-MSUDIGITS(shift);	   /* where to slice */
6847
  if (cut==0) {			   /* unit-boundary case */
6848
    for (; source>=uar; source--, target--) *target=*source;
6849
    }
6850
   else {
6851
    first=uar+D2U(digits+shift)-1; /* where msu of source will end up */
6852
    for (; source>=uar; source--, target--) {
6853
      /* split the source Unit and accumulate remainder for next */
6854
      #if DECDPUN<=4
6855
	uInt quot=QUOT10(*source, cut);
6856
	uInt rem=*source-quot*powers[cut];
6857
	next+=quot;
6858
      #else
6859
	uInt rem=*source%powers[cut];
6860
	next+=*source/powers[cut];
6861
      #endif
6862
      if (target<=first) *target=(Unit)next;   /* write to target iff valid */
6863
      next=rem*powers[DECDPUN-cut];	       /* save remainder for next Unit */
6864
      }
6865
    } /* shift-move */
6866

6867
  /* propagate any partial unit to one below and clear the rest */
6868
  for (; target>=uar; target--) {
6869
    *target=(Unit)next;
6870
    next=0;
6871
    }
6872
  return digits+shift;
6873
  } /* decShiftToMost */
6874

6875
/* ------------------------------------------------------------------ */
6876
/* decShiftToLeast -- shift digits in array towards least significant */
6877
/*								      */
6878
/*   uar   is the array						      */
6879
/*   units is length of the array, in units			      */
6880
/*   shift is the number of digits to remove from the lsu end; it     */
6881
/*     must be zero or positive and <= than units*DECDPUN.	      */
6882
/*								      */
6883
/*   returns the new length of the integer in the array, in units     */
6884
/*								      */
6885
/* Removed digits are discarded (lost).	 Units not required to hold   */
6886
/* the final result are unchanged.				      */
6887
/* ------------------------------------------------------------------ */
6888
static Int decShiftToLeast(Unit *uar, Int units, Int shift) {
6889
  Unit	*target, *up;		   /* work */
6890
  Int	cut, count;		   /* work */
6891
  Int	quot, rem;		   /* for division */
6892

6893
  if (shift==0) return units;	   /* [fastpath] nothing to do */
6894
  if (shift==units*DECDPUN) {	   /* [fastpath] little to do */
6895
    *uar=0;			   /* all digits cleared gives zero */
6896
    return 1;			   /* leaves just the one */
6897
    }
6898

6899
  target=uar;			   /* both paths */
6900
  cut=MSUDIGITS(shift);
6901
  if (cut==DECDPUN) {		   /* unit-boundary case; easy */
6902
    up=uar+D2U(shift);
6903
    for (; up<uar+units; target++, up++) *target=*up;
6904
    return target-uar;
6905
    }
6906

6907
  /* messier */
6908
  up=uar+D2U(shift-cut);	   /* source; correct to whole Units */
6909
  count=units*DECDPUN-shift;	   /* the maximum new length */
6910
  #if DECDPUN<=4
6911
    quot=QUOT10(*up, cut);
6912
  #else
6913
    quot=*up/powers[cut];
6914
  #endif
6915
  for (; ; target++) {
6916
    *target=(Unit)quot;
6917
    count-=(DECDPUN-cut);
6918
    if (count<=0) break;
6919
    up++;
6920
    quot=*up;
6921
    #if DECDPUN<=4
6922
      quot=QUOT10(quot, cut);
6923
      rem=*up-quot*powers[cut];
6924
    #else
6925
      rem=quot%powers[cut];
6926
      quot=quot/powers[cut];
6927
    #endif
6928
    *target=(Unit)(*target+rem*powers[DECDPUN-cut]);
6929
    count-=cut;
6930
    if (count<=0) break;
6931
    }
6932
  return target-uar+1;
6933
  } /* decShiftToLeast */
6934

6935
#if DECSUBSET
6936
/* ------------------------------------------------------------------ */
6937
/* decRoundOperand -- round an operand	[used for subset only]	      */
6938
/*								      */
6939
/*   dn is the number to round (dn->digits is > set->digits)	      */
6940
/*   set is the relevant context				      */
6941
/*   status is the status accumulator				      */
6942
/*								      */
6943
/*   returns an allocated decNumber with the rounded result.	      */
6944
/*								      */
6945
/* lostDigits and other status may be set by this.		      */
6946
/*								      */
6947
/* Since the input is an operand, it must not be modified.	      */
6948
/* Instead, return an allocated decNumber, rounded as required.	      */
6949
/* It is the caller's responsibility to free the allocated storage.   */
6950
/*								      */
6951
/* If no storage is available then the result cannot be used, so NULL */
6952
/* is returned.							      */
6953
/* ------------------------------------------------------------------ */
6954
static decNumber *decRoundOperand(const decNumber *dn, decContext *set,
6955
				  uInt *status) {
6956
  decNumber *res;			/* result structure */
6957
  uInt newstatus=0;			/* status from round */
6958
  Int  residue=0;			/* rounding accumulator */
6959

6960
  /* Allocate storage for the returned decNumber, big enough for the */
6961
  /* length specified by the context */
6962
  res=(decNumber *)malloc(sizeof(decNumber)
6963
			  +(D2U(set->digits)-1)*sizeof(Unit));
6964
  if (res==NULL) {
6965
    *status|=DEC_Insufficient_storage;
6966
    return NULL;
6967
    }
6968
  decCopyFit(res, dn, set, &residue, &newstatus);
6969
  decApplyRound(res, set, residue, &newstatus);
6970

6971
  /* If that set Inexact then "lost digits" is raised... */
6972
  if (newstatus & DEC_Inexact) newstatus|=DEC_Lost_digits;
6973
  *status|=newstatus;
6974
  return res;
6975
  } /* decRoundOperand */
6976
#endif
6977

6978
/* ------------------------------------------------------------------ */
6979
/* decCopyFit -- copy a number, truncating the coefficient if needed  */
6980
/*								      */
6981
/*   dest is the target decNumber				      */
6982
/*   src  is the source decNumber				      */
6983
/*   set is the context [used for length (digits) and rounding mode]  */
6984
/*   residue is the residue accumulator				      */
6985
/*   status contains the current status to be updated		      */
6986
/*								      */
6987
/* (dest==src is allowed and will be a no-op if fits)		      */
6988
/* All fields are updated as required.				      */
6989
/* ------------------------------------------------------------------ */
6990
static void decCopyFit(decNumber *dest, const decNumber *src,
6991
		       decContext *set, Int *residue, uInt *status) {
6992
  dest->bits=src->bits;
6993
  dest->exponent=src->exponent;
6994
  decSetCoeff(dest, set, src->lsu, src->digits, residue, status);
6995
  } /* decCopyFit */
6996

6997
/* ------------------------------------------------------------------ */
6998
/* decSetCoeff -- set the coefficient of a number		      */
6999
/*								      */
7000
/*   dn	   is the number whose coefficient array is to be set.	      */
7001
/*	   It must have space for set->digits digits		      */
7002
/*   set   is the context [for size]				      */
7003
/*   lsu   -> lsu of the source coefficient [may be dn->lsu]	      */
7004
/*   len   is digits in the source coefficient [may be dn->digits]    */
7005
/*   residue is the residue accumulator.  This has values as in	      */
7006
/*	   decApplyRound, and will be unchanged unless the	      */
7007
/*	   target size is less than len.  In this case, the	      */
7008
/*	   coefficient is truncated and the residue is updated to     */
7009
/*	   reflect the previous residue and the dropped digits.	      */
7010
/*   status is the status accumulator, as usual			      */
7011
/*								      */
7012
/* The coefficient may already be in the number, or it can be an      */
7013
/* external intermediate array.	 If it is in the number, lsu must ==  */
7014
/* dn->lsu and len must == dn->digits.				      */
7015
/*								      */
7016
/* Note that the coefficient length (len) may be < set->digits, and   */
7017
/* in this case this merely copies the coefficient (or is a no-op     */
7018
/* if dn->lsu==lsu).						      */
7019
/*								      */
7020
/* Note also that (only internally, from decQuantizeOp and	      */
7021
/* decSetSubnormal) the value of set->digits may be less than one,    */
7022
/* indicating a round to left.	This routine handles that case	      */
7023
/* correctly; caller ensures space.				      */
7024
/*								      */
7025
/* dn->digits, dn->lsu (and as required), and dn->exponent are	      */
7026
/* updated as necessary.   dn->bits (sign) is unchanged.	      */
7027
/*								      */
7028
/* DEC_Rounded status is set if any digits are discarded.	      */
7029
/* DEC_Inexact status is set if any non-zero digits are discarded, or */
7030
/*			 incoming residue was non-0 (implies rounded) */
7031
/* ------------------------------------------------------------------ */
7032
/* mapping array: maps 0-9 to canonical residues, so that a residue */
7033
/* can be adjusted in the range [-1, +1] and achieve correct rounding */
7034
/*			       0  1  2	3  4  5	 6  7  8  9 */
7035
static const uByte resmap[10]={0, 3, 3, 3, 3, 5, 7, 7, 7, 7};
7036
static void decSetCoeff(decNumber *dn, decContext *set, const Unit *lsu,
7037
			Int len, Int *residue, uInt *status) {
7038
  Int	discard;	      /* number of digits to discard */
7039
  uInt	cut;		      /* cut point in Unit */
7040
  const Unit *up;	      /* work */
7041
  Unit	*target;	      /* .. */
7042
  Int	count;		      /* .. */
7043
  #if DECDPUN<=4
7044
  uInt	temp;		      /* .. */
7045
  #endif
7046

7047
  discard=len-set->digits;    /* digits to discard */
7048
  if (discard<=0) {	      /* no digits are being discarded */
7049
    if (dn->lsu!=lsu) {	      /* copy needed */
7050
      /* copy the coefficient array to the result number; no shift needed */
7051
      count=len;	      /* avoids D2U */
7052
      up=lsu;
7053
      for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
7054
	*target=*up;
7055
      dn->digits=len;	      /* set the new length */
7056
      }
7057
    /* dn->exponent and residue are unchanged, record any inexactitude */
7058
    if (*residue!=0) *status|=(DEC_Inexact | DEC_Rounded);
7059
    return;
7060
    }
7061

7062
  /* some digits must be discarded ... */
7063
  dn->exponent+=discard;      /* maintain numerical value */
7064
  *status|=DEC_Rounded;	      /* accumulate Rounded status */
7065
  if (*residue>1) *residue=1; /* previous residue now to right, so reduce */
7066

7067
  if (discard>len) {	      /* everything, +1, is being discarded */
7068
    /* guard digit is 0 */
7069
    /* residue is all the number [NB could be all 0s] */
7070
    if (*residue<=0) {	      /* not already positive */
7071
      count=len;	      /* avoids D2U */
7072
      for (up=lsu; count>0; up++, count-=DECDPUN) if (*up!=0) { /* found non-0 */
7073
	*residue=1;
7074
	break;		      /* no need to check any others */
7075
	}
7076
      }
7077
    if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude */
7078
    *dn->lsu=0;		      /* coefficient will now be 0 */
7079
    dn->digits=1;	      /* .. */
7080
    return;
7081
    } /* total discard */
7082

7083
  /* partial discard [most common case] */
7084
  /* here, at least the first (most significant) discarded digit exists */
7085

7086
  /* spin up the number, noting residue during the spin, until get to */
7087
  /* the Unit with the first discarded digit.  When reach it, extract */
7088
  /* it and remember its position */
7089
  count=0;
7090
  for (up=lsu;; up++) {
7091
    count+=DECDPUN;
7092
    if (count>=discard) break; /* full ones all checked */
7093
    if (*up!=0) *residue=1;
7094
    } /* up */
7095

7096
  /* here up -> Unit with first discarded digit */
7097
  cut=discard-(count-DECDPUN)-1;
7098
  if (cut==DECDPUN-1) {	      /* unit-boundary case (fast) */
7099
    Unit half=(Unit)powers[DECDPUN]>>1;
7100
    /* set residue directly */
7101
    if (*up>=half) {
7102
      if (*up>half) *residue=7;
7103
      else *residue+=5;	      /* add sticky bit */
7104
      }
7105
     else { /* <half */
7106
      if (*up!=0) *residue=3; /* [else is 0, leave as sticky bit] */
7107
      }
7108
    if (set->digits<=0) {     /* special for Quantize/Subnormal :-( */
7109
      *dn->lsu=0;	      /* .. result is 0 */
7110
      dn->digits=1;	      /* .. */
7111
      }
7112
     else {		      /* shift to least */
7113
      count=set->digits;      /* now digits to end up with */
7114
      dn->digits=count;	      /* set the new length */
7115
      up++;		      /* move to next */
7116
      /* on unit boundary, so shift-down copy loop is simple */
7117
      for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
7118
	*target=*up;
7119
      }
7120
    } /* unit-boundary case */
7121

7122
   else { /* discard digit is in low digit(s), and not top digit */
7123
    uInt  discard1;		   /* first discarded digit */
7124
    uInt  quot, rem;		   /* for divisions */
7125
    if (cut==0) quot=*up;	   /* is at bottom of unit */
7126
     else /* cut>0 */ {		   /* it's not at bottom of unit */
7127
      #if DECDPUN<=4
7128
	quot=QUOT10(*up, cut);
7129
	rem=*up-quot*powers[cut];
7130
      #else
7131
	rem=*up%powers[cut];
7132
	quot=*up/powers[cut];
7133
      #endif
7134
      if (rem!=0) *residue=1;
7135
      }
7136
    /* discard digit is now at bottom of quot */
7137
    #if DECDPUN<=4
7138
      temp=(quot*6554)>>16;	   /* fast /10 */
7139
      /* Vowels algorithm here not a win (9 instructions) */
7140
      discard1=quot-X10(temp);
7141
      quot=temp;
7142
    #else
7143
      discard1=quot%10;
7144
      quot=quot/10;
7145
    #endif
7146
    /* here, discard1 is the guard digit, and residue is everything */
7147
    /* else [use mapping array to accumulate residue safely] */
7148
    *residue+=resmap[discard1];
7149
    cut++;			   /* update cut */
7150
    /* here: up -> Unit of the array with bottom digit */
7151
    /*	     cut is the division point for each Unit */
7152
    /*	     quot holds the uncut high-order digits for the current unit */
7153
    if (set->digits<=0) {	   /* special for Quantize/Subnormal :-( */
7154
      *dn->lsu=0;		   /* .. result is 0 */
7155
      dn->digits=1;		   /* .. */
7156
      }
7157
     else {			   /* shift to least needed */
7158
      count=set->digits;	   /* now digits to end up with */
7159
      dn->digits=count;		   /* set the new length */
7160
      /* shift-copy the coefficient array to the result number */
7161
      for (target=dn->lsu; ; target++) {
7162
	*target=(Unit)quot;
7163
	count-=(DECDPUN-cut);
7164
	if (count<=0) break;
7165
	up++;
7166
	quot=*up;
7167
	#if DECDPUN<=4
7168
	  quot=QUOT10(quot, cut);
7169
	  rem=*up-quot*powers[cut];
7170
	#else
7171
	  rem=quot%powers[cut];
7172
	  quot=quot/powers[cut];
7173
	#endif
7174
	*target=(Unit)(*target+rem*powers[DECDPUN-cut]);
7175
	count-=cut;
7176
	if (count<=0) break;
7177
	} /* shift-copy loop */
7178
      } /* shift to least */
7179
    } /* not unit boundary */
7180

7181
  if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude */
7182
  return;
7183
  } /* decSetCoeff */
7184

7185
/* ------------------------------------------------------------------ */
7186
/* decApplyRound -- apply pending rounding to a number		      */
7187
/*								      */
7188
/*   dn	   is the number, with space for set->digits digits	      */
7189
/*   set   is the context [for size and rounding mode]		      */
7190
/*   residue indicates pending rounding, being any accumulated	      */
7191
/*	   guard and sticky information.  It may be:		      */
7192
/*	   6-9: rounding digit is >5				      */
7193
/*	   5:	rounding digit is exactly half-way		      */
7194
/*	   1-4: rounding digit is <5 and >0			      */
7195
/*	   0:	the coefficient is exact			      */
7196
/*	  -1:	as 1, but the hidden digits are subtractive, that     */
7197
/*		is, of the opposite sign to dn.	 In this case the     */
7198
/*		coefficient must be non-0.  This case occurs when     */
7199
/*		subtracting a small number (which can be reduced to   */
7200
/*		a sticky bit); see decAddOp.			      */
7201
/*   status is the status accumulator, as usual			      */
7202
/*								      */
7203
/* This routine applies rounding while keeping the length of the      */
7204
/* coefficient constant.  The exponent and status are unchanged	      */
7205
/* except if:							      */
7206
/*								      */
7207
/*   -- the coefficient was increased and is all nines (in which      */
7208
/*	case Overflow could occur, and is handled directly here so    */
7209
/*	the caller does not need to re-test for overflow)	      */
7210
/*								      */
7211
/*   -- the coefficient was decreased and becomes all nines (in which */
7212
/*	case Underflow could occur, and is also handled directly).    */
7213
/*								      */
7214
/* All fields in dn are updated as required.			      */
7215
/*								      */
7216
/* ------------------------------------------------------------------ */
7217
static void decApplyRound(decNumber *dn, decContext *set, Int residue,
7218
			  uInt *status) {
7219
  Int  bump;		      /* 1 if coefficient needs to be incremented */
7220
			      /* -1 if coefficient needs to be decremented */
7221

7222
  if (residue==0) return;     /* nothing to apply */
7223

7224
  bump=0;		      /* assume a smooth ride */
7225

7226
  /* now decide whether, and how, to round, depending on mode */
7227
  switch (set->round) {
7228
    case DEC_ROUND_05UP: {    /* round zero or five up (for reround) */
7229
      /* This is the same as DEC_ROUND_DOWN unless there is a */
7230
      /* positive residue and the lsd of dn is 0 or 5, in which case */
7231
      /* it is bumped; when residue is <0, the number is therefore */
7232
      /* bumped down unless the final digit was 1 or 6 (in which */
7233
      /* case it is bumped down and then up -- a no-op) */
7234
      Int lsd5=*dn->lsu%5;     /* get lsd and quintate */
7235
      if (residue<0 && lsd5!=1) bump=-1;
7236
       else if (residue>0 && lsd5==0) bump=1;
7237
      /* [bump==1 could be applied directly; use common path for clarity] */
7238
      break;} /* r-05 */
7239

7240
    case DEC_ROUND_DOWN: {
7241
      /* no change, except if negative residue */
7242
      if (residue<0) bump=-1;
7243
      break;} /* r-d */
7244

7245
    case DEC_ROUND_HALF_DOWN: {
7246
      if (residue>5) bump=1;
7247
      break;} /* r-h-d */
7248

7249
    case DEC_ROUND_HALF_EVEN: {
7250
      if (residue>5) bump=1;		/* >0.5 goes up */
7251
       else if (residue==5) {		/* exactly 0.5000... */
7252
	/* 0.5 goes up iff [new] lsd is odd */
7253
	if (*dn->lsu & 0x01) bump=1;
7254
	}
7255
      break;} /* r-h-e */
7256

7257
    case DEC_ROUND_HALF_UP: {
7258
      if (residue>=5) bump=1;
7259
      break;} /* r-h-u */
7260

7261
    case DEC_ROUND_UP: {
7262
      if (residue>0) bump=1;
7263
      break;} /* r-u */
7264

7265
    case DEC_ROUND_CEILING: {
7266
      /* same as _UP for positive numbers, and as _DOWN for negatives */
7267
      /* [negative residue cannot occur on 0] */
7268
      if (decNumberIsNegative(dn)) {
7269
	if (residue<0) bump=-1;
7270
	}
7271
       else {
7272
	if (residue>0) bump=1;
7273
	}
7274
      break;} /* r-c */
7275

7276
    case DEC_ROUND_FLOOR: {
7277
      /* same as _UP for negative numbers, and as _DOWN for positive */
7278
      /* [negative residue cannot occur on 0] */
7279
      if (!decNumberIsNegative(dn)) {
7280
	if (residue<0) bump=-1;
7281
	}
7282
       else {
7283
	if (residue>0) bump=1;
7284
	}
7285
      break;} /* r-f */
7286

7287
    default: {	    /* e.g., DEC_ROUND_MAX */
7288
      *status|=DEC_Invalid_context;
7289
      #if DECTRACE || (DECCHECK && DECVERB)
7290
      printf("Unknown rounding mode: %d\n", set->round);
7291
      #endif
7292
      break;}
7293
    } /* switch */
7294

7295
  /* now bump the number, up or down, if need be */
7296
  if (bump==0) return;			     /* no action required */
7297

7298
  /* Simply use decUnitAddSub unless bumping up and the number is */
7299
  /* all nines.	 In this special case set to 100... explicitly */
7300
  /* and adjust the exponent by one (as otherwise could overflow */
7301
  /* the array) */
7302
  /* Similarly handle all-nines result if bumping down. */
7303
  if (bump>0) {
7304
    Unit *up;				     /* work */
7305
    uInt count=dn->digits;		     /* digits to be checked */
7306
    for (up=dn->lsu; ; up++) {
7307
      if (count<=DECDPUN) {
7308
	/* this is the last Unit (the msu) */
7309
	if (*up!=powers[count]-1) break;     /* not still 9s */
7310
	/* here if it, too, is all nines */
7311
	*up=(Unit)powers[count-1];	     /* here 999 -> 100 etc. */
7312
	for (up=up-1; up>=dn->lsu; up--) *up=0; /* others all to 0 */
7313
	dn->exponent++;			     /* and bump exponent */
7314
	/* [which, very rarely, could cause Overflow...] */
7315
	if ((dn->exponent+dn->digits)>set->emax+1) {
7316
	  decSetOverflow(dn, set, status);
7317
	  }
7318
	return;				     /* done */
7319
	}
7320
      /* a full unit to check, with more to come */
7321
      if (*up!=DECDPUNMAX) break;	     /* not still 9s */
7322
      count-=DECDPUN;
7323
      } /* up */
7324
    } /* bump>0 */
7325
   else {				     /* -1 */
7326
    /* here checking for a pre-bump of 1000... (leading 1, all */
7327
    /* other digits zero) */
7328
    Unit *up, *sup;			     /* work */
7329
    uInt count=dn->digits;		     /* digits to be checked */
7330
    for (up=dn->lsu; ; up++) {
7331
      if (count<=DECDPUN) {
7332
	/* this is the last Unit (the msu) */
7333
	if (*up!=powers[count-1]) break;     /* not 100.. */
7334
	/* here if have the 1000... case */
7335
	sup=up;				     /* save msu pointer */
7336
	*up=(Unit)powers[count]-1;	     /* here 100 in msu -> 999 */
7337
	/* others all to all-nines, too */
7338
	for (up=up-1; up>=dn->lsu; up--) *up=(Unit)powers[DECDPUN]-1;
7339
	dn->exponent--;			     /* and bump exponent */
7340

7341
	/* iff the number was at the subnormal boundary (exponent=etiny) */
7342
	/* then the exponent is now out of range, so it will in fact get */
7343
	/* clamped to etiny and the final 9 dropped. */
7344
	/* printf(">> emin=%d exp=%d sdig=%d\n", set->emin, */
7345
	/*	  dn->exponent, set->digits); */
7346
	if (dn->exponent+1==set->emin-set->digits+1) {
7347
	  if (count==1 && dn->digits==1) *sup=0;  /* here 9 -> 0[.9] */
7348
	   else {
7349
	    *sup=(Unit)powers[count-1]-1;    /* here 999.. in msu -> 99.. */
7350
	    dn->digits--;
7351
	    }
7352
	  dn->exponent++;
7353
	  *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
7354
	  }
7355
	return;				     /* done */
7356
	}
7357

7358
      /* a full unit to check, with more to come */
7359
      if (*up!=0) break;		     /* not still 0s */
7360
      count-=DECDPUN;
7361
      } /* up */
7362

7363
    } /* bump<0 */
7364

7365
  /* Actual bump needed.  Do it. */
7366
  decUnitAddSub(dn->lsu, D2U(dn->digits), uarrone, 1, 0, dn->lsu, bump);
7367
  } /* decApplyRound */
7368

7369
#if DECSUBSET
7370
/* ------------------------------------------------------------------ */
7371
/* decFinish -- finish processing a number			      */
7372
/*								      */
7373
/*   dn is the number						      */
7374
/*   set is the context						      */
7375
/*   residue is the rounding accumulator (as in decApplyRound)	      */
7376
/*   status is the accumulator					      */
7377
/*								      */
7378
/* This finishes off the current number by:			      */
7379
/*    1. If not extended:					      */
7380
/*	 a. Converting a zero result to clean '0'		      */
7381
/*	 b. Reducing positive exponents to 0, if would fit in digits  */
7382
/*    2. Checking for overflow and subnormals (always)		      */
7383
/* Note this is just Finalize when no subset arithmetic.	      */
7384
/* All fields are updated as required.				      */
7385
/* ------------------------------------------------------------------ */
7386
static void decFinish(decNumber *dn, decContext *set, Int *residue,
7387
		      uInt *status) {
7388
  if (!set->extended) {
7389
    if ISZERO(dn) {		   /* value is zero */
7390
      dn->exponent=0;		   /* clean exponent .. */
7391
      dn->bits=0;		   /* .. and sign */
7392
      return;			   /* no error possible */
7393
      }
7394
    if (dn->exponent>=0) {	   /* non-negative exponent */
7395
      /* >0; reduce to integer if possible */
7396
      if (set->digits >= (dn->exponent+dn->digits)) {
7397
	dn->digits=decShiftToMost(dn->lsu, dn->digits, dn->exponent);
7398
	dn->exponent=0;
7399
	}
7400
      }
7401
    } /* !extended */
7402

7403
  decFinalize(dn, set, residue, status);
7404
  } /* decFinish */
7405
#endif
7406

7407
/* ------------------------------------------------------------------ */
7408
/* decFinalize -- final check, clamp, and round of a number	      */
7409
/*								      */
7410
/*   dn is the number						      */
7411
/*   set is the context						      */
7412
/*   residue is the rounding accumulator (as in decApplyRound)	      */
7413
/*   status is the status accumulator				      */
7414
/*								      */
7415
/* This finishes off the current number by checking for subnormal     */
7416
/* results, applying any pending rounding, checking for overflow,     */
7417
/* and applying any clamping.					      */
7418
/* Underflow and overflow conditions are raised as appropriate.	      */
7419
/* All fields are updated as required.				      */
7420
/* ------------------------------------------------------------------ */
7421
static void decFinalize(decNumber *dn, decContext *set, Int *residue,
7422
			uInt *status) {
7423
  Int shift;				/* shift needed if clamping */
7424
  Int tinyexp=set->emin-dn->digits+1;	/* precalculate subnormal boundary */
7425

7426
  /* Must be careful, here, when checking the exponent as the */
7427
  /* adjusted exponent could overflow 31 bits [because it may already */
7428
  /* be up to twice the expected]. */
7429

7430
  /* First test for subnormal.	This must be done before any final */
7431
  /* round as the result could be rounded to Nmin or 0. */
7432
  if (dn->exponent<=tinyexp) {		/* prefilter */
7433
    Int comp;
7434
    decNumber nmin;
7435
    /* A very nasty case here is dn == Nmin and residue<0 */
7436
    if (dn->exponent<tinyexp) {
7437
      /* Go handle subnormals; this will apply round if needed. */
7438
      decSetSubnormal(dn, set, residue, status);
7439
      return;
7440
      }
7441
    /* Equals case: only subnormal if dn=Nmin and negative residue */
7442
    decNumberZero(&nmin);
7443
    nmin.lsu[0]=1;
7444
    nmin.exponent=set->emin;
7445
    comp=decCompare(dn, &nmin, 1);		  /* (signless compare) */
7446
    if (comp==BADINT) {				  /* oops */
7447
      *status|=DEC_Insufficient_storage;	  /* abandon... */
7448
      return;
7449
      }
7450
    if (*residue<0 && comp==0) {		  /* neg residue and dn==Nmin */
7451
      decApplyRound(dn, set, *residue, status);	  /* might force down */
7452
      decSetSubnormal(dn, set, residue, status);
7453
      return;
7454
      }
7455
    }
7456

7457
  /* now apply any pending round (this could raise overflow). */
7458
  if (*residue!=0) decApplyRound(dn, set, *residue, status);
7459

7460
  /* Check for overflow [redundant in the 'rare' case] or clamp */
7461
  if (dn->exponent<=set->emax-set->digits+1) return;   /* neither needed */
7462

7463

7464
  /* here when might have an overflow or clamp to do */
7465
  if (dn->exponent>set->emax-dn->digits+1) {	       /* too big */
7466
    decSetOverflow(dn, set, status);
7467
    return;
7468
    }
7469
  /* here when the result is normal but in clamp range */
7470
  if (!set->clamp) return;
7471

7472
  /* here when need to apply the IEEE exponent clamp (fold-down) */
7473
  shift=dn->exponent-(set->emax-set->digits+1);
7474

7475
  /* shift coefficient (if non-zero) */
7476
  if (!ISZERO(dn)) {
7477
    dn->digits=decShiftToMost(dn->lsu, dn->digits, shift);
7478
    }
7479
  dn->exponent-=shift;	 /* adjust the exponent to match */
7480
  *status|=DEC_Clamped;	 /* and record the dirty deed */
7481
  return;
7482
  } /* decFinalize */
7483

7484
/* ------------------------------------------------------------------ */
7485
/* decSetOverflow -- set number to proper overflow value	      */
7486
/*								      */
7487
/*   dn is the number (used for sign [only] and result)		      */
7488
/*   set is the context [used for the rounding mode, etc.]	      */
7489
/*   status contains the current status to be updated		      */
7490
/*								      */
7491
/* This sets the sign of a number and sets its value to either	      */
7492
/* Infinity or the maximum finite value, depending on the sign of     */
7493
/* dn and the rounding mode, following IEEE 854 rules.		      */
7494
/* ------------------------------------------------------------------ */
7495
static void decSetOverflow(decNumber *dn, decContext *set, uInt *status) {
7496
  Flag needmax=0;		   /* result is maximum finite value */
7497
  uByte sign=dn->bits&DECNEG;	   /* clean and save sign bit */
7498

7499
  if (ISZERO(dn)) {		   /* zero does not overflow magnitude */
7500
    Int emax=set->emax;			     /* limit value */
7501
    if (set->clamp) emax-=set->digits-1;     /* lower if clamping */
7502
    if (dn->exponent>emax) {		     /* clamp required */
7503
      dn->exponent=emax;
7504
      *status|=DEC_Clamped;
7505
      }
7506
    return;
7507
    }
7508

7509
  decNumberZero(dn);
7510
  switch (set->round) {
7511
    case DEC_ROUND_DOWN: {
7512
      needmax=1;		   /* never Infinity */
7513
      break;} /* r-d */
7514
    case DEC_ROUND_05UP: {
7515
      needmax=1;		   /* never Infinity */
7516
      break;} /* r-05 */
7517
    case DEC_ROUND_CEILING: {
7518
      if (sign) needmax=1;	   /* Infinity if non-negative */
7519
      break;} /* r-c */
7520
    case DEC_ROUND_FLOOR: {
7521
      if (!sign) needmax=1;	   /* Infinity if negative */
7522
      break;} /* r-f */
7523
    default: break;		   /* Infinity in all other cases */
7524
    }
7525
  if (needmax) {
7526
    decSetMaxValue(dn, set);
7527
    dn->bits=sign;		   /* set sign */
7528
    }
7529
   else dn->bits=sign|DECINF;	   /* Value is +/-Infinity */
7530
  *status|=DEC_Overflow | DEC_Inexact | DEC_Rounded;
7531
  } /* decSetOverflow */
7532

7533
/* ------------------------------------------------------------------ */
7534
/* decSetMaxValue -- set number to +Nmax (maximum normal value)	      */
7535
/*								      */
7536
/*   dn is the number to set					      */
7537
/*   set is the context [used for digits and emax]		      */
7538
/*								      */
7539
/* This sets the number to the maximum positive value.		      */
7540
/* ------------------------------------------------------------------ */
7541
static void decSetMaxValue(decNumber *dn, decContext *set) {
7542
  Unit *up;			   /* work */
7543
  Int count=set->digits;	   /* nines to add */
7544
  dn->digits=count;
7545
  /* fill in all nines to set maximum value */
7546
  for (up=dn->lsu; ; up++) {
7547
    if (count>DECDPUN) *up=DECDPUNMAX;	/* unit full o'nines */
7548
     else {				/* this is the msu */
7549
      *up=(Unit)(powers[count]-1);
7550
      break;
7551
      }
7552
    count-=DECDPUN;		   /* filled those digits */
7553
    } /* up */
7554
  dn->bits=0;			   /* + sign */
7555
  dn->exponent=set->emax-set->digits+1;
7556
  } /* decSetMaxValue */
7557

7558
/* ------------------------------------------------------------------ */
7559
/* decSetSubnormal -- process value whose exponent is <Emin	      */
7560
/*								      */
7561
/*   dn is the number (used as input as well as output; it may have   */
7562
/*	   an allowed subnormal value, which may need to be rounded)  */
7563
/*   set is the context [used for the rounding mode]		      */
7564
/*   residue is any pending residue				      */
7565
/*   status contains the current status to be updated		      */
7566
/*								      */
7567
/* If subset mode, set result to zero and set Underflow flags.	      */
7568
/*								      */
7569
/* Value may be zero with a low exponent; this does not set Subnormal */
7570
/* but the exponent will be clamped to Etiny.			      */
7571
/*								      */
7572
/* Otherwise ensure exponent is not out of range, and round as	      */
7573
/* necessary.  Underflow is set if the result is Inexact.	      */
7574
/* ------------------------------------------------------------------ */
7575
static void decSetSubnormal(decNumber *dn, decContext *set, Int *residue,
7576
			    uInt *status) {
7577
  decContext workset;	      /* work */
7578
  Int	     etiny, adjust;   /* .. */
7579

7580
  #if DECSUBSET
7581
  /* simple set to zero and 'hard underflow' for subset */
7582
  if (!set->extended) {
7583
    decNumberZero(dn);
7584
    /* always full overflow */
7585
    *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
7586
    return;
7587
    }
7588
  #endif
7589

7590
  /* Full arithmetic -- allow subnormals, rounded to minimum exponent */
7591
  /* (Etiny) if needed */
7592
  etiny=set->emin-(set->digits-1);	/* smallest allowed exponent */
7593

7594
  if ISZERO(dn) {			/* value is zero */
7595
    /* residue can never be non-zero here */
7596
    #if DECCHECK
7597
      if (*residue!=0) {
7598
	printf("++ Subnormal 0 residue %ld\n", (LI)*residue);
7599
	*status|=DEC_Invalid_operation;
7600
	}
7601
    #endif
7602
    if (dn->exponent<etiny) {		/* clamp required */
7603
      dn->exponent=etiny;
7604
      *status|=DEC_Clamped;
7605
      }
7606
    return;
7607
    }
7608

7609
  *status|=DEC_Subnormal;		/* have a non-zero subnormal */
7610
  adjust=etiny-dn->exponent;		/* calculate digits to remove */
7611
  if (adjust<=0) {			/* not out of range; unrounded */
7612
    /* residue can never be non-zero here, except in the Nmin-residue */
7613
    /* case (which is a subnormal result), so can take fast-path here */
7614
    /* it may already be inexact (from setting the coefficient) */
7615
    if (*status&DEC_Inexact) *status|=DEC_Underflow;
7616
    return;
7617
    }
7618

7619
  /* adjust>0, so need to rescale the result so exponent becomes Etiny */
7620
  /* [this code is similar to that in rescale] */
7621
  workset=*set;				/* clone rounding, etc. */
7622
  workset.digits=dn->digits-adjust;	/* set requested length */
7623
  workset.emin-=adjust;			/* and adjust emin to match */
7624
  /* [note that the latter can be <1, here, similar to Rescale case] */
7625
  decSetCoeff(dn, &workset, dn->lsu, dn->digits, residue, status);
7626
  decApplyRound(dn, &workset, *residue, status);
7627

7628
  /* Use 754R/854 default rule: Underflow is set iff Inexact */
7629
  /* [independent of whether trapped] */
7630
  if (*status&DEC_Inexact) *status|=DEC_Underflow;
7631

7632
  /* if rounded up a 999s case, exponent will be off by one; adjust */
7633
  /* back if so [it will fit, because it was shortened earlier] */
7634
  if (dn->exponent>etiny) {
7635
    dn->digits=decShiftToMost(dn->lsu, dn->digits, 1);
7636
    dn->exponent--;			/* (re)adjust the exponent. */
7637
    }
7638

7639
  /* if rounded to zero, it is by definition clamped... */
7640
  if (ISZERO(dn)) *status|=DEC_Clamped;
7641
  } /* decSetSubnormal */
7642

7643
/* ------------------------------------------------------------------ */
7644
/* decCheckMath - check entry conditions for a math function	      */
7645
/*								      */
7646
/*   This checks the context and the operand			      */
7647
/*								      */
7648
/*   rhs is the operand to check				      */
7649
/*   set is the context to check				      */
7650
/*   status is unchanged if both are good			      */
7651
/*								      */
7652
/* returns non-zero if status is changed, 0 otherwise		      */
7653
/*								      */
7654
/* Restrictions enforced:					      */
7655
/*								      */
7656
/*   digits, emax, and -emin in the context must be less than	      */
7657
/*   DEC_MAX_MATH (999999), and A must be within these bounds if      */
7658
/*   non-zero.	Invalid_operation is set in the status if a	      */
7659
/*   restriction is violated.					      */
7660
/* ------------------------------------------------------------------ */
7661
static uInt decCheckMath(const decNumber *rhs, decContext *set,
7662
			 uInt *status) {
7663
  uInt save=*status;			     /* record */
7664
  if (set->digits>DEC_MAX_MATH
7665
   || set->emax>DEC_MAX_MATH
7666
   || -set->emin>DEC_MAX_MATH) *status|=DEC_Invalid_context;
7667
   else if ((rhs->digits>DEC_MAX_MATH
7668
     || rhs->exponent+rhs->digits>DEC_MAX_MATH+1
7669
     || rhs->exponent+rhs->digits<2*(1-DEC_MAX_MATH))
7670
     && !ISZERO(rhs)) *status|=DEC_Invalid_operation;
7671
  return (*status!=save);
7672
  } /* decCheckMath */
7673

7674
/* ------------------------------------------------------------------ */
7675
/* decGetInt -- get integer from a number			      */
7676
/*								      */
7677
/*   dn is the number [which will not be altered]		      */
7678
/*								      */
7679
/*   returns one of:						      */
7680
/*     BADINT if there is a non-zero fraction			      */
7681
/*     the converted integer					      */
7682
/*     BIGEVEN if the integer is even and magnitude > 2*10**9	      */
7683
/*     BIGODD  if the integer is odd  and magnitude > 2*10**9	      */
7684
/*								      */
7685
/* This checks and gets a whole number from the input decNumber.      */
7686
/* The sign can be determined from dn by the caller when BIGEVEN or   */
7687
/* BIGODD is returned.						      */
7688
/* ------------------------------------------------------------------ */
7689
static Int decGetInt(const decNumber *dn) {
7690
  Int  theInt;				/* result accumulator */
7691
  const Unit *up;			/* work */
7692
  Int  got;				/* digits (real or not) processed */
7693
  Int  ilength=dn->digits+dn->exponent; /* integral length */
7694
  Flag neg=decNumberIsNegative(dn);	/* 1 if -ve */
7695

7696
  /* The number must be an integer that fits in 10 digits */
7697
  /* Assert, here, that 10 is enough for any rescale Etiny */
7698
  #if DEC_MAX_EMAX > 999999999
7699
    #error GetInt may need updating [for Emax]
7700
  #endif
7701
  #if DEC_MIN_EMIN < -999999999
7702
    #error GetInt may need updating [for Emin]
7703
  #endif
7704
  if (ISZERO(dn)) return 0;		/* zeros are OK, with any exponent */
7705

7706
  up=dn->lsu;				/* ready for lsu */
7707
  theInt=0;				/* ready to accumulate */
7708
  if (dn->exponent>=0) {		/* relatively easy */
7709
    /* no fractional part [usual]; allow for positive exponent */
7710
    got=dn->exponent;
7711
    }
7712
   else { /* -ve exponent; some fractional part to check and discard */
7713
    Int count=-dn->exponent;		/* digits to discard */
7714
    /* spin up whole units until reach the Unit with the unit digit */
7715
    for (; count>=DECDPUN; up++) {
7716
      if (*up!=0) return BADINT;	/* non-zero Unit to discard */
7717
      count-=DECDPUN;
7718
      }
7719
    if (count==0) got=0;		/* [a multiple of DECDPUN] */
7720
     else {				/* [not multiple of DECDPUN] */
7721
      Int rem;				/* work */
7722
      /* slice off fraction digits and check for non-zero */
7723
      #if DECDPUN<=4
7724
	theInt=QUOT10(*up, count);
7725
	rem=*up-theInt*powers[count];
7726
      #else
7727
	rem=*up%powers[count];		/* slice off discards */
7728
	theInt=*up/powers[count];
7729
      #endif
7730
      if (rem!=0) return BADINT;	/* non-zero fraction */
7731
      /* it looks good */
7732
      got=DECDPUN-count;		/* number of digits so far */
7733
      up++;				/* ready for next */
7734
      }
7735
    }
7736
  /* now it's known there's no fractional part */
7737

7738
  /* tricky code now, to accumulate up to 9.3 digits */
7739
  if (got==0) {theInt=*up; got+=DECDPUN; up++;} /* ensure lsu is there */
7740

7741
  if (ilength<11) {
7742
    Int save=theInt;
7743
    /* collect any remaining unit(s) */
7744
    for (; got<ilength; up++) {
7745
      theInt+=*up*powers[got];
7746
      got+=DECDPUN;
7747
      }
7748
    if (ilength==10) {			/* need to check for wrap */
7749
      if (theInt/(Int)powers[got-DECDPUN]!=(Int)*(up-1)) ilength=11;
7750
	 /* [that test also disallows the BADINT result case] */
7751
       else if (neg && theInt>1999999997) ilength=11;
7752
       else if (!neg && theInt>999999999) ilength=11;
7753
      if (ilength==11) theInt=save;	/* restore correct low bit */
7754
      }
7755
    }
7756

7757
  if (ilength>10) {			/* too big */
7758
    if (theInt&1) return BIGODD;	/* bottom bit 1 */
7759
    return BIGEVEN;			/* bottom bit 0 */
7760
    }
7761

7762
  if (neg) theInt=-theInt;		/* apply sign */
7763
  return theInt;
7764
  } /* decGetInt */
7765

7766
/* ------------------------------------------------------------------ */
7767
/* decDecap -- decapitate the coefficient of a number		      */
7768
/*								      */
7769
/*   dn	  is the number to be decapitated			      */
7770
/*   drop is the number of digits to be removed from the left of dn;  */
7771
/*     this must be <= dn->digits (if equal, the coefficient is	      */
7772
/*     set to 0)						      */
7773
/*								      */
7774
/* Returns dn; dn->digits will be <= the initial digits less drop     */
7775
/* (after removing drop digits there may be leading zero digits	      */
7776
/* which will also be removed).	 Only dn->lsu and dn->digits change.  */
7777
/* ------------------------------------------------------------------ */
7778
static decNumber *decDecap(decNumber *dn, Int drop) {
7779
  Unit *msu;				/* -> target cut point */
7780
  Int cut;				/* work */
7781
  if (drop>=dn->digits) {		/* losing the whole thing */
7782
    #if DECCHECK
7783
    if (drop>dn->digits)
7784
      printf("decDecap called with drop>digits [%ld>%ld]\n",
7785
	     (LI)drop, (LI)dn->digits);
7786
    #endif
7787
    dn->lsu[0]=0;
7788
    dn->digits=1;
7789
    return dn;
7790
    }
7791
  msu=dn->lsu+D2U(dn->digits-drop)-1;	/* -> likely msu */
7792
  cut=MSUDIGITS(dn->digits-drop);	/* digits to be in use in msu */
7793
  if (cut!=DECDPUN) *msu%=powers[cut];	/* clear left digits */
7794
  /* that may have left leading zero digits, so do a proper count... */
7795
  dn->digits=decGetDigits(dn->lsu, msu-dn->lsu+1);
7796
  return dn;
7797
  } /* decDecap */
7798

7799
/* ------------------------------------------------------------------ */
7800
/* decBiStr -- compare string with pairwise options		      */
7801
/*								      */
7802
/*   targ is the string to compare				      */
7803
/*   str1 is one of the strings to compare against (length may be 0)  */
7804
/*   str2 is the other; it must be the same length as str1	      */
7805
/*								      */
7806
/*   returns 1 if strings compare equal, (that is, it is the same     */
7807
/*   length as str1 and str2, and each character of targ is in either */
7808
/*   str1 or str2 in the corresponding position), or 0 otherwise      */
7809
/*								      */
7810
/* This is used for generic caseless compare, including the awkward   */
7811
/* case of the Turkish dotted and dotless Is.  Use as (for example):  */
7812
/*   if (decBiStr(test, "mike", "MIKE")) ...			      */
7813
/* ------------------------------------------------------------------ */
7814
static Flag decBiStr(const char *targ, const char *str1, const char *str2) {
7815
  for (;;targ++, str1++, str2++) {
7816
    if (*targ!=*str1 && *targ!=*str2) return 0;
7817
    /* *targ has a match in one (or both, if terminator) */
7818
    if (*targ=='\0') break;
7819
    } /* forever */
7820
  return 1;
7821
  } /* decBiStr */
7822

7823
/* ------------------------------------------------------------------ */
7824
/* decNaNs -- handle NaN operand or operands			      */
7825
/*								      */
7826
/*   res     is the result number				      */
7827
/*   lhs     is the first operand				      */
7828
/*   rhs     is the second operand, or NULL if none		      */
7829
/*   context is used to limit payload length			      */
7830
/*   status  contains the current status			      */
7831
/*   returns res in case convenient				      */
7832
/*								      */
7833
/* Called when one or both operands is a NaN, and propagates the      */
7834
/* appropriate result to res.  When an sNaN is found, it is changed   */
7835
/* to a qNaN and Invalid operation is set.			      */
7836
/* ------------------------------------------------------------------ */
7837
static decNumber * decNaNs(decNumber *res, const decNumber *lhs,
7838
			   const decNumber *rhs, decContext *set,
7839
			   uInt *status) {
7840
  /* This decision tree ends up with LHS being the source pointer, */
7841
  /* and status updated if need be */
7842
  if (lhs->bits & DECSNAN)
7843
    *status|=DEC_Invalid_operation | DEC_sNaN;
7844
   else if (rhs==NULL);
7845
   else if (rhs->bits & DECSNAN) {
7846
    lhs=rhs;
7847
    *status|=DEC_Invalid_operation | DEC_sNaN;
7848
    }
7849
   else if (lhs->bits & DECNAN);
7850
   else lhs=rhs;
7851

7852
  /* propagate the payload */
7853
  if (lhs->digits<=set->digits) decNumberCopy(res, lhs); /* easy */
7854
   else { /* too long */
7855
    const Unit *ul;
7856
    Unit *ur, *uresp1;
7857
    /* copy safe number of units, then decapitate */
7858
    res->bits=lhs->bits;		/* need sign etc. */
7859
    uresp1=res->lsu+D2U(set->digits);
7860
    for (ur=res->lsu, ul=lhs->lsu; ur<uresp1; ur++, ul++) *ur=*ul;
7861
    res->digits=D2U(set->digits)*DECDPUN;
7862
    /* maybe still too long */
7863
    if (res->digits>set->digits) decDecap(res, res->digits-set->digits);
7864
    }
7865

7866
  res->bits&=~DECSNAN;	      /* convert any sNaN to NaN, while */
7867
  res->bits|=DECNAN;	      /* .. preserving sign */
7868
  res->exponent=0;	      /* clean exponent */
7869
			      /* [coefficient was copied/decapitated] */
7870
  return res;
7871
  } /* decNaNs */
7872

7873
/* ------------------------------------------------------------------ */
7874
/* decStatus -- apply non-zero status				      */
7875
/*								      */
7876
/*   dn	    is the number to set if error			      */
7877
/*   status contains the current status (not yet in context)	      */
7878
/*   set    is the context					      */
7879
/*								      */
7880
/* If the status is an error status, the number is set to a NaN,      */
7881
/* unless the error was an overflow, divide-by-zero, or underflow,    */
7882
/* in which case the number will have already been set.		      */
7883
/*								      */
7884
/* The context status is then updated with the new status.  Note that */
7885
/* this may raise a signal, so control may never return from this     */
7886
/* routine (hence resources must be recovered before it is called).   */
7887
/* ------------------------------------------------------------------ */
7888
static void decStatus(decNumber *dn, uInt status, decContext *set) {
7889
  if (status & DEC_NaNs) {		/* error status -> NaN */
7890
    /* if cause was an sNaN, clear and propagate [NaN is already set up] */
7891
    if (status & DEC_sNaN) status&=~DEC_sNaN;
7892
     else {
7893
      decNumberZero(dn);		/* other error: clean throughout */
7894
      dn->bits=DECNAN;			/* and make a quiet NaN */
7895
      }
7896
    }
7897
  decContextSetStatus(set, status);	/* [may not return] */
7898
  return;
7899
  } /* decStatus */
7900

7901
/* ------------------------------------------------------------------ */
7902
/* decGetDigits -- count digits in a Units array		      */
7903
/*								      */
7904
/*   uar is the Unit array holding the number (this is often an	      */
7905
/*	    accumulator of some sort)				      */
7906
/*   len is the length of the array in units [>=1]		      */
7907
/*								      */
7908
/*   returns the number of (significant) digits in the array	      */
7909
/*								      */
7910
/* All leading zeros are excluded, except the last if the array has   */
7911
/* only zero Units.						      */
7912
/* ------------------------------------------------------------------ */
7913
/* This may be called twice during some operations. */
7914
static Int decGetDigits(Unit *uar, Int len) {
7915
  Unit *up=uar+(len-1);		   /* -> msu */
7916
  Int  digits=(len-1)*DECDPUN+1;   /* possible digits excluding msu */
7917
  #if DECDPUN>4
7918
  uInt const *pow;		   /* work */
7919
  #endif
7920
				   /* (at least 1 in final msu) */
7921
  #if DECCHECK
7922
  if (len<1) printf("decGetDigits called with len<1 [%ld]\n", (LI)len);
7923
  #endif
7924

7925
  for (; up>=uar; up--) {
7926
    if (*up==0) {		   /* unit is all 0s */
7927
      if (digits==1) break;	   /* a zero has one digit */
7928
      digits-=DECDPUN;		   /* adjust for 0 unit */
7929
      continue;}
7930
    /* found the first (most significant) non-zero Unit */
7931
    #if DECDPUN>1		   /* not done yet */
7932
    if (*up<10) break;		   /* is 1-9 */
7933
    digits++;
7934
    #if DECDPUN>2		   /* not done yet */
7935
    if (*up<100) break;		   /* is 10-99 */
7936
    digits++;
7937
    #if DECDPUN>3		   /* not done yet */
7938
    if (*up<1000) break;	   /* is 100-999 */
7939
    digits++;
7940
    #if DECDPUN>4		   /* count the rest ... */
7941
    for (pow=&powers[4]; *up>=*pow; pow++) digits++;
7942
    #endif
7943
    #endif
7944
    #endif
7945
    #endif
7946
    break;
7947
    } /* up */
7948
  return digits;
7949
  } /* decGetDigits */
7950

7951
/* ------------------------------------------------------------------ */
7952
/* mulUInt128ByPowOf10 -- multiply a 128-bit unsigned integer by a    */
7953
/* power of 10.                                                       */
7954
/*                                                                    */
7955
/*   The 128-bit factor composed of plow and phigh is multiplied      */
7956
/*   by 10^exp.                                                       */
7957
/*                                                                    */
7958
/*   plow   pointer to the low 64 bits of the first factor            */
7959
/*   phigh  pointer to the high 64 bits of the first factor           */
7960
/*   exp    the exponent of the power of 10 of the second factor      */
7961
/*                                                                    */
7962
/* If the result fits in 128 bits, returns false and the              */
7963
/* multiplication result through plow and phigh.                      */
7964
/* Otherwise, returns true.                                           */
7965
/* ------------------------------------------------------------------ */
7966
static bool mulUInt128ByPowOf10(uLong *plow, uLong *phigh, uInt pow10)
7967
{
7968
    while (pow10 >= ARRAY_SIZE(powers)) {
7969
        if (mulu128(plow, phigh, powers[ARRAY_SIZE(powers) - 1])) {
7970
            /* Overflow */
7971
            return true;
7972
        }
7973
        pow10 -= ARRAY_SIZE(powers) - 1;
7974
    }
7975

7976
    if (pow10 > 0) {
7977
        return mulu128(plow, phigh, powers[pow10]);
7978
    } else {
7979
        return false;
7980
    }
7981
}
7982

7983
#if DECTRACE | DECCHECK
7984
/* ------------------------------------------------------------------ */
7985
/* decNumberShow -- display a number [debug aid]		      */
7986
/*   dn is the number to show					      */
7987
/*								      */
7988
/* Shows: sign, exponent, coefficient (msu first), digits	      */
7989
/*    or: sign, special-value					      */
7990
/* ------------------------------------------------------------------ */
7991
/* this is public so other modules can use it */
7992
void decNumberShow(const decNumber *dn) {
7993
  const Unit *up;		   /* work */
7994
  uInt u, d;			   /* .. */
7995
  Int cut;			   /* .. */
7996
  char isign='+';		   /* main sign */
7997
  if (dn==NULL) {
7998
    printf("NULL\n");
7999
    return;}
8000
  if (decNumberIsNegative(dn)) isign='-';
8001
  printf(" >> %c ", isign);
8002
  if (dn->bits&DECSPECIAL) {	   /* Is a special value */
8003
    if (decNumberIsInfinite(dn)) printf("Infinity");
8004
     else {				     /* a NaN */
8005
      if (dn->bits&DECSNAN) printf("sNaN");  /* signalling NaN */
8006
       else printf("NaN");
8007
      }
8008
    /* if coefficient and exponent are 0, no more to do */
8009
    if (dn->exponent==0 && dn->digits==1 && *dn->lsu==0) {
8010
      printf("\n");
8011
      return;}
8012
    /* drop through to report other information */
8013
    printf(" ");
8014
    }
8015

8016
  /* now carefully display the coefficient */
8017
  up=dn->lsu+D2U(dn->digits)-1;		/* msu */
8018
  printf("%ld", (LI)*up);
8019
  for (up=up-1; up>=dn->lsu; up--) {
8020
    u=*up;
8021
    printf(":");
8022
    for (cut=DECDPUN-1; cut>=0; cut--) {
8023
      d=u/powers[cut];
8024
      u-=d*powers[cut];
8025
      printf("%ld", (LI)d);
8026
      } /* cut */
8027
    } /* up */
8028
  if (dn->exponent!=0) {
8029
    char esign='+';
8030
    if (dn->exponent<0) esign='-';
8031
    printf(" E%c%ld", esign, (LI)abs(dn->exponent));
8032
    }
8033
  printf(" [%ld]\n", (LI)dn->digits);
8034
  } /* decNumberShow */
8035
#endif
8036

8037
#if DECTRACE || DECCHECK
8038
/* ------------------------------------------------------------------ */
8039
/* decDumpAr -- display a unit array [debug/check aid]		      */
8040
/*   name is a single-character tag name			      */
8041
/*   ar	  is the array to display				      */
8042
/*   len  is the length of the array in Units			      */
8043
/* ------------------------------------------------------------------ */
8044
static void decDumpAr(char name, const Unit *ar, Int len) {
8045
  Int i;
8046
  const char *spec;
8047
  #if DECDPUN==9
8048
    spec="%09d ";
8049
  #elif DECDPUN==8
8050
    spec="%08d ";
8051
  #elif DECDPUN==7
8052
    spec="%07d ";
8053
  #elif DECDPUN==6
8054
    spec="%06d ";
8055
  #elif DECDPUN==5
8056
    spec="%05d ";
8057
  #elif DECDPUN==4
8058
    spec="%04d ";
8059
  #elif DECDPUN==3
8060
    spec="%03d ";
8061
  #elif DECDPUN==2
8062
    spec="%02d ";
8063
  #else
8064
    spec="%d ";
8065
  #endif
8066
  printf("  :%c: ", name);
8067
  for (i=len-1; i>=0; i--) {
8068
    if (i==len-1) printf("%ld ", (LI)ar[i]);
8069
     else printf(spec, ar[i]);
8070
    }
8071
  printf("\n");
8072
  return;}
8073
#endif
8074

8075
#if DECCHECK
8076
/* ------------------------------------------------------------------ */
8077
/* decCheckOperands -- check operand(s) to a routine		      */
8078
/*   res is the result structure (not checked; it will be set to      */
8079
/*	    quiet NaN if error found (and it is not NULL))	      */
8080
/*   lhs is the first operand (may be DECUNRESU)		      */
8081
/*   rhs is the second (may be DECUNUSED)			      */
8082
/*   set is the context (may be DECUNCONT)			      */
8083
/*   returns 0 if both operands, and the context are clean, or 1      */
8084
/*     otherwise (in which case the context will show an error,	      */
8085
/*     unless NULL).  Note that res is not cleaned; caller should     */
8086
/*     handle this so res=NULL case is safe.			      */
8087
/* The caller is expected to abandon immediately if 1 is returned.    */
8088
/* ------------------------------------------------------------------ */
8089
static Flag decCheckOperands(decNumber *res, const decNumber *lhs,
8090
			     const decNumber *rhs, decContext *set) {
8091
  Flag bad=0;
8092
  if (set==NULL) {		   /* oops; hopeless */
8093
    #if DECTRACE || DECVERB
8094
    printf("Reference to context is NULL.\n");
8095
    #endif
8096
    bad=1;
8097
    return 1;}
8098
   else if (set!=DECUNCONT
8099
     && (set->digits<1 || set->round>=DEC_ROUND_MAX)) {
8100
    bad=1;
8101
    #if DECTRACE || DECVERB
8102
    printf("Bad context [digits=%ld round=%ld].\n",
8103
	   (LI)set->digits, (LI)set->round);
8104
    #endif
8105
    }
8106
   else {
8107
    if (res==NULL) {
8108
      bad=1;
8109
      #if DECTRACE
8110
      /* this one not DECVERB as standard tests include NULL */
8111
      printf("Reference to result is NULL.\n");
8112
      #endif
8113
      }
8114
    if (!bad && lhs!=DECUNUSED) bad=(decCheckNumber(lhs));
8115
    if (!bad && rhs!=DECUNUSED) bad=(decCheckNumber(rhs));
8116
    }
8117
  if (bad) {
8118
    if (set!=DECUNCONT) decContextSetStatus(set, DEC_Invalid_operation);
8119
    if (res!=DECUNRESU && res!=NULL) {
8120
      decNumberZero(res);
8121
      res->bits=DECNAN;	      /* qNaN */
8122
      }
8123
    }
8124
  return bad;
8125
  } /* decCheckOperands */
8126

8127
/* ------------------------------------------------------------------ */
8128
/* decCheckNumber -- check a number				      */
8129
/*   dn is the number to check					      */
8130
/*   returns 0 if the number is clean, or 1 otherwise		      */
8131
/*								      */
8132
/* The number is considered valid if it could be a result from some   */
8133
/* operation in some valid context.				      */
8134
/* ------------------------------------------------------------------ */
8135
static Flag decCheckNumber(const decNumber *dn) {
8136
  const Unit *up;	      /* work */
8137
  uInt maxuint;		      /* .. */
8138
  Int ae, d, digits;	      /* .. */
8139
  Int emin, emax;	      /* .. */
8140

8141
  if (dn==NULL) {	      /* hopeless */
8142
    #if DECTRACE
8143
    /* this one not DECVERB as standard tests include NULL */
8144
    printf("Reference to decNumber is NULL.\n");
8145
    #endif
8146
    return 1;}
8147

8148
  /* check special values */
8149
  if (dn->bits & DECSPECIAL) {
8150
    if (dn->exponent!=0) {
8151
      #if DECTRACE || DECVERB
8152
      printf("Exponent %ld (not 0) for a special value [%02x].\n",
8153
	     (LI)dn->exponent, dn->bits);
8154
      #endif
8155
      return 1;}
8156

8157
    /* 2003.09.08: NaNs may now have coefficients, so next tests Inf only */
8158
    if (decNumberIsInfinite(dn)) {
8159
      if (dn->digits!=1) {
8160
	#if DECTRACE || DECVERB
8161
	printf("Digits %ld (not 1) for an infinity.\n", (LI)dn->digits);
8162
	#endif
8163
	return 1;}
8164
      if (*dn->lsu!=0) {
8165
	#if DECTRACE || DECVERB
8166
	printf("LSU %ld (not 0) for an infinity.\n", (LI)*dn->lsu);
8167
	#endif
8168
	decDumpAr('I', dn->lsu, D2U(dn->digits));
8169
	return 1;}
8170
      } /* Inf */
8171
    /* 2002.12.26: negative NaNs can now appear through proposed IEEE */
8172
    /*		   concrete formats (decimal64, etc.). */
8173
    return 0;
8174
    }
8175

8176
  /* check the coefficient */
8177
  if (dn->digits<1 || dn->digits>DECNUMMAXP) {
8178
    #if DECTRACE || DECVERB
8179
    printf("Digits %ld in number.\n", (LI)dn->digits);
8180
    #endif
8181
    return 1;}
8182

8183
  d=dn->digits;
8184

8185
  for (up=dn->lsu; d>0; up++) {
8186
    if (d>DECDPUN) maxuint=DECDPUNMAX;
8187
     else {		      /* reached the msu */
8188
      maxuint=powers[d]-1;
8189
      if (dn->digits>1 && *up<powers[d-1]) {
8190
	#if DECTRACE || DECVERB
8191
	printf("Leading 0 in number.\n");
8192
	decNumberShow(dn);
8193
	#endif
8194
	return 1;}
8195
      }
8196
    if (*up>maxuint) {
8197
      #if DECTRACE || DECVERB
8198
      printf("Bad Unit [%08lx] in %ld-digit number at offset %ld [maxuint %ld].\n",
8199
	      (LI)*up, (LI)dn->digits, (LI)(up-dn->lsu), (LI)maxuint);
8200
      #endif
8201
      return 1;}
8202
    d-=DECDPUN;
8203
    }
8204

8205
  /* check the exponent.  Note that input operands can have exponents */
8206
  /* which are out of the set->emin/set->emax and set->digits range */
8207
  /* (just as they can have more digits than set->digits). */
8208
  ae=dn->exponent+dn->digits-1;	   /* adjusted exponent */
8209
  emax=DECNUMMAXE;
8210
  emin=DECNUMMINE;
8211
  digits=DECNUMMAXP;
8212
  if (ae<emin-(digits-1)) {
8213
    #if DECTRACE || DECVERB
8214
    printf("Adjusted exponent underflow [%ld].\n", (LI)ae);
8215
    decNumberShow(dn);
8216
    #endif
8217
    return 1;}
8218
  if (ae>+emax) {
8219
    #if DECTRACE || DECVERB
8220
    printf("Adjusted exponent overflow [%ld].\n", (LI)ae);
8221
    decNumberShow(dn);
8222
    #endif
8223
    return 1;}
8224

8225
  return 0;		 /* it's OK */
8226
  } /* decCheckNumber */
8227

8228
/* ------------------------------------------------------------------ */
8229
/* decCheckInexact -- check a normal finite inexact result has digits */
8230
/*   dn is the number to check					      */
8231
/*   set is the context (for status and precision)		      */
8232
/*   sets Invalid operation, etc., if some digits are missing	      */
8233
/* [this check is not made for DECSUBSET compilation or when	      */
8234
/* subnormal is not set]					      */
8235
/* ------------------------------------------------------------------ */
8236
static void decCheckInexact(const decNumber *dn, decContext *set) {
8237
  #if !DECSUBSET && DECEXTFLAG
8238
    if ((set->status & (DEC_Inexact|DEC_Subnormal))==DEC_Inexact
8239
     && (set->digits!=dn->digits) && !(dn->bits & DECSPECIAL)) {
8240
      #if DECTRACE || DECVERB
8241
      printf("Insufficient digits [%ld] on normal Inexact result.\n",
8242
	     (LI)dn->digits);
8243
      decNumberShow(dn);
8244
      #endif
8245
      decContextSetStatus(set, DEC_Invalid_operation);
8246
      }
8247
  #else
8248
    /* next is a noop for quiet compiler */
8249
    if (dn!=NULL && dn->digits==0) set->status|=DEC_Invalid_operation;
8250
  #endif
8251
  return;
8252
  } /* decCheckInexact */
8253
#endif
8254

8255
#if DECALLOC
8256
#undef malloc
8257
#undef free
8258
/* ------------------------------------------------------------------ */
8259
/* decMalloc -- accountable allocation routine			      */
8260
/*   n is the number of bytes to allocate			      */
8261
/*								      */
8262
/* Semantics is the same as the stdlib malloc routine, but bytes      */
8263
/* allocated are accounted for globally, and corruption fences are    */
8264
/* added before and after the 'actual' storage.			      */
8265
/* ------------------------------------------------------------------ */
8266
/* This routine allocates storage with an extra twelve bytes; 8 are   */
8267
/* at the start and hold:					      */
8268
/*   0-3 the original length requested				      */
8269
/*   4-7 buffer corruption detection fence (DECFENCE, x4)	      */
8270
/* The 4 bytes at the end also hold a corruption fence (DECFENCE, x4) */
8271
/* ------------------------------------------------------------------ */
8272
static void *decMalloc(size_t n) {
8273
  uInt	size=n+12;		   /* true size */
8274
  void	*alloc;			   /* -> allocated storage */
8275
  uInt	*j;			   /* work */
8276
  uByte *b, *b0;		   /* .. */
8277

8278
  alloc=malloc(size);		   /* -> allocated storage */
8279
  if (alloc==NULL) return NULL;	   /* out of strorage */
8280
  b0=(uByte *)alloc;		   /* as bytes */
8281
  decAllocBytes+=n;		   /* account for storage */
8282
  j=(uInt *)alloc;		   /* -> first four bytes */
8283
  *j=n;				   /* save n */
8284
  /* printf(" alloc ++ dAB: %ld (%d)\n", decAllocBytes, n); */
8285
  for (b=b0+4; b<b0+8; b++) *b=DECFENCE;
8286
  for (b=b0+n+8; b<b0+n+12; b++) *b=DECFENCE;
8287
  return b0+8;			   /* -> play area */
8288
  } /* decMalloc */
8289

8290
/* ------------------------------------------------------------------ */
8291
/* decFree -- accountable free routine				      */
8292
/*   alloc is the storage to free				      */
8293
/*								      */
8294
/* Semantics is the same as the stdlib malloc routine, except that    */
8295
/* the global storage accounting is updated and the fences are	      */
8296
/* checked to ensure that no routine has written 'out of bounds'.     */
8297
/* ------------------------------------------------------------------ */
8298
/* This routine first checks that the fences have not been corrupted. */
8299
/* It then frees the storage using the 'truw' storage address (that   */
8300
/* is, offset by 8).						      */
8301
/* ------------------------------------------------------------------ */
8302
static void decFree(void *alloc) {
8303
  uInt	*j, n;			   /* pointer, original length */
8304
  uByte *b, *b0;		   /* work */
8305

8306
  if (alloc==NULL) return;	   /* allowed; it's a nop */
8307
  b0=(uByte *)alloc;		   /* as bytes */
8308
  b0-=8;			   /* -> true start of storage */
8309
  j=(uInt *)b0;			   /* -> first four bytes */
8310
  n=*j;				   /* lift */
8311
  for (b=b0+4; b<b0+8; b++) if (*b!=DECFENCE)
8312
    printf("=== Corrupt byte [%02x] at offset %d from %ld ===\n", *b,
8313
	   b-b0-8, (Int)b0);
8314
  for (b=b0+n+8; b<b0+n+12; b++) if (*b!=DECFENCE)
8315
    printf("=== Corrupt byte [%02x] at offset +%d from %ld, n=%ld ===\n", *b,
8316
	   b-b0-8, (Int)b0, n);
8317
  free(b0);			   /* drop the storage */
8318
  decAllocBytes-=n;		   /* account for storage */
8319
  /* printf(" free -- dAB: %d (%d)\n", decAllocBytes, -n); */
8320
  } /* decFree */
8321
#define malloc(a) decMalloc(a)
8322
#define free(a) decFree(a)
8323
#endif
8324

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.