OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-6.8/] [libdecnumber/] [decNumber.c] - Blame information for rev 486

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 24 jeremybenn
/* 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 <stdlib.h>                /* for malloc, free, etc. */
170
#include <stdio.h>                 /* for printf [if needed] */
171
#include <string.h>                /* for strcpy */
172
#include <ctype.h>                 /* for lower */
173
#include "config.h"                /* for GCC definitions */
174
#include "decNumber.h"             /* base number library */
175
#include "decNumberLocal.h"        /* decNumber local types, etc. */
176
 
177
/* Constants */
178
/* Public lookup table used by the D2U macro */
179
const uByte d2utable[DECMAXD2U+1]=D2UTABLE;
180
 
181
#define DECVERB     1              /* set to 1 for verbose DECCHECK */
182
#define powers      DECPOWERS      /* old internal name */
183
 
184
/* Local constants */
185
#define DIVIDE      0x80           /* Divide operators */
186
#define REMAINDER   0x40           /* .. */
187
#define DIVIDEINT   0x20           /* .. */
188
#define REMNEAR     0x10           /* .. */
189
#define COMPARE     0x01           /* Compare operators */
190
#define COMPMAX     0x02           /* .. */
191
#define COMPMIN     0x03           /* .. */
192
#define COMPTOTAL   0x04           /* .. */
193
#define COMPNAN     0x05           /* .. [NaN processing] */
194
#define COMPSIG     0x06           /* .. [signaling COMPARE] */
195
#define COMPMAXMAG  0x07           /* .. */
196
#define COMPMINMAG  0x08           /* .. */
197
 
198
#define DEC_sNaN     0x40000000    /* local status: sNaN signal */
199
#define BADINT  (Int)0x80000000    /* most-negative Int; error indicator */
200
/* Next two indicate an integer >= 10**6, and its parity (bottom bit) */
201
#define BIGEVEN (Int)0x80000002
202
#define BIGODD  (Int)0x80000003
203
 
204
static Unit uarrone[1]={1};   /* Unit array of 1, used for incrementing */
205
 
206
/* Granularity-dependent code */
207
#if DECDPUN<=4
208
  #define eInt  Int           /* extended integer */
209
  #define ueInt uInt          /* unsigned extended integer */
210
  /* Constant multipliers for divide-by-power-of five using reciprocal */
211
  /* multiply, after removing powers of 2 by shifting, and final shift */
212
  /* of 17 [we only need up to **4] */
213
  static const uInt multies[]={131073, 26215, 5243, 1049, 210};
214
  /* QUOT10 -- macro to return the quotient of unit u divided by 10**n */
215
  #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
216
#else
217
  /* For DECDPUN>4 non-ANSI-89 64-bit types are needed. */
218
  #if !DECUSE64
219
    #error decNumber.c: DECUSE64 must be 1 when DECDPUN>4
220
  #endif
221
  #define eInt  Long          /* extended integer */
222
  #define ueInt uLong         /* unsigned extended integer */
223
#endif
224
 
225
/* Local routines */
226
static decNumber * decAddOp(decNumber *, const decNumber *, const decNumber *,
227
                              decContext *, uByte, uInt *);
228
static Flag        decBiStr(const char *, const char *, const char *);
229
static uInt        decCheckMath(const decNumber *, decContext *, uInt *);
230
static void        decApplyRound(decNumber *, decContext *, Int, uInt *);
231
static Int         decCompare(const decNumber *lhs, const decNumber *rhs, Flag);
232
static decNumber * decCompareOp(decNumber *, const decNumber *,
233
                              const decNumber *, decContext *,
234
                              Flag, uInt *);
235
static void        decCopyFit(decNumber *, const decNumber *, decContext *,
236
                              Int *, uInt *);
237
static decNumber * decDecap(decNumber *, Int);
238
static decNumber * decDivideOp(decNumber *, const decNumber *,
239
                              const decNumber *, decContext *, Flag, uInt *);
240
static decNumber * decExpOp(decNumber *, const decNumber *,
241
                              decContext *, uInt *);
242
static void        decFinalize(decNumber *, decContext *, Int *, uInt *);
243
static Int         decGetDigits(Unit *, Int);
244
static Int         decGetInt(const decNumber *);
245
static decNumber * decLnOp(decNumber *, const decNumber *,
246
                              decContext *, uInt *);
247
static decNumber * decMultiplyOp(decNumber *, const decNumber *,
248
                              const decNumber *, decContext *,
249
                              uInt *);
250
static decNumber * decNaNs(decNumber *, const decNumber *,
251
                              const decNumber *, decContext *, uInt *);
252
static decNumber * decQuantizeOp(decNumber *, const decNumber *,
253
                              const decNumber *, decContext *, Flag,
254
                              uInt *);
255
static void        decReverse(Unit *, Unit *);
256
static void        decSetCoeff(decNumber *, decContext *, const Unit *,
257
                              Int, Int *, uInt *);
258
static void        decSetMaxValue(decNumber *, decContext *);
259
static void        decSetOverflow(decNumber *, decContext *, uInt *);
260
static void        decSetSubnormal(decNumber *, decContext *, Int *, uInt *);
261
static Int         decShiftToLeast(Unit *, Int, Int);
262
static Int         decShiftToMost(Unit *, Int, Int);
263
static void        decStatus(decNumber *, uInt, decContext *);
264
static void        decToString(const decNumber *, char[], Flag);
265
static decNumber * decTrim(decNumber *, decContext *, Flag, Int *);
266
static Int         decUnitAddSub(const Unit *, Int, const Unit *, Int, Int,
267
                              Unit *, Int);
268
static Int         decUnitCompare(const Unit *, Int, const Unit *, Int, Int);
269
 
270
#if !DECSUBSET
271
/* decFinish == decFinalize when no subset arithmetic needed */
272
#define decFinish(a,b,c,d) decFinalize(a,b,c,d)
273
#else
274
static void        decFinish(decNumber *, decContext *, Int *, uInt *);
275
static decNumber * decRoundOperand(const decNumber *, decContext *, uInt *);
276
#endif
277
 
278
/* Local macros */
279
/* masked special-values bits */
280
#define SPECIALARG  (rhs->bits & DECSPECIAL)
281
#define SPECIALARGS ((lhs->bits | rhs->bits) & DECSPECIAL)
282
 
283
/* Diagnostic macros, etc. */
284
#if DECALLOC
285
/* Handle malloc/free accounting.  If enabled, our accountable routines */
286
/* are used; otherwise the code just goes straight to the system malloc */
287
/* and free routines. */
288
#define malloc(a) decMalloc(a)
289
#define free(a) decFree(a)
290
#define DECFENCE 0x5a              /* corruption detector */
291
/* 'Our' malloc and free: */
292
static void *decMalloc(size_t);
293
static void  decFree(void *);
294
uInt decAllocBytes=0;               /* count of bytes allocated */
295
/* Note that DECALLOC code only checks for storage buffer overflow. */
296
/* To check for memory leaks, the decAllocBytes variable must be */
297
/* checked to be 0 at appropriate times (e.g., after the test */
298
/* harness completes a set of tests).  This checking may be unreliable */
299
/* if the testing is done in a multi-thread environment. */
300
#endif
301
 
302
#if DECCHECK
303
/* Optional checking routines.  Enabling these means that decNumber */
304
/* and decContext operands to operator routines are checked for */
305
/* correctness.  This roughly doubles the execution time of the */
306
/* fastest routines (and adds 600+ bytes), so should not normally be */
307
/* used in 'production'. */
308
/* decCheckInexact is used to check that inexact results have a full */
309
/* complement of digits (where appropriate -- this is not the case */
310
/* for Quantize, for example) */
311
#define DECUNRESU ((decNumber *)(void *)0xffffffff)
312
#define DECUNUSED ((const decNumber *)(void *)0xffffffff)
313
#define DECUNCONT ((decContext *)(void *)(0xffffffff))
314
static Flag decCheckOperands(decNumber *, const decNumber *,
315
                             const decNumber *, decContext *);
316
static Flag decCheckNumber(const decNumber *);
317
static void decCheckInexact(const decNumber *, decContext *);
318
#endif
319
 
320
#if DECTRACE || DECCHECK
321
/* Optional trace/debugging routines (may or may not be used) */
322
void decNumberShow(const decNumber *);  /* displays the components of a number */
323
static void decDumpAr(char, const Unit *, Int);
324
#endif
325
 
326
/* ================================================================== */
327
/* Conversions                                                        */
328
/* ================================================================== */
329
 
330
/* ------------------------------------------------------------------ */
331
/* from-int32 -- conversion from Int or uInt                          */
332
/*                                                                    */
333
/*  dn is the decNumber to receive the integer                        */
334
/*  in or uin is the integer to be converted                          */
335
/*  returns dn                                                        */
336
/*                                                                    */
337
/* No error is possible.                                              */
338
/* ------------------------------------------------------------------ */
339
decNumber * decNumberFromInt32(decNumber *dn, Int in) {
340
  uInt unsig;
341
  if (in>=0) unsig=in;
342
   else {                               /* negative (possibly BADINT) */
343
    if (in==BADINT) unsig=(uInt)1073741824*2; /* special case */
344
     else unsig=-in;                    /* invert */
345
    }
346
  /* in is now positive */
347
  decNumberFromUInt32(dn, unsig);
348
  if (in<0) dn->bits=DECNEG;             /* sign needed */
349
  return dn;
350
  } /* decNumberFromInt32 */
351
 
352
decNumber * decNumberFromUInt32(decNumber *dn, uInt uin) {
353
  Unit *up;                             /* work pointer */
354
  decNumberZero(dn);                    /* clean */
355
  if (uin==0) return dn;         /* [or decGetDigits bad call] */
356
  for (up=dn->lsu; uin>0; up++) {
357
    *up=(Unit)(uin%(DECDPUNMAX+1));
358
    uin=uin/(DECDPUNMAX+1);
359
    }
360
  dn->digits=decGetDigits(dn->lsu, up-dn->lsu);
361
  return dn;
362
  } /* decNumberFromUInt32 */
363
 
364
/* ------------------------------------------------------------------ */
365
/* to-int32 -- conversion to Int or uInt                              */
366
/*                                                                    */
367
/*  dn is the decNumber to convert                                    */
368
/*  set is the context for reporting errors                           */
369
/*  returns the converted decNumber, or 0 if Invalid is set           */
370
/*                                                                    */
371
/* Invalid is set if the decNumber does not have exponent==0 or if    */
372
/* it is a NaN, Infinite, or out-of-range.                            */
373
/* ------------------------------------------------------------------ */
374
Int decNumberToInt32(const decNumber *dn, decContext *set) {
375
  #if DECCHECK
376
  if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
377
  #endif
378
 
379
  /* special or too many digits, or bad exponent */
380
  if (dn->bits&DECSPECIAL || dn->digits>10 || dn->exponent!=0) ; /* bad */
381
   else { /* is a finite integer with 10 or fewer digits */
382
    Int d;                         /* work */
383
    const Unit *up;                /* .. */
384
    uInt hi=0, lo;                  /* .. */
385
    up=dn->lsu;                    /* -> lsu */
386
    lo=*up;                        /* get 1 to 9 digits */
387
    #if DECDPUN>1                  /* split to higher */
388
      hi=lo/10;
389
      lo=lo%10;
390
    #endif
391
    up++;
392
    /* collect remaining Units, if any, into hi */
393
    for (d=DECDPUN; d<dn->digits; up++, d+=DECDPUN) hi+=*up*powers[d-1];
394
    /* now low has the lsd, hi the remainder */
395
    if (hi>214748364 || (hi==214748364 && lo>7)) { /* out of range? */
396
      /* most-negative is a reprieve */
397
      if (dn->bits&DECNEG && hi==214748364 && lo==8) return 0x80000000;
398
      /* bad -- drop through */
399
      }
400
     else { /* in-range always */
401
      Int i=X10(hi)+lo;
402
      if (dn->bits&DECNEG) return -i;
403
      return i;
404
      }
405
    } /* integer */
406
  decContextSetStatus(set, DEC_Invalid_operation); /* [may not return] */
407
  return 0;
408
  } /* decNumberToInt32 */
409
 
410
uInt decNumberToUInt32(const decNumber *dn, decContext *set) {
411
  #if DECCHECK
412
  if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
413
  #endif
414
  /* special or too many digits, or bad exponent, or negative (<0) */
415
  if (dn->bits&DECSPECIAL || dn->digits>10 || dn->exponent!=0
416
    || (dn->bits&DECNEG && !ISZERO(dn)));                   /* bad */
417
   else { /* is a finite integer with 10 or fewer digits */
418
    Int d;                         /* work */
419
    const Unit *up;                /* .. */
420
    uInt hi=0, lo;                  /* .. */
421
    up=dn->lsu;                    /* -> lsu */
422
    lo=*up;                        /* get 1 to 9 digits */
423
    #if DECDPUN>1                  /* split to higher */
424
      hi=lo/10;
425
      lo=lo%10;
426
    #endif
427
    up++;
428
    /* collect remaining Units, if any, into hi */
429
    for (d=DECDPUN; d<dn->digits; up++, d+=DECDPUN) hi+=*up*powers[d-1];
430
 
431
    /* now low has the lsd, hi the remainder */
432
    if (hi>429496729 || (hi==429496729 && lo>5)) ; /* no reprieve possible */
433
     else return X10(hi)+lo;
434
    } /* integer */
435
  decContextSetStatus(set, DEC_Invalid_operation); /* [may not return] */
436
  return 0;
437
  } /* decNumberToUInt32 */
438
 
439
/* ------------------------------------------------------------------ */
440
/* to-scientific-string -- conversion to numeric string               */
441
/* to-engineering-string -- conversion to numeric string              */
442
/*                                                                    */
443
/*   decNumberToString(dn, string);                                   */
444
/*   decNumberToEngString(dn, string);                                */
445
/*                                                                    */
446
/*  dn is the decNumber to convert                                    */
447
/*  string is the string where the result will be laid out            */
448
/*                                                                    */
449
/*  string must be at least dn->digits+14 characters long             */
450
/*                                                                    */
451
/*  No error is possible, and no status can be set.                   */
452
/* ------------------------------------------------------------------ */
453
char * decNumberToString(const decNumber *dn, char *string){
454
  decToString(dn, string, 0);
455
  return string;
456
  } /* DecNumberToString */
457
 
458
char * decNumberToEngString(const decNumber *dn, char *string){
459
  decToString(dn, string, 1);
460
  return string;
461
  } /* DecNumberToEngString */
462
 
463
/* ------------------------------------------------------------------ */
464
/* to-number -- conversion from numeric string                        */
465
/*                                                                    */
466
/* decNumberFromString -- convert string to decNumber                 */
467
/*   dn        -- the number structure to fill                        */
468
/*   chars[]   -- the string to convert ('\0' terminated)             */
469
/*   set       -- the context used for processing any error,          */
470
/*                determining the maximum precision available         */
471
/*                (set.digits), determining the maximum and minimum   */
472
/*                exponent (set.emax and set.emin), determining if    */
473
/*                extended values are allowed, and checking the       */
474
/*                rounding mode if overflow occurs or rounding is     */
475
/*                needed.                                             */
476
/*                                                                    */
477
/* The length of the coefficient and the size of the exponent are     */
478
/* checked by this routine, so the correct error (Underflow or        */
479
/* Overflow) can be reported or rounding applied, as necessary.       */
480
/*                                                                    */
481
/* If bad syntax is detected, the result will be a quiet NaN.         */
482
/* ------------------------------------------------------------------ */
483
decNumber * decNumberFromString(decNumber *dn, const char chars[],
484
                                decContext *set) {
485
  Int   exponent=0;                 /* working exponent [assume 0] */
486
  uByte bits=0;                     /* working flags [assume +ve] */
487
  Unit  *res;                      /* where result will be built */
488
  Unit  resbuff[SD2U(DECBUFFER+9)];/* local buffer in case need temporary */
489
                                   /* [+9 allows for ln() constants] */
490
  Unit  *allocres=NULL;            /* -> allocated result, iff allocated */
491
  Int   d=0;                        /* count of digits found in decimal part */
492
  const char *dotchar=NULL;        /* where dot was found */
493
  const char *cfirst=chars;        /* -> first character of decimal part */
494
  const char *last=NULL;           /* -> last digit of decimal part */
495
  const char *c;                   /* work */
496
  Unit  *up;                       /* .. */
497
  #if DECDPUN>1
498
  Int   cut, out;                  /* .. */
499
  #endif
500
  Int   residue;                   /* rounding residue */
501
  uInt  status=0;                   /* error code */
502
 
503
  #if DECCHECK
504
  if (decCheckOperands(DECUNRESU, DECUNUSED, DECUNUSED, set))
505
    return decNumberZero(dn);
506
  #endif
507
 
508
  do {                             /* status & malloc protection */
509
    for (c=chars;; c++) {          /* -> input character */
510
      if (*c>='0' && *c<='9') {    /* test for Arabic digit */
511
        last=c;
512
        d++;                       /* count of real digits */
513
        continue;                  /* still in decimal part */
514
        }
515
      if (*c=='.' && dotchar==NULL) { /* first '.' */
516
        dotchar=c;                 /* record offset into decimal part */
517
        if (c==cfirst) cfirst++;   /* first digit must follow */
518
        continue;}
519
      if (c==chars) {              /* first in string... */
520
        if (*c=='-') {             /* valid - sign */
521
          cfirst++;
522
          bits=DECNEG;
523
          continue;}
524
        if (*c=='+') {             /* valid + sign */
525
          cfirst++;
526
          continue;}
527
        }
528
      /* *c is not a digit, or a valid +, -, or '.' */
529
      break;
530
      } /* c */
531
 
532
    if (last==NULL) {              /* no digits yet */
533
      status=DEC_Conversion_syntax;/* assume the worst */
534
      if (*c=='\0') break;         /* and no more to come... */
535
      #if DECSUBSET
536
      /* if subset then infinities and NaNs are not allowed */
537
      if (!set->extended) break;   /* hopeless */
538
      #endif
539
      /* Infinities and NaNs are possible, here */
540
      if (dotchar!=NULL) break;    /* .. unless had a dot */
541
      decNumberZero(dn);           /* be optimistic */
542
      if (decBiStr(c, "infinity", "INFINITY")
543
       || decBiStr(c, "inf", "INF")) {
544
        dn->bits=bits | DECINF;
545
        status=0;                   /* is OK */
546
        break; /* all done */
547
        }
548
      /* a NaN expected */
549
      /* 2003.09.10 NaNs are now permitted to have a sign */
550
      dn->bits=bits | DECNAN;      /* assume simple NaN */
551
      if (*c=='s' || *c=='S') {    /* looks like an sNaN */
552
        c++;
553
        dn->bits=bits | DECSNAN;
554
        }
555
      if (*c!='n' && *c!='N') break;    /* check caseless "NaN" */
556
      c++;
557
      if (*c!='a' && *c!='A') break;    /* .. */
558
      c++;
559
      if (*c!='n' && *c!='N') break;    /* .. */
560
      c++;
561
      /* now either nothing, or nnnn payload, expected */
562
      /* -> start of integer and skip leading 0s [including plain 0] */
563
      for (cfirst=c; *cfirst=='0';) cfirst++;
564
      if (*cfirst=='\0') {         /* "NaN" or "sNaN", maybe with all 0s */
565
        status=0;                   /* it's good */
566
        break;                     /* .. */
567
        }
568
      /* something other than 0s; setup last and d as usual [no dots] */
569
      for (c=cfirst;; c++, d++) {
570
        if (*c<'0' || *c>'9') break; /* test for Arabic digit */
571
        last=c;
572
        }
573
      if (*c!='\0') break;         /* not all digits */
574
      if (d>set->digits-1) {
575
        /* [NB: payload in a decNumber can be full length unless */
576
        /* clamped, in which case can only be digits-1] */
577
        if (set->clamp) break;
578
        if (d>set->digits) break;
579
        } /* too many digits? */
580
      /* good; drop through to convert the integer to coefficient */
581
      status=0;                     /* syntax is OK */
582
      bits=dn->bits;               /* for copy-back */
583
      } /* last==NULL */
584
 
585
     else if (*c!='\0') {          /* more to process... */
586
      /* had some digits; exponent is only valid sequence now */
587
      Flag nege;                   /* 1=negative exponent */
588
      const char *firstexp;        /* -> first significant exponent digit */
589
      status=DEC_Conversion_syntax;/* assume the worst */
590
      if (*c!='e' && *c!='E') break;
591
      /* Found 'e' or 'E' -- now process explicit exponent */
592
      /* 1998.07.11: sign no longer required */
593
      nege=0;
594
      c++;                         /* to (possible) sign */
595
      if (*c=='-') {nege=1; c++;}
596
       else if (*c=='+') c++;
597
      if (*c=='\0') break;
598
 
599
      for (; *c=='0' && *(c+1)!='\0';) c++;  /* strip insignificant zeros */
600
      firstexp=c;                            /* save exponent digit place */
601
      for (; ;c++) {
602
        if (*c<'0' || *c>'9') break;         /* not a digit */
603
        exponent=X10(exponent)+(Int)*c-(Int)'0';
604
        } /* c */
605
      /* if not now on a '\0', *c must not be a digit */
606
      if (*c!='\0') break;
607
 
608
      /* (this next test must be after the syntax checks) */
609
      /* if it was too long the exponent may have wrapped, so check */
610
      /* carefully and set it to a certain overflow if wrap possible */
611
      if (c>=firstexp+9+1) {
612
        if (c>firstexp+9+1 || *firstexp>'1') exponent=DECNUMMAXE*2;
613
        /* [up to 1999999999 is OK, for example 1E-1000000998] */
614
        }
615
      if (nege) exponent=-exponent;     /* was negative */
616
      status=0;                          /* is OK */
617
      } /* stuff after digits */
618
 
619
    /* Here when whole string has been inspected; syntax is good */
620
    /* cfirst->first digit (never dot), last->last digit (ditto) */
621
 
622
    /* strip leading zeros/dot [leave final 0 if all 0's] */
623
    if (*cfirst=='0') {                 /* [cfirst has stepped over .] */
624
      for (c=cfirst; c<last; c++, cfirst++) {
625
        if (*c=='.') continue;          /* ignore dots */
626
        if (*c!='0') break;             /* non-zero found */
627
        d--;                            /* 0 stripped */
628
        } /* c */
629
      #if DECSUBSET
630
      /* make a rapid exit for easy zeros if !extended */
631
      if (*cfirst=='0' && !set->extended) {
632
        decNumberZero(dn);              /* clean result */
633
        break;                          /* [could be return] */
634
        }
635
      #endif
636
      } /* at least one leading 0 */
637
 
638
    /* Handle decimal point... */
639
    if (dotchar!=NULL && dotchar<last)  /* non-trailing '.' found? */
640
      exponent-=(last-dotchar);         /* adjust exponent */
641
    /* [we can now ignore the .] */
642
 
643
    /* OK, the digits string is good.  Assemble in the decNumber, or in */
644
    /* a temporary units array if rounding is needed */
645
    if (d<=set->digits) res=dn->lsu;    /* fits into supplied decNumber */
646
     else {                             /* rounding needed */
647
      Int needbytes=D2U(d)*sizeof(Unit);/* bytes needed */
648
      res=resbuff;                      /* assume use local buffer */
649
      if (needbytes>(Int)sizeof(resbuff)) { /* too big for local */
650
        allocres=(Unit *)malloc(needbytes);
651
        if (allocres==NULL) {status|=DEC_Insufficient_storage; break;}
652
        res=allocres;
653
        }
654
      }
655
    /* res now -> number lsu, buffer, or allocated storage for Unit array */
656
 
657
    /* Place the coefficient into the selected Unit array */
658
    /* [this is often 70% of the cost of this function when DECDPUN>1] */
659
    #if DECDPUN>1
660
    out=0;                          /* accumulator */
661
    up=res+D2U(d)-1;               /* -> msu */
662
    cut=d-(up-res)*DECDPUN;        /* digits in top unit */
663
    for (c=cfirst;; c++) {         /* along the digits */
664
      if (*c=='.') continue;       /* ignore '.' [don't decrement cut] */
665
      out=X10(out)+(Int)*c-(Int)'0';
666
      if (c==last) break;          /* done [never get to trailing '.'] */
667
      cut--;
668
      if (cut>0) continue;          /* more for this unit */
669
      *up=(Unit)out;               /* write unit */
670
      up--;                        /* prepare for unit below.. */
671
      cut=DECDPUN;                 /* .. */
672
      out=0;                        /* .. */
673
      } /* c */
674
    *up=(Unit)out;                 /* write lsu */
675
 
676
    #else
677
    /* DECDPUN==1 */
678
    up=res;                        /* -> lsu */
679
    for (c=last; c>=cfirst; c--) { /* over each character, from least */
680
      if (*c=='.') continue;       /* ignore . [don't step up] */
681
      *up=(Unit)((Int)*c-(Int)'0');
682
      up++;
683
      } /* c */
684
    #endif
685
 
686
    dn->bits=bits;
687
    dn->exponent=exponent;
688
    dn->digits=d;
689
 
690
    /* if not in number (too long) shorten into the number */
691
    if (d>set->digits) {
692
      residue=0;
693
      decSetCoeff(dn, set, res, d, &residue, &status);
694
      /* always check for overflow or subnormal and round as needed */
695
      decFinalize(dn, set, &residue, &status);
696
      }
697
     else { /* no rounding, but may still have overflow or subnormal */
698
      /* [these tests are just for performance; finalize repeats them] */
699
      if ((dn->exponent-1<set->emin-dn->digits)
700
       || (dn->exponent-1>set->emax-set->digits)) {
701
        residue=0;
702
        decFinalize(dn, set, &residue, &status);
703
        }
704
      }
705
    /* decNumberShow(dn); */
706
    } while(0);                          /* [for break] */
707
 
708
  if (allocres!=NULL) free(allocres);   /* drop any storage used */
709
  if (status!=0) decStatus(dn, status, set);
710
  return dn;
711
  } /* decNumberFromString */
712
 
713
/* ================================================================== */
714
/* Operators                                                          */
715
/* ================================================================== */
716
 
717
/* ------------------------------------------------------------------ */
718
/* decNumberAbs -- absolute value operator                            */
719
/*                                                                    */
720
/*   This computes C = abs(A)                                         */
721
/*                                                                    */
722
/*   res is C, the result.  C may be A                                */
723
/*   rhs is A                                                         */
724
/*   set is the context                                               */
725
/*                                                                    */
726
/* See also decNumberCopyAbs for a quiet bitwise version of this.     */
727
/* C must have space for set->digits digits.                          */
728
/* ------------------------------------------------------------------ */
729
/* This has the same effect as decNumberPlus unless A is negative,    */
730
/* in which case it has the same effect as decNumberMinus.            */
731
/* ------------------------------------------------------------------ */
732
decNumber * decNumberAbs(decNumber *res, const decNumber *rhs,
733
                         decContext *set) {
734
  decNumber dzero;                      /* for 0 */
735
  uInt status=0;                 /* accumulator */
736
 
737
  #if DECCHECK
738
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
739
  #endif
740
 
741
  decNumberZero(&dzero);                /* set 0 */
742
  dzero.exponent=rhs->exponent;         /* [no coefficient expansion] */
743
  decAddOp(res, &dzero, rhs, set, (uByte)(rhs->bits & DECNEG), &status);
744
  if (status!=0) decStatus(res, status, set);
745
  #if DECCHECK
746
  decCheckInexact(res, set);
747
  #endif
748
  return res;
749
  } /* decNumberAbs */
750
 
751
/* ------------------------------------------------------------------ */
752
/* decNumberAdd -- add two Numbers                                    */
753
/*                                                                    */
754
/*   This computes C = A + B                                          */
755
/*                                                                    */
756
/*   res is C, the result.  C may be A and/or B (e.g., X=X+X)         */
757
/*   lhs is A                                                         */
758
/*   rhs is B                                                         */
759
/*   set is the context                                               */
760
/*                                                                    */
761
/* C must have space for set->digits digits.                          */
762
/* ------------------------------------------------------------------ */
763
/* This just calls the routine shared with Subtract                   */
764
decNumber * decNumberAdd(decNumber *res, const decNumber *lhs,
765
                         const decNumber *rhs, decContext *set) {
766
  uInt status=0;                 /* accumulator */
767
  decAddOp(res, lhs, rhs, set, 0, &status);
768
  if (status!=0) decStatus(res, status, set);
769
  #if DECCHECK
770
  decCheckInexact(res, set);
771
  #endif
772
  return res;
773
  } /* decNumberAdd */
774
 
775
/* ------------------------------------------------------------------ */
776
/* decNumberAnd -- AND two Numbers, digitwise                         */
777
/*                                                                    */
778
/*   This computes C = A & B                                          */
779
/*                                                                    */
780
/*   res is C, the result.  C may be A and/or B (e.g., X=X&X)         */
781
/*   lhs is A                                                         */
782
/*   rhs is B                                                         */
783
/*   set is the context (used for result length and error report)     */
784
/*                                                                    */
785
/* C must have space for set->digits digits.                          */
786
/*                                                                    */
787
/* Logical function restrictions apply (see above); a NaN is          */
788
/* returned with Invalid_operation if a restriction is violated.      */
789
/* ------------------------------------------------------------------ */
790
decNumber * decNumberAnd(decNumber *res, const decNumber *lhs,
791
                         const decNumber *rhs, decContext *set) {
792
  const Unit *ua, *ub;                  /* -> operands */
793
  const Unit *msua, *msub;              /* -> operand msus */
794
  Unit *uc,  *msuc;                     /* -> result and its msu */
795
  Int   msudigs;                        /* digits in res msu */
796
  #if DECCHECK
797
  if (decCheckOperands(res, lhs, rhs, set)) return res;
798
  #endif
799
 
800
  if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
801
   || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
802
    decStatus(res, DEC_Invalid_operation, set);
803
    return res;
804
    }
805
 
806
  /* operands are valid */
807
  ua=lhs->lsu;                          /* bottom-up */
808
  ub=rhs->lsu;                          /* .. */
809
  uc=res->lsu;                          /* .. */
810
  msua=ua+D2U(lhs->digits)-1;           /* -> msu of lhs */
811
  msub=ub+D2U(rhs->digits)-1;           /* -> msu of rhs */
812
  msuc=uc+D2U(set->digits)-1;           /* -> msu of result */
813
  msudigs=MSUDIGITS(set->digits);       /* [faster than remainder] */
814
  for (; uc<=msuc; ua++, ub++, uc++) {  /* Unit loop */
815
    Unit a, b;                          /* extract units */
816
    if (ua>msua) a=0;
817
     else a=*ua;
818
    if (ub>msub) b=0;
819
     else b=*ub;
820
    *uc=0;                               /* can now write back */
821
    if (a|b) {                          /* maybe 1 bits to examine */
822
      Int i, j;
823
      *uc=0;                             /* can now write back */
824
      /* This loop could be unrolled and/or use BIN2BCD tables */
825
      for (i=0; i<DECDPUN; i++) {
826
        if (a&b&1) *uc=*uc+(Unit)powers[i];  /* effect AND */
827
        j=a%10;
828
        a=a/10;
829
        j|=b%10;
830
        b=b/10;
831
        if (j>1) {
832
          decStatus(res, DEC_Invalid_operation, set);
833
          return res;
834
          }
835
        if (uc==msuc && i==msudigs-1) break; /* just did final digit */
836
        } /* each digit */
837
      } /* both OK */
838
    } /* each unit */
839
  /* [here uc-1 is the msu of the result] */
840
  res->digits=decGetDigits(res->lsu, uc-res->lsu);
841
  res->exponent=0;                       /* integer */
842
  res->bits=0;                           /* sign=0 */
843
  return res;  /* [no status to set] */
844
  } /* decNumberAnd */
845
 
846
/* ------------------------------------------------------------------ */
847
/* decNumberCompare -- compare two Numbers                            */
848
/*                                                                    */
849
/*   This computes C = A ? B                                          */
850
/*                                                                    */
851
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
852
/*   lhs is A                                                         */
853
/*   rhs is B                                                         */
854
/*   set is the context                                               */
855
/*                                                                    */
856
/* C must have space for one digit (or NaN).                          */
857
/* ------------------------------------------------------------------ */
858
decNumber * decNumberCompare(decNumber *res, const decNumber *lhs,
859
                             const decNumber *rhs, decContext *set) {
860
  uInt status=0;                 /* accumulator */
861
  decCompareOp(res, lhs, rhs, set, COMPARE, &status);
862
  if (status!=0) decStatus(res, status, set);
863
  return res;
864
  } /* decNumberCompare */
865
 
866
/* ------------------------------------------------------------------ */
867
/* decNumberCompareSignal -- compare, signalling on all NaNs          */
868
/*                                                                    */
869
/*   This computes C = A ? B                                          */
870
/*                                                                    */
871
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
872
/*   lhs is A                                                         */
873
/*   rhs is B                                                         */
874
/*   set is the context                                               */
875
/*                                                                    */
876
/* C must have space for one digit (or NaN).                          */
877
/* ------------------------------------------------------------------ */
878
decNumber * decNumberCompareSignal(decNumber *res, const decNumber *lhs,
879
                                   const decNumber *rhs, decContext *set) {
880
  uInt status=0;                 /* accumulator */
881
  decCompareOp(res, lhs, rhs, set, COMPSIG, &status);
882
  if (status!=0) decStatus(res, status, set);
883
  return res;
884
  } /* decNumberCompareSignal */
885
 
886
/* ------------------------------------------------------------------ */
887
/* decNumberCompareTotal -- compare two Numbers, using total ordering */
888
/*                                                                    */
889
/*   This computes C = A ? B, under total ordering                    */
890
/*                                                                    */
891
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
892
/*   lhs is A                                                         */
893
/*   rhs is B                                                         */
894
/*   set is the context                                               */
895
/*                                                                    */
896
/* C must have space for one digit; the result will always be one of  */
897
/* -1, 0, or 1.                                                       */
898
/* ------------------------------------------------------------------ */
899
decNumber * decNumberCompareTotal(decNumber *res, const decNumber *lhs,
900
                                  const decNumber *rhs, decContext *set) {
901
  uInt status=0;                 /* accumulator */
902
  decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
903
  if (status!=0) decStatus(res, status, set);
904
  return res;
905
  } /* decNumberCompareTotal */
906
 
907
/* ------------------------------------------------------------------ */
908
/* decNumberCompareTotalMag -- compare, total ordering of magnitudes  */
909
/*                                                                    */
910
/*   This computes C = |A| ? |B|, under total ordering                */
911
/*                                                                    */
912
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
913
/*   lhs is A                                                         */
914
/*   rhs is B                                                         */
915
/*   set is the context                                               */
916
/*                                                                    */
917
/* C must have space for one digit; the result will always be one of  */
918
/* -1, 0, or 1.                                                       */
919
/* ------------------------------------------------------------------ */
920
decNumber * decNumberCompareTotalMag(decNumber *res, const decNumber *lhs,
921
                                     const decNumber *rhs, decContext *set) {
922
  uInt status=0;            /* accumulator */
923
  uInt needbytes;                  /* for space calculations */
924
  decNumber bufa[D2N(DECBUFFER+1)];/* +1 in case DECBUFFER=0 */
925
  decNumber *allocbufa=NULL;       /* -> allocated bufa, iff allocated */
926
  decNumber bufb[D2N(DECBUFFER+1)];
927
  decNumber *allocbufb=NULL;       /* -> allocated bufb, iff allocated */
928
  decNumber *a, *b;                /* temporary pointers */
929
 
930
  #if DECCHECK
931
  if (decCheckOperands(res, lhs, rhs, set)) return res;
932
  #endif
933
 
934
  do {                                  /* protect allocated storage */
935
    /* if either is negative, take a copy and absolute */
936
    if (decNumberIsNegative(lhs)) {     /* lhs<0 */
937
      a=bufa;
938
      needbytes=sizeof(decNumber)+(D2U(lhs->digits)-1)*sizeof(Unit);
939
      if (needbytes>sizeof(bufa)) {     /* need malloc space */
940
        allocbufa=(decNumber *)malloc(needbytes);
941
        if (allocbufa==NULL) {          /* hopeless -- abandon */
942
          status|=DEC_Insufficient_storage;
943
          break;}
944
        a=allocbufa;                    /* use the allocated space */
945
        }
946
      decNumberCopy(a, lhs);            /* copy content */
947
      a->bits&=~DECNEG;                 /* .. and clear the sign */
948
      lhs=a;                            /* use copy from here on */
949
      }
950
    if (decNumberIsNegative(rhs)) {     /* rhs<0 */
951
      b=bufb;
952
      needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
953
      if (needbytes>sizeof(bufb)) {     /* need malloc space */
954
        allocbufb=(decNumber *)malloc(needbytes);
955
        if (allocbufb==NULL) {          /* hopeless -- abandon */
956
          status|=DEC_Insufficient_storage;
957
          break;}
958
        b=allocbufb;                    /* use the allocated space */
959
        }
960
      decNumberCopy(b, rhs);            /* copy content */
961
      b->bits&=~DECNEG;                 /* .. and clear the sign */
962
      rhs=b;                            /* use copy from here on */
963
      }
964
    decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
965
    } while(0);                          /* end protected */
966
 
967
  if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
968
  if (allocbufb!=NULL) free(allocbufb); /* .. */
969
  if (status!=0) decStatus(res, status, set);
970
  return res;
971
  } /* decNumberCompareTotalMag */
972
 
973
/* ------------------------------------------------------------------ */
974
/* decNumberDivide -- divide one number by another                    */
975
/*                                                                    */
976
/*   This computes C = A / B                                          */
977
/*                                                                    */
978
/*   res is C, the result.  C may be A and/or B (e.g., X=X/X)         */
979
/*   lhs is A                                                         */
980
/*   rhs is B                                                         */
981
/*   set is the context                                               */
982
/*                                                                    */
983
/* C must have space for set->digits digits.                          */
984
/* ------------------------------------------------------------------ */
985
decNumber * decNumberDivide(decNumber *res, const decNumber *lhs,
986
                            const decNumber *rhs, decContext *set) {
987
  uInt status=0;                 /* accumulator */
988
  decDivideOp(res, lhs, rhs, set, DIVIDE, &status);
989
  if (status!=0) decStatus(res, status, set);
990
  #if DECCHECK
991
  decCheckInexact(res, set);
992
  #endif
993
  return res;
994
  } /* decNumberDivide */
995
 
996
/* ------------------------------------------------------------------ */
997
/* decNumberDivideInteger -- divide and return integer quotient       */
998
/*                                                                    */
999
/*   This computes C = A # B, where # is the integer divide operator  */
1000
/*                                                                    */
1001
/*   res is C, the result.  C may be A and/or B (e.g., X=X#X)         */
1002
/*   lhs is A                                                         */
1003
/*   rhs is B                                                         */
1004
/*   set is the context                                               */
1005
/*                                                                    */
1006
/* C must have space for set->digits digits.                          */
1007
/* ------------------------------------------------------------------ */
1008
decNumber * decNumberDivideInteger(decNumber *res, const decNumber *lhs,
1009
                                   const decNumber *rhs, decContext *set) {
1010
  uInt status=0;                 /* accumulator */
1011
  decDivideOp(res, lhs, rhs, set, DIVIDEINT, &status);
1012
  if (status!=0) decStatus(res, status, set);
1013
  return res;
1014
  } /* decNumberDivideInteger */
1015
 
1016
/* ------------------------------------------------------------------ */
1017
/* decNumberExp -- exponentiation                                     */
1018
/*                                                                    */
1019
/*   This computes C = exp(A)                                         */
1020
/*                                                                    */
1021
/*   res is C, the result.  C may be A                                */
1022
/*   rhs is A                                                         */
1023
/*   set is the context; note that rounding mode has no effect        */
1024
/*                                                                    */
1025
/* C must have space for set->digits digits.                          */
1026
/*                                                                    */
1027
/* Mathematical function restrictions apply (see above); a NaN is     */
1028
/* returned with Invalid_operation if a restriction is violated.      */
1029
/*                                                                    */
1030
/* Finite results will always be full precision and Inexact, except   */
1031
/* when A is a zero or -Infinity (giving 1 or 0 respectively).        */
1032
/*                                                                    */
1033
/* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
1034
/* almost always be correctly rounded, but may be up to 1 ulp in      */
1035
/* error in rare cases.                                               */
1036
/* ------------------------------------------------------------------ */
1037
/* This is a wrapper for decExpOp which can handle the slightly wider */
1038
/* (double) range needed by Ln (which has to be able to calculate     */
1039
/* exp(-a) where a can be the tiniest number (Ntiny).                 */
1040
/* ------------------------------------------------------------------ */
1041
decNumber * decNumberExp(decNumber *res, const decNumber *rhs,
1042
                         decContext *set) {
1043
  uInt status=0;                 /* accumulator */
1044
  #if DECSUBSET
1045
  decNumber *allocrhs=NULL;        /* non-NULL if rounded rhs allocated */
1046
  #endif
1047
 
1048
  #if DECCHECK
1049
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1050
  #endif
1051
 
1052
  /* Check restrictions; these restrictions ensure that if h=8 (see */
1053
  /* decExpOp) then the result will either overflow or underflow to 0. */
1054
  /* Other math functions restrict the input range, too, for inverses. */
1055
  /* If not violated then carry out the operation. */
1056
  if (!decCheckMath(rhs, set, &status)) do { /* protect allocation */
1057
    #if DECSUBSET
1058
    if (!set->extended) {
1059
      /* reduce operand and set lostDigits status, as needed */
1060
      if (rhs->digits>set->digits) {
1061
        allocrhs=decRoundOperand(rhs, set, &status);
1062
        if (allocrhs==NULL) break;
1063
        rhs=allocrhs;
1064
        }
1065
      }
1066
    #endif
1067
    decExpOp(res, rhs, set, &status);
1068
    } while(0);                          /* end protected */
1069
 
1070
  #if DECSUBSET
1071
  if (allocrhs !=NULL) free(allocrhs);  /* drop any storage used */
1072
  #endif
1073
  /* apply significant status */
1074
  if (status!=0) decStatus(res, status, set);
1075
  #if DECCHECK
1076
  decCheckInexact(res, set);
1077
  #endif
1078
  return res;
1079
  } /* decNumberExp */
1080
 
1081
/* ------------------------------------------------------------------ */
1082
/* decNumberFMA -- fused multiply add                                 */
1083
/*                                                                    */
1084
/*   This computes D = (A * B) + C with only one rounding             */
1085
/*                                                                    */
1086
/*   res is D, the result.  D may be A or B or C (e.g., X=FMA(X,X,X)) */
1087
/*   lhs is A                                                         */
1088
/*   rhs is B                                                         */
1089
/*   fhs is C [far hand side]                                         */
1090
/*   set is the context                                               */
1091
/*                                                                    */
1092
/* Mathematical function restrictions apply (see above); a NaN is     */
1093
/* returned with Invalid_operation if a restriction is violated.      */
1094
/*                                                                    */
1095
/* C must have space for set->digits digits.                          */
1096
/* ------------------------------------------------------------------ */
1097
decNumber * decNumberFMA(decNumber *res, const decNumber *lhs,
1098
                         const decNumber *rhs, const decNumber *fhs,
1099
                         decContext *set) {
1100
  uInt status=0;            /* accumulator */
1101
  decContext dcmul;                /* context for the multiplication */
1102
  uInt needbytes;                  /* for space calculations */
1103
  decNumber bufa[D2N(DECBUFFER*2+1)];
1104
  decNumber *allocbufa=NULL;       /* -> allocated bufa, iff allocated */
1105
  decNumber *acc;                  /* accumulator pointer */
1106
  decNumber dzero;                 /* work */
1107
 
1108
  #if DECCHECK
1109
  if (decCheckOperands(res, lhs, rhs, set)) return res;
1110
  if (decCheckOperands(res, fhs, DECUNUSED, set)) return res;
1111
  #endif
1112
 
1113
  do {                                  /* protect allocated storage */
1114
    #if DECSUBSET
1115
    if (!set->extended) {               /* [undefined if subset] */
1116
      status|=DEC_Invalid_operation;
1117
      break;}
1118
    #endif
1119
    /* Check math restrictions [these ensure no overflow or underflow] */
1120
    if ((!decNumberIsSpecial(lhs) && decCheckMath(lhs, set, &status))
1121
     || (!decNumberIsSpecial(rhs) && decCheckMath(rhs, set, &status))
1122
     || (!decNumberIsSpecial(fhs) && decCheckMath(fhs, set, &status))) break;
1123
    /* set up context for multiply */
1124
    dcmul=*set;
1125
    dcmul.digits=lhs->digits+rhs->digits; /* just enough */
1126
    /* [The above may be an over-estimate for subset arithmetic, but that's OK] */
1127
    dcmul.emax=DEC_MAX_EMAX;            /* effectively unbounded .. */
1128
    dcmul.emin=DEC_MIN_EMIN;            /* [thanks to Math restrictions] */
1129
    /* set up decNumber space to receive the result of the multiply */
1130
    acc=bufa;                           /* may fit */
1131
    needbytes=sizeof(decNumber)+(D2U(dcmul.digits)-1)*sizeof(Unit);
1132
    if (needbytes>sizeof(bufa)) {       /* need malloc space */
1133
      allocbufa=(decNumber *)malloc(needbytes);
1134
      if (allocbufa==NULL) {            /* hopeless -- abandon */
1135
        status|=DEC_Insufficient_storage;
1136
        break;}
1137
      acc=allocbufa;                    /* use the allocated space */
1138
      }
1139
    /* multiply with extended range and necessary precision */
1140
    /*printf("emin=%ld\n", dcmul.emin); */
1141
    decMultiplyOp(acc, lhs, rhs, &dcmul, &status);
1142
    /* Only Invalid operation (from sNaN or Inf * 0) is possible in */
1143
    /* status; if either is seen than ignore fhs (in case it is */
1144
    /* another sNaN) and set acc to NaN unless we had an sNaN */
1145
    /* [decMultiplyOp leaves that to caller] */
1146
    /* Note sNaN has to go through addOp to shorten payload if */
1147
    /* necessary */
1148
    if ((status&DEC_Invalid_operation)!=0) {
1149
      if (!(status&DEC_sNaN)) {         /* but be true invalid */
1150
        decNumberZero(res);             /* acc not yet set */
1151
        res->bits=DECNAN;
1152
        break;
1153
        }
1154
      decNumberZero(&dzero);            /* make 0 (any non-NaN would do) */
1155
      fhs=&dzero;                       /* use that */
1156
      }
1157
    #if DECCHECK
1158
     else { /* multiply was OK */
1159
      if (status!=0) printf("Status=%08lx after FMA multiply\n", status);
1160
      }
1161
    #endif
1162
    /* add the third operand and result -> res, and all is done */
1163
    decAddOp(res, acc, fhs, set, 0, &status);
1164
    } while(0);                          /* end protected */
1165
 
1166
  if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
1167
  if (status!=0) decStatus(res, status, set);
1168
  #if DECCHECK
1169
  decCheckInexact(res, set);
1170
  #endif
1171
  return res;
1172
  } /* decNumberFMA */
1173
 
1174
/* ------------------------------------------------------------------ */
1175
/* decNumberInvert -- invert a Number, digitwise                      */
1176
/*                                                                    */
1177
/*   This computes C = ~A                                             */
1178
/*                                                                    */
1179
/*   res is C, the result.  C may be A (e.g., X=~X)                   */
1180
/*   rhs is A                                                         */
1181
/*   set is the context (used for result length and error report)     */
1182
/*                                                                    */
1183
/* C must have space for set->digits digits.                          */
1184
/*                                                                    */
1185
/* Logical function restrictions apply (see above); a NaN is          */
1186
/* returned with Invalid_operation if a restriction is violated.      */
1187
/* ------------------------------------------------------------------ */
1188
decNumber * decNumberInvert(decNumber *res, const decNumber *rhs,
1189
                            decContext *set) {
1190
  const Unit *ua, *msua;                /* -> operand and its msu */
1191
  Unit  *uc, *msuc;                     /* -> result and its msu */
1192
  Int   msudigs;                        /* digits in res msu */
1193
  #if DECCHECK
1194
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1195
  #endif
1196
 
1197
  if (rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
1198
    decStatus(res, DEC_Invalid_operation, set);
1199
    return res;
1200
    }
1201
  /* operand is valid */
1202
  ua=rhs->lsu;                          /* bottom-up */
1203
  uc=res->lsu;                          /* .. */
1204
  msua=ua+D2U(rhs->digits)-1;           /* -> msu of rhs */
1205
  msuc=uc+D2U(set->digits)-1;           /* -> msu of result */
1206
  msudigs=MSUDIGITS(set->digits);       /* [faster than remainder] */
1207
  for (; uc<=msuc; ua++, uc++) {        /* Unit loop */
1208
    Unit a;                             /* extract unit */
1209
    Int  i, j;                          /* work */
1210
    if (ua>msua) a=0;
1211
     else a=*ua;
1212
    *uc=0;                               /* can now write back */
1213
    /* always need to examine all bits in rhs */
1214
    /* This loop could be unrolled and/or use BIN2BCD tables */
1215
    for (i=0; i<DECDPUN; i++) {
1216
      if ((~a)&1) *uc=*uc+(Unit)powers[i];   /* effect INVERT */
1217
      j=a%10;
1218
      a=a/10;
1219
      if (j>1) {
1220
        decStatus(res, DEC_Invalid_operation, set);
1221
        return res;
1222
        }
1223
      if (uc==msuc && i==msudigs-1) break;   /* just did final digit */
1224
      } /* each digit */
1225
    } /* each unit */
1226
  /* [here uc-1 is the msu of the result] */
1227
  res->digits=decGetDigits(res->lsu, uc-res->lsu);
1228
  res->exponent=0;                       /* integer */
1229
  res->bits=0;                           /* sign=0 */
1230
  return res;  /* [no status to set] */
1231
  } /* decNumberInvert */
1232
 
1233
/* ------------------------------------------------------------------ */
1234
/* decNumberLn -- natural logarithm                                   */
1235
/*                                                                    */
1236
/*   This computes C = ln(A)                                          */
1237
/*                                                                    */
1238
/*   res is C, the result.  C may be A                                */
1239
/*   rhs is A                                                         */
1240
/*   set is the context; note that rounding mode has no effect        */
1241
/*                                                                    */
1242
/* C must have space for set->digits digits.                          */
1243
/*                                                                    */
1244
/* Notable cases:                                                     */
1245
/*   A<0 -> Invalid                                                   */
1246
/*   A=0 -> -Infinity (Exact)                                         */
1247
/*   A=+Infinity -> +Infinity (Exact)                                 */
1248
/*   A=1 exactly -> 0 (Exact)                                         */
1249
/*                                                                    */
1250
/* Mathematical function restrictions apply (see above); a NaN is     */
1251
/* returned with Invalid_operation if a restriction is violated.      */
1252
/*                                                                    */
1253
/* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
1254
/* almost always be correctly rounded, but may be up to 1 ulp in      */
1255
/* error in rare cases.                                               */
1256
/* ------------------------------------------------------------------ */
1257
/* This is a wrapper for decLnOp which can handle the slightly wider  */
1258
/* (+11) range needed by Ln, Log10, etc. (which may have to be able   */
1259
/* to calculate at p+e+2).                                            */
1260
/* ------------------------------------------------------------------ */
1261
decNumber * decNumberLn(decNumber *res, const decNumber *rhs,
1262
                        decContext *set) {
1263
  uInt status=0;            /* accumulator */
1264
  #if DECSUBSET
1265
  decNumber *allocrhs=NULL;        /* non-NULL if rounded rhs allocated */
1266
  #endif
1267
 
1268
  #if DECCHECK
1269
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1270
  #endif
1271
 
1272
  /* Check restrictions; this is a math function; if not violated */
1273
  /* then carry out the operation. */
1274
  if (!decCheckMath(rhs, set, &status)) do { /* protect allocation */
1275
    #if DECSUBSET
1276
    if (!set->extended) {
1277
      /* reduce operand and set lostDigits status, as needed */
1278
      if (rhs->digits>set->digits) {
1279
        allocrhs=decRoundOperand(rhs, set, &status);
1280
        if (allocrhs==NULL) break;
1281
        rhs=allocrhs;
1282
        }
1283
      /* special check in subset for rhs=0 */
1284
      if (ISZERO(rhs)) {                /* +/- zeros -> error */
1285
        status|=DEC_Invalid_operation;
1286
        break;}
1287
      } /* extended=0 */
1288
    #endif
1289
    decLnOp(res, rhs, set, &status);
1290
    } while(0);                          /* end protected */
1291
 
1292
  #if DECSUBSET
1293
  if (allocrhs !=NULL) free(allocrhs);  /* drop any storage used */
1294
  #endif
1295
  /* apply significant status */
1296
  if (status!=0) decStatus(res, status, set);
1297
  #if DECCHECK
1298
  decCheckInexact(res, set);
1299
  #endif
1300
  return res;
1301
  } /* decNumberLn */
1302
 
1303
/* ------------------------------------------------------------------ */
1304
/* decNumberLogB - get adjusted exponent, by 754r rules               */
1305
/*                                                                    */
1306
/*   This computes C = adjustedexponent(A)                            */
1307
/*                                                                    */
1308
/*   res is C, the result.  C may be A                                */
1309
/*   rhs is A                                                         */
1310
/*   set is the context, used only for digits and status              */
1311
/*                                                                    */
1312
/* C must have space for 10 digits (A might have 10**9 digits and     */
1313
/* an exponent of +999999999, or one digit and an exponent of         */
1314
/* -1999999999).                                                      */
1315
/*                                                                    */
1316
/* This returns the adjusted exponent of A after (in theory) padding  */
1317
/* with zeros on the right to set->digits digits while keeping the    */
1318
/* same value.  The exponent is not limited by emin/emax.             */
1319
/*                                                                    */
1320
/* Notable cases:                                                     */
1321
/*   A<0 -> Use |A|                                                   */
1322
/*   A=0 -> -Infinity (Division by zero)                              */
1323
/*   A=Infinite -> +Infinity (Exact)                                  */
1324
/*   A=1 exactly -> 0 (Exact)                                         */
1325
/*   NaNs are propagated as usual                                     */
1326
/* ------------------------------------------------------------------ */
1327
decNumber * decNumberLogB(decNumber *res, const decNumber *rhs,
1328
                          decContext *set) {
1329
  uInt status=0;            /* accumulator */
1330
 
1331
  #if DECCHECK
1332
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1333
  #endif
1334
 
1335
  /* NaNs as usual; Infinities return +Infinity; 0->oops */
1336
  if (decNumberIsNaN(rhs)) decNaNs(res, rhs, NULL, set, &status);
1337
   else if (decNumberIsInfinite(rhs)) decNumberCopyAbs(res, rhs);
1338
   else if (decNumberIsZero(rhs)) {
1339
    decNumberZero(res);                 /* prepare for Infinity */
1340
    res->bits=DECNEG|DECINF;            /* -Infinity */
1341
    status|=DEC_Division_by_zero;       /* as per 754r */
1342
    }
1343
   else { /* finite non-zero */
1344
    Int ae=rhs->exponent+rhs->digits-1; /* adjusted exponent */
1345
    decNumberFromInt32(res, ae);        /* lay it out */
1346
    }
1347
 
1348
  if (status!=0) decStatus(res, status, set);
1349
  return res;
1350
  } /* decNumberLogB */
1351
 
1352
/* ------------------------------------------------------------------ */
1353
/* decNumberLog10 -- logarithm in base 10                             */
1354
/*                                                                    */
1355
/*   This computes C = log10(A)                                       */
1356
/*                                                                    */
1357
/*   res is C, the result.  C may be A                                */
1358
/*   rhs is A                                                         */
1359
/*   set is the context; note that rounding mode has no effect        */
1360
/*                                                                    */
1361
/* C must have space for set->digits digits.                          */
1362
/*                                                                    */
1363
/* Notable cases:                                                     */
1364
/*   A<0 -> Invalid                                                   */
1365
/*   A=0 -> -Infinity (Exact)                                         */
1366
/*   A=+Infinity -> +Infinity (Exact)                                 */
1367
/*   A=10**n (if n is an integer) -> n (Exact)                        */
1368
/*                                                                    */
1369
/* Mathematical function restrictions apply (see above); a NaN is     */
1370
/* returned with Invalid_operation if a restriction is violated.      */
1371
/*                                                                    */
1372
/* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
1373
/* almost always be correctly rounded, but may be up to 1 ulp in      */
1374
/* error in rare cases.                                               */
1375
/* ------------------------------------------------------------------ */
1376
/* This calculates ln(A)/ln(10) using appropriate precision.  For     */
1377
/* ln(A) this is the max(p, rhs->digits + t) + 3, where p is the      */
1378
/* requested digits and t is the number of digits in the exponent     */
1379
/* (maximum 6).  For ln(10) it is p + 3; this is often handled by the */
1380
/* fastpath in decLnOp.  The final division is done to the requested  */
1381
/* precision.                                                         */
1382
/* ------------------------------------------------------------------ */
1383
decNumber * decNumberLog10(decNumber *res, const decNumber *rhs,
1384
                          decContext *set) {
1385
  uInt status=0, ignore=0;           /* status accumulators */
1386
  uInt needbytes;                  /* for space calculations */
1387
  Int p;                           /* working precision */
1388
  Int t;                           /* digits in exponent of A */
1389
 
1390
  /* buffers for a and b working decimals */
1391
  /* (adjustment calculator, same size) */
1392
  decNumber bufa[D2N(DECBUFFER+2)];
1393
  decNumber *allocbufa=NULL;       /* -> allocated bufa, iff allocated */
1394
  decNumber *a=bufa;               /* temporary a */
1395
  decNumber bufb[D2N(DECBUFFER+2)];
1396
  decNumber *allocbufb=NULL;       /* -> allocated bufb, iff allocated */
1397
  decNumber *b=bufb;               /* temporary b */
1398
  decNumber bufw[D2N(10)];         /* working 2-10 digit number */
1399
  decNumber *w=bufw;               /* .. */
1400
  #if DECSUBSET
1401
  decNumber *allocrhs=NULL;        /* non-NULL if rounded rhs allocated */
1402
  #endif
1403
 
1404
  decContext aset;                 /* working context */
1405
 
1406
  #if DECCHECK
1407
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1408
  #endif
1409
 
1410
  /* Check restrictions; this is a math function; if not violated */
1411
  /* then carry out the operation. */
1412
  if (!decCheckMath(rhs, set, &status)) do { /* protect malloc */
1413
    #if DECSUBSET
1414
    if (!set->extended) {
1415
      /* reduce operand and set lostDigits status, as needed */
1416
      if (rhs->digits>set->digits) {
1417
        allocrhs=decRoundOperand(rhs, set, &status);
1418
        if (allocrhs==NULL) break;
1419
        rhs=allocrhs;
1420
        }
1421
      /* special check in subset for rhs=0 */
1422
      if (ISZERO(rhs)) {                /* +/- zeros -> error */
1423
        status|=DEC_Invalid_operation;
1424
        break;}
1425
      } /* extended=0 */
1426
    #endif
1427
 
1428
    decContextDefault(&aset, DEC_INIT_DECIMAL64); /* clean context */
1429
 
1430
    /* handle exact powers of 10; only check if +ve finite */
1431
    if (!(rhs->bits&(DECNEG|DECSPECIAL)) && !ISZERO(rhs)) {
1432
      Int residue=0;                /* (no residue) */
1433
      uInt copystat=0;              /* clean status */
1434
 
1435
      /* round to a single digit... */
1436
      aset.digits=1;
1437
      decCopyFit(w, rhs, &aset, &residue, &copystat); /* copy & shorten */
1438
      /* if exact and the digit is 1, rhs is a power of 10 */
1439
      if (!(copystat&DEC_Inexact) && w->lsu[0]==1) {
1440
        /* the exponent, conveniently, is the power of 10; making */
1441
        /* this the result needs a little care as it might not fit, */
1442
        /* so first convert it into the working number, and then move */
1443
        /* to res */
1444
        decNumberFromInt32(w, w->exponent);
1445
        residue=0;
1446
        decCopyFit(res, w, set, &residue, &status); /* copy & round */
1447
        decFinish(res, set, &residue, &status);     /* cleanup/set flags */
1448
        break;
1449
        } /* not a power of 10 */
1450
      } /* not a candidate for exact */
1451
 
1452
    /* simplify the information-content calculation to use 'total */
1453
    /* number of digits in a, including exponent' as compared to the */
1454
    /* requested digits, as increasing this will only rarely cost an */
1455
    /* iteration in ln(a) anyway */
1456
    t=6;                                /* it can never be >6 */
1457
 
1458
    /* allocate space when needed... */
1459
    p=(rhs->digits+t>set->digits?rhs->digits+t:set->digits)+3;
1460
    needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
1461
    if (needbytes>sizeof(bufa)) {       /* need malloc space */
1462
      allocbufa=(decNumber *)malloc(needbytes);
1463
      if (allocbufa==NULL) {            /* hopeless -- abandon */
1464
        status|=DEC_Insufficient_storage;
1465
        break;}
1466
      a=allocbufa;                      /* use the allocated space */
1467
      }
1468
    aset.digits=p;                      /* as calculated */
1469
    aset.emax=DEC_MAX_MATH;             /* usual bounds */
1470
    aset.emin=-DEC_MAX_MATH;            /* .. */
1471
    aset.clamp=0;                        /* and no concrete format */
1472
    decLnOp(a, rhs, &aset, &status);    /* a=ln(rhs) */
1473
 
1474
    /* skip the division if the result so far is infinite, NaN, or */
1475
    /* zero, or there was an error; note NaN from sNaN needs copy */
1476
    if (status&DEC_NaNs && !(status&DEC_sNaN)) break;
1477
    if (a->bits&DECSPECIAL || ISZERO(a)) {
1478
      decNumberCopy(res, a);            /* [will fit] */
1479
      break;}
1480
 
1481
    /* for ln(10) an extra 3 digits of precision are needed */
1482
    p=set->digits+3;
1483
    needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
1484
    if (needbytes>sizeof(bufb)) {       /* need malloc space */
1485
      allocbufb=(decNumber *)malloc(needbytes);
1486
      if (allocbufb==NULL) {            /* hopeless -- abandon */
1487
        status|=DEC_Insufficient_storage;
1488
        break;}
1489
      b=allocbufb;                      /* use the allocated space */
1490
      }
1491
    decNumberZero(w);                   /* set up 10... */
1492
    #if DECDPUN==1
1493
    w->lsu[1]=1; w->lsu[0]=0;             /* .. */
1494
    #else
1495
    w->lsu[0]=10;                        /* .. */
1496
    #endif
1497
    w->digits=2;                        /* .. */
1498
 
1499
    aset.digits=p;
1500
    decLnOp(b, w, &aset, &ignore);      /* b=ln(10) */
1501
 
1502
    aset.digits=set->digits;            /* for final divide */
1503
    decDivideOp(res, a, b, &aset, DIVIDE, &status); /* into result */
1504
    } while(0);                          /* [for break] */
1505
 
1506
  if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
1507
  if (allocbufb!=NULL) free(allocbufb); /* .. */
1508
  #if DECSUBSET
1509
  if (allocrhs !=NULL) free(allocrhs);  /* .. */
1510
  #endif
1511
  /* apply significant status */
1512
  if (status!=0) decStatus(res, status, set);
1513
  #if DECCHECK
1514
  decCheckInexact(res, set);
1515
  #endif
1516
  return res;
1517
  } /* decNumberLog10 */
1518
 
1519
/* ------------------------------------------------------------------ */
1520
/* decNumberMax -- compare two Numbers and return the maximum         */
1521
/*                                                                    */
1522
/*   This computes C = A ? B, returning the maximum by 754R rules     */
1523
/*                                                                    */
1524
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
1525
/*   lhs is A                                                         */
1526
/*   rhs is B                                                         */
1527
/*   set is the context                                               */
1528
/*                                                                    */
1529
/* C must have space for set->digits digits.                          */
1530
/* ------------------------------------------------------------------ */
1531
decNumber * decNumberMax(decNumber *res, const decNumber *lhs,
1532
                         const decNumber *rhs, decContext *set) {
1533
  uInt status=0;                 /* accumulator */
1534
  decCompareOp(res, lhs, rhs, set, COMPMAX, &status);
1535
  if (status!=0) decStatus(res, status, set);
1536
  #if DECCHECK
1537
  decCheckInexact(res, set);
1538
  #endif
1539
  return res;
1540
  } /* decNumberMax */
1541
 
1542
/* ------------------------------------------------------------------ */
1543
/* decNumberMaxMag -- compare and return the maximum by magnitude     */
1544
/*                                                                    */
1545
/*   This computes C = A ? B, returning the maximum by 754R rules     */
1546
/*                                                                    */
1547
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
1548
/*   lhs is A                                                         */
1549
/*   rhs is B                                                         */
1550
/*   set is the context                                               */
1551
/*                                                                    */
1552
/* C must have space for set->digits digits.                          */
1553
/* ------------------------------------------------------------------ */
1554
decNumber * decNumberMaxMag(decNumber *res, const decNumber *lhs,
1555
                         const decNumber *rhs, decContext *set) {
1556
  uInt status=0;                 /* accumulator */
1557
  decCompareOp(res, lhs, rhs, set, COMPMAXMAG, &status);
1558
  if (status!=0) decStatus(res, status, set);
1559
  #if DECCHECK
1560
  decCheckInexact(res, set);
1561
  #endif
1562
  return res;
1563
  } /* decNumberMaxMag */
1564
 
1565
/* ------------------------------------------------------------------ */
1566
/* decNumberMin -- compare two Numbers and return the minimum         */
1567
/*                                                                    */
1568
/*   This computes C = A ? B, returning the minimum by 754R rules     */
1569
/*                                                                    */
1570
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
1571
/*   lhs is A                                                         */
1572
/*   rhs is B                                                         */
1573
/*   set is the context                                               */
1574
/*                                                                    */
1575
/* C must have space for set->digits digits.                          */
1576
/* ------------------------------------------------------------------ */
1577
decNumber * decNumberMin(decNumber *res, const decNumber *lhs,
1578
                         const decNumber *rhs, decContext *set) {
1579
  uInt status=0;                 /* accumulator */
1580
  decCompareOp(res, lhs, rhs, set, COMPMIN, &status);
1581
  if (status!=0) decStatus(res, status, set);
1582
  #if DECCHECK
1583
  decCheckInexact(res, set);
1584
  #endif
1585
  return res;
1586
  } /* decNumberMin */
1587
 
1588
/* ------------------------------------------------------------------ */
1589
/* decNumberMinMag -- compare and return the minimum by magnitude     */
1590
/*                                                                    */
1591
/*   This computes C = A ? B, returning the minimum by 754R rules     */
1592
/*                                                                    */
1593
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
1594
/*   lhs is A                                                         */
1595
/*   rhs is B                                                         */
1596
/*   set is the context                                               */
1597
/*                                                                    */
1598
/* C must have space for set->digits digits.                          */
1599
/* ------------------------------------------------------------------ */
1600
decNumber * decNumberMinMag(decNumber *res, const decNumber *lhs,
1601
                         const decNumber *rhs, decContext *set) {
1602
  uInt status=0;                 /* accumulator */
1603
  decCompareOp(res, lhs, rhs, set, COMPMINMAG, &status);
1604
  if (status!=0) decStatus(res, status, set);
1605
  #if DECCHECK
1606
  decCheckInexact(res, set);
1607
  #endif
1608
  return res;
1609
  } /* decNumberMinMag */
1610
 
1611
/* ------------------------------------------------------------------ */
1612
/* decNumberMinus -- prefix minus operator                            */
1613
/*                                                                    */
1614
/*   This computes C = 0 - A                                          */
1615
/*                                                                    */
1616
/*   res is C, the result.  C may be A                                */
1617
/*   rhs is A                                                         */
1618
/*   set is the context                                               */
1619
/*                                                                    */
1620
/* See also decNumberCopyNegate for a quiet bitwise version of this.  */
1621
/* C must have space for set->digits digits.                          */
1622
/* ------------------------------------------------------------------ */
1623
/* Simply use AddOp for the subtract, which will do the necessary.    */
1624
/* ------------------------------------------------------------------ */
1625
decNumber * decNumberMinus(decNumber *res, const decNumber *rhs,
1626
                           decContext *set) {
1627
  decNumber dzero;
1628
  uInt status=0;                 /* accumulator */
1629
 
1630
  #if DECCHECK
1631
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1632
  #endif
1633
 
1634
  decNumberZero(&dzero);                /* make 0 */
1635
  dzero.exponent=rhs->exponent;         /* [no coefficient expansion] */
1636
  decAddOp(res, &dzero, rhs, set, DECNEG, &status);
1637
  if (status!=0) decStatus(res, status, set);
1638
  #if DECCHECK
1639
  decCheckInexact(res, set);
1640
  #endif
1641
  return res;
1642
  } /* decNumberMinus */
1643
 
1644
/* ------------------------------------------------------------------ */
1645
/* decNumberNextMinus -- next towards -Infinity                       */
1646
/*                                                                    */
1647
/*   This computes C = A - infinitesimal, rounded towards -Infinity   */
1648
/*                                                                    */
1649
/*   res is C, the result.  C may be A                                */
1650
/*   rhs is A                                                         */
1651
/*   set is the context                                               */
1652
/*                                                                    */
1653
/* This is a generalization of 754r NextDown.                         */
1654
/* ------------------------------------------------------------------ */
1655
decNumber * decNumberNextMinus(decNumber *res, const decNumber *rhs,
1656
                               decContext *set) {
1657
  decNumber dtiny;                           /* constant */
1658
  decContext workset=*set;                   /* work */
1659
  uInt status=0;                      /* accumulator */
1660
  #if DECCHECK
1661
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1662
  #endif
1663
 
1664
  /* +Infinity is the special case */
1665
  if ((rhs->bits&(DECINF|DECNEG))==DECINF) {
1666
    decSetMaxValue(res, set);                /* is +ve */
1667
    /* there is no status to set */
1668
    return res;
1669
    }
1670
  decNumberZero(&dtiny);                     /* start with 0 */
1671
  dtiny.lsu[0]=1;                             /* make number that is .. */
1672
  dtiny.exponent=DEC_MIN_EMIN-1;             /* .. smaller than tiniest */
1673
  workset.round=DEC_ROUND_FLOOR;
1674
  decAddOp(res, rhs, &dtiny, &workset, DECNEG, &status);
1675
  status&=DEC_Invalid_operation|DEC_sNaN;    /* only sNaN Invalid please */
1676
  if (status!=0) decStatus(res, status, set);
1677
  return res;
1678
  } /* decNumberNextMinus */
1679
 
1680
/* ------------------------------------------------------------------ */
1681
/* decNumberNextPlus -- next towards +Infinity                        */
1682
/*                                                                    */
1683
/*   This computes C = A + infinitesimal, rounded towards +Infinity   */
1684
/*                                                                    */
1685
/*   res is C, the result.  C may be A                                */
1686
/*   rhs is A                                                         */
1687
/*   set is the context                                               */
1688
/*                                                                    */
1689
/* This is a generalization of 754r NextUp.                           */
1690
/* ------------------------------------------------------------------ */
1691
decNumber * decNumberNextPlus(decNumber *res, const decNumber *rhs,
1692
                              decContext *set) {
1693
  decNumber dtiny;                           /* constant */
1694
  decContext workset=*set;                   /* work */
1695
  uInt status=0;                      /* accumulator */
1696
  #if DECCHECK
1697
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1698
  #endif
1699
 
1700
  /* -Infinity is the special case */
1701
  if ((rhs->bits&(DECINF|DECNEG))==(DECINF|DECNEG)) {
1702
    decSetMaxValue(res, set);
1703
    res->bits=DECNEG;                        /* negative */
1704
    /* there is no status to set */
1705
    return res;
1706
    }
1707
  decNumberZero(&dtiny);                     /* start with 0 */
1708
  dtiny.lsu[0]=1;                             /* make number that is .. */
1709
  dtiny.exponent=DEC_MIN_EMIN-1;             /* .. smaller than tiniest */
1710
  workset.round=DEC_ROUND_CEILING;
1711
  decAddOp(res, rhs, &dtiny, &workset, 0, &status);
1712
  status&=DEC_Invalid_operation|DEC_sNaN;    /* only sNaN Invalid please */
1713
  if (status!=0) decStatus(res, status, set);
1714
  return res;
1715
  } /* decNumberNextPlus */
1716
 
1717
/* ------------------------------------------------------------------ */
1718
/* decNumberNextToward -- next towards rhs                            */
1719
/*                                                                    */
1720
/*   This computes C = A +/- infinitesimal, rounded towards           */
1721
/*   +/-Infinity in the direction of B, as per 754r nextafter rules   */
1722
/*                                                                    */
1723
/*   res is C, the result.  C may be A or B.                          */
1724
/*   lhs is A                                                         */
1725
/*   rhs is B                                                         */
1726
/*   set is the context                                               */
1727
/*                                                                    */
1728
/* This is a generalization of 754r NextAfter.                        */
1729
/* ------------------------------------------------------------------ */
1730
decNumber * decNumberNextToward(decNumber *res, const decNumber *lhs,
1731
                                const decNumber *rhs, decContext *set) {
1732
  decNumber dtiny;                           /* constant */
1733
  decContext workset=*set;                   /* work */
1734
  Int result;                                /* .. */
1735
  uInt status=0;                      /* accumulator */
1736
  #if DECCHECK
1737
  if (decCheckOperands(res, lhs, rhs, set)) return res;
1738
  #endif
1739
 
1740
  if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs)) {
1741
    decNaNs(res, lhs, rhs, set, &status);
1742
    }
1743
   else { /* Is numeric, so no chance of sNaN Invalid, etc. */
1744
    result=decCompare(lhs, rhs, 0);      /* sign matters */
1745
    if (result==BADINT) status|=DEC_Insufficient_storage; /* rare */
1746
     else { /* valid compare */
1747
      if (result==0) decNumberCopySign(res, lhs, rhs); /* easy */
1748
       else { /* differ: need NextPlus or NextMinus */
1749
        uByte sub;                      /* add or subtract */
1750
        if (result<0) {                  /* lhs<rhs, do nextplus */
1751
          /* -Infinity is the special case */
1752
          if ((lhs->bits&(DECINF|DECNEG))==(DECINF|DECNEG)) {
1753
            decSetMaxValue(res, set);
1754
            res->bits=DECNEG;           /* negative */
1755
            return res;                 /* there is no status to set */
1756
            }
1757
          workset.round=DEC_ROUND_CEILING;
1758
          sub=0;                 /* add, please */
1759
          } /* plus */
1760
         else {                         /* lhs>rhs, do nextminus */
1761
          /* +Infinity is the special case */
1762
          if ((lhs->bits&(DECINF|DECNEG))==DECINF) {
1763
            decSetMaxValue(res, set);
1764
            return res;                 /* there is no status to set */
1765
            }
1766
          workset.round=DEC_ROUND_FLOOR;
1767
          sub=DECNEG;                   /* subtract, please */
1768
          } /* minus */
1769
        decNumberZero(&dtiny);          /* start with 0 */
1770
        dtiny.lsu[0]=1;                  /* make number that is .. */
1771
        dtiny.exponent=DEC_MIN_EMIN-1;  /* .. smaller than tiniest */
1772
        decAddOp(res, lhs, &dtiny, &workset, sub, &status); /* + or - */
1773
        /* turn off exceptions if the result is a normal number */
1774
        /* (including Nmin), otherwise let all status through */
1775
        if (decNumberIsNormal(res, set)) status=0;
1776
        } /* unequal */
1777
      } /* compare OK */
1778
    } /* numeric */
1779
  if (status!=0) decStatus(res, status, set);
1780
  return res;
1781
  } /* decNumberNextToward */
1782
 
1783
/* ------------------------------------------------------------------ */
1784
/* decNumberOr -- OR two Numbers, digitwise                           */
1785
/*                                                                    */
1786
/*   This computes C = A | B                                          */
1787
/*                                                                    */
1788
/*   res is C, the result.  C may be A and/or B (e.g., X=X|X)         */
1789
/*   lhs is A                                                         */
1790
/*   rhs is B                                                         */
1791
/*   set is the context (used for result length and error report)     */
1792
/*                                                                    */
1793
/* C must have space for set->digits digits.                          */
1794
/*                                                                    */
1795
/* Logical function restrictions apply (see above); a NaN is          */
1796
/* returned with Invalid_operation if a restriction is violated.      */
1797
/* ------------------------------------------------------------------ */
1798
decNumber * decNumberOr(decNumber *res, const decNumber *lhs,
1799
                        const decNumber *rhs, decContext *set) {
1800
  const Unit *ua, *ub;                  /* -> operands */
1801
  const Unit *msua, *msub;              /* -> operand msus */
1802
  Unit  *uc, *msuc;                     /* -> result and its msu */
1803
  Int   msudigs;                        /* digits in res msu */
1804
  #if DECCHECK
1805
  if (decCheckOperands(res, lhs, rhs, set)) return res;
1806
  #endif
1807
 
1808
  if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
1809
   || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
1810
    decStatus(res, DEC_Invalid_operation, set);
1811
    return res;
1812
    }
1813
  /* operands are valid */
1814
  ua=lhs->lsu;                          /* bottom-up */
1815
  ub=rhs->lsu;                          /* .. */
1816
  uc=res->lsu;                          /* .. */
1817
  msua=ua+D2U(lhs->digits)-1;           /* -> msu of lhs */
1818
  msub=ub+D2U(rhs->digits)-1;           /* -> msu of rhs */
1819
  msuc=uc+D2U(set->digits)-1;           /* -> msu of result */
1820
  msudigs=MSUDIGITS(set->digits);       /* [faster than remainder] */
1821
  for (; uc<=msuc; ua++, ub++, uc++) {  /* Unit loop */
1822
    Unit a, b;                          /* extract units */
1823
    if (ua>msua) a=0;
1824
     else a=*ua;
1825
    if (ub>msub) b=0;
1826
     else b=*ub;
1827
    *uc=0;                               /* can now write back */
1828
    if (a|b) {                          /* maybe 1 bits to examine */
1829
      Int i, j;
1830
      /* This loop could be unrolled and/or use BIN2BCD tables */
1831
      for (i=0; i<DECDPUN; i++) {
1832
        if ((a|b)&1) *uc=*uc+(Unit)powers[i];     /* effect OR */
1833
        j=a%10;
1834
        a=a/10;
1835
        j|=b%10;
1836
        b=b/10;
1837
        if (j>1) {
1838
          decStatus(res, DEC_Invalid_operation, set);
1839
          return res;
1840
          }
1841
        if (uc==msuc && i==msudigs-1) break;      /* just did final digit */
1842
        } /* each digit */
1843
      } /* non-zero */
1844
    } /* each unit */
1845
  /* [here uc-1 is the msu of the result] */
1846
  res->digits=decGetDigits(res->lsu, uc-res->lsu);
1847
  res->exponent=0;                       /* integer */
1848
  res->bits=0;                           /* sign=0 */
1849
  return res;  /* [no status to set] */
1850
  } /* decNumberOr */
1851
 
1852
/* ------------------------------------------------------------------ */
1853
/* decNumberPlus -- prefix plus operator                              */
1854
/*                                                                    */
1855
/*   This computes C = 0 + A                                          */
1856
/*                                                                    */
1857
/*   res is C, the result.  C may be A                                */
1858
/*   rhs is A                                                         */
1859
/*   set is the context                                               */
1860
/*                                                                    */
1861
/* See also decNumberCopy for a quiet bitwise version of this.        */
1862
/* C must have space for set->digits digits.                          */
1863
/* ------------------------------------------------------------------ */
1864
/* This simply uses AddOp; Add will take fast path after preparing A. */
1865
/* Performance is a concern here, as this routine is often used to    */
1866
/* check operands and apply rounding and overflow/underflow testing.  */
1867
/* ------------------------------------------------------------------ */
1868
decNumber * decNumberPlus(decNumber *res, const decNumber *rhs,
1869
                          decContext *set) {
1870
  decNumber dzero;
1871
  uInt status=0;                 /* accumulator */
1872
  #if DECCHECK
1873
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1874
  #endif
1875
 
1876
  decNumberZero(&dzero);                /* make 0 */
1877
  dzero.exponent=rhs->exponent;         /* [no coefficient expansion] */
1878
  decAddOp(res, &dzero, rhs, set, 0, &status);
1879
  if (status!=0) decStatus(res, status, set);
1880
  #if DECCHECK
1881
  decCheckInexact(res, set);
1882
  #endif
1883
  return res;
1884
  } /* decNumberPlus */
1885
 
1886
/* ------------------------------------------------------------------ */
1887
/* decNumberMultiply -- multiply two Numbers                          */
1888
/*                                                                    */
1889
/*   This computes C = A x B                                          */
1890
/*                                                                    */
1891
/*   res is C, the result.  C may be A and/or B (e.g., X=X+X)         */
1892
/*   lhs is A                                                         */
1893
/*   rhs is B                                                         */
1894
/*   set is the context                                               */
1895
/*                                                                    */
1896
/* C must have space for set->digits digits.                          */
1897
/* ------------------------------------------------------------------ */
1898
decNumber * decNumberMultiply(decNumber *res, const decNumber *lhs,
1899
                              const decNumber *rhs, decContext *set) {
1900
  uInt status=0;            /* accumulator */
1901
  decMultiplyOp(res, lhs, rhs, set, &status);
1902
  if (status!=0) decStatus(res, status, set);
1903
  #if DECCHECK
1904
  decCheckInexact(res, set);
1905
  #endif
1906
  return res;
1907
  } /* decNumberMultiply */
1908
 
1909
/* ------------------------------------------------------------------ */
1910
/* decNumberPower -- raise a number to a power                        */
1911
/*                                                                    */
1912
/*   This computes C = A ** B                                         */
1913
/*                                                                    */
1914
/*   res is C, the result.  C may be A and/or B (e.g., X=X**X)        */
1915
/*   lhs is A                                                         */
1916
/*   rhs is B                                                         */
1917
/*   set is the context                                               */
1918
/*                                                                    */
1919
/* C must have space for set->digits digits.                          */
1920
/*                                                                    */
1921
/* Mathematical function restrictions apply (see above); a NaN is     */
1922
/* returned with Invalid_operation if a restriction is violated.      */
1923
/*                                                                    */
1924
/* However, if 1999999997<=B<=999999999 and B is an integer then the  */
1925
/* restrictions on A and the context are relaxed to the usual bounds, */
1926
/* for compatibility with the earlier (integer power only) version    */
1927
/* of this function.                                                  */
1928
/*                                                                    */
1929
/* When B is an integer, the result may be exact, even if rounded.    */
1930
/*                                                                    */
1931
/* The final result is rounded according to the context; it will      */
1932
/* almost always be correctly rounded, but may be up to 1 ulp in      */
1933
/* error in rare cases.                                               */
1934
/* ------------------------------------------------------------------ */
1935
decNumber * decNumberPower(decNumber *res, const decNumber *lhs,
1936
                           const decNumber *rhs, decContext *set) {
1937
  #if DECSUBSET
1938
  decNumber *alloclhs=NULL;        /* non-NULL if rounded lhs allocated */
1939
  decNumber *allocrhs=NULL;        /* .., rhs */
1940
  #endif
1941
  decNumber *allocdac=NULL;        /* -> allocated acc buffer, iff used */
1942
  decNumber *allocinv=NULL;        /* -> allocated 1/x buffer, iff used */
1943
  Int   reqdigits=set->digits;     /* requested DIGITS */
1944
  Int   n;                         /* rhs in binary */
1945
  Flag  rhsint=0;                   /* 1 if rhs is an integer */
1946
  Flag  useint=0;                   /* 1 if can use integer calculation */
1947
  Flag  isoddint=0;                 /* 1 if rhs is an integer and odd */
1948
  Int   i;                         /* work */
1949
  #if DECSUBSET
1950
  Int   dropped;                   /* .. */
1951
  #endif
1952
  uInt  needbytes;                 /* buffer size needed */
1953
  Flag  seenbit;                   /* seen a bit while powering */
1954
  Int   residue=0;                  /* rounding residue */
1955
  uInt  status=0;                   /* accumulators */
1956
  uByte bits=0;                     /* result sign if errors */
1957
  decContext aset;                 /* working context */
1958
  decNumber dnOne;                 /* work value 1... */
1959
  /* local accumulator buffer [a decNumber, with digits+elength+1 digits] */
1960
  decNumber dacbuff[D2N(DECBUFFER+9)];
1961
  decNumber *dac=dacbuff;          /* -> result accumulator */
1962
  /* same again for possible 1/lhs calculation */
1963
  decNumber invbuff[D2N(DECBUFFER+9)];
1964
 
1965
  #if DECCHECK
1966
  if (decCheckOperands(res, lhs, rhs, set)) return res;
1967
  #endif
1968
 
1969
  do {                             /* protect allocated storage */
1970
    #if DECSUBSET
1971
    if (!set->extended) { /* reduce operands and set status, as needed */
1972
      if (lhs->digits>reqdigits) {
1973
        alloclhs=decRoundOperand(lhs, set, &status);
1974
        if (alloclhs==NULL) break;
1975
        lhs=alloclhs;
1976
        }
1977
      if (rhs->digits>reqdigits) {
1978
        allocrhs=decRoundOperand(rhs, set, &status);
1979
        if (allocrhs==NULL) break;
1980
        rhs=allocrhs;
1981
        }
1982
      }
1983
    #endif
1984
    /* [following code does not require input rounding] */
1985
 
1986
    /* handle NaNs and rhs Infinity (lhs infinity is harder) */
1987
    if (SPECIALARGS) {
1988
      if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs)) { /* NaNs */
1989
        decNaNs(res, lhs, rhs, set, &status);
1990
        break;}
1991
      if (decNumberIsInfinite(rhs)) {   /* rhs Infinity */
1992
        Flag rhsneg=rhs->bits&DECNEG;   /* save rhs sign */
1993
        if (decNumberIsNegative(lhs)    /* lhs<0 */
1994
         && !decNumberIsZero(lhs))      /* .. */
1995
          status|=DEC_Invalid_operation;
1996
         else {                         /* lhs >=0 */
1997
          decNumberZero(&dnOne);        /* set up 1 */
1998
          dnOne.lsu[0]=1;
1999
          decNumberCompare(dac, lhs, &dnOne, set); /* lhs ? 1 */
2000
          decNumberZero(res);           /* prepare for 0/1/Infinity */
2001
          if (decNumberIsNegative(dac)) {    /* lhs<1 */
2002
            if (rhsneg) res->bits|=DECINF;   /* +Infinity [else is +0] */
2003
            }
2004
           else if (dac->lsu[0]==0) {          /* lhs=1 */
2005
            /* 1**Infinity is inexact, so return fully-padded 1.0000 */
2006
            Int shift=set->digits-1;
2007
            *res->lsu=1;                     /* was 0, make int 1 */
2008
            res->digits=decShiftToMost(res->lsu, 1, shift);
2009
            res->exponent=-shift;            /* make 1.0000... */
2010
            status|=DEC_Inexact|DEC_Rounded; /* deemed inexact */
2011
            }
2012
           else {                            /* lhs>1 */
2013
            if (!rhsneg) res->bits|=DECINF;  /* +Infinity [else is +0] */
2014
            }
2015
          } /* lhs>=0 */
2016
        break;}
2017
      /* [lhs infinity drops through] */
2018
      } /* specials */
2019
 
2020
    /* Original rhs may be an integer that fits and is in range */
2021
    n=decGetInt(rhs);
2022
    if (n!=BADINT) {                    /* it is an integer */
2023
      rhsint=1;                         /* record the fact for 1**n */
2024
      isoddint=(Flag)n&1;               /* [works even if big] */
2025
      if (n!=BIGEVEN && n!=BIGODD)      /* can use integer path? */
2026
        useint=1;                       /* looks good */
2027
      }
2028
 
2029
    if (decNumberIsNegative(lhs)        /* -x .. */
2030
      && isoddint) bits=DECNEG;         /* .. to an odd power */
2031
 
2032
    /* handle LHS infinity */
2033
    if (decNumberIsInfinite(lhs)) {     /* [NaNs already handled] */
2034
      uByte rbits=rhs->bits;            /* save */
2035
      decNumberZero(res);               /* prepare */
2036
      if (n==0) *res->lsu=1;             /* [-]Inf**0 => 1 */
2037
       else {
2038
        /* -Inf**nonint -> error */
2039
        if (!rhsint && decNumberIsNegative(lhs)) {
2040
          status|=DEC_Invalid_operation;     /* -Inf**nonint is error */
2041
          break;}
2042
        if (!(rbits & DECNEG)) bits|=DECINF; /* was not a **-n */
2043
        /* [otherwise will be 0 or -0] */
2044
        res->bits=bits;
2045
        }
2046
      break;}
2047
 
2048
    /* similarly handle LHS zero */
2049
    if (decNumberIsZero(lhs)) {
2050
      if (n==0) {                             /* 0**0 => Error */
2051
        #if DECSUBSET
2052
        if (!set->extended) {                /* [unless subset] */
2053
          decNumberZero(res);
2054
          *res->lsu=1;                       /* return 1 */
2055
          break;}
2056
        #endif
2057
        status|=DEC_Invalid_operation;
2058
        }
2059
       else {                                /* 0**x */
2060
        uByte rbits=rhs->bits;               /* save */
2061
        if (rbits & DECNEG) {                /* was a 0**(-n) */
2062
          #if DECSUBSET
2063
          if (!set->extended) {              /* [bad if subset] */
2064
            status|=DEC_Invalid_operation;
2065
            break;}
2066
          #endif
2067
          bits|=DECINF;
2068
          }
2069
        decNumberZero(res);                  /* prepare */
2070
        /* [otherwise will be 0 or -0] */
2071
        res->bits=bits;
2072
        }
2073
      break;}
2074
 
2075
    /* here both lhs and rhs are finite; rhs==0 is handled in the */
2076
    /* integer path.  Next handle the non-integer cases */
2077
    if (!useint) {                      /* non-integral rhs */
2078
      /* any -ve lhs is bad, as is either operand or context out of */
2079
      /* bounds */
2080
      if (decNumberIsNegative(lhs)) {
2081
        status|=DEC_Invalid_operation;
2082
        break;}
2083
      if (decCheckMath(lhs, set, &status)
2084
       || decCheckMath(rhs, set, &status)) break; /* variable status */
2085
 
2086
      decContextDefault(&aset, DEC_INIT_DECIMAL64); /* clean context */
2087
      aset.emax=DEC_MAX_MATH;           /* usual bounds */
2088
      aset.emin=-DEC_MAX_MATH;          /* .. */
2089
      aset.clamp=0;                      /* and no concrete format */
2090
 
2091
      /* calculate the result using exp(ln(lhs)*rhs), which can */
2092
      /* all be done into the accumulator, dac.  The precision needed */
2093
      /* is enough to contain the full information in the lhs (which */
2094
      /* is the total digits, including exponent), or the requested */
2095
      /* precision, if larger, + 4; 6 is used for the exponent */
2096
      /* maximum length, and this is also used when it is shorter */
2097
      /* than the requested digits as it greatly reduces the >0.5 ulp */
2098
      /* cases at little cost (because Ln doubles digits each */
2099
      /* iteration so a few extra digits rarely causes an extra */
2100
      /* iteration) */
2101
      aset.digits=MAXI(lhs->digits, set->digits)+6+4;
2102
      } /* non-integer rhs */
2103
 
2104
     else { /* rhs is in-range integer */
2105
      if (n==0) {                        /* x**0 = 1 */
2106
        /* (0**0 was handled above) */
2107
        decNumberZero(res);             /* result=1 */
2108
        *res->lsu=1;                    /* .. */
2109
        break;}
2110
      /* rhs is a non-zero integer */
2111
      if (n<0) n=-n;                     /* use abs(n) */
2112
 
2113
      aset=*set;                        /* clone the context */
2114
      aset.round=DEC_ROUND_HALF_EVEN;   /* internally use balanced */
2115
      /* calculate the working DIGITS */
2116
      aset.digits=reqdigits+(rhs->digits+rhs->exponent)+2;
2117
      #if DECSUBSET
2118
      if (!set->extended) aset.digits--;     /* use classic precision */
2119
      #endif
2120
      /* it's an error if this is more than can be handled */
2121
      if (aset.digits>DECNUMMAXP) {status|=DEC_Invalid_operation; break;}
2122
      } /* integer path */
2123
 
2124
    /* aset.digits is the count of digits for the accumulator needed */
2125
    /* if accumulator is too long for local storage, then allocate */
2126
    needbytes=sizeof(decNumber)+(D2U(aset.digits)-1)*sizeof(Unit);
2127
    /* [needbytes also used below if 1/lhs needed] */
2128
    if (needbytes>sizeof(dacbuff)) {
2129
      allocdac=(decNumber *)malloc(needbytes);
2130
      if (allocdac==NULL) {   /* hopeless -- abandon */
2131
        status|=DEC_Insufficient_storage;
2132
        break;}
2133
      dac=allocdac;           /* use the allocated space */
2134
      }
2135
    /* here, aset is set up and accumulator is ready for use */
2136
 
2137
    if (!useint) {                           /* non-integral rhs */
2138
      /* x ** y; special-case x=1 here as it will otherwise always */
2139
      /* reduce to integer 1; decLnOp has a fastpath which detects */
2140
      /* the case of x=1 */
2141
      decLnOp(dac, lhs, &aset, &status);     /* dac=ln(lhs) */
2142
      /* [no error possible, as lhs 0 already handled] */
2143
      if (ISZERO(dac)) {                     /* x==1, 1.0, etc. */
2144
        /* need to return fully-padded 1.0000 etc., but rhsint->1 */
2145
        *dac->lsu=1;                         /* was 0, make int 1 */
2146
        if (!rhsint) {                       /* add padding */
2147
          Int shift=set->digits-1;
2148
          dac->digits=decShiftToMost(dac->lsu, 1, shift);
2149
          dac->exponent=-shift;              /* make 1.0000... */
2150
          status|=DEC_Inexact|DEC_Rounded;   /* deemed inexact */
2151
          }
2152
        }
2153
       else {
2154
        decMultiplyOp(dac, dac, rhs, &aset, &status);  /* dac=dac*rhs */
2155
        decExpOp(dac, dac, &aset, &status);            /* dac=exp(dac) */
2156
        }
2157
      /* and drop through for final rounding */
2158
      } /* non-integer rhs */
2159
 
2160
     else {                             /* carry on with integer */
2161
      decNumberZero(dac);               /* acc=1 */
2162
      *dac->lsu=1;                      /* .. */
2163
 
2164
      /* if a negative power the constant 1 is needed, and if not subset */
2165
      /* invert the lhs now rather than inverting the result later */
2166
      if (decNumberIsNegative(rhs)) {   /* was a **-n [hence digits>0] */
2167
        decNumber *inv=invbuff;         /* asssume use fixed buffer */
2168
        decNumberCopy(&dnOne, dac);     /* dnOne=1;  [needed now or later] */
2169
        #if DECSUBSET
2170
        if (set->extended) {            /* need to calculate 1/lhs */
2171
        #endif
2172
          /* divide lhs into 1, putting result in dac [dac=1/dac] */
2173
          decDivideOp(dac, &dnOne, lhs, &aset, DIVIDE, &status);
2174
          /* now locate or allocate space for the inverted lhs */
2175
          if (needbytes>sizeof(invbuff)) {
2176
            allocinv=(decNumber *)malloc(needbytes);
2177
            if (allocinv==NULL) {       /* hopeless -- abandon */
2178
              status|=DEC_Insufficient_storage;
2179
              break;}
2180
            inv=allocinv;               /* use the allocated space */
2181
            }
2182
          /* [inv now points to big-enough buffer or allocated storage] */
2183
          decNumberCopy(inv, dac);      /* copy the 1/lhs */
2184
          decNumberCopy(dac, &dnOne);   /* restore acc=1 */
2185
          lhs=inv;                      /* .. and go forward with new lhs */
2186
        #if DECSUBSET
2187
          }
2188
        #endif
2189
        }
2190
 
2191
      /* Raise-to-the-power loop... */
2192
      seenbit=0;            /* set once a 1-bit is encountered */
2193
      for (i=1;;i++){              /* for each bit [top bit ignored] */
2194
        /* abandon if had overflow or terminal underflow */
2195
        if (status & (DEC_Overflow|DEC_Underflow)) { /* interesting? */
2196
          if (status&DEC_Overflow || ISZERO(dac)) break;
2197
          }
2198
        /* [the following two lines revealed an optimizer bug in a C++ */
2199
        /* compiler, with symptom: 5**3 -> 25, when n=n+n was used] */
2200
        n=n<<1;                    /* move next bit to testable position */
2201
        if (n<0) {                  /* top bit is set */
2202
          seenbit=1;               /* OK, significant bit seen */
2203
          decMultiplyOp(dac, dac, lhs, &aset, &status); /* dac=dac*x */
2204
          }
2205
        if (i==31) break;          /* that was the last bit */
2206
        if (!seenbit) continue;    /* no need to square 1 */
2207
        decMultiplyOp(dac, dac, dac, &aset, &status); /* dac=dac*dac [square] */
2208
        } /*i*/ /* 32 bits */
2209
 
2210
      /* complete internal overflow or underflow processing */
2211
      if (status & (DEC_Overflow|DEC_Underflow)) {
2212
        #if DECSUBSET
2213
        /* If subset, and power was negative, reverse the kind of -erflow */
2214
        /* [1/x not yet done] */
2215
        if (!set->extended && decNumberIsNegative(rhs)) {
2216
          if (status & DEC_Overflow)
2217
            status^=DEC_Overflow | DEC_Underflow | DEC_Subnormal;
2218
           else { /* trickier -- Underflow may or may not be set */
2219
            status&=~(DEC_Underflow | DEC_Subnormal); /* [one or both] */
2220
            status|=DEC_Overflow;
2221
            }
2222
          }
2223
        #endif
2224
        dac->bits=(dac->bits & ~DECNEG) | bits; /* force correct sign */
2225
        /* round subnormals [to set.digits rather than aset.digits] */
2226
        /* or set overflow result similarly as required */
2227
        decFinalize(dac, set, &residue, &status);
2228
        decNumberCopy(res, dac);   /* copy to result (is now OK length) */
2229
        break;
2230
        }
2231
 
2232
      #if DECSUBSET
2233
      if (!set->extended &&                  /* subset math */
2234
          decNumberIsNegative(rhs)) {        /* was a **-n [hence digits>0] */
2235
        /* so divide result into 1 [dac=1/dac] */
2236
        decDivideOp(dac, &dnOne, dac, &aset, DIVIDE, &status);
2237
        }
2238
      #endif
2239
      } /* rhs integer path */
2240
 
2241
    /* reduce result to the requested length and copy to result */
2242
    decCopyFit(res, dac, set, &residue, &status);
2243
    decFinish(res, set, &residue, &status);  /* final cleanup */
2244
    #if DECSUBSET
2245
    if (!set->extended) decTrim(res, set, 0, &dropped); /* trailing zeros */
2246
    #endif
2247
    } while(0);                          /* end protected */
2248
 
2249
  if (allocdac!=NULL) free(allocdac);   /* drop any storage used */
2250
  if (allocinv!=NULL) free(allocinv);   /* .. */
2251
  #if DECSUBSET
2252
  if (alloclhs!=NULL) free(alloclhs);   /* .. */
2253
  if (allocrhs!=NULL) free(allocrhs);   /* .. */
2254
  #endif
2255
  if (status!=0) decStatus(res, status, set);
2256
  #if DECCHECK
2257
  decCheckInexact(res, set);
2258
  #endif
2259
  return res;
2260
  } /* decNumberPower */
2261
 
2262
/* ------------------------------------------------------------------ */
2263
/* decNumberQuantize -- force exponent to requested value             */
2264
/*                                                                    */
2265
/*   This computes C = op(A, B), where op adjusts the coefficient     */
2266
/*   of C (by rounding or shifting) such that the exponent (-scale)   */
2267
/*   of C has exponent of B.  The numerical value of C will equal A,  */
2268
/*   except for the effects of any rounding that occurred.            */
2269
/*                                                                    */
2270
/*   res is C, the result.  C may be A or B                           */
2271
/*   lhs is A, the number to adjust                                   */
2272
/*   rhs is B, the number with exponent to match                      */
2273
/*   set is the context                                               */
2274
/*                                                                    */
2275
/* C must have space for set->digits digits.                          */
2276
/*                                                                    */
2277
/* Unless there is an error or the result is infinite, the exponent   */
2278
/* after the operation is guaranteed to be equal to that of B.        */
2279
/* ------------------------------------------------------------------ */
2280
decNumber * decNumberQuantize(decNumber *res, const decNumber *lhs,
2281
                              const decNumber *rhs, decContext *set) {
2282
  uInt status=0;                 /* accumulator */
2283
  decQuantizeOp(res, lhs, rhs, set, 1, &status);
2284
  if (status!=0) decStatus(res, status, set);
2285
  return res;
2286
  } /* decNumberQuantize */
2287
 
2288
/* ------------------------------------------------------------------ */
2289
/* decNumberReduce -- remove trailing zeros                           */
2290
/*                                                                    */
2291
/*   This computes C = 0 + A, and normalizes the result               */
2292
/*                                                                    */
2293
/*   res is C, the result.  C may be A                                */
2294
/*   rhs is A                                                         */
2295
/*   set is the context                                               */
2296
/*                                                                    */
2297
/* C must have space for set->digits digits.                          */
2298
/* ------------------------------------------------------------------ */
2299
/* Previously known as Normalize */
2300
decNumber * decNumberNormalize(decNumber *res, const decNumber *rhs,
2301
                               decContext *set) {
2302
  return decNumberReduce(res, rhs, set);
2303
  } /* decNumberNormalize */
2304
 
2305
decNumber * decNumberReduce(decNumber *res, const decNumber *rhs,
2306
                            decContext *set) {
2307
  #if DECSUBSET
2308
  decNumber *allocrhs=NULL;        /* non-NULL if rounded rhs allocated */
2309
  #endif
2310
  uInt status=0;            /* as usual */
2311
  Int  residue=0;                   /* as usual */
2312
  Int  dropped;                    /* work */
2313
 
2314
  #if DECCHECK
2315
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
2316
  #endif
2317
 
2318
  do {                             /* protect allocated storage */
2319
    #if DECSUBSET
2320
    if (!set->extended) {
2321
      /* reduce operand and set lostDigits status, as needed */
2322
      if (rhs->digits>set->digits) {
2323
        allocrhs=decRoundOperand(rhs, set, &status);
2324
        if (allocrhs==NULL) break;
2325
        rhs=allocrhs;
2326
        }
2327
      }
2328
    #endif
2329
    /* [following code does not require input rounding] */
2330
 
2331
    /* Infinities copy through; NaNs need usual treatment */
2332
    if (decNumberIsNaN(rhs)) {
2333
      decNaNs(res, rhs, NULL, set, &status);
2334
      break;
2335
      }
2336
 
2337
    /* reduce result to the requested length and copy to result */
2338
    decCopyFit(res, rhs, set, &residue, &status); /* copy & round */
2339
    decFinish(res, set, &residue, &status);       /* cleanup/set flags */
2340
    decTrim(res, set, 1, &dropped);               /* normalize in place */
2341
    } while(0);                               /* end protected */
2342
 
2343
  #if DECSUBSET
2344
  if (allocrhs !=NULL) free(allocrhs);       /* .. */
2345
  #endif
2346
  if (status!=0) decStatus(res, status, set);/* then report status */
2347
  return res;
2348
  } /* decNumberReduce */
2349
 
2350
/* ------------------------------------------------------------------ */
2351
/* decNumberRescale -- force exponent to requested value              */
2352
/*                                                                    */
2353
/*   This computes C = op(A, B), where op adjusts the coefficient     */
2354
/*   of C (by rounding or shifting) such that the exponent (-scale)   */
2355
/*   of C has the value B.  The numerical value of C will equal A,    */
2356
/*   except for the effects of any rounding that occurred.            */
2357
/*                                                                    */
2358
/*   res is C, the result.  C may be A or B                           */
2359
/*   lhs is A, the number to adjust                                   */
2360
/*   rhs is B, the requested exponent                                 */
2361
/*   set is the context                                               */
2362
/*                                                                    */
2363
/* C must have space for set->digits digits.                          */
2364
/*                                                                    */
2365
/* Unless there is an error or the result is infinite, the exponent   */
2366
/* after the operation is guaranteed to be equal to B.                */
2367
/* ------------------------------------------------------------------ */
2368
decNumber * decNumberRescale(decNumber *res, const decNumber *lhs,
2369
                             const decNumber *rhs, decContext *set) {
2370
  uInt status=0;                 /* accumulator */
2371
  decQuantizeOp(res, lhs, rhs, set, 0, &status);
2372
  if (status!=0) decStatus(res, status, set);
2373
  return res;
2374
  } /* decNumberRescale */
2375
 
2376
/* ------------------------------------------------------------------ */
2377
/* decNumberRemainder -- divide and return remainder                  */
2378
/*                                                                    */
2379
/*   This computes C = A % B                                          */
2380
/*                                                                    */
2381
/*   res is C, the result.  C may be A and/or B (e.g., X=X%X)         */
2382
/*   lhs is A                                                         */
2383
/*   rhs is B                                                         */
2384
/*   set is the context                                               */
2385
/*                                                                    */
2386
/* C must have space for set->digits digits.                          */
2387
/* ------------------------------------------------------------------ */
2388
decNumber * decNumberRemainder(decNumber *res, const decNumber *lhs,
2389
                               const decNumber *rhs, decContext *set) {
2390
  uInt status=0;                 /* accumulator */
2391
  decDivideOp(res, lhs, rhs, set, REMAINDER, &status);
2392
  if (status!=0) decStatus(res, status, set);
2393
  #if DECCHECK
2394
  decCheckInexact(res, set);
2395
  #endif
2396
  return res;
2397
  } /* decNumberRemainder */
2398
 
2399
/* ------------------------------------------------------------------ */
2400
/* decNumberRemainderNear -- divide and return remainder from nearest */
2401
/*                                                                    */
2402
/*   This computes C = A % B, where % is the IEEE remainder operator  */
2403
/*                                                                    */
2404
/*   res is C, the result.  C may be A and/or B (e.g., X=X%X)         */
2405
/*   lhs is A                                                         */
2406
/*   rhs is B                                                         */
2407
/*   set is the context                                               */
2408
/*                                                                    */
2409
/* C must have space for set->digits digits.                          */
2410
/* ------------------------------------------------------------------ */
2411
decNumber * decNumberRemainderNear(decNumber *res, const decNumber *lhs,
2412
                                   const decNumber *rhs, decContext *set) {
2413
  uInt status=0;                 /* accumulator */
2414
  decDivideOp(res, lhs, rhs, set, REMNEAR, &status);
2415
  if (status!=0) decStatus(res, status, set);
2416
  #if DECCHECK
2417
  decCheckInexact(res, set);
2418
  #endif
2419
  return res;
2420
  } /* decNumberRemainderNear */
2421
 
2422
/* ------------------------------------------------------------------ */
2423
/* decNumberRotate -- rotate the coefficient of a Number left/right   */
2424
/*                                                                    */
2425
/*   This computes C = A rot B  (in base ten and rotating set->digits */
2426
/*   digits).                                                         */
2427
/*                                                                    */
2428
/*   res is C, the result.  C may be A and/or B (e.g., X=XrotX)       */
2429
/*   lhs is A                                                         */
2430
/*   rhs is B, the number of digits to rotate (-ve to right)          */
2431
/*   set is the context                                               */
2432
/*                                                                    */
2433
/* The digits of the coefficient of A are rotated to the left (if B   */
2434
/* is positive) or to the right (if B is negative) without adjusting  */
2435
/* the exponent or the sign of A.  If lhs->digits is less than        */
2436
/* set->digits the coefficient is padded with zeros on the left       */
2437
/* before the rotate.  Any leading zeros in the result are removed    */
2438
/* as usual.                                                          */
2439
/*                                                                    */
2440
/* B must be an integer (q=0) and in the range -set->digits through   */
2441
/* +set->digits.                                                      */
2442
/* C must have space for set->digits digits.                          */
2443
/* NaNs are propagated as usual.  Infinities are unaffected (but      */
2444
/* B must be valid).  No status is set unless B is invalid or an      */
2445
/* operand is an sNaN.                                                */
2446
/* ------------------------------------------------------------------ */
2447
decNumber * decNumberRotate(decNumber *res, const decNumber *lhs,
2448
                           const decNumber *rhs, decContext *set) {
2449
  uInt status=0;       /* accumulator */
2450
  Int  rotate;                /* rhs as an Int */
2451
 
2452
  #if DECCHECK
2453
  if (decCheckOperands(res, lhs, rhs, set)) return res;
2454
  #endif
2455
 
2456
  /* NaNs propagate as normal */
2457
  if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
2458
    decNaNs(res, lhs, rhs, set, &status);
2459
   /* rhs must be an integer */
2460
   else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
2461
    status=DEC_Invalid_operation;
2462
   else { /* both numeric, rhs is an integer */
2463
    rotate=decGetInt(rhs);                   /* [cannot fail] */
2464
    if (rotate==BADINT                       /* something bad .. */
2465
     || rotate==BIGODD || rotate==BIGEVEN    /* .. very big .. */
2466
     || abs(rotate)>set->digits)             /* .. or out of range */
2467
      status=DEC_Invalid_operation;
2468
     else {                                  /* rhs is OK */
2469
      decNumberCopy(res, lhs);
2470
      /* convert -ve rotate to equivalent positive rotation */
2471
      if (rotate<0) rotate=set->digits+rotate;
2472
      if (rotate!=0 && rotate!=set->digits   /* zero or full rotation */
2473
       && !decNumberIsInfinite(res)) {       /* lhs was infinite */
2474
        /* left-rotate to do; 0 < rotate < set->digits */
2475
        uInt units, shift;                   /* work */
2476
        uInt msudigits;                      /* digits in result msu */
2477
        Unit *msu=res->lsu+D2U(res->digits)-1;    /* current msu */
2478
        Unit *msumax=res->lsu+D2U(set->digits)-1; /* rotation msu */
2479
        for (msu++; msu<=msumax; msu++) *msu=0;    /* ensure high units=0 */
2480
        res->digits=set->digits;                  /* now full-length */
2481
        msudigits=MSUDIGITS(res->digits);         /* actual digits in msu */
2482
 
2483
        /* rotation here is done in-place, in three steps */
2484
        /* 1. shift all to least up to one unit to unit-align final */
2485
        /*    lsd [any digits shifted out are rotated to the left, */
2486
        /*    abutted to the original msd (which may require split)] */
2487
        /* */
2488
        /*    [if there are no whole units left to rotate, the */
2489
        /*    rotation is now complete] */
2490
        /* */
2491
        /* 2. shift to least, from below the split point only, so that */
2492
        /*    the final msd is in the right place in its Unit [any */
2493
        /*    digits shifted out will fit exactly in the current msu, */
2494
        /*    left aligned, no split required] */
2495
        /* */
2496
        /* 3. rotate all the units by reversing left part, right */
2497
        /*    part, and then whole */
2498
        /* */
2499
        /* example: rotate right 8 digits (2 units + 2), DECDPUN=3. */
2500
        /* */
2501
        /*   start: 00a bcd efg hij klm npq */
2502
        /* */
2503
        /*      1a  000 0ab cde fgh|ijk lmn [pq saved] */
2504
        /*      1b  00p qab cde fgh|ijk lmn */
2505
        /* */
2506
        /*      2a  00p qab cde fgh|00i jkl [mn saved] */
2507
        /*      2b  mnp qab cde fgh|00i jkl */
2508
        /* */
2509
        /*      3a  fgh cde qab mnp|00i jkl */
2510
        /*      3b  fgh cde qab mnp|jkl 00i */
2511
        /*      3c  00i jkl mnp qab cde fgh */
2512
 
2513
        /* Step 1: amount to shift is the partial right-rotate count */
2514
        rotate=set->digits-rotate;      /* make it right-rotate */
2515
        units=rotate/DECDPUN;           /* whole units to rotate */
2516
        shift=rotate%DECDPUN;           /* left-over digits count */
2517
        if (shift>0) {                   /* not an exact number of units */
2518
          uInt save=res->lsu[0]%powers[shift];     /* save low digit(s) */
2519
          decShiftToLeast(res->lsu, D2U(res->digits), shift);
2520
          if (shift>msudigits) {        /* msumax-1 needs >0 digits */
2521
            uInt rem=save%powers[shift-msudigits];/* split save */
2522
            *msumax=(Unit)(save/powers[shift-msudigits]); /* and insert */
2523
            *(msumax-1)=*(msumax-1)
2524
                       +(Unit)(rem*powers[DECDPUN-(shift-msudigits)]); /* .. */
2525
            }
2526
           else { /* all fits in msumax */
2527
            *msumax=*msumax+(Unit)(save*powers[msudigits-shift]); /* [maybe *1] */
2528
            }
2529
          } /* digits shift needed */
2530
 
2531
        /* If whole units to rotate... */
2532
        if (units>0) {                   /* some to do */
2533
          /* Step 2: the units to touch are the whole ones in rotate, */
2534
          /*   if any, and the shift is DECDPUN-msudigits (which may be */
2535
          /*   0, again) */
2536
          shift=DECDPUN-msudigits;
2537
          if (shift>0) {         /* not an exact number of units */
2538
            uInt save=res->lsu[0]%powers[shift];  /* save low digit(s) */
2539
            decShiftToLeast(res->lsu, units, shift);
2540
            *msumax=*msumax+(Unit)(save*powers[msudigits]);
2541
            } /* partial shift needed */
2542
 
2543
          /* Step 3: rotate the units array using triple reverse */
2544
          /* (reversing is easy and fast) */
2545
          decReverse(res->lsu+units, msumax);     /* left part */
2546
          decReverse(res->lsu, res->lsu+units-1); /* right part */
2547
          decReverse(res->lsu, msumax);           /* whole */
2548
          } /* whole units to rotate */
2549
        /* the rotation may have left an undetermined number of zeros */
2550
        /* on the left, so true length needs to be calculated */
2551
        res->digits=decGetDigits(res->lsu, msumax-res->lsu+1);
2552
        } /* rotate needed */
2553
      } /* rhs OK */
2554
    } /* numerics */
2555
  if (status!=0) decStatus(res, status, set);
2556
  return res;
2557
  } /* decNumberRotate */
2558
 
2559
/* ------------------------------------------------------------------ */
2560
/* decNumberSameQuantum -- test for equal exponents                   */
2561
/*                                                                    */
2562
/*   res is the result number, which will contain either 0 or 1       */
2563
/*   lhs is a number to test                                          */
2564
/*   rhs is the second (usually a pattern)                            */
2565
/*                                                                    */
2566
/* No errors are possible and no context is needed.                   */
2567
/* ------------------------------------------------------------------ */
2568
decNumber * decNumberSameQuantum(decNumber *res, const decNumber *lhs,
2569
                                 const decNumber *rhs) {
2570
  Unit ret=0;                       /* return value */
2571
 
2572
  #if DECCHECK
2573
  if (decCheckOperands(res, lhs, rhs, DECUNCONT)) return res;
2574
  #endif
2575
 
2576
  if (SPECIALARGS) {
2577
    if (decNumberIsNaN(lhs) && decNumberIsNaN(rhs)) ret=1;
2578
     else if (decNumberIsInfinite(lhs) && decNumberIsInfinite(rhs)) ret=1;
2579
     /* [anything else with a special gives 0] */
2580
    }
2581
   else if (lhs->exponent==rhs->exponent) ret=1;
2582
 
2583
  decNumberZero(res);              /* OK to overwrite an operand now */
2584
  *res->lsu=ret;
2585
  return res;
2586
  } /* decNumberSameQuantum */
2587
 
2588
/* ------------------------------------------------------------------ */
2589
/* decNumberScaleB -- multiply by a power of 10                       */
2590
/*                                                                    */
2591
/* This computes C = A x 10**B where B is an integer (q=0) with       */
2592
/* maximum magnitude 2*(emax+digits)                                  */
2593
/*                                                                    */
2594
/*   res is C, the result.  C may be A or B                           */
2595
/*   lhs is A, the number to adjust                                   */
2596
/*   rhs is B, the requested power of ten to use                      */
2597
/*   set is the context                                               */
2598
/*                                                                    */
2599
/* C must have space for set->digits digits.                          */
2600
/*                                                                    */
2601
/* The result may underflow or overflow.                              */
2602
/* ------------------------------------------------------------------ */
2603
decNumber * decNumberScaleB(decNumber *res, const decNumber *lhs,
2604
                            const decNumber *rhs, decContext *set) {
2605
  Int  reqexp;                /* requested exponent change [B] */
2606
  uInt status=0;       /* accumulator */
2607
  Int  residue;               /* work */
2608
 
2609
  #if DECCHECK
2610
  if (decCheckOperands(res, lhs, rhs, set)) return res;
2611
  #endif
2612
 
2613
  /* Handle special values except lhs infinite */
2614
  if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
2615
    decNaNs(res, lhs, rhs, set, &status);
2616
    /* rhs must be an integer */
2617
   else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
2618
    status=DEC_Invalid_operation;
2619
   else {
2620
    /* lhs is a number; rhs is a finite with q==0 */
2621
    reqexp=decGetInt(rhs);                   /* [cannot fail] */
2622
    if (reqexp==BADINT                       /* something bad .. */
2623
     || reqexp==BIGODD || reqexp==BIGEVEN    /* .. very big .. */
2624
     || abs(reqexp)>(2*(set->digits+set->emax))) /* .. or out of range */
2625
      status=DEC_Invalid_operation;
2626
     else {                                  /* rhs is OK */
2627
      decNumberCopy(res, lhs);               /* all done if infinite lhs */
2628
      if (!decNumberIsInfinite(res)) {       /* prepare to scale */
2629
        res->exponent+=reqexp;               /* adjust the exponent */
2630
        residue=0;
2631
        decFinalize(res, set, &residue, &status); /* .. and check */
2632
        } /* finite LHS */
2633
      } /* rhs OK */
2634
    } /* rhs finite */
2635
  if (status!=0) decStatus(res, status, set);
2636
  return res;
2637
  } /* decNumberScaleB */
2638
 
2639
/* ------------------------------------------------------------------ */
2640
/* decNumberShift -- shift the coefficient of a Number left or right  */
2641
/*                                                                    */
2642
/*   This computes C = A << B or C = A >> -B  (in base ten).          */
2643
/*                                                                    */
2644
/*   res is C, the result.  C may be A and/or B (e.g., X=X<<X)        */
2645
/*   lhs is A                                                         */
2646
/*   rhs is B, the number of digits to shift (-ve to right)           */
2647
/*   set is the context                                               */
2648
/*                                                                    */
2649
/* The digits of the coefficient of A are shifted to the left (if B   */
2650
/* is positive) or to the right (if B is negative) without adjusting  */
2651
/* the exponent or the sign of A.                                     */
2652
/*                                                                    */
2653
/* B must be an integer (q=0) and in the range -set->digits through   */
2654
/* +set->digits.                                                      */
2655
/* C must have space for set->digits digits.                          */
2656
/* NaNs are propagated as usual.  Infinities are unaffected (but      */
2657
/* B must be valid).  No status is set unless B is invalid or an      */
2658
/* operand is an sNaN.                                                */
2659
/* ------------------------------------------------------------------ */
2660
decNumber * decNumberShift(decNumber *res, const decNumber *lhs,
2661
                           const decNumber *rhs, decContext *set) {
2662
  uInt status=0;       /* accumulator */
2663
  Int  shift;                 /* rhs as an Int */
2664
 
2665
  #if DECCHECK
2666
  if (decCheckOperands(res, lhs, rhs, set)) return res;
2667
  #endif
2668
 
2669
  /* NaNs propagate as normal */
2670
  if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
2671
    decNaNs(res, lhs, rhs, set, &status);
2672
   /* rhs must be an integer */
2673
   else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
2674
    status=DEC_Invalid_operation;
2675
   else { /* both numeric, rhs is an integer */
2676
    shift=decGetInt(rhs);                    /* [cannot fail] */
2677
    if (shift==BADINT                        /* something bad .. */
2678
     || shift==BIGODD || shift==BIGEVEN      /* .. very big .. */
2679
     || abs(shift)>set->digits)              /* .. or out of range */
2680
      status=DEC_Invalid_operation;
2681
     else {                                  /* rhs is OK */
2682
      decNumberCopy(res, lhs);
2683
      if (shift!=0 && !decNumberIsInfinite(res)) { /* something to do */
2684
        if (shift>0) {                        /* to left */
2685
          if (shift==set->digits) {          /* removing all */
2686
            *res->lsu=0;              /* so place 0 */
2687
            res->digits=1;                   /* .. */
2688
            }
2689
           else {                            /* */
2690
            /* first remove leading digits if necessary */
2691
            if (res->digits+shift>set->digits) {
2692
              decDecap(res, res->digits+shift-set->digits);
2693
              /* that updated res->digits; may have gone to 1 (for a */
2694
              /* single digit or for zero */
2695
              }
2696
            if (res->digits>1 || *res->lsu)  /* if non-zero.. */
2697
              res->digits=decShiftToMost(res->lsu, res->digits, shift);
2698
            } /* partial left */
2699
          } /* left */
2700
         else { /* to right */
2701
          if (-shift>=res->digits) {         /* discarding all */
2702
            *res->lsu=0;              /* so place 0 */
2703
            res->digits=1;                   /* .. */
2704
            }
2705
           else {
2706
            decShiftToLeast(res->lsu, D2U(res->digits), -shift);
2707
            res->digits-=(-shift);
2708
            }
2709
          } /* to right */
2710
        } /* non-0 non-Inf shift */
2711
      } /* rhs OK */
2712
    } /* numerics */
2713
  if (status!=0) decStatus(res, status, set);
2714
  return res;
2715
  } /* decNumberShift */
2716
 
2717
/* ------------------------------------------------------------------ */
2718
/* decNumberSquareRoot -- square root operator                        */
2719
/*                                                                    */
2720
/*   This computes C = squareroot(A)                                  */
2721
/*                                                                    */
2722
/*   res is C, the result.  C may be A                                */
2723
/*   rhs is A                                                         */
2724
/*   set is the context; note that rounding mode has no effect        */
2725
/*                                                                    */
2726
/* C must have space for set->digits digits.                          */
2727
/* ------------------------------------------------------------------ */
2728
/* This uses the following varying-precision algorithm in:            */
2729
/*                                                                    */
2730
/*   Properly Rounded Variable Precision Square Root, T. E. Hull and  */
2731
/*   A. Abrham, ACM Transactions on Mathematical Software, Vol 11 #3, */
2732
/*   pp229-237, ACM, September 1985.                                  */
2733
/*                                                                    */
2734
/* The square-root is calculated using Newton's method, after which   */
2735
/* a check is made to ensure the result is correctly rounded.         */
2736
/*                                                                    */
2737
/* % [Reformatted original Numerical Turing source code follows.]     */
2738
/* function sqrt(x : real) : real                                     */
2739
/* % sqrt(x) returns the properly rounded approximation to the square */
2740
/* % root of x, in the precision of the calling environment, or it    */
2741
/* % fails if x < 0.                                                  */
2742
/* % t e hull and a abrham, august, 1984                              */
2743
/* if x <= 0 then                                                     */
2744
/*   if x < 0 then                                                    */
2745
/*     assert false                                                   */
2746
/*   else                                                             */
2747
/*     result 0                                                       */
2748
/*   end if                                                           */
2749
/* end if                                                             */
2750
/* var f := setexp(x, 0)  % fraction part of x   [0.1 <= x < 1]       */
2751
/* var e := getexp(x)     % exponent part of x                        */
2752
/* var approx : real                                                  */
2753
/* if e mod 2 = 0  then                                               */
2754
/*   approx := .259 + .819 * f   % approx to root of f                */
2755
/* else                                                               */
2756
/*   f := f/l0                   % adjustments                        */
2757
/*   e := e + 1                  %   for odd                          */
2758
/*   approx := .0819 + 2.59 * f  %   exponent                         */
2759
/* end if                                                             */
2760
/*                                                                    */
2761
/* var p:= 3                                                          */
2762
/* const maxp := currentprecision + 2                                 */
2763
/* loop                                                               */
2764
/*   p := min(2*p - 2, maxp)     % p = 4,6,10, . . . , maxp           */
2765
/*   precision p                                                      */
2766
/*   approx := .5 * (approx + f/approx)                               */
2767
/*   exit when p = maxp                                               */
2768
/* end loop                                                           */
2769
/*                                                                    */
2770
/* % approx is now within 1 ulp of the properly rounded square root   */
2771
/* % of f; to ensure proper rounding, compare squares of (approx -    */
2772
/* % l/2 ulp) and (approx + l/2 ulp) with f.                          */
2773
/* p := currentprecision                                              */
2774
/* begin                                                              */
2775
/*   precision p + 2                                                  */
2776
/*   const approxsubhalf := approx - setexp(.5, -p)                   */
2777
/*   if mulru(approxsubhalf, approxsubhalf) > f then                  */
2778
/*     approx := approx - setexp(.l, -p + 1)                          */
2779
/*   else                                                             */
2780
/*     const approxaddhalf := approx + setexp(.5, -p)                 */
2781
/*     if mulrd(approxaddhalf, approxaddhalf) < f then                */
2782
/*       approx := approx + setexp(.l, -p + 1)                        */
2783
/*     end if                                                         */
2784
/*   end if                                                           */
2785
/* end                                                                */
2786
/* result setexp(approx, e div 2)  % fix exponent                     */
2787
/* end sqrt                                                           */
2788
/* ------------------------------------------------------------------ */
2789
decNumber * decNumberSquareRoot(decNumber *res, const decNumber *rhs,
2790
                                decContext *set) {
2791
  decContext workset, approxset;   /* work contexts */
2792
  decNumber dzero;                 /* used for constant zero */
2793
  Int  maxp;                       /* largest working precision */
2794
  Int  workp;                      /* working precision */
2795
  Int  residue=0;                   /* rounding residue */
2796
  uInt status=0, ignore=0;           /* status accumulators */
2797
  uInt rstatus;                    /* .. */
2798
  Int  exp;                        /* working exponent */
2799
  Int  ideal;                      /* ideal (preferred) exponent */
2800
  Int  needbytes;                  /* work */
2801
  Int  dropped;                    /* .. */
2802
 
2803
  #if DECSUBSET
2804
  decNumber *allocrhs=NULL;        /* non-NULL if rounded rhs allocated */
2805
  #endif
2806
  /* buffer for f [needs +1 in case DECBUFFER 0] */
2807
  decNumber buff[D2N(DECBUFFER+1)];
2808
  /* buffer for a [needs +2 to match likely maxp] */
2809
  decNumber bufa[D2N(DECBUFFER+2)];
2810
  /* buffer for temporary, b [must be same size as a] */
2811
  decNumber bufb[D2N(DECBUFFER+2)];
2812
  decNumber *allocbuff=NULL;       /* -> allocated buff, iff allocated */
2813
  decNumber *allocbufa=NULL;       /* -> allocated bufa, iff allocated */
2814
  decNumber *allocbufb=NULL;       /* -> allocated bufb, iff allocated */
2815
  decNumber *f=buff;               /* reduced fraction */
2816
  decNumber *a=bufa;               /* approximation to result */
2817
  decNumber *b=bufb;               /* intermediate result */
2818
  /* buffer for temporary variable, up to 3 digits */
2819
  decNumber buft[D2N(3)];
2820
  decNumber *t=buft;               /* up-to-3-digit constant or work */
2821
 
2822
  #if DECCHECK
2823
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
2824
  #endif
2825
 
2826
  do {                             /* protect allocated storage */
2827
    #if DECSUBSET
2828
    if (!set->extended) {
2829
      /* reduce operand and set lostDigits status, as needed */
2830
      if (rhs->digits>set->digits) {
2831
        allocrhs=decRoundOperand(rhs, set, &status);
2832
        if (allocrhs==NULL) break;
2833
        /* [Note: 'f' allocation below could reuse this buffer if */
2834
        /* used, but as this is rare they are kept separate for clarity.] */
2835
        rhs=allocrhs;
2836
        }
2837
      }
2838
    #endif
2839
    /* [following code does not require input rounding] */
2840
 
2841
    /* handle infinities and NaNs */
2842
    if (SPECIALARG) {
2843
      if (decNumberIsInfinite(rhs)) {         /* an infinity */
2844
        if (decNumberIsNegative(rhs)) status|=DEC_Invalid_operation;
2845
         else decNumberCopy(res, rhs);        /* +Infinity */
2846
        }
2847
       else decNaNs(res, rhs, NULL, set, &status); /* a NaN */
2848
      break;
2849
      }
2850
 
2851
    /* calculate the ideal (preferred) exponent [floor(exp/2)] */
2852
    /* [We would like to write: ideal=rhs->exponent>>1, but this */
2853
    /* generates a compiler warning.  Generated code is the same.] */
2854
    ideal=(rhs->exponent&~1)/2;         /* target */
2855
 
2856
    /* handle zeros */
2857
    if (ISZERO(rhs)) {
2858
      decNumberCopy(res, rhs);          /* could be 0 or -0 */
2859
      res->exponent=ideal;              /* use the ideal [safe] */
2860
      /* use decFinish to clamp any out-of-range exponent, etc. */
2861
      decFinish(res, set, &residue, &status);
2862
      break;
2863
      }
2864
 
2865
    /* any other -x is an oops */
2866
    if (decNumberIsNegative(rhs)) {
2867
      status|=DEC_Invalid_operation;
2868
      break;
2869
      }
2870
 
2871
    /* space is needed for three working variables */
2872
    /*   f -- the same precision as the RHS, reduced to 0.01->0.99... */
2873
    /*   a -- Hull's approximation -- precision, when assigned, is */
2874
    /*        currentprecision+1 or the input argument precision, */
2875
    /*        whichever is larger (+2 for use as temporary) */
2876
    /*   b -- intermediate temporary result (same size as a) */
2877
    /* if any is too long for local storage, then allocate */
2878
    workp=MAXI(set->digits+1, rhs->digits);  /* actual rounding precision */
2879
    maxp=workp+2;                            /* largest working precision */
2880
 
2881
    needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
2882
    if (needbytes>(Int)sizeof(buff)) {
2883
      allocbuff=(decNumber *)malloc(needbytes);
2884
      if (allocbuff==NULL) {  /* hopeless -- abandon */
2885
        status|=DEC_Insufficient_storage;
2886
        break;}
2887
      f=allocbuff;            /* use the allocated space */
2888
      }
2889
    /* a and b both need to be able to hold a maxp-length number */
2890
    needbytes=sizeof(decNumber)+(D2U(maxp)-1)*sizeof(Unit);
2891
    if (needbytes>(Int)sizeof(bufa)) {            /* [same applies to b] */
2892
      allocbufa=(decNumber *)malloc(needbytes);
2893
      allocbufb=(decNumber *)malloc(needbytes);
2894
      if (allocbufa==NULL || allocbufb==NULL) {   /* hopeless */
2895
        status|=DEC_Insufficient_storage;
2896
        break;}
2897
      a=allocbufa;            /* use the allocated spaces */
2898
      b=allocbufb;            /* .. */
2899
      }
2900
 
2901
    /* copy rhs -> f, save exponent, and reduce so 0.1 <= f < 1 */
2902
    decNumberCopy(f, rhs);
2903
    exp=f->exponent+f->digits;               /* adjusted to Hull rules */
2904
    f->exponent=-(f->digits);                /* to range */
2905
 
2906
    /* set up working context */
2907
    decContextDefault(&workset, DEC_INIT_DECIMAL64);
2908
 
2909
    /* [Until further notice, no error is possible and status bits */
2910
    /* (Rounded, etc.) should be ignored, not accumulated.] */
2911
 
2912
    /* Calculate initial approximation, and allow for odd exponent */
2913
    workset.digits=workp;                    /* p for initial calculation */
2914
    t->bits=0; t->digits=3;
2915
    a->bits=0; a->digits=3;
2916
    if ((exp & 1)==0) {                       /* even exponent */
2917
      /* Set t=0.259, a=0.819 */
2918
      t->exponent=-3;
2919
      a->exponent=-3;
2920
      #if DECDPUN>=3
2921
        t->lsu[0]=259;
2922
        a->lsu[0]=819;
2923
      #elif DECDPUN==2
2924
        t->lsu[0]=59; t->lsu[1]=2;
2925
        a->lsu[0]=19; a->lsu[1]=8;
2926
      #else
2927
        t->lsu[0]=9; t->lsu[1]=5; t->lsu[2]=2;
2928
        a->lsu[0]=9; a->lsu[1]=1; a->lsu[2]=8;
2929
      #endif
2930
      }
2931
     else {                                  /* odd exponent */
2932
      /* Set t=0.0819, a=2.59 */
2933
      f->exponent--;                         /* f=f/10 */
2934
      exp++;                                 /* e=e+1 */
2935
      t->exponent=-4;
2936
      a->exponent=-2;
2937
      #if DECDPUN>=3
2938
        t->lsu[0]=819;
2939
        a->lsu[0]=259;
2940
      #elif DECDPUN==2
2941
        t->lsu[0]=19; t->lsu[1]=8;
2942
        a->lsu[0]=59; a->lsu[1]=2;
2943
      #else
2944
        t->lsu[0]=9; t->lsu[1]=1; t->lsu[2]=8;
2945
        a->lsu[0]=9; a->lsu[1]=5; a->lsu[2]=2;
2946
      #endif
2947
      }
2948
    decMultiplyOp(a, a, f, &workset, &ignore);    /* a=a*f */
2949
    decAddOp(a, a, t, &workset, 0, &ignore);       /* ..+t */
2950
    /* [a is now the initial approximation for sqrt(f), calculated with */
2951
    /* currentprecision, which is also a's precision.] */
2952
 
2953
    /* the main calculation loop */
2954
    decNumberZero(&dzero);                   /* make 0 */
2955
    decNumberZero(t);                        /* set t = 0.5 */
2956
    t->lsu[0]=5;                      /* .. */
2957
    t->exponent=-1;                          /* .. */
2958
    workset.digits=3;                        /* initial p */
2959
    for (;;) {
2960
      /* set p to min(2*p - 2, maxp)  [hence 3; or: 4, 6, 10, ... , maxp] */
2961
      workset.digits=workset.digits*2-2;
2962
      if (workset.digits>maxp) workset.digits=maxp;
2963
      /* a = 0.5 * (a + f/a) */
2964
      /* [calculated at p then rounded to currentprecision] */
2965
      decDivideOp(b, f, a, &workset, DIVIDE, &ignore); /* b=f/a */
2966
      decAddOp(b, b, a, &workset, 0, &ignore);     /* b=b+a */
2967
      decMultiplyOp(a, b, t, &workset, &ignore);  /* a=b*0.5 */
2968
      if (a->digits==maxp) break;            /* have required digits */
2969
      } /* loop */
2970
 
2971
    /* Here, 0.1 <= a < 1 [Hull], and a has maxp digits */
2972
    /* now reduce to length, etc.; this needs to be done with a */
2973
    /* having the correct exponent so as to handle subnormals */
2974
    /* correctly */
2975
    approxset=*set;                          /* get emin, emax, etc. */
2976
    approxset.round=DEC_ROUND_HALF_EVEN;
2977
    a->exponent+=exp/2;                      /* set correct exponent */
2978
 
2979
    rstatus=0;                                /* clear status */
2980
    residue=0;                                /* .. and accumulator */
2981
    decCopyFit(a, a, &approxset, &residue, &rstatus);  /* reduce (if needed) */
2982
    decFinish(a, &approxset, &residue, &rstatus);      /* clean and finalize */
2983
 
2984
    /* Overflow was possible if the input exponent was out-of-range, */
2985
    /* in which case quit */
2986
    if (rstatus&DEC_Overflow) {
2987
      status=rstatus;                        /* use the status as-is */
2988
      decNumberCopy(res, a);                 /* copy to result */
2989
      break;
2990
      }
2991
 
2992
    /* Preserve status except Inexact/Rounded */
2993
    status|=(rstatus & ~(DEC_Rounded|DEC_Inexact));
2994
 
2995
    /* Carry out the Hull correction */
2996
    a->exponent-=exp/2;                      /* back to 0.1->1 */
2997
 
2998
    /* a is now at final precision and within 1 ulp of the properly */
2999
    /* rounded square root of f; to ensure proper rounding, compare */
3000
    /* squares of (a - l/2 ulp) and (a + l/2 ulp) with f. */
3001
    /* Here workset.digits=maxp and t=0.5, and a->digits determines */
3002
    /* the ulp */
3003
    workset.digits--;                             /* maxp-1 is OK now */
3004
    t->exponent=-a->digits-1;                     /* make 0.5 ulp */
3005
    decAddOp(b, a, t, &workset, DECNEG, &ignore); /* b = a - 0.5 ulp */
3006
    workset.round=DEC_ROUND_UP;
3007
    decMultiplyOp(b, b, b, &workset, &ignore);    /* b = mulru(b, b) */
3008
    decCompareOp(b, f, b, &workset, COMPARE, &ignore); /* b ? f, reversed */
3009
    if (decNumberIsNegative(b)) {                 /* f < b [i.e., b > f] */
3010
      /* this is the more common adjustment, though both are rare */
3011
      t->exponent++;                              /* make 1.0 ulp */
3012
      t->lsu[0]=1;                                 /* .. */
3013
      decAddOp(a, a, t, &workset, DECNEG, &ignore); /* a = a - 1 ulp */
3014
      /* assign to approx [round to length] */
3015
      approxset.emin-=exp/2;                      /* adjust to match a */
3016
      approxset.emax-=exp/2;
3017
      decAddOp(a, &dzero, a, &approxset, 0, &ignore);
3018
      }
3019
     else {
3020
      decAddOp(b, a, t, &workset, 0, &ignore);     /* b = a + 0.5 ulp */
3021
      workset.round=DEC_ROUND_DOWN;
3022
      decMultiplyOp(b, b, b, &workset, &ignore);  /* b = mulrd(b, b) */
3023
      decCompareOp(b, b, f, &workset, COMPARE, &ignore);   /* b ? f */
3024
      if (decNumberIsNegative(b)) {               /* b < f */
3025
        t->exponent++;                            /* make 1.0 ulp */
3026
        t->lsu[0]=1;                               /* .. */
3027
        decAddOp(a, a, t, &workset, 0, &ignore);  /* a = a + 1 ulp */
3028
        /* assign to approx [round to length] */
3029
        approxset.emin-=exp/2;                    /* adjust to match a */
3030
        approxset.emax-=exp/2;
3031
        decAddOp(a, &dzero, a, &approxset, 0, &ignore);
3032
        }
3033
      }
3034
    /* [no errors are possible in the above, and rounding/inexact during */
3035
    /* estimation are irrelevant, so status was not accumulated] */
3036
 
3037
    /* Here, 0.1 <= a < 1  (still), so adjust back */
3038
    a->exponent+=exp/2;                      /* set correct exponent */
3039
 
3040
    /* count droppable zeros [after any subnormal rounding] by */
3041
    /* trimming a copy */
3042
    decNumberCopy(b, a);
3043
    decTrim(b, set, 1, &dropped);            /* [drops trailing zeros] */
3044
 
3045
    /* Set Inexact and Rounded.  The answer can only be exact if */
3046
    /* it is short enough so that squaring it could fit in workp digits, */
3047
    /* and it cannot have trailing zeros due to clamping, so these are */
3048
    /* the only (relatively rare) conditions a careful check is needed */
3049
    if (b->digits*2-1 > workp && !set->clamp) { /* cannot fit */
3050
      status|=DEC_Inexact|DEC_Rounded;
3051
      }
3052
     else {                                  /* could be exact/unrounded */
3053
      uInt mstatus=0;                         /* local status */
3054
      decMultiplyOp(b, b, b, &workset, &mstatus); /* try the multiply */
3055
      if (mstatus&DEC_Overflow) {            /* result just won't fit */
3056
        status|=DEC_Inexact|DEC_Rounded;
3057
        }
3058
       else {                                /* plausible */
3059
        decCompareOp(t, b, rhs, &workset, COMPARE, &mstatus); /* b ? rhs */
3060
        if (!ISZERO(t)) status|=DEC_Inexact|DEC_Rounded; /* not equal */
3061
         else {                              /* is Exact */
3062
          /* here, dropped is the count of trailing zeros in 'a' */
3063
          /* use closest exponent to ideal... */
3064
          Int todrop=ideal-a->exponent;      /* most that can be dropped */
3065
          if (todrop<0) status|=DEC_Rounded; /* ideally would add 0s */
3066
           else {                            /* unrounded */
3067
            if (dropped<todrop) {            /* clamp to those available */
3068
              todrop=dropped;
3069
              status|=DEC_Clamped;
3070
              }
3071
            if (todrop>0) {                   /* have some to drop */
3072
              decShiftToLeast(a->lsu, D2U(a->digits), todrop);
3073
              a->exponent+=todrop;           /* maintain numerical value */
3074
              a->digits-=todrop;             /* new length */
3075
              }
3076
            }
3077
          }
3078
        }
3079
      }
3080
 
3081
    /* double-check Underflow, as perhaps the result could not have */
3082
    /* been subnormal (initial argument too big), or it is now Exact */
3083
    if (status&DEC_Underflow) {
3084
      Int ae=rhs->exponent+rhs->digits-1;    /* adjusted exponent */
3085
      /* check if truly subnormal */
3086
      #if DECEXTFLAG                         /* DEC_Subnormal too */
3087
        if (ae>=set->emin*2) status&=~(DEC_Subnormal|DEC_Underflow);
3088
      #else
3089
        if (ae>=set->emin*2) status&=~DEC_Underflow;
3090
      #endif
3091
      /* check if truly inexact */
3092
      if (!(status&DEC_Inexact)) status&=~DEC_Underflow;
3093
      }
3094
 
3095
    decNumberCopy(res, a);                   /* a is now the result */
3096
    } while(0);                               /* end protected */
3097
 
3098
  if (allocbuff!=NULL) free(allocbuff);      /* drop any storage used */
3099
  if (allocbufa!=NULL) free(allocbufa);      /* .. */
3100
  if (allocbufb!=NULL) free(allocbufb);      /* .. */
3101
  #if DECSUBSET
3102
  if (allocrhs !=NULL) free(allocrhs);       /* .. */
3103
  #endif
3104
  if (status!=0) decStatus(res, status, set);/* then report status */
3105
  #if DECCHECK
3106
  decCheckInexact(res, set);
3107
  #endif
3108
  return res;
3109
  } /* decNumberSquareRoot */
3110
 
3111
/* ------------------------------------------------------------------ */
3112
/* decNumberSubtract -- subtract two Numbers                          */
3113
/*                                                                    */
3114
/*   This computes C = A - B                                          */
3115
/*                                                                    */
3116
/*   res is C, the result.  C may be A and/or B (e.g., X=X-X)         */
3117
/*   lhs is A                                                         */
3118
/*   rhs is B                                                         */
3119
/*   set is the context                                               */
3120
/*                                                                    */
3121
/* C must have space for set->digits digits.                          */
3122
/* ------------------------------------------------------------------ */
3123
decNumber * decNumberSubtract(decNumber *res, const decNumber *lhs,
3124
                              const decNumber *rhs, decContext *set) {
3125
  uInt status=0;                 /* accumulator */
3126
 
3127
  decAddOp(res, lhs, rhs, set, DECNEG, &status);
3128
  if (status!=0) decStatus(res, status, set);
3129
  #if DECCHECK
3130
  decCheckInexact(res, set);
3131
  #endif
3132
  return res;
3133
  } /* decNumberSubtract */
3134
 
3135
/* ------------------------------------------------------------------ */
3136
/* decNumberToIntegralExact -- round-to-integral-value with InExact   */
3137
/* decNumberToIntegralValue -- round-to-integral-value                */
3138
/*                                                                    */
3139
/*   res is the result                                                */
3140
/*   rhs is input number                                              */
3141
/*   set is the context                                               */
3142
/*                                                                    */
3143
/* res must have space for any value of rhs.                          */
3144
/*                                                                    */
3145
/* This implements the IEEE special operators and therefore treats    */
3146
/* special values as valid.  For finite numbers it returns            */
3147
/* rescale(rhs, 0) if rhs->exponent is <0.                            */
3148
/* Otherwise the result is rhs (so no error is possible, except for   */
3149
/* sNaN).                                                             */
3150
/*                                                                    */
3151
/* The context is used for rounding mode and status after sNaN, but   */
3152
/* the digits setting is ignored.  The Exact version will signal      */
3153
/* Inexact if the result differs numerically from rhs; the other      */
3154
/* never signals Inexact.                                             */
3155
/* ------------------------------------------------------------------ */
3156
decNumber * decNumberToIntegralExact(decNumber *res, const decNumber *rhs,
3157
                                     decContext *set) {
3158
  decNumber dn;
3159
  decContext workset;              /* working context */
3160
  uInt status=0;            /* accumulator */
3161
 
3162
  #if DECCHECK
3163
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
3164
  #endif
3165
 
3166
  /* handle infinities and NaNs */
3167
  if (SPECIALARG) {
3168
    if (decNumberIsInfinite(rhs)) decNumberCopy(res, rhs); /* an Infinity */
3169
     else decNaNs(res, rhs, NULL, set, &status); /* a NaN */
3170
    }
3171
   else { /* finite */
3172
    /* have a finite number; no error possible (res must be big enough) */
3173
    if (rhs->exponent>=0) return decNumberCopy(res, rhs);
3174
    /* that was easy, but if negative exponent there is work to do... */
3175
    workset=*set;                  /* clone rounding, etc. */
3176
    workset.digits=rhs->digits;    /* no length rounding */
3177
    workset.traps=0;                /* no traps */
3178
    decNumberZero(&dn);            /* make a number with exponent 0 */
3179
    decNumberQuantize(res, rhs, &dn, &workset);
3180
    status|=workset.status;
3181
    }
3182
  if (status!=0) decStatus(res, status, set);
3183
  return res;
3184
  } /* decNumberToIntegralExact */
3185
 
3186
decNumber * decNumberToIntegralValue(decNumber *res, const decNumber *rhs,
3187
                                     decContext *set) {
3188
  decContext workset=*set;         /* working context */
3189
  workset.traps=0;                  /* no traps */
3190
  decNumberToIntegralExact(res, rhs, &workset);
3191
  /* this never affects set, except for sNaNs; NaN will have been set */
3192
  /* or propagated already, so no need to call decStatus */
3193
  set->status|=workset.status&DEC_Invalid_operation;
3194
  return res;
3195
  } /* decNumberToIntegralValue */
3196
 
3197
/* ------------------------------------------------------------------ */
3198
/* decNumberXor -- XOR two Numbers, digitwise                         */
3199
/*                                                                    */
3200
/*   This computes C = A ^ B                                          */
3201
/*                                                                    */
3202
/*   res is C, the result.  C may be A and/or B (e.g., X=X^X)         */
3203
/*   lhs is A                                                         */
3204
/*   rhs is B                                                         */
3205
/*   set is the context (used for result length and error report)     */
3206
/*                                                                    */
3207
/* C must have space for set->digits digits.                          */
3208
/*                                                                    */
3209
/* Logical function restrictions apply (see above); a NaN is          */
3210
/* returned with Invalid_operation if a restriction is violated.      */
3211
/* ------------------------------------------------------------------ */
3212
decNumber * decNumberXor(decNumber *res, const decNumber *lhs,
3213
                         const decNumber *rhs, decContext *set) {
3214
  const Unit *ua, *ub;                  /* -> operands */
3215
  const Unit *msua, *msub;              /* -> operand msus */
3216
  Unit  *uc, *msuc;                     /* -> result and its msu */
3217
  Int   msudigs;                        /* digits in res msu */
3218
  #if DECCHECK
3219
  if (decCheckOperands(res, lhs, rhs, set)) return res;
3220
  #endif
3221
 
3222
  if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
3223
   || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
3224
    decStatus(res, DEC_Invalid_operation, set);
3225
    return res;
3226
    }
3227
  /* operands are valid */
3228
  ua=lhs->lsu;                          /* bottom-up */
3229
  ub=rhs->lsu;                          /* .. */
3230
  uc=res->lsu;                          /* .. */
3231
  msua=ua+D2U(lhs->digits)-1;           /* -> msu of lhs */
3232
  msub=ub+D2U(rhs->digits)-1;           /* -> msu of rhs */
3233
  msuc=uc+D2U(set->digits)-1;           /* -> msu of result */
3234
  msudigs=MSUDIGITS(set->digits);       /* [faster than remainder] */
3235
  for (; uc<=msuc; ua++, ub++, uc++) {  /* Unit loop */
3236
    Unit a, b;                          /* extract units */
3237
    if (ua>msua) a=0;
3238
     else a=*ua;
3239
    if (ub>msub) b=0;
3240
     else b=*ub;
3241
    *uc=0;                               /* can now write back */
3242
    if (a|b) {                          /* maybe 1 bits to examine */
3243
      Int i, j;
3244
      /* This loop could be unrolled and/or use BIN2BCD tables */
3245
      for (i=0; i<DECDPUN; i++) {
3246
        if ((a^b)&1) *uc=*uc+(Unit)powers[i];     /* effect XOR */
3247
        j=a%10;
3248
        a=a/10;
3249
        j|=b%10;
3250
        b=b/10;
3251
        if (j>1) {
3252
          decStatus(res, DEC_Invalid_operation, set);
3253
          return res;
3254
          }
3255
        if (uc==msuc && i==msudigs-1) break;      /* just did final digit */
3256
        } /* each digit */
3257
      } /* non-zero */
3258
    } /* each unit */
3259
  /* [here uc-1 is the msu of the result] */
3260
  res->digits=decGetDigits(res->lsu, uc-res->lsu);
3261
  res->exponent=0;                       /* integer */
3262
  res->bits=0;                           /* sign=0 */
3263
  return res;  /* [no status to set] */
3264
  } /* decNumberXor */
3265
 
3266
 
3267
/* ================================================================== */
3268
/* Utility routines                                                   */
3269
/* ================================================================== */
3270
 
3271
/* ------------------------------------------------------------------ */
3272
/* decNumberClass -- return the decClass of a decNumber               */
3273
/*   dn -- the decNumber to test                                      */
3274
/*   set -- the context to use for Emin                               */
3275
/*   returns the decClass enum                                        */
3276
/* ------------------------------------------------------------------ */
3277
enum decClass decNumberClass(const decNumber *dn, decContext *set) {
3278
  if (decNumberIsSpecial(dn)) {
3279
    if (decNumberIsQNaN(dn)) return DEC_CLASS_QNAN;
3280
    if (decNumberIsSNaN(dn)) return DEC_CLASS_SNAN;
3281
    /* must be an infinity */
3282
    if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_INF;
3283
    return DEC_CLASS_POS_INF;
3284
    }
3285
  /* is finite */
3286
  if (decNumberIsNormal(dn, set)) { /* most common */
3287
    if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_NORMAL;
3288
    return DEC_CLASS_POS_NORMAL;
3289
    }
3290
  /* is subnormal or zero */
3291
  if (decNumberIsZero(dn)) {    /* most common */
3292
    if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_ZERO;
3293
    return DEC_CLASS_POS_ZERO;
3294
    }
3295
  if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_SUBNORMAL;
3296
  return DEC_CLASS_POS_SUBNORMAL;
3297
  } /* decNumberClass */
3298
 
3299
/* ------------------------------------------------------------------ */
3300
/* decNumberClassToString -- convert decClass to a string             */
3301
/*                                                                    */
3302
/*  eclass is a valid decClass                                        */
3303
/*  returns a constant string describing the class (max 13+1 chars)   */
3304
/* ------------------------------------------------------------------ */
3305
const char *decNumberClassToString(enum decClass eclass) {
3306
  if (eclass==DEC_CLASS_POS_NORMAL)    return DEC_ClassString_PN;
3307
  if (eclass==DEC_CLASS_NEG_NORMAL)    return DEC_ClassString_NN;
3308
  if (eclass==DEC_CLASS_POS_ZERO)      return DEC_ClassString_PZ;
3309
  if (eclass==DEC_CLASS_NEG_ZERO)      return DEC_ClassString_NZ;
3310
  if (eclass==DEC_CLASS_POS_SUBNORMAL) return DEC_ClassString_PS;
3311
  if (eclass==DEC_CLASS_NEG_SUBNORMAL) return DEC_ClassString_NS;
3312
  if (eclass==DEC_CLASS_POS_INF)       return DEC_ClassString_PI;
3313
  if (eclass==DEC_CLASS_NEG_INF)       return DEC_ClassString_NI;
3314
  if (eclass==DEC_CLASS_QNAN)          return DEC_ClassString_QN;
3315
  if (eclass==DEC_CLASS_SNAN)          return DEC_ClassString_SN;
3316
  return DEC_ClassString_UN;           /* Unknown */
3317
  } /* decNumberClassToString */
3318
 
3319
/* ------------------------------------------------------------------ */
3320
/* decNumberCopy -- copy a number                                     */
3321
/*                                                                    */
3322
/*   dest is the target decNumber                                     */
3323
/*   src  is the source decNumber                                     */
3324
/*   returns dest                                                     */
3325
/*                                                                    */
3326
/* (dest==src is allowed and is a no-op)                              */
3327
/* All fields are updated as required.  This is a utility operation,  */
3328
/* so special values are unchanged and no error is possible.          */
3329
/* ------------------------------------------------------------------ */
3330
decNumber * decNumberCopy(decNumber *dest, const decNumber *src) {
3331
 
3332
  #if DECCHECK
3333
  if (src==NULL) return decNumberZero(dest);
3334
  #endif
3335
 
3336
  if (dest==src) return dest;                /* no copy required */
3337
 
3338
  /* Use explicit assignments here as structure assignment could copy */
3339
  /* more than just the lsu (for small DECDPUN).  This would not affect */
3340
  /* the value of the results, but could disturb test harness spill */
3341
  /* checking. */
3342
  dest->bits=src->bits;
3343
  dest->exponent=src->exponent;
3344
  dest->digits=src->digits;
3345
  dest->lsu[0]=src->lsu[0];
3346
  if (src->digits>DECDPUN) {                 /* more Units to come */
3347
    const Unit *smsup, *s;                   /* work */
3348
    Unit  *d;                                /* .. */
3349
    /* memcpy for the remaining Units would be safe as they cannot */
3350
    /* overlap.  However, this explicit loop is faster in short cases. */
3351
    d=dest->lsu+1;                           /* -> first destination */
3352
    smsup=src->lsu+D2U(src->digits);         /* -> source msu+1 */
3353
    for (s=src->lsu+1; s<smsup; s++, d++) *d=*s;
3354
    }
3355
  return dest;
3356
  } /* decNumberCopy */
3357
 
3358
/* ------------------------------------------------------------------ */
3359
/* decNumberCopyAbs -- quiet absolute value operator                  */
3360
/*                                                                    */
3361
/*   This sets C = abs(A)                                             */
3362
/*                                                                    */
3363
/*   res is C, the result.  C may be A                                */
3364
/*   rhs is A                                                         */
3365
/*                                                                    */
3366
/* C must have space for set->digits digits.                          */
3367
/* No exception or error can occur; this is a quiet bitwise operation.*/
3368
/* See also decNumberAbs for a checking version of this.              */
3369
/* ------------------------------------------------------------------ */
3370
decNumber * decNumberCopyAbs(decNumber *res, const decNumber *rhs) {
3371
  #if DECCHECK
3372
  if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
3373
  #endif
3374
  decNumberCopy(res, rhs);
3375
  res->bits&=~DECNEG;                   /* turn off sign */
3376
  return res;
3377
  } /* decNumberCopyAbs */
3378
 
3379
/* ------------------------------------------------------------------ */
3380
/* decNumberCopyNegate -- quiet negate value operator                 */
3381
/*                                                                    */
3382
/*   This sets C = negate(A)                                          */
3383
/*                                                                    */
3384
/*   res is C, the result.  C may be A                                */
3385
/*   rhs is A                                                         */
3386
/*                                                                    */
3387
/* C must have space for set->digits digits.                          */
3388
/* No exception or error can occur; this is a quiet bitwise operation.*/
3389
/* See also decNumberMinus for a checking version of this.            */
3390
/* ------------------------------------------------------------------ */
3391
decNumber * decNumberCopyNegate(decNumber *res, const decNumber *rhs) {
3392
  #if DECCHECK
3393
  if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
3394
  #endif
3395
  decNumberCopy(res, rhs);
3396
  res->bits^=DECNEG;                    /* invert the sign */
3397
  return res;
3398
  } /* decNumberCopyNegate */
3399
 
3400
/* ------------------------------------------------------------------ */
3401
/* decNumberCopySign -- quiet copy and set sign operator              */
3402
/*                                                                    */
3403
/*   This sets C = A with the sign of B                               */
3404
/*                                                                    */
3405
/*   res is C, the result.  C may be A                                */
3406
/*   lhs is A                                                         */
3407
/*   rhs is B                                                         */
3408
/*                                                                    */
3409
/* C must have space for set->digits digits.                          */
3410
/* No exception or error can occur; this is a quiet bitwise operation.*/
3411
/* ------------------------------------------------------------------ */
3412
decNumber * decNumberCopySign(decNumber *res, const decNumber *lhs,
3413
                              const decNumber *rhs) {
3414
  uByte sign;                           /* rhs sign */
3415
  #if DECCHECK
3416
  if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
3417
  #endif
3418
  sign=rhs->bits & DECNEG;              /* save sign bit */
3419
  decNumberCopy(res, lhs);
3420
  res->bits&=~DECNEG;                   /* clear the sign */
3421
  res->bits|=sign;                      /* set from rhs */
3422
  return res;
3423
  } /* decNumberCopySign */
3424
 
3425
/* ------------------------------------------------------------------ */
3426
/* decNumberGetBCD -- get the coefficient in BCD8                     */
3427
/*   dn is the source decNumber                                       */
3428
/*   bcd is the uInt array that will receive dn->digits BCD bytes,    */
3429
/*     most-significant at offset 0                                   */
3430
/*   returns bcd                                                      */
3431
/*                                                                    */
3432
/* bcd must have at least dn->digits bytes.  No error is possible; if */
3433
/* dn is a NaN or Infinite, digits must be 1 and the coefficient 0.   */
3434
/* ------------------------------------------------------------------ */
3435
uByte * decNumberGetBCD(const decNumber *dn, uint8_t *bcd) {
3436
  uByte *ub=bcd+dn->digits-1;      /* -> lsd */
3437
  const Unit *up=dn->lsu;          /* Unit pointer, -> lsu */
3438
 
3439
  #if DECDPUN==1                   /* trivial simple copy */
3440
    for (; ub>=bcd; ub--, up++) *ub=*up;
3441
  #else                            /* chopping needed */
3442
    uInt u=*up;                    /* work */
3443
    uInt cut=DECDPUN;              /* downcounter through unit */
3444
    for (; ub>=bcd; ub--) {
3445
      *ub=(uByte)(u%10);           /* [*6554 trick inhibits, here] */
3446
      u=u/10;
3447
      cut--;
3448
      if (cut>0) continue;          /* more in this unit */
3449
      up++;
3450
      u=*up;
3451
      cut=DECDPUN;
3452
      }
3453
  #endif
3454
  return bcd;
3455
  } /* decNumberGetBCD */
3456
 
3457
/* ------------------------------------------------------------------ */
3458
/* decNumberSetBCD -- set (replace) the coefficient from BCD8         */
3459
/*   dn is the target decNumber                                       */
3460
/*   bcd is the uInt array that will source n BCD bytes, most-        */
3461
/*     significant at offset 0                                        */
3462
/*   n is the number of digits in the source BCD array (bcd)          */
3463
/*   returns dn                                                       */
3464
/*                                                                    */
3465
/* dn must have space for at least n digits.  No error is possible;   */
3466
/* if dn is a NaN, or Infinite, or is to become a zero, n must be 1   */
3467
/* and bcd[0] zero.                                                   */
3468
/* ------------------------------------------------------------------ */
3469
decNumber * decNumberSetBCD(decNumber *dn, const uByte *bcd, uInt n) {
3470
  Unit *up=dn->lsu+D2U(dn->digits)-1;   /* -> msu [target pointer] */
3471
  const uByte *ub=bcd;                  /* -> source msd */
3472
 
3473
  #if DECDPUN==1                        /* trivial simple copy */
3474
    for (; ub<bcd+n; ub++, up--) *up=*ub;
3475
  #else                                 /* some assembly needed */
3476
    /* calculate how many digits in msu, and hence first cut */
3477
    Int cut=MSUDIGITS(n);               /* [faster than remainder] */
3478
    for (;up>=dn->lsu; up--) {          /* each Unit from msu */
3479
      *up=0;                             /* will take <=DECDPUN digits */
3480
      for (; cut>0; ub++, cut--) *up=X10(*up)+*ub;
3481
      cut=DECDPUN;                      /* next Unit has all digits */
3482
      }
3483
  #endif
3484
  dn->digits=n;                         /* set digit count */
3485
  return dn;
3486
  } /* decNumberSetBCD */
3487
 
3488
/* ------------------------------------------------------------------ */
3489
/* decNumberIsNormal -- test normality of a decNumber                 */
3490
/*   dn is the decNumber to test                                      */
3491
/*   set is the context to use for Emin                               */
3492
/*   returns 1 if |dn| is finite and >=Nmin, 0 otherwise              */
3493
/* ------------------------------------------------------------------ */
3494
Int decNumberIsNormal(const decNumber *dn, decContext *set) {
3495
  Int ae;                               /* adjusted exponent */
3496
  #if DECCHECK
3497
  if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
3498
  #endif
3499
 
3500
  if (decNumberIsSpecial(dn)) return 0; /* not finite */
3501
  if (decNumberIsZero(dn)) return 0;     /* not non-zero */
3502
 
3503
  ae=dn->exponent+dn->digits-1;         /* adjusted exponent */
3504
  if (ae<set->emin) return 0;            /* is subnormal */
3505
  return 1;
3506
  } /* decNumberIsNormal */
3507
 
3508
/* ------------------------------------------------------------------ */
3509
/* decNumberIsSubnormal -- test subnormality of a decNumber           */
3510
/*   dn is the decNumber to test                                      */
3511
/*   set is the context to use for Emin                               */
3512
/*   returns 1 if |dn| is finite, non-zero, and <Nmin, 0 otherwise    */
3513
/* ------------------------------------------------------------------ */
3514
Int decNumberIsSubnormal(const decNumber *dn, decContext *set) {
3515
  Int ae;                               /* adjusted exponent */
3516
  #if DECCHECK
3517
  if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
3518
  #endif
3519
 
3520
  if (decNumberIsSpecial(dn)) return 0; /* not finite */
3521
  if (decNumberIsZero(dn)) return 0;     /* not non-zero */
3522
 
3523
  ae=dn->exponent+dn->digits-1;         /* adjusted exponent */
3524
  if (ae<set->emin) return 1;           /* is subnormal */
3525
  return 0;
3526
  } /* decNumberIsSubnormal */
3527
 
3528
/* ------------------------------------------------------------------ */
3529
/* decNumberTrim -- remove insignificant zeros                        */
3530
/*                                                                    */
3531
/*   dn is the number to trim                                         */
3532
/*   returns dn                                                       */
3533
/*                                                                    */
3534
/* All fields are updated as required.  This is a utility operation,  */
3535
/* so special values are unchanged and no error is possible.          */
3536
/* ------------------------------------------------------------------ */
3537
decNumber * decNumberTrim(decNumber *dn) {
3538
  Int  dropped;                    /* work */
3539
  decContext set;                  /* .. */
3540
  #if DECCHECK
3541
  if (decCheckOperands(DECUNRESU, DECUNUSED, dn, DECUNCONT)) return dn;
3542
  #endif
3543
  decContextDefault(&set, DEC_INIT_BASE);    /* clamp=0 */
3544
  return decTrim(dn, &set, 0, &dropped);
3545
  } /* decNumberTrim */
3546
 
3547
/* ------------------------------------------------------------------ */
3548
/* decNumberVersion -- return the name and version of this module     */
3549
/*                                                                    */
3550
/* No error is possible.                                              */
3551
/* ------------------------------------------------------------------ */
3552
const char * decNumberVersion(void) {
3553
  return DECVERSION;
3554
  } /* decNumberVersion */
3555
 
3556
/* ------------------------------------------------------------------ */
3557
/* decNumberZero -- set a number to 0                                 */
3558
/*                                                                    */
3559
/*   dn is the number to set, with space for one digit                */
3560
/*   returns dn                                                       */
3561
/*                                                                    */
3562
/* No error is possible.                                              */
3563
/* ------------------------------------------------------------------ */
3564
/* Memset is not used as it is much slower in some environments. */
3565
decNumber * decNumberZero(decNumber *dn) {
3566
 
3567
  #if DECCHECK
3568
  if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
3569
  #endif
3570
 
3571
  dn->bits=0;
3572
  dn->exponent=0;
3573
  dn->digits=1;
3574
  dn->lsu[0]=0;
3575
  return dn;
3576
  } /* decNumberZero */
3577
 
3578
/* ================================================================== */
3579
/* Local routines                                                     */
3580
/* ================================================================== */
3581
 
3582
/* ------------------------------------------------------------------ */
3583
/* decToString -- lay out a number into a string                      */
3584
/*                                                                    */
3585
/*   dn     is the number to lay out                                  */
3586
/*   string is where to lay out the number                            */
3587
/*   eng    is 1 if Engineering, 0 if Scientific                      */
3588
/*                                                                    */
3589
/* string must be at least dn->digits+14 characters long              */
3590
/* No error is possible.                                              */
3591
/*                                                                    */
3592
/* Note that this routine can generate a -0 or 0.000.  These are      */
3593
/* never generated in subset to-number or arithmetic, but can occur   */
3594
/* in non-subset arithmetic (e.g., -1*0 or 1.234-1.234).              */
3595
/* ------------------------------------------------------------------ */
3596
/* If DECCHECK is enabled the string "?" is returned if a number is */
3597
/* invalid. */
3598
static void decToString(const decNumber *dn, char *string, Flag eng) {
3599
  Int exp=dn->exponent;       /* local copy */
3600
  Int e;                      /* E-part value */
3601
  Int pre;                    /* digits before the '.' */
3602
  Int cut;                    /* for counting digits in a Unit */
3603
  char *c=string;             /* work [output pointer] */
3604
  const Unit *up=dn->lsu+D2U(dn->digits)-1; /* -> msu [input pointer] */
3605
  uInt u, pow;                /* work */
3606
 
3607
  #if DECCHECK
3608
  if (decCheckOperands(DECUNRESU, dn, DECUNUSED, DECUNCONT)) {
3609
    strcpy(string, "?");
3610
    return;}
3611
  #endif
3612
 
3613
  if (decNumberIsNegative(dn)) {   /* Negatives get a minus */
3614
    *c='-';
3615
    c++;
3616
    }
3617
  if (dn->bits&DECSPECIAL) {       /* Is a special value */
3618
    if (decNumberIsInfinite(dn)) {
3619
      strcpy(c,   "Inf");
3620
      strcpy(c+3, "inity");
3621
      return;}
3622
    /* a NaN */
3623
    if (dn->bits&DECSNAN) {        /* signalling NaN */
3624
      *c='s';
3625
      c++;
3626
      }
3627
    strcpy(c, "NaN");
3628
    c+=3;                          /* step past */
3629
    /* if not a clean non-zero coefficient, that's all there is in a */
3630
    /* NaN string */
3631
    if (exp!=0 || (*dn->lsu==0 && dn->digits==1)) return;
3632
    /* [drop through to add integer] */
3633
    }
3634
 
3635
  /* calculate how many digits in msu, and hence first cut */
3636
  cut=MSUDIGITS(dn->digits);       /* [faster than remainder] */
3637
  cut--;                           /* power of ten for digit */
3638
 
3639
  if (exp==0) {                     /* simple integer [common fastpath] */
3640
    for (;up>=dn->lsu; up--) {     /* each Unit from msu */
3641
      u=*up;                       /* contains DECDPUN digits to lay out */
3642
      for (; cut>=0; c++, cut--) TODIGIT(u, cut, c, pow);
3643
      cut=DECDPUN-1;               /* next Unit has all digits */
3644
      }
3645
    *c='\0';                       /* terminate the string */
3646
    return;}
3647
 
3648
  /* non-0 exponent -- assume plain form */
3649
  pre=dn->digits+exp;              /* digits before '.' */
3650
  e=0;                              /* no E */
3651
  if ((exp>0) || (pre<-5)) {        /* need exponential form */
3652
    e=exp+dn->digits-1;            /* calculate E value */
3653
    pre=1;                         /* assume one digit before '.' */
3654
    if (eng && (e!=0)) {    /* engineering: may need to adjust */
3655
      Int adj;                     /* adjustment */
3656
      /* The C remainder operator is undefined for negative numbers, so */
3657
      /* a positive remainder calculation must be used here */
3658
      if (e<0) {
3659
        adj=(-e)%3;
3660
        if (adj!=0) adj=3-adj;
3661
        }
3662
       else { /* e>0 */
3663
        adj=e%3;
3664
        }
3665
      e=e-adj;
3666
      /* if dealing with zero still produce an exponent which is a */
3667
      /* multiple of three, as expected, but there will only be the */
3668
      /* one zero before the E, still.  Otherwise note the padding. */
3669
      if (!ISZERO(dn)) pre+=adj;
3670
       else {  /* is zero */
3671
        if (adj!=0) {               /* 0.00Esnn needed */
3672
          e=e+3;
3673
          pre=-(2-adj);
3674
          }
3675
        } /* zero */
3676
      } /* eng */
3677
    } /* need exponent */
3678
 
3679
  /* lay out the digits of the coefficient, adding 0s and . as needed */
3680
  u=*up;
3681
  if (pre>0) {                      /* xxx.xxx or xx00 (engineering) form */
3682
    Int n=pre;
3683
    for (; pre>0; pre--, c++, cut--) {
3684
      if (cut<0) {                  /* need new Unit */
3685
        if (up==dn->lsu) break;    /* out of input digits (pre>digits) */
3686
        up--;
3687
        cut=DECDPUN-1;
3688
        u=*up;
3689
        }
3690
      TODIGIT(u, cut, c, pow);
3691
      }
3692
    if (n<dn->digits) {            /* more to come, after '.' */
3693
      *c='.'; c++;
3694
      for (;; c++, cut--) {
3695
        if (cut<0) {                /* need new Unit */
3696
          if (up==dn->lsu) break;  /* out of input digits */
3697
          up--;
3698
          cut=DECDPUN-1;
3699
          u=*up;
3700
          }
3701
        TODIGIT(u, cut, c, pow);
3702
        }
3703
      }
3704
     else for (; pre>0; pre--, c++) *c='0'; /* 0 padding (for engineering) needed */
3705
    }
3706
   else {                          /* 0.xxx or 0.000xxx form */
3707
    *c='0'; c++;
3708
    *c='.'; c++;
3709
    for (; pre<0; pre++, c++) *c='0';    /* add any 0's after '.' */
3710
    for (; ; c++, cut--) {
3711
      if (cut<0) {                  /* need new Unit */
3712
        if (up==dn->lsu) break;    /* out of input digits */
3713
        up--;
3714
        cut=DECDPUN-1;
3715
        u=*up;
3716
        }
3717
      TODIGIT(u, cut, c, pow);
3718
      }
3719
    }
3720
 
3721
  /* Finally add the E-part, if needed.  It will never be 0, has a
3722
     base maximum and minimum of +999999999 through -999999999, but
3723
     could range down to -1999999998 for anormal numbers */
3724
  if (e!=0) {
3725
    Flag had=0;                /* 1=had non-zero */
3726
    *c='E'; c++;
3727
    *c='+'; c++;              /* assume positive */
3728
    u=e;                      /* .. */
3729
    if (e<0) {
3730
      *(c-1)='-';             /* oops, need - */
3731
      u=-e;                   /* uInt, please */
3732
      }
3733
    /* lay out the exponent [_itoa or equivalent is not ANSI C] */
3734
    for (cut=9; cut>=0; cut--) {
3735
      TODIGIT(u, cut, c, pow);
3736
      if (*c=='0' && !had) continue;    /* skip leading zeros */
3737
      had=1;                            /* had non-0 */
3738
      c++;                              /* step for next */
3739
      } /* cut */
3740
    }
3741
  *c='\0';          /* terminate the string (all paths) */
3742
  return;
3743
  } /* decToString */
3744
 
3745
/* ------------------------------------------------------------------ */
3746
/* decAddOp -- add/subtract operation                                 */
3747
/*                                                                    */
3748
/*   This computes C = A + B                                          */
3749
/*                                                                    */
3750
/*   res is C, the result.  C may be A and/or B (e.g., X=X+X)         */
3751
/*   lhs is A                                                         */
3752
/*   rhs is B                                                         */
3753
/*   set is the context                                               */
3754
/*   negate is DECNEG if rhs should be negated, or 0 otherwise        */
3755
/*   status accumulates status for the caller                         */
3756
/*                                                                    */
3757
/* C must have space for set->digits digits.                          */
3758
/* Inexact in status must be 0 for correct Exact zero sign in result  */
3759
/* ------------------------------------------------------------------ */
3760
/* If possible, the coefficient is calculated directly into C.        */
3761
/* However, if:                                                       */
3762
/*   -- a digits+1 calculation is needed because the numbers are      */
3763
/*      unaligned and span more than set->digits digits               */
3764
/*   -- a carry to digits+1 digits looks possible                     */
3765
/*   -- C is the same as A or B, and the result would destructively   */
3766
/*      overlap the A or B coefficient                                */
3767
/* then the result must be calculated into a temporary buffer.  In    */
3768
/* this case a local (stack) buffer is used if possible, and only if  */
3769
/* too long for that does malloc become the final resort.             */
3770
/*                                                                    */
3771
/* Misalignment is handled as follows:                                */
3772
/*   Apad: (AExp>BExp) Swap operands and proceed as for BExp>AExp.    */
3773
/*   BPad: Apply the padding by a combination of shifting (whole      */
3774
/*         units) and multiplication (part units).                    */
3775
/*                                                                    */
3776
/* Addition, especially x=x+1, is speed-critical.                     */
3777
/* The static buffer is larger than might be expected to allow for    */
3778
/* calls from higher-level funtions (notable exp).                    */
3779
/* ------------------------------------------------------------------ */
3780
static decNumber * decAddOp(decNumber *res, const decNumber *lhs,
3781
                            const decNumber *rhs, decContext *set,
3782
                            uByte negate, uInt *status) {
3783
  #if DECSUBSET
3784
  decNumber *alloclhs=NULL;        /* non-NULL if rounded lhs allocated */
3785
  decNumber *allocrhs=NULL;        /* .., rhs */
3786
  #endif
3787
  Int   rhsshift;                  /* working shift (in Units) */
3788
  Int   maxdigits;                 /* longest logical length */
3789
  Int   mult;                      /* multiplier */
3790
  Int   residue;                   /* rounding accumulator */
3791
  uByte bits;                      /* result bits */
3792
  Flag  diffsign;                  /* non-0 if arguments have different sign */
3793
  Unit  *acc;                      /* accumulator for result */
3794
  Unit  accbuff[SD2U(DECBUFFER*2+20)]; /* local buffer [*2+20 reduces many */
3795
                                   /* allocations when called from */
3796
                                   /* other operations, notable exp] */
3797
  Unit  *allocacc=NULL;            /* -> allocated acc buffer, iff allocated */
3798
  Int   reqdigits=set->digits;     /* local copy; requested DIGITS */
3799
  Int   padding;                   /* work */
3800
 
3801
  #if DECCHECK
3802
  if (decCheckOperands(res, lhs, rhs, set)) return res;
3803
  #endif
3804
 
3805
  do {                             /* protect allocated storage */
3806
    #if DECSUBSET
3807
    if (!set->extended) {
3808
      /* reduce operands and set lostDigits status, as needed */
3809
      if (lhs->digits>reqdigits) {
3810
        alloclhs=decRoundOperand(lhs, set, status);
3811
        if (alloclhs==NULL) break;
3812
        lhs=alloclhs;
3813
        }
3814
      if (rhs->digits>reqdigits) {
3815
        allocrhs=decRoundOperand(rhs, set, status);
3816
        if (allocrhs==NULL) break;
3817
        rhs=allocrhs;
3818
        }
3819
      }
3820
    #endif
3821
    /* [following code does not require input rounding] */
3822
 
3823
    /* note whether signs differ [used all paths] */
3824
    diffsign=(Flag)((lhs->bits^rhs->bits^negate)&DECNEG);
3825
 
3826
    /* handle infinities and NaNs */
3827
    if (SPECIALARGS) {                  /* a special bit set */
3828
      if (SPECIALARGS & (DECSNAN | DECNAN))  /* a NaN */
3829
        decNaNs(res, lhs, rhs, set, status);
3830
       else { /* one or two infinities */
3831
        if (decNumberIsInfinite(lhs)) { /* LHS is infinity */
3832
          /* two infinities with different signs is invalid */
3833
          if (decNumberIsInfinite(rhs) && diffsign) {
3834
            *status|=DEC_Invalid_operation;
3835
            break;
3836
            }
3837
          bits=lhs->bits & DECNEG;      /* get sign from LHS */
3838
          }
3839
         else bits=(rhs->bits^negate) & DECNEG;/* RHS must be Infinity */
3840
        bits|=DECINF;
3841
        decNumberZero(res);
3842
        res->bits=bits;                 /* set +/- infinity */
3843
        } /* an infinity */
3844
      break;
3845
      }
3846
 
3847
    /* Quick exit for add 0s; return the non-0, modified as need be */
3848
    if (ISZERO(lhs)) {
3849
      Int adjust;                       /* work */
3850
      Int lexp=lhs->exponent;           /* save in case LHS==RES */
3851
      bits=lhs->bits;                   /* .. */
3852
      residue=0;                 /* clear accumulator */
3853
      decCopyFit(res, rhs, set, &residue, status); /* copy (as needed) */
3854
      res->bits^=negate;                /* flip if rhs was negated */
3855
      #if DECSUBSET
3856
      if (set->extended) {              /* exponents on zeros count */
3857
      #endif
3858
        /* exponent will be the lower of the two */
3859
        adjust=lexp-res->exponent;      /* adjustment needed [if -ve] */
3860
        if (ISZERO(res)) {              /* both 0: special IEEE 854 rules */
3861
          if (adjust<0) res->exponent=lexp;  /* set exponent */
3862
          /* 0-0 gives +0 unless rounding to -infinity, and -0-0 gives -0 */
3863
          if (diffsign) {
3864
            if (set->round!=DEC_ROUND_FLOOR) res->bits=0;
3865
             else res->bits=DECNEG;     /* preserve 0 sign */
3866
            }
3867
          }
3868
         else { /* non-0 res */
3869
          if (adjust<0) {     /* 0-padding needed */
3870
            if ((res->digits-adjust)>set->digits) {
3871
              adjust=res->digits-set->digits;     /* to fit exactly */
3872
              *status|=DEC_Rounded;               /* [but exact] */
3873
              }
3874
            res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
3875
            res->exponent+=adjust;                /* set the exponent. */
3876
            }
3877
          } /* non-0 res */
3878
      #if DECSUBSET
3879
        } /* extended */
3880
      #endif
3881
      decFinish(res, set, &residue, status);      /* clean and finalize */
3882
      break;}
3883
 
3884
    if (ISZERO(rhs)) {                  /* [lhs is non-zero] */
3885
      Int adjust;                       /* work */
3886
      Int rexp=rhs->exponent;           /* save in case RHS==RES */
3887
      bits=rhs->bits;                   /* be clean */
3888
      residue=0;                 /* clear accumulator */
3889
      decCopyFit(res, lhs, set, &residue, status); /* copy (as needed) */
3890
      #if DECSUBSET
3891
      if (set->extended) {              /* exponents on zeros count */
3892
      #endif
3893
        /* exponent will be the lower of the two */
3894
        /* [0-0 case handled above] */
3895
        adjust=rexp-res->exponent;      /* adjustment needed [if -ve] */
3896
        if (adjust<0) {      /* 0-padding needed */
3897
          if ((res->digits-adjust)>set->digits) {
3898
            adjust=res->digits-set->digits;     /* to fit exactly */
3899
            *status|=DEC_Rounded;               /* [but exact] */
3900
            }
3901
          res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
3902
          res->exponent+=adjust;                /* set the exponent. */
3903
          }
3904
      #if DECSUBSET
3905
        } /* extended */
3906
      #endif
3907
      decFinish(res, set, &residue, status);      /* clean and finalize */
3908
      break;}
3909
 
3910
    /* [NB: both fastpath and mainpath code below assume these cases */
3911
    /* (notably 0-0) have already been handled] */
3912
 
3913
    /* calculate the padding needed to align the operands */
3914
    padding=rhs->exponent-lhs->exponent;
3915
 
3916
    /* Fastpath cases where the numbers are aligned and normal, the RHS */
3917
    /* is all in one unit, no operand rounding is needed, and no carry, */
3918
    /* lengthening, or borrow is needed */
3919
    if (padding==0
3920
        && rhs->digits<=DECDPUN
3921
        && rhs->exponent>=set->emin     /* [some normals drop through] */
3922
        && rhs->exponent<=set->emax-set->digits+1 /* [could clamp] */
3923
        && rhs->digits<=reqdigits
3924
        && lhs->digits<=reqdigits) {
3925
      Int partial=*lhs->lsu;
3926
      if (!diffsign) {                  /* adding */
3927
        partial+=*rhs->lsu;
3928
        if ((partial<=DECDPUNMAX)       /* result fits in unit */
3929
         && (lhs->digits>=DECDPUN ||    /* .. and no digits-count change */
3930
             partial<(Int)powers[lhs->digits])) { /* .. */
3931
          if (res!=lhs) decNumberCopy(res, lhs);  /* not in place */
3932
          *res->lsu=(Unit)partial;      /* [copy could have overwritten RHS] */
3933
          break;
3934
          }
3935
        /* else drop out for careful add */
3936
        }
3937
       else {                           /* signs differ */
3938
        partial-=*rhs->lsu;
3939
        if (partial>0) { /* no borrow needed, and non-0 result */
3940
          if (res!=lhs) decNumberCopy(res, lhs);  /* not in place */
3941
          *res->lsu=(Unit)partial;
3942
          /* this could have reduced digits [but result>0] */
3943
          res->digits=decGetDigits(res->lsu, D2U(res->digits));
3944
          break;
3945
          }
3946
        /* else drop out for careful subtract */
3947
        }
3948
      }
3949
 
3950
    /* Now align (pad) the lhs or rhs so they can be added or */
3951
    /* subtracted, as necessary.  If one number is much larger than */
3952
    /* the other (that is, if in plain form there is a least one */
3953
    /* digit between the lowest digit of one and the highest of the */
3954
    /* other) padding with up to DIGITS-1 trailing zeros may be */
3955
    /* needed; then apply rounding (as exotic rounding modes may be */
3956
    /* affected by the residue). */
3957
    rhsshift=0;                /* rhs shift to left (padding) in Units */
3958
    bits=lhs->bits;           /* assume sign is that of LHS */
3959
    mult=1;                   /* likely multiplier */
3960
 
3961
    /* [if padding==0 the operands are aligned; no padding is needed] */
3962
    if (padding!=0) {
3963
      /* some padding needed; always pad the RHS, as any required */
3964
      /* padding can then be effected by a simple combination of */
3965
      /* shifts and a multiply */
3966
      Flag swapped=0;
3967
      if (padding<0) {                   /* LHS needs the padding */
3968
        const decNumber *t;
3969
        padding=-padding;               /* will be +ve */
3970
        bits=(uByte)(rhs->bits^negate); /* assumed sign is now that of RHS */
3971
        t=lhs; lhs=rhs; rhs=t;
3972
        swapped=1;
3973
        }
3974
 
3975
      /* If, after pad, rhs would be longer than lhs by digits+1 or */
3976
      /* more then lhs cannot affect the answer, except as a residue, */
3977
      /* so only need to pad up to a length of DIGITS+1. */
3978
      if (rhs->digits+padding > lhs->digits+reqdigits+1) {
3979
        /* The RHS is sufficient */
3980
        /* for residue use the relative sign indication... */
3981
        Int shift=reqdigits-rhs->digits;     /* left shift needed */
3982
        residue=1;                           /* residue for rounding */
3983
        if (diffsign) residue=-residue;      /* signs differ */
3984
        /* copy, shortening if necessary */
3985
        decCopyFit(res, rhs, set, &residue, status);
3986
        /* if it was already shorter, then need to pad with zeros */
3987
        if (shift>0) {
3988
          res->digits=decShiftToMost(res->lsu, res->digits, shift);
3989
          res->exponent-=shift;              /* adjust the exponent. */
3990
          }
3991
        /* flip the result sign if unswapped and rhs was negated */
3992
        if (!swapped) res->bits^=negate;
3993
        decFinish(res, set, &residue, status);    /* done */
3994
        break;}
3995
 
3996
      /* LHS digits may affect result */
3997
      rhsshift=D2U(padding+1)-1;        /* this much by Unit shift .. */
3998
      mult=powers[padding-(rhsshift*DECDPUN)]; /* .. this by multiplication */
3999
      } /* padding needed */
4000
 
4001
    if (diffsign) mult=-mult;           /* signs differ */
4002
 
4003
    /* determine the longer operand */
4004
    maxdigits=rhs->digits+padding;      /* virtual length of RHS */
4005
    if (lhs->digits>maxdigits) maxdigits=lhs->digits;
4006
 
4007
    /* Decide on the result buffer to use; if possible place directly */
4008
    /* into result. */
4009
    acc=res->lsu;                       /* assume add direct to result */
4010
    /* If destructive overlap, or the number is too long, or a carry or */
4011
    /* borrow to DIGITS+1 might be possible, a buffer must be used. */
4012
    /* [Might be worth more sophisticated tests when maxdigits==reqdigits] */
4013
    if ((maxdigits>=reqdigits)          /* is, or could be, too large */
4014
     || (res==rhs && rhsshift>0)) {      /* destructive overlap */
4015
      /* buffer needed, choose it; units for maxdigits digits will be */
4016
      /* needed, +1 Unit for carry or borrow */
4017
      Int need=D2U(maxdigits)+1;
4018
      acc=accbuff;                      /* assume use local buffer */
4019
      if (need*sizeof(Unit)>sizeof(accbuff)) {
4020
        /* printf("malloc add %ld %ld\n", need, sizeof(accbuff)); */
4021
        allocacc=(Unit *)malloc(need*sizeof(Unit));
4022
        if (allocacc==NULL) {           /* hopeless -- abandon */
4023
          *status|=DEC_Insufficient_storage;
4024
          break;}
4025
        acc=allocacc;
4026
        }
4027
      }
4028
 
4029
    res->bits=(uByte)(bits&DECNEG);     /* it's now safe to overwrite.. */
4030
    res->exponent=lhs->exponent;        /* .. operands (even if aliased) */
4031
 
4032
    #if DECTRACE
4033
      decDumpAr('A', lhs->lsu, D2U(lhs->digits));
4034
      decDumpAr('B', rhs->lsu, D2U(rhs->digits));
4035
      printf("  :h: %ld %ld\n", rhsshift, mult);
4036
    #endif
4037
 
4038
    /* add [A+B*m] or subtract [A+B*(-m)] */
4039
    res->digits=decUnitAddSub(lhs->lsu, D2U(lhs->digits),
4040
                              rhs->lsu, D2U(rhs->digits),
4041
                              rhsshift, acc, mult)
4042
               *DECDPUN;           /* [units -> digits] */
4043
    if (res->digits<0) {    /* borrowed... */
4044
      res->digits=-res->digits;
4045
      res->bits^=DECNEG;           /* flip the sign */
4046
      }
4047
    #if DECTRACE
4048
      decDumpAr('+', acc, D2U(res->digits));
4049
    #endif
4050
 
4051
    /* If a buffer was used the result must be copied back, possibly */
4052
    /* shortening.  (If no buffer was used then the result must have */
4053
    /* fit, so can't need rounding and residue must be 0.) */
4054
    residue=0;                      /* clear accumulator */
4055
    if (acc!=res->lsu) {
4056
      #if DECSUBSET
4057
      if (set->extended) {         /* round from first significant digit */
4058
      #endif
4059
        /* remove leading zeros that were added due to rounding up to */
4060
        /* integral Units -- before the test for rounding. */
4061
        if (res->digits>reqdigits)
4062
          res->digits=decGetDigits(acc, D2U(res->digits));
4063
        decSetCoeff(res, set, acc, res->digits, &residue, status);
4064
      #if DECSUBSET
4065
        }
4066
       else { /* subset arithmetic rounds from original significant digit */
4067
        /* May have an underestimate.  This only occurs when both */
4068
        /* numbers fit in DECDPUN digits and are padding with a */
4069
        /* negative multiple (-10, -100...) and the top digit(s) become */
4070
        /* 0.  (This only matters when using X3.274 rules where the */
4071
        /* leading zero could be included in the rounding.) */
4072
        if (res->digits<maxdigits) {
4073
          *(acc+D2U(res->digits))=0; /* ensure leading 0 is there */
4074
          res->digits=maxdigits;
4075
          }
4076
         else {
4077
          /* remove leading zeros that added due to rounding up to */
4078
          /* integral Units (but only those in excess of the original */
4079
          /* maxdigits length, unless extended) before test for rounding. */
4080
          if (res->digits>reqdigits) {
4081
            res->digits=decGetDigits(acc, D2U(res->digits));
4082
            if (res->digits<maxdigits) res->digits=maxdigits;
4083
            }
4084
          }
4085
        decSetCoeff(res, set, acc, res->digits, &residue, status);
4086
        /* Now apply rounding if needed before removing leading zeros. */
4087
        /* This is safe because subnormals are not a possibility */
4088
        if (residue!=0) {
4089
          decApplyRound(res, set, residue, status);
4090
          residue=0;                  /* did what needed to be done */
4091
          }
4092
        } /* subset */
4093
      #endif
4094
      } /* used buffer */
4095
 
4096
    /* strip leading zeros [these were left on in case of subset subtract] */
4097
    res->digits=decGetDigits(res->lsu, D2U(res->digits));
4098
 
4099
    /* apply checks and rounding */
4100
    decFinish(res, set, &residue, status);
4101
 
4102
    /* "When the sum of two operands with opposite signs is exactly */
4103
    /* zero, the sign of that sum shall be '+' in all rounding modes */
4104
    /* except round toward -Infinity, in which mode that sign shall be */
4105
    /* '-'."  [Subset zeros also never have '-', set by decFinish.] */
4106
    if (ISZERO(res) && diffsign
4107
     #if DECSUBSET
4108
     && set->extended
4109
     #endif
4110
     && (*status&DEC_Inexact)==0) {
4111
      if (set->round==DEC_ROUND_FLOOR) res->bits|=DECNEG;   /* sign - */
4112
                                  else res->bits&=~DECNEG;  /* sign + */
4113
      }
4114
    } while(0);                               /* end protected */
4115
 
4116
  if (allocacc!=NULL) free(allocacc);        /* drop any storage used */
4117
  #if DECSUBSET
4118
  if (allocrhs!=NULL) free(allocrhs);        /* .. */
4119
  if (alloclhs!=NULL) free(alloclhs);        /* .. */
4120
  #endif
4121
  return res;
4122
  } /* decAddOp */
4123
 
4124
/* ------------------------------------------------------------------ */
4125
/* decDivideOp -- division operation                                  */
4126
/*                                                                    */
4127
/*  This routine performs the calculations for all four division      */
4128
/*  operators (divide, divideInteger, remainder, remainderNear).      */
4129
/*                                                                    */
4130
/*  C=A op B                                                          */
4131
/*                                                                    */
4132
/*   res is C, the result.  C may be A and/or B (e.g., X=X/X)         */
4133
/*   lhs is A                                                         */
4134
/*   rhs is B                                                         */
4135
/*   set is the context                                               */
4136
/*   op  is DIVIDE, DIVIDEINT, REMAINDER, or REMNEAR respectively.    */
4137
/*   status is the usual accumulator                                  */
4138
/*                                                                    */
4139
/* C must have space for set->digits digits.                          */
4140
/*                                                                    */
4141
/* ------------------------------------------------------------------ */
4142
/*   The underlying algorithm of this routine is the same as in the   */
4143
/*   1981 S/370 implementation, that is, non-restoring long division  */
4144
/*   with bi-unit (rather than bi-digit) estimation for each unit     */
4145
/*   multiplier.  In this pseudocode overview, complications for the  */
4146
/*   Remainder operators and division residues for exact rounding are */
4147
/*   omitted for clarity.                                             */
4148
/*                                                                    */
4149
/*     Prepare operands and handle special values                     */
4150
/*     Test for x/0 and then 0/x                                      */
4151
/*     Exp =Exp1 - Exp2                                               */
4152
/*     Exp =Exp +len(var1) -len(var2)                                 */
4153
/*     Sign=Sign1 * Sign2                                             */
4154
/*     Pad accumulator (Var1) to double-length with 0's (pad1)        */
4155
/*     Pad Var2 to same length as Var1                                */
4156
/*     msu2pair/plus=1st 2 or 1 units of var2, +1 to allow for round  */
4157
/*     have=0                                                         */
4158
/*     Do until (have=digits+1 OR residue=0)                          */
4159
/*       if exp<0 then if integer divide/residue then leave           */
4160
/*       this_unit=0                                                  */
4161
/*       Do forever                                                   */
4162
/*          compare numbers                                           */
4163
/*          if <0 then leave inner_loop                               */
4164
/*          if =0 then (* quick exit without subtract *) do           */
4165
/*             this_unit=this_unit+1; output this_unit                */
4166
/*             leave outer_loop; end                                  */
4167
/*          Compare lengths of numbers (mantissae):                   */
4168
/*          If same then tops2=msu2pair -- {units 1&2 of var2}        */
4169
/*                  else tops2=msu2plus -- {0, unit 1 of var2}        */
4170
/*          tops1=first_unit_of_Var1*10**DECDPUN +second_unit_of_var1 */
4171
/*          mult=tops1/tops2  -- Good and safe guess at divisor       */
4172
/*          if mult=0 then mult=1                                     */
4173
/*          this_unit=this_unit+mult                                  */
4174
/*          subtract                                                  */
4175
/*          end inner_loop                                            */
4176
/*        if have\=0 | this_unit\=0 then do                           */
4177
/*          output this_unit                                          */
4178
/*          have=have+1; end                                          */
4179
/*        var2=var2/10                                                */
4180
/*        exp=exp-1                                                   */
4181
/*        end outer_loop                                              */
4182
/*     exp=exp+1   -- set the proper exponent                         */
4183
/*     if have=0 then generate answer=0                               */
4184
/*     Return (Result is defined by Var1)                             */
4185
/*                                                                    */
4186
/* ------------------------------------------------------------------ */
4187
/* Two working buffers are needed during the division; one (digits+   */
4188
/* 1) to accumulate the result, and the other (up to 2*digits+1) for  */
4189
/* long subtractions.  These are acc and var1 respectively.           */
4190
/* var1 is a copy of the lhs coefficient, var2 is the rhs coefficient.*/
4191
/* The static buffers may be larger than might be expected to allow   */
4192
/* for calls from higher-level funtions (notable exp).                */
4193
/* ------------------------------------------------------------------ */
4194
static decNumber * decDivideOp(decNumber *res,
4195
                               const decNumber *lhs, const decNumber *rhs,
4196
                               decContext *set, Flag op, uInt *status) {
4197
  #if DECSUBSET
4198
  decNumber *alloclhs=NULL;        /* non-NULL if rounded lhs allocated */
4199
  decNumber *allocrhs=NULL;        /* .., rhs */
4200
  #endif
4201
  Unit  accbuff[SD2U(DECBUFFER+DECDPUN+10)]; /* local buffer */
4202
  Unit  *acc=accbuff;              /* -> accumulator array for result */
4203
  Unit  *allocacc=NULL;            /* -> allocated buffer, iff allocated */
4204
  Unit  *accnext;                  /* -> where next digit will go */
4205
  Int   acclength;                 /* length of acc needed [Units] */
4206
  Int   accunits;                  /* count of units accumulated */
4207
  Int   accdigits;                 /* count of digits accumulated */
4208
 
4209
  Unit  varbuff[SD2U(DECBUFFER*2+DECDPUN)*sizeof(Unit)]; /* buffer for var1 */
4210
  Unit  *var1=varbuff;             /* -> var1 array for long subtraction */
4211
  Unit  *varalloc=NULL;            /* -> allocated buffer, iff used */
4212
  Unit  *msu1;                     /* -> msu of var1 */
4213
 
4214
  const Unit *var2;                /* -> var2 array */
4215
  const Unit *msu2;                /* -> msu of var2 */
4216
  Int   msu2plus;                  /* msu2 plus one [does not vary] */
4217
  eInt  msu2pair;                  /* msu2 pair plus one [does not vary] */
4218
 
4219
  Int   var1units, var2units;      /* actual lengths */
4220
  Int   var2ulen;                  /* logical length (units) */
4221
  Int   var1initpad=0;              /* var1 initial padding (digits) */
4222
  Int   maxdigits;                 /* longest LHS or required acc length */
4223
  Int   mult;                      /* multiplier for subtraction */
4224
  Unit  thisunit;                  /* current unit being accumulated */
4225
  Int   residue;                   /* for rounding */
4226
  Int   reqdigits=set->digits;     /* requested DIGITS */
4227
  Int   exponent;                  /* working exponent */
4228
  Int   maxexponent=0;              /* DIVIDE maximum exponent if unrounded */
4229
  uByte bits;                      /* working sign */
4230
  Unit  *target;                   /* work */
4231
  const Unit *source;              /* .. */
4232
  uInt  const *pow;                /* .. */
4233
  Int   shift, cut;                /* .. */
4234
  #if DECSUBSET
4235
  Int   dropped;                   /* work */
4236
  #endif
4237
 
4238
  #if DECCHECK
4239
  if (decCheckOperands(res, lhs, rhs, set)) return res;
4240
  #endif
4241
 
4242
  do {                             /* protect allocated storage */
4243
    #if DECSUBSET
4244
    if (!set->extended) {
4245
      /* reduce operands and set lostDigits status, as needed */
4246
      if (lhs->digits>reqdigits) {
4247
        alloclhs=decRoundOperand(lhs, set, status);
4248
        if (alloclhs==NULL) break;
4249
        lhs=alloclhs;
4250
        }
4251
      if (rhs->digits>reqdigits) {
4252
        allocrhs=decRoundOperand(rhs, set, status);
4253
        if (allocrhs==NULL) break;
4254
        rhs=allocrhs;
4255
        }
4256
      }
4257
    #endif
4258
    /* [following code does not require input rounding] */
4259
 
4260
    bits=(lhs->bits^rhs->bits)&DECNEG;  /* assumed sign for divisions */
4261
 
4262
    /* handle infinities and NaNs */
4263
    if (SPECIALARGS) {                  /* a special bit set */
4264
      if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs */
4265
        decNaNs(res, lhs, rhs, set, status);
4266
        break;
4267
        }
4268
      /* one or two infinities */
4269
      if (decNumberIsInfinite(lhs)) {   /* LHS (dividend) is infinite */
4270
        if (decNumberIsInfinite(rhs) || /* two infinities are invalid .. */
4271
            op & (REMAINDER | REMNEAR)) { /* as is remainder of infinity */
4272
          *status|=DEC_Invalid_operation;
4273
          break;
4274
          }
4275
        /* [Note that infinity/0 raises no exceptions] */
4276
        decNumberZero(res);
4277
        res->bits=bits|DECINF;          /* set +/- infinity */
4278
        break;
4279
        }
4280
       else {                           /* RHS (divisor) is infinite */
4281
        residue=0;
4282
        if (op&(REMAINDER|REMNEAR)) {
4283
          /* result is [finished clone of] lhs */
4284
          decCopyFit(res, lhs, set, &residue, status);
4285
          }
4286
         else {  /* a division */
4287
          decNumberZero(res);
4288
          res->bits=bits;               /* set +/- zero */
4289
          /* for DIVIDEINT the exponent is always 0.  For DIVIDE, result */
4290
          /* is a 0 with infinitely negative exponent, clamped to minimum */
4291
          if (op&DIVIDE) {
4292
            res->exponent=set->emin-set->digits+1;
4293
            *status|=DEC_Clamped;
4294
            }
4295
          }
4296
        decFinish(res, set, &residue, status);
4297
        break;
4298
        }
4299
      }
4300
 
4301
    /* handle 0 rhs (x/0) */
4302
    if (ISZERO(rhs)) {                  /* x/0 is always exceptional */
4303
      if (ISZERO(lhs)) {
4304
        decNumberZero(res);             /* [after lhs test] */
4305
        *status|=DEC_Division_undefined;/* 0/0 will become NaN */
4306
        }
4307
       else {
4308
        decNumberZero(res);
4309
        if (op&(REMAINDER|REMNEAR)) *status|=DEC_Invalid_operation;
4310
         else {
4311
          *status|=DEC_Division_by_zero; /* x/0 */
4312
          res->bits=bits|DECINF;         /* .. is +/- Infinity */
4313
          }
4314
        }
4315
      break;}
4316
 
4317
    /* handle 0 lhs (0/x) */
4318
    if (ISZERO(lhs)) {                  /* 0/x [x!=0] */
4319
      #if DECSUBSET
4320
      if (!set->extended) decNumberZero(res);
4321
       else {
4322
      #endif
4323
        if (op&DIVIDE) {
4324
          residue=0;
4325
          exponent=lhs->exponent-rhs->exponent; /* ideal exponent */
4326
          decNumberCopy(res, lhs);      /* [zeros always fit] */
4327
          res->bits=bits;               /* sign as computed */
4328
          res->exponent=exponent;       /* exponent, too */
4329
          decFinalize(res, set, &residue, status);   /* check exponent */
4330
          }
4331
         else if (op&DIVIDEINT) {
4332
          decNumberZero(res);           /* integer 0 */
4333
          res->bits=bits;               /* sign as computed */
4334
          }
4335
         else {                         /* a remainder */
4336
          exponent=rhs->exponent;       /* [save in case overwrite] */
4337
          decNumberCopy(res, lhs);      /* [zeros always fit] */
4338
          if (exponent<res->exponent) res->exponent=exponent; /* use lower */
4339
          }
4340
      #if DECSUBSET
4341
        }
4342
      #endif
4343
      break;}
4344
 
4345
    /* Precalculate exponent.  This starts off adjusted (and hence fits */
4346
    /* in 31 bits) and becomes the usual unadjusted exponent as the */
4347
    /* division proceeds.  The order of evaluation is important, here, */
4348
    /* to avoid wrap. */
4349
    exponent=(lhs->exponent+lhs->digits)-(rhs->exponent+rhs->digits);
4350
 
4351
    /* If the working exponent is -ve, then some quick exits are */
4352
    /* possible because the quotient is known to be <1 */
4353
    /* [for REMNEAR, it needs to be < -1, as -0.5 could need work] */
4354
    if (exponent<0 && !(op==DIVIDE)) {
4355
      if (op&DIVIDEINT) {
4356
        decNumberZero(res);                  /* integer part is 0 */
4357
        #if DECSUBSET
4358
        if (set->extended)
4359
        #endif
4360
          res->bits=bits;                    /* set +/- zero */
4361
        break;}
4362
      /* fastpath remainders so long as the lhs has the smaller */
4363
      /* (or equal) exponent */
4364
      if (lhs->exponent<=rhs->exponent) {
4365
        if (op&REMAINDER || exponent<-1) {
4366
          /* It is REMAINDER or safe REMNEAR; result is [finished */
4367
          /* clone of] lhs  (r = x - 0*y) */
4368
          residue=0;
4369
          decCopyFit(res, lhs, set, &residue, status);
4370
          decFinish(res, set, &residue, status);
4371
          break;
4372
          }
4373
        /* [unsafe REMNEAR drops through] */
4374
        }
4375
      } /* fastpaths */
4376
 
4377
    /* Long (slow) division is needed; roll up the sleeves... */
4378
 
4379
    /* The accumulator will hold the quotient of the division. */
4380
    /* If it needs to be too long for stack storage, then allocate. */
4381
    acclength=D2U(reqdigits+DECDPUN);   /* in Units */
4382
    if (acclength*sizeof(Unit)>sizeof(accbuff)) {
4383
      /* printf("malloc dvacc %ld units\n", acclength); */
4384
      allocacc=(Unit *)malloc(acclength*sizeof(Unit));
4385
      if (allocacc==NULL) {             /* hopeless -- abandon */
4386
        *status|=DEC_Insufficient_storage;
4387
        break;}
4388
      acc=allocacc;                     /* use the allocated space */
4389
      }
4390
 
4391
    /* var1 is the padded LHS ready for subtractions. */
4392
    /* If it needs to be too long for stack storage, then allocate. */
4393
    /* The maximum units needed for var1 (long subtraction) is: */
4394
    /* Enough for */
4395
    /*     (rhs->digits+reqdigits-1) -- to allow full slide to right */
4396
    /* or  (lhs->digits)             -- to allow for long lhs */
4397
    /* whichever is larger */
4398
    /*   +1                -- for rounding of slide to right */
4399
    /*   +1                -- for leading 0s */
4400
    /*   +1                -- for pre-adjust if a remainder or DIVIDEINT */
4401
    /* [Note: unused units do not participate in decUnitAddSub data] */
4402
    maxdigits=rhs->digits+reqdigits-1;
4403
    if (lhs->digits>maxdigits) maxdigits=lhs->digits;
4404
    var1units=D2U(maxdigits)+2;
4405
    /* allocate a guard unit above msu1 for REMAINDERNEAR */
4406
    if (!(op&DIVIDE)) var1units++;
4407
    if ((var1units+1)*sizeof(Unit)>sizeof(varbuff)) {
4408
      /* printf("malloc dvvar %ld units\n", var1units+1); */
4409
      varalloc=(Unit *)malloc((var1units+1)*sizeof(Unit));
4410
      if (varalloc==NULL) {             /* hopeless -- abandon */
4411
        *status|=DEC_Insufficient_storage;
4412
        break;}
4413
      var1=varalloc;                    /* use the allocated space */
4414
      }
4415
 
4416
    /* Extend the lhs and rhs to full long subtraction length.  The lhs */
4417
    /* is truly extended into the var1 buffer, with 0 padding, so a */
4418
    /* subtract in place is always possible.  The rhs (var2) has */
4419
    /* virtual padding (implemented by decUnitAddSub). */
4420
    /* One guard unit was allocated above msu1 for rem=rem+rem in */
4421
    /* REMAINDERNEAR. */
4422
    msu1=var1+var1units-1;              /* msu of var1 */
4423
    source=lhs->lsu+D2U(lhs->digits)-1; /* msu of input array */
4424
    for (target=msu1; source>=lhs->lsu; source--, target--) *target=*source;
4425
    for (; target>=var1; target--) *target=0;
4426
 
4427
    /* rhs (var2) is left-aligned with var1 at the start */
4428
    var2ulen=var1units;                 /* rhs logical length (units) */
4429
    var2units=D2U(rhs->digits);         /* rhs actual length (units) */
4430
    var2=rhs->lsu;                      /* -> rhs array */
4431
    msu2=var2+var2units-1;              /* -> msu of var2 [never changes] */
4432
    /* now set up the variables which will be used for estimating the */
4433
    /* multiplication factor.  If these variables are not exact, add */
4434
    /* 1 to make sure that the multiplier is never overestimated. */
4435
    msu2plus=*msu2;                     /* it's value .. */
4436
    if (var2units>1) msu2plus++;        /* .. +1 if any more */
4437
    msu2pair=(eInt)*msu2*(DECDPUNMAX+1);/* top two pair .. */
4438
    if (var2units>1) {                  /* .. [else treat 2nd as 0] */
4439
      msu2pair+=*(msu2-1);              /* .. */
4440
      if (var2units>2) msu2pair++;      /* .. +1 if any more */
4441
      }
4442
 
4443
    /* The calculation is working in units, which may have leading zeros, */
4444
    /* but the exponent was calculated on the assumption that they are */
4445
    /* both left-aligned.  Adjust the exponent to compensate: add the */
4446
    /* number of leading zeros in var1 msu and subtract those in var2 msu. */
4447
    /* [This is actually done by counting the digits and negating, as */
4448
    /* lead1=DECDPUN-digits1, and similarly for lead2.] */
4449
    for (pow=&powers[1]; *msu1>=*pow; pow++) exponent--;
4450
    for (pow=&powers[1]; *msu2>=*pow; pow++) exponent++;
4451
 
4452
    /* Now, if doing an integer divide or remainder, ensure that */
4453
    /* the result will be Unit-aligned.  To do this, shift the var1 */
4454
    /* accumulator towards least if need be.  (It's much easier to */
4455
    /* do this now than to reassemble the residue afterwards, if */
4456
    /* doing a remainder.)  Also ensure the exponent is not negative. */
4457
    if (!(op&DIVIDE)) {
4458
      Unit *u;                          /* work */
4459
      /* save the initial 'false' padding of var1, in digits */
4460
      var1initpad=(var1units-D2U(lhs->digits))*DECDPUN;
4461
      /* Determine the shift to do. */
4462
      if (exponent<0) cut=-exponent;
4463
       else cut=DECDPUN-exponent%DECDPUN;
4464
      decShiftToLeast(var1, var1units, cut);
4465
      exponent+=cut;                    /* maintain numerical value */
4466
      var1initpad-=cut;                 /* .. and reduce padding */
4467
      /* clean any most-significant units which were just emptied */
4468
      for (u=msu1; cut>=DECDPUN; cut-=DECDPUN, u--) *u=0;
4469
      } /* align */
4470
     else { /* is DIVIDE */
4471
      maxexponent=lhs->exponent-rhs->exponent;    /* save */
4472
      /* optimization: if the first iteration will just produce 0, */
4473
      /* preadjust to skip it [valid for DIVIDE only] */
4474
      if (*msu1<*msu2) {
4475
        var2ulen--;                     /* shift down */
4476
        exponent-=DECDPUN;              /* update the exponent */
4477
        }
4478
      }
4479
 
4480
    /* ---- start the long-division loops ------------------------------ */
4481
    accunits=0;                          /* no units accumulated yet */
4482
    accdigits=0;                 /* .. or digits */
4483
    accnext=acc+acclength-1;            /* -> msu of acc [NB: allows digits+1] */
4484
    for (;;) {                          /* outer forever loop */
4485
      thisunit=0;                        /* current unit assumed 0 */
4486
      /* find the next unit */
4487
      for (;;) {                        /* inner forever loop */
4488
        /* strip leading zero units [from either pre-adjust or from */
4489
        /* subtract last time around].  Leave at least one unit. */
4490
        for (; *msu1==0 && msu1>var1; msu1--) var1units--;
4491
 
4492
        if (var1units<var2ulen) break;       /* var1 too low for subtract */
4493
        if (var1units==var2ulen) {           /* unit-by-unit compare needed */
4494
          /* compare the two numbers, from msu */
4495
          const Unit *pv1, *pv2;
4496
          Unit v2;                           /* units to compare */
4497
          pv2=msu2;                          /* -> msu */
4498
          for (pv1=msu1; ; pv1--, pv2--) {
4499
            /* v1=*pv1 -- always OK */
4500
            v2=0;                             /* assume in padding */
4501
            if (pv2>=var2) v2=*pv2;          /* in range */
4502
            if (*pv1!=v2) break;             /* no longer the same */
4503
            if (pv1==var1) break;            /* done; leave pv1 as is */
4504
            }
4505
          /* here when all inspected or a difference seen */
4506
          if (*pv1<v2) break;                /* var1 too low to subtract */
4507
          if (*pv1==v2) {                    /* var1 == var2 */
4508
            /* reach here if var1 and var2 are identical; subtraction */
4509
            /* would increase digit by one, and the residue will be 0 so */
4510
            /* the calculation is done; leave the loop with residue=0. */
4511
            thisunit++;                      /* as though subtracted */
4512
            *var1=0;                          /* set var1 to 0 */
4513
            var1units=1;                     /* .. */
4514
            break;  /* from inner */
4515
            } /* var1 == var2 */
4516
          /* *pv1>v2.  Prepare for real subtraction; the lengths are equal */
4517
          /* Estimate the multiplier (there's always a msu1-1)... */
4518
          /* Bring in two units of var2 to provide a good estimate. */
4519
          mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2pair);
4520
          } /* lengths the same */
4521
         else { /* var1units > var2ulen, so subtraction is safe */
4522
          /* The var2 msu is one unit towards the lsu of the var1 msu, */
4523
          /* so only one unit for var2 can be used. */
4524
          mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2plus);
4525
          }
4526
        if (mult==0) mult=1;                  /* must always be at least 1 */
4527
        /* subtraction needed; var1 is > var2 */
4528
        thisunit=(Unit)(thisunit+mult);      /* accumulate */
4529
        /* subtract var1-var2, into var1; only the overlap needs */
4530
        /* processing, as this is an in-place calculation */
4531
        shift=var2ulen-var2units;
4532
        #if DECTRACE
4533
          decDumpAr('1', &var1[shift], var1units-shift);
4534
          decDumpAr('2', var2, var2units);
4535
          printf("m=%ld\n", -mult);
4536
        #endif
4537
        decUnitAddSub(&var1[shift], var1units-shift,
4538
                      var2, var2units, 0,
4539
                      &var1[shift], -mult);
4540
        #if DECTRACE
4541
          decDumpAr('#', &var1[shift], var1units-shift);
4542
        #endif
4543
        /* var1 now probably has leading zeros; these are removed at the */
4544
        /* top of the inner loop. */
4545
        } /* inner loop */
4546
 
4547
      /* The next unit has been calculated in full; unless it's a */
4548
      /* leading zero, add to acc */
4549
      if (accunits!=0 || thisunit!=0) {        /* is first or non-zero */
4550
        *accnext=thisunit;                   /* store in accumulator */
4551
        /* account exactly for the new digits */
4552
        if (accunits==0) {
4553
          accdigits++;                       /* at least one */
4554
          for (pow=&powers[1]; thisunit>=*pow; pow++) accdigits++;
4555
          }
4556
         else accdigits+=DECDPUN;
4557
        accunits++;                          /* update count */
4558
        accnext--;                           /* ready for next */
4559
        if (accdigits>reqdigits) break;      /* have enough digits */
4560
        }
4561
 
4562
      /* if the residue is zero, the operation is done (unless divide */
4563
      /* or divideInteger and still not enough digits yet) */
4564
      if (*var1==0 && var1units==1) {         /* residue is 0 */
4565
        if (op&(REMAINDER|REMNEAR)) break;
4566
        if ((op&DIVIDE) && (exponent<=maxexponent)) break;
4567
        /* [drop through if divideInteger] */
4568
        }
4569
      /* also done enough if calculating remainder or integer */
4570
      /* divide and just did the last ('units') unit */
4571
      if (exponent==0 && !(op&DIVIDE)) break;
4572
 
4573
      /* to get here, var1 is less than var2, so divide var2 by the per- */
4574
      /* Unit power of ten and go for the next digit */
4575
      var2ulen--;                            /* shift down */
4576
      exponent-=DECDPUN;                     /* update the exponent */
4577
      } /* outer loop */
4578
 
4579
    /* ---- division is complete --------------------------------------- */
4580
    /* here: acc      has at least reqdigits+1 of good results (or fewer */
4581
    /*                if early stop), starting at accnext+1 (its lsu) */
4582
    /*       var1     has any residue at the stopping point */
4583
    /*       accunits is the number of digits collected in acc */
4584
    if (accunits==0) {              /* acc is 0 */
4585
      accunits=1;                  /* show have a unit .. */
4586
      accdigits=1;                 /* .. */
4587
      *accnext=0;                   /* .. whose value is 0 */
4588
      }
4589
     else accnext++;               /* back to last placed */
4590
    /* accnext now -> lowest unit of result */
4591
 
4592
    residue=0;                      /* assume no residue */
4593
    if (op&DIVIDE) {
4594
      /* record the presence of any residue, for rounding */
4595
      if (*var1!=0 || var1units>1) residue=1;
4596
       else { /* no residue */
4597
        /* Had an exact division; clean up spurious trailing 0s. */
4598
        /* There will be at most DECDPUN-1, from the final multiply, */
4599
        /* and then only if the result is non-0 (and even) and the */
4600
        /* exponent is 'loose'. */
4601
        #if DECDPUN>1
4602
        Unit lsu=*accnext;
4603
        if (!(lsu&0x01) && (lsu!=0)) {
4604
          /* count the trailing zeros */
4605
          Int drop=0;
4606
          for (;; drop++) {    /* [will terminate because lsu!=0] */
4607
            if (exponent>=maxexponent) break;     /* don't chop real 0s */
4608
            #if DECDPUN<=4
4609
              if ((lsu-QUOT10(lsu, drop+1)
4610
                  *powers[drop+1])!=0) break;      /* found non-0 digit */
4611
            #else
4612
              if (lsu%powers[drop+1]!=0) break;    /* found non-0 digit */
4613
            #endif
4614
            exponent++;
4615
            }
4616
          if (drop>0) {
4617
            accunits=decShiftToLeast(accnext, accunits, drop);
4618
            accdigits=decGetDigits(accnext, accunits);
4619
            accunits=D2U(accdigits);
4620
            /* [exponent was adjusted in the loop] */
4621
            }
4622
          } /* neither odd nor 0 */
4623
        #endif
4624
        } /* exact divide */
4625
      } /* divide */
4626
     else /* op!=DIVIDE */ {
4627
      /* check for coefficient overflow */
4628
      if (accdigits+exponent>reqdigits) {
4629
        *status|=DEC_Division_impossible;
4630
        break;
4631
        }
4632
      if (op & (REMAINDER|REMNEAR)) {
4633
        /* [Here, the exponent will be 0, because var1 was adjusted */
4634
        /* appropriately.] */
4635
        Int postshift;                       /* work */
4636
        Flag wasodd=0;                        /* integer was odd */
4637
        Unit *quotlsu;                       /* for save */
4638
        Int  quotdigits;                     /* .. */
4639
 
4640
        bits=lhs->bits;                      /* remainder sign is always as lhs */
4641
 
4642
        /* Fastpath when residue is truly 0 is worthwhile [and */
4643
        /* simplifies the code below] */
4644
        if (*var1==0 && var1units==1) {       /* residue is 0 */
4645
          Int exp=lhs->exponent;             /* save min(exponents) */
4646
          if (rhs->exponent<exp) exp=rhs->exponent;
4647
          decNumberZero(res);                /* 0 coefficient */
4648
          #if DECSUBSET
4649
          if (set->extended)
4650
          #endif
4651
          res->exponent=exp;                 /* .. with proper exponent */
4652
          res->bits=(uByte)(bits&DECNEG);          /* [cleaned] */
4653
          decFinish(res, set, &residue, status);   /* might clamp */
4654
          break;
4655
          }
4656
        /* note if the quotient was odd */
4657
        if (*accnext & 0x01) wasodd=1;       /* acc is odd */
4658
        quotlsu=accnext;                     /* save in case need to reinspect */
4659
        quotdigits=accdigits;                /* .. */
4660
 
4661
        /* treat the residue, in var1, as the value to return, via acc */
4662
        /* calculate the unused zero digits.  This is the smaller of: */
4663
        /*   var1 initial padding (saved above) */
4664
        /*   var2 residual padding, which happens to be given by: */
4665
        postshift=var1initpad+exponent-lhs->exponent+rhs->exponent;
4666
        /* [the 'exponent' term accounts for the shifts during divide] */
4667
        if (var1initpad<postshift) postshift=var1initpad;
4668
 
4669
        /* shift var1 the requested amount, and adjust its digits */
4670
        var1units=decShiftToLeast(var1, var1units, postshift);
4671
        accnext=var1;
4672
        accdigits=decGetDigits(var1, var1units);
4673
        accunits=D2U(accdigits);
4674
 
4675
        exponent=lhs->exponent;         /* exponent is smaller of lhs & rhs */
4676
        if (rhs->exponent<exponent) exponent=rhs->exponent;
4677
 
4678
        /* Now correct the result if doing remainderNear; if it */
4679
        /* (looking just at coefficients) is > rhs/2, or == rhs/2 and */
4680
        /* the integer was odd then the result should be rem-rhs. */
4681
        if (op&REMNEAR) {
4682
          Int compare, tarunits;        /* work */
4683
          Unit *up;                     /* .. */
4684
          /* calculate remainder*2 into the var1 buffer (which has */
4685
          /* 'headroom' of an extra unit and hence enough space) */
4686
          /* [a dedicated 'double' loop would be faster, here] */
4687
          tarunits=decUnitAddSub(accnext, accunits, accnext, accunits,
4688
                                 0, accnext, 1);
4689
          /* decDumpAr('r', accnext, tarunits); */
4690
 
4691
          /* Here, accnext (var1) holds tarunits Units with twice the */
4692
          /* remainder's coefficient, which must now be compared to the */
4693
          /* RHS.  The remainder's exponent may be smaller than the RHS's. */
4694
          compare=decUnitCompare(accnext, tarunits, rhs->lsu, D2U(rhs->digits),
4695
                                 rhs->exponent-exponent);
4696
          if (compare==BADINT) {             /* deep trouble */
4697
            *status|=DEC_Insufficient_storage;
4698
            break;}
4699
 
4700
          /* now restore the remainder by dividing by two; the lsu */
4701
          /* is known to be even. */
4702
          for (up=accnext; up<accnext+tarunits; up++) {
4703
            Int half;              /* half to add to lower unit */
4704
            half=*up & 0x01;
4705
            *up/=2;                /* [shift] */
4706
            if (!half) continue;
4707
            *(up-1)+=(DECDPUNMAX+1)/2;
4708
            }
4709
          /* [accunits still describes the original remainder length] */
4710
 
4711
          if (compare>0 || (compare==0 && wasodd)) { /* adjustment needed */
4712
            Int exp, expunits, exprem;       /* work */
4713
            /* This is effectively causing round-up of the quotient, */
4714
            /* so if it was the rare case where it was full and all */
4715
            /* nines, it would overflow and hence division-impossible */
4716
            /* should be raised */
4717
            Flag allnines=0;                  /* 1 if quotient all nines */
4718
            if (quotdigits==reqdigits) {     /* could be borderline */
4719
              for (up=quotlsu; ; up++) {
4720
                if (quotdigits>DECDPUN) {
4721
                  if (*up!=DECDPUNMAX) break;/* non-nines */
4722
                  }
4723
                 else {                      /* this is the last Unit */
4724
                  if (*up==powers[quotdigits]-1) allnines=1;
4725
                  break;
4726
                  }
4727
                quotdigits-=DECDPUN;         /* checked those digits */
4728
                } /* up */
4729
              } /* borderline check */
4730
            if (allnines) {
4731
              *status|=DEC_Division_impossible;
4732
              break;}
4733
 
4734
            /* rem-rhs is needed; the sign will invert.  Again, var1 */
4735
            /* can safely be used for the working Units array. */
4736
            exp=rhs->exponent-exponent;      /* RHS padding needed */
4737
            /* Calculate units and remainder from exponent. */
4738
            expunits=exp/DECDPUN;
4739
            exprem=exp%DECDPUN;
4740
            /* subtract [A+B*(-m)]; the result will always be negative */
4741
            accunits=-decUnitAddSub(accnext, accunits,
4742
                                    rhs->lsu, D2U(rhs->digits),
4743
                                    expunits, accnext, -(Int)powers[exprem]);
4744
            accdigits=decGetDigits(accnext, accunits); /* count digits exactly */
4745
            accunits=D2U(accdigits);    /* and recalculate the units for copy */
4746
            /* [exponent is as for original remainder] */
4747
            bits^=DECNEG;               /* flip the sign */
4748
            }
4749
          } /* REMNEAR */
4750
        } /* REMAINDER or REMNEAR */
4751
      } /* not DIVIDE */
4752
 
4753
    /* Set exponent and bits */
4754
    res->exponent=exponent;
4755
    res->bits=(uByte)(bits&DECNEG);          /* [cleaned] */
4756
 
4757
    /* Now the coefficient. */
4758
    decSetCoeff(res, set, accnext, accdigits, &residue, status);
4759
 
4760
    decFinish(res, set, &residue, status);   /* final cleanup */
4761
 
4762
    #if DECSUBSET
4763
    /* If a divide then strip trailing zeros if subset [after round] */
4764
    if (!set->extended && (op==DIVIDE)) decTrim(res, set, 0, &dropped);
4765
    #endif
4766
    } while(0);                               /* end protected */
4767
 
4768
  if (varalloc!=NULL) free(varalloc);   /* drop any storage used */
4769
  if (allocacc!=NULL) free(allocacc);   /* .. */
4770
  #if DECSUBSET
4771
  if (allocrhs!=NULL) free(allocrhs);   /* .. */
4772
  if (alloclhs!=NULL) free(alloclhs);   /* .. */
4773
  #endif
4774
  return res;
4775
  } /* decDivideOp */
4776
 
4777
/* ------------------------------------------------------------------ */
4778
/* decMultiplyOp -- multiplication operation                          */
4779
/*                                                                    */
4780
/*  This routine performs the multiplication C=A x B.                 */
4781
/*                                                                    */
4782
/*   res is C, the result.  C may be A and/or B (e.g., X=X*X)         */
4783
/*   lhs is A                                                         */
4784
/*   rhs is B                                                         */
4785
/*   set is the context                                               */
4786
/*   status is the usual accumulator                                  */
4787
/*                                                                    */
4788
/* C must have space for set->digits digits.                          */
4789
/*                                                                    */
4790
/* ------------------------------------------------------------------ */
4791
/* 'Classic' multiplication is used rather than Karatsuba, as the     */
4792
/* latter would give only a minor improvement for the short numbers   */
4793
/* expected to be handled most (and uses much more memory).           */
4794
/*                                                                    */
4795
/* There are two major paths here: the general-purpose ('old code')   */
4796
/* path which handles all DECDPUN values, and a fastpath version      */
4797
/* which is used if 64-bit ints are available, DECDPUN<=4, and more   */
4798
/* than two calls to decUnitAddSub would be made.                     */
4799
/*                                                                    */
4800
/* The fastpath version lumps units together into 8-digit or 9-digit  */
4801
/* chunks, and also uses a lazy carry strategy to minimise expensive  */
4802
/* 64-bit divisions.  The chunks are then broken apart again into     */
4803
/* units for continuing processing.  Despite this overhead, the       */
4804
/* fastpath can speed up some 16-digit operations by 10x (and much    */
4805
/* more for higher-precision calculations).                           */
4806
/*                                                                    */
4807
/* A buffer always has to be used for the accumulator; in the         */
4808
/* fastpath, buffers are also always needed for the chunked copies of */
4809
/* of the operand coefficients.                                       */
4810
/* Static buffers are larger than needed just for multiply, to allow  */
4811
/* for calls from other operations (notably exp).                     */
4812
/* ------------------------------------------------------------------ */
4813
#define FASTMUL (DECUSE64 && DECDPUN<5)
4814
static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs,
4815
                                 const decNumber *rhs, decContext *set,
4816
                                 uInt *status) {
4817
  Int    accunits;                 /* Units of accumulator in use */
4818
  Int    exponent;                 /* work */
4819
  Int    residue=0;                 /* rounding residue */
4820
  uByte  bits;                     /* result sign */
4821
  Unit  *acc;                      /* -> accumulator Unit array */
4822
  Int    needbytes;                /* size calculator */
4823
  void  *allocacc=NULL;            /* -> allocated accumulator, iff allocated */
4824
  Unit  accbuff[SD2U(DECBUFFER*4+1)]; /* buffer (+1 for DECBUFFER==0, */
4825
                                   /* *4 for calls from other operations) */
4826
  const Unit *mer, *mermsup;       /* work */
4827
  Int   madlength;                 /* Units in multiplicand */
4828
  Int   shift;                     /* Units to shift multiplicand by */
4829
 
4830
  #if FASTMUL
4831
    /* if DECDPUN is 1 or 3 work in base 10**9, otherwise */
4832
    /* (DECDPUN is 2 or 4) then work in base 10**8 */
4833
    #if DECDPUN & 1                /* odd */
4834
      #define FASTBASE 1000000000  /* base */
4835
      #define FASTDIGS          9  /* digits in base */
4836
      #define FASTLAZY         18  /* carry resolution point [1->18] */
4837
    #else
4838
      #define FASTBASE  100000000
4839
      #define FASTDIGS          8
4840
      #define FASTLAZY       1844  /* carry resolution point [1->1844] */
4841
    #endif
4842
    /* three buffers are used, two for chunked copies of the operands */
4843
    /* (base 10**8 or base 10**9) and one base 2**64 accumulator with */
4844
    /* lazy carry evaluation */
4845
    uInt   zlhibuff[(DECBUFFER*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0) */
4846
    uInt  *zlhi=zlhibuff;                 /* -> lhs array */
4847
    uInt  *alloclhi=NULL;                 /* -> allocated buffer, iff allocated */
4848
    uInt   zrhibuff[(DECBUFFER*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0) */
4849
    uInt  *zrhi=zrhibuff;                 /* -> rhs array */
4850
    uInt  *allocrhi=NULL;                 /* -> allocated buffer, iff allocated */
4851
    uLong  zaccbuff[(DECBUFFER*2+1)/4+2]; /* buffer (+1 for DECBUFFER==0) */
4852
    /* [allocacc is shared for both paths, as only one will run] */
4853
    uLong *zacc=zaccbuff;          /* -> accumulator array for exact result */
4854
    #if DECDPUN==1
4855
    Int    zoff;                   /* accumulator offset */
4856
    #endif
4857
    uInt  *lip, *rip;              /* item pointers */
4858
    uInt  *lmsi, *rmsi;            /* most significant items */
4859
    Int    ilhs, irhs, iacc;       /* item counts in the arrays */
4860
    Int    lazy;                   /* lazy carry counter */
4861
    uLong  lcarry;                 /* uLong carry */
4862
    uInt   carry;                  /* carry (NB not uLong) */
4863
    Int    count;                  /* work */
4864
    const  Unit *cup;              /* .. */
4865
    Unit  *up;                     /* .. */
4866
    uLong *lp;                     /* .. */
4867
    Int    p;                      /* .. */
4868
  #endif
4869
 
4870
  #if DECSUBSET
4871
    decNumber *alloclhs=NULL;      /* -> allocated buffer, iff allocated */
4872
    decNumber *allocrhs=NULL;      /* -> allocated buffer, iff allocated */
4873
  #endif
4874
 
4875
  #if DECCHECK
4876
  if (decCheckOperands(res, lhs, rhs, set)) return res;
4877
  #endif
4878
 
4879
  /* precalculate result sign */
4880
  bits=(uByte)((lhs->bits^rhs->bits)&DECNEG);
4881
 
4882
  /* handle infinities and NaNs */
4883
  if (SPECIALARGS) {               /* a special bit set */
4884
    if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs */
4885
      decNaNs(res, lhs, rhs, set, status);
4886
      return res;}
4887
    /* one or two infinities; Infinity * 0 is invalid */
4888
    if (((lhs->bits & DECINF)==0 && ISZERO(lhs))
4889
      ||((rhs->bits & DECINF)==0 && ISZERO(rhs))) {
4890
      *status|=DEC_Invalid_operation;
4891
      return res;}
4892
    decNumberZero(res);
4893
    res->bits=bits|DECINF;         /* infinity */
4894
    return res;}
4895
 
4896
  /* For best speed, as in DMSRCN [the original Rexx numerics */
4897
  /* module], use the shorter number as the multiplier (rhs) and */
4898
  /* the longer as the multiplicand (lhs) to minimise the number of */
4899
  /* adds (partial products) */
4900
  if (lhs->digits<rhs->digits) {   /* swap... */
4901
    const decNumber *hold=lhs;
4902
    lhs=rhs;
4903
    rhs=hold;
4904
    }
4905
 
4906
  do {                             /* protect allocated storage */
4907
    #if DECSUBSET
4908
    if (!set->extended) {
4909
      /* reduce operands and set lostDigits status, as needed */
4910
      if (lhs->digits>set->digits) {
4911
        alloclhs=decRoundOperand(lhs, set, status);
4912
        if (alloclhs==NULL) break;
4913
        lhs=alloclhs;
4914
        }
4915
      if (rhs->digits>set->digits) {
4916
        allocrhs=decRoundOperand(rhs, set, status);
4917
        if (allocrhs==NULL) break;
4918
        rhs=allocrhs;
4919
        }
4920
      }
4921
    #endif
4922
    /* [following code does not require input rounding] */
4923
 
4924
    #if FASTMUL                    /* fastpath can be used */
4925
    /* use the fast path if there are enough digits in the shorter */
4926
    /* operand to make the setup and takedown worthwhile */
4927
    #define NEEDTWO (DECDPUN*2)    /* within two decUnitAddSub calls */
4928
    if (rhs->digits>NEEDTWO) {     /* use fastpath... */
4929
      /* calculate the number of elements in each array */
4930
      ilhs=(lhs->digits+FASTDIGS-1)/FASTDIGS; /* [ceiling] */
4931
      irhs=(rhs->digits+FASTDIGS-1)/FASTDIGS; /* .. */
4932
      iacc=ilhs+irhs;
4933
 
4934
      /* allocate buffers if required, as usual */
4935
      needbytes=ilhs*sizeof(uInt);
4936
      if (needbytes>(Int)sizeof(zlhibuff)) {
4937
        alloclhi=(uInt *)malloc(needbytes);
4938
        zlhi=alloclhi;}
4939
      needbytes=irhs*sizeof(uInt);
4940
      if (needbytes>(Int)sizeof(zrhibuff)) {
4941
        allocrhi=(uInt *)malloc(needbytes);
4942
        zrhi=allocrhi;}
4943
 
4944
      /* Allocating the accumulator space needs a special case when */
4945
      /* DECDPUN=1 because when converting the accumulator to Units */
4946
      /* after the multiplication each 8-byte item becomes 9 1-byte */
4947
      /* units.  Therefore iacc extra bytes are needed at the front */
4948
      /* (rounded up to a multiple of 8 bytes), and the uLong */
4949
      /* accumulator starts offset the appropriate number of units */
4950
      /* to the right to avoid overwrite during the unchunking. */
4951
      needbytes=iacc*sizeof(uLong);
4952
      #if DECDPUN==1
4953
      zoff=(iacc+7)/8;        /* items to offset by */
4954
      needbytes+=zoff*8;
4955
      #endif
4956
      if (needbytes>(Int)sizeof(zaccbuff)) {
4957
        allocacc=(uLong *)malloc(needbytes);
4958
        zacc=(uLong *)allocacc;}
4959
      if (zlhi==NULL||zrhi==NULL||zacc==NULL) {
4960
        *status|=DEC_Insufficient_storage;
4961
        break;}
4962
 
4963
      acc=(Unit *)zacc;       /* -> target Unit array */
4964
      #if DECDPUN==1
4965
      zacc+=zoff;             /* start uLong accumulator to right */
4966
      #endif
4967
 
4968
      /* assemble the chunked copies of the left and right sides */
4969
      for (count=lhs->digits, cup=lhs->lsu, lip=zlhi; count>0; lip++)
4970
        for (p=0, *lip=0; p<FASTDIGS && count>0;
4971
             p+=DECDPUN, cup++, count-=DECDPUN)
4972
          *lip+=*cup*powers[p];
4973
      lmsi=lip-1;     /* save -> msi */
4974
      for (count=rhs->digits, cup=rhs->lsu, rip=zrhi; count>0; rip++)
4975
        for (p=0, *rip=0; p<FASTDIGS && count>0;
4976
             p+=DECDPUN, cup++, count-=DECDPUN)
4977
          *rip+=*cup*powers[p];
4978
      rmsi=rip-1;     /* save -> msi */
4979
 
4980
      /* zero the accumulator */
4981
      for (lp=zacc; lp<zacc+iacc; lp++) *lp=0;
4982
 
4983
      /* Start the multiplication */
4984
      /* Resolving carries can dominate the cost of accumulating the */
4985
      /* partial products, so this is only done when necessary. */
4986
      /* Each uLong item in the accumulator can hold values up to */
4987
      /* 2**64-1, and each partial product can be as large as */
4988
      /* (10**FASTDIGS-1)**2.  When FASTDIGS=9, this can be added to */
4989
      /* itself 18.4 times in a uLong without overflowing, so during */
4990
      /* the main calculation resolution is carried out every 18th */
4991
      /* add -- every 162 digits.  Similarly, when FASTDIGS=8, the */
4992
      /* partial products can be added to themselves 1844.6 times in */
4993
      /* a uLong without overflowing, so intermediate carry */
4994
      /* resolution occurs only every 14752 digits.  Hence for common */
4995
      /* short numbers usually only the one final carry resolution */
4996
      /* occurs. */
4997
      /* (The count is set via FASTLAZY to simplify experiments to */
4998
      /* measure the value of this approach: a 35% improvement on a */
4999
      /* [34x34] multiply.) */
5000
      lazy=FASTLAZY;                         /* carry delay count */
5001
      for (rip=zrhi; rip<=rmsi; rip++) {     /* over each item in rhs */
5002
        lp=zacc+(rip-zrhi);                  /* where to add the lhs */
5003
        for (lip=zlhi; lip<=lmsi; lip++, lp++) { /* over each item in lhs */
5004
          *lp+=(uLong)(*lip)*(*rip);         /* [this should in-line] */
5005
          } /* lip loop */
5006
        lazy--;
5007
        if (lazy>0 && rip!=rmsi) continue;
5008
        lazy=FASTLAZY;                       /* reset delay count */
5009
        /* spin up the accumulator resolving overflows */
5010
        for (lp=zacc; lp<zacc+iacc; lp++) {
5011
          if (*lp<FASTBASE) continue;        /* it fits */
5012
          lcarry=*lp/FASTBASE;               /* top part [slow divide] */
5013
          /* lcarry can exceed 2**32-1, so check again; this check */
5014
          /* and occasional extra divide (slow) is well worth it, as */
5015
          /* it allows FASTLAZY to be increased to 18 rather than 4 */
5016
          /* in the FASTDIGS=9 case */
5017
          if (lcarry<FASTBASE) carry=(uInt)lcarry;  /* [usual] */
5018
           else { /* two-place carry [fairly rare] */
5019
            uInt carry2=(uInt)(lcarry/FASTBASE);    /* top top part */
5020
            *(lp+2)+=carry2;                        /* add to item+2 */
5021
            *lp-=((uLong)FASTBASE*FASTBASE*carry2); /* [slow] */
5022
            carry=(uInt)(lcarry-((uLong)FASTBASE*carry2)); /* [inline] */
5023
            }
5024
          *(lp+1)+=carry;                    /* add to item above [inline] */
5025
          *lp-=((uLong)FASTBASE*carry);      /* [inline] */
5026
          } /* carry resolution */
5027
        } /* rip loop */
5028
 
5029
      /* The multiplication is complete; time to convert back into */
5030
      /* units.  This can be done in-place in the accumulator and in */
5031
      /* 32-bit operations, because carries were resolved after the */
5032
      /* final add.  This needs N-1 divides and multiplies for */
5033
      /* each item in the accumulator (which will become up to N */
5034
      /* units, where 2<=N<=9). */
5035
      for (lp=zacc, up=acc; lp<zacc+iacc; lp++) {
5036
        uInt item=(uInt)*lp;                 /* decapitate to uInt */
5037
        for (p=0; p<FASTDIGS-DECDPUN; p+=DECDPUN, up++) {
5038
          uInt part=item/(DECDPUNMAX+1);
5039
          *up=(Unit)(item-(part*(DECDPUNMAX+1)));
5040
          item=part;
5041
          } /* p */
5042
        *up=(Unit)item; up++;                /* [final needs no division] */
5043
        } /* lp */
5044
      accunits=up-acc;                       /* count of units */
5045
      }
5046
     else { /* here to use units directly, without chunking ['old code'] */
5047
    #endif
5048
 
5049
      /* if accumulator will be too long for local storage, then allocate */
5050
      acc=accbuff;                 /* -> assume buffer for accumulator */
5051
      needbytes=(D2U(lhs->digits)+D2U(rhs->digits))*sizeof(Unit);
5052
      if (needbytes>(Int)sizeof(accbuff)) {
5053
        allocacc=(Unit *)malloc(needbytes);
5054
        if (allocacc==NULL) {*status|=DEC_Insufficient_storage; break;}
5055
        acc=(Unit *)allocacc;                /* use the allocated space */
5056
        }
5057
 
5058
      /* Now the main long multiplication loop */
5059
      /* Unlike the equivalent in the IBM Java implementation, there */
5060
      /* is no advantage in calculating from msu to lsu.  So, do it */
5061
      /* by the book, as it were. */
5062
      /* Each iteration calculates ACC=ACC+MULTAND*MULT */
5063
      accunits=1;                  /* accumulator starts at '0' */
5064
      *acc=0;                       /* .. (lsu=0) */
5065
      shift=0;                      /* no multiplicand shift at first */
5066
      madlength=D2U(lhs->digits);  /* this won't change */
5067
      mermsup=rhs->lsu+D2U(rhs->digits); /* -> msu+1 of multiplier */
5068
 
5069
      for (mer=rhs->lsu; mer<mermsup; mer++) {
5070
        /* Here, *mer is the next Unit in the multiplier to use */
5071
        /* If non-zero [optimization] add it... */
5072
        if (*mer!=0) accunits=decUnitAddSub(&acc[shift], accunits-shift,
5073
                                            lhs->lsu, madlength, 0,
5074
                                            &acc[shift], *mer)
5075
                                            + shift;
5076
         else { /* extend acc with a 0; it will be used shortly */
5077
          *(acc+accunits)=0;        /* [this avoids length of <=0 later] */
5078
          accunits++;
5079
          }
5080
        /* multiply multiplicand by 10**DECDPUN for next Unit to left */
5081
        shift++;                   /* add this for 'logical length' */
5082
        } /* n */
5083
    #if FASTMUL
5084
      } /* unchunked units */
5085
    #endif
5086
    /* common end-path */
5087
    #if DECTRACE
5088
      decDumpAr('*', acc, accunits);         /* Show exact result */
5089
    #endif
5090
 
5091
    /* acc now contains the exact result of the multiplication, */
5092
    /* possibly with a leading zero unit; build the decNumber from */
5093
    /* it, noting if any residue */
5094
    res->bits=bits;                          /* set sign */
5095
    res->digits=decGetDigits(acc, accunits); /* count digits exactly */
5096
 
5097
    /* There can be a 31-bit wrap in calculating the exponent. */
5098
    /* This can only happen if both input exponents are negative and */
5099
    /* both their magnitudes are large.  If there was a wrap, set a */
5100
    /* safe very negative exponent, from which decFinalize() will */
5101
    /* raise a hard underflow shortly. */
5102
    exponent=lhs->exponent+rhs->exponent;    /* calculate exponent */
5103
    if (lhs->exponent<0 && rhs->exponent<0 && exponent>0)
5104
      exponent=-2*DECNUMMAXE;                /* force underflow */
5105
    res->exponent=exponent;                  /* OK to overwrite now */
5106
 
5107
 
5108
    /* Set the coefficient.  If any rounding, residue records */
5109
    decSetCoeff(res, set, acc, res->digits, &residue, status);
5110
    decFinish(res, set, &residue, status);   /* final cleanup */
5111
    } while(0);                          /* end protected */
5112
 
5113
  if (allocacc!=NULL) free(allocacc);   /* drop any storage used */
5114
  #if DECSUBSET
5115
  if (allocrhs!=NULL) free(allocrhs);   /* .. */
5116
  if (alloclhs!=NULL) free(alloclhs);   /* .. */
5117
  #endif
5118
  #if FASTMUL
5119
  if (allocrhi!=NULL) free(allocrhi);   /* .. */
5120
  if (alloclhi!=NULL) free(alloclhi);   /* .. */
5121
  #endif
5122
  return res;
5123
  } /* decMultiplyOp */
5124
 
5125
/* ------------------------------------------------------------------ */
5126
/* decExpOp -- effect exponentiation                                  */
5127
/*                                                                    */
5128
/*   This computes C = exp(A)                                         */
5129
/*                                                                    */
5130
/*   res is C, the result.  C may be A                                */
5131
/*   rhs is A                                                         */
5132
/*   set is the context; note that rounding mode has no effect        */
5133
/*                                                                    */
5134
/* C must have space for set->digits digits. status is updated but    */
5135
/* not set.                                                           */
5136
/*                                                                    */
5137
/* Restrictions:                                                      */
5138
/*                                                                    */
5139
/*   digits, emax, and -emin in the context must be less than         */
5140
/*   2*DEC_MAX_MATH (1999998), and the rhs must be within these       */
5141
/*   bounds or a zero.  This is an internal routine, so these         */
5142
/*   restrictions are contractual and not enforced.                   */
5143
/*                                                                    */
5144
/* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will      */
5145
/* almost always be correctly rounded, but may be up to 1 ulp in      */
5146
/* error in rare cases.                                               */
5147
/*                                                                    */
5148
/* Finite results will always be full precision and Inexact, except   */
5149
/* when A is a zero or -Infinity (giving 1 or 0 respectively).        */
5150
/* ------------------------------------------------------------------ */
5151
/* This approach used here is similar to the algorithm described in   */
5152
/*                                                                    */
5153
/*   Variable Precision Exponential Function, T. E. Hull and          */
5154
/*   A. Abrham, ACM Transactions on Mathematical Software, Vol 12 #2, */
5155
/*   pp79-91, ACM, June 1986.                                         */
5156
/*                                                                    */
5157
/* with the main difference being that the iterations in the series   */
5158
/* evaluation are terminated dynamically (which does not require the  */
5159
/* extra variable-precision variables which are expensive in this     */
5160
/* context).                                                          */
5161
/*                                                                    */
5162
/* The error analysis in Hull & Abrham's paper applies except for the */
5163
/* round-off error accumulation during the series evaluation.  This   */
5164
/* code does not precalculate the number of iterations and so cannot  */
5165
/* use Horner's scheme.  Instead, the accumulation is done at double- */
5166
/* precision, which ensures that the additions of the terms are exact */
5167
/* and do not accumulate round-off (and any round-off errors in the   */
5168
/* terms themselves move 'to the right' faster than they can          */
5169
/* accumulate).  This code also extends the calculation by allowing,  */
5170
/* in the spirit of other decNumber operators, the input to be more   */
5171
/* precise than the result (the precision used is based on the more   */
5172
/* precise of the input or requested result).                         */
5173
/*                                                                    */
5174
/* Implementation notes:                                              */
5175
/*                                                                    */
5176
/* 1. This is separated out as decExpOp so it can be called from      */
5177
/*    other Mathematical functions (notably Ln) with a wider range    */
5178
/*    than normal.  In particular, it can handle the slightly wider   */
5179
/*    (double) range needed by Ln (which has to be able to calculate  */
5180
/*    exp(-x) where x can be the tiniest number (Ntiny).              */
5181
/*                                                                    */
5182
/* 2. Normalizing x to be <=0.1 (instead of <=1) reduces loop         */
5183
/*    iterations by appoximately a third with additional (although    */
5184
/*    diminishing) returns as the range is reduced to even smaller    */
5185
/*    fractions.  However, h (the power of 10 used to correct the     */
5186
/*    result at the end, see below) must be kept <=8 as otherwise     */
5187
/*    the final result cannot be computed.  Hence the leverage is a   */
5188
/*    sliding value (8-h), where potentially the range is reduced     */
5189
/*    more for smaller values.                                        */
5190
/*                                                                    */
5191
/*    The leverage that can be applied in this way is severely        */
5192
/*    limited by the cost of the raise-to-the power at the end,       */
5193
/*    which dominates when the number of iterations is small (less    */
5194
/*    than ten) or when rhs is short.  As an example, the adjustment  */
5195
/*    x**10,000,000 needs 31 multiplications, all but one full-width. */
5196
/*                                                                    */
5197
/* 3. The restrictions (especially precision) could be raised with    */
5198
/*    care, but the full decNumber range seems very hard within the   */
5199
/*    32-bit limits.                                                  */
5200
/*                                                                    */
5201
/* 4. The working precisions for the static buffers are twice the     */
5202
/*    obvious size to allow for calls from decNumberPower.            */
5203
/* ------------------------------------------------------------------ */
5204
decNumber * decExpOp(decNumber *res, const decNumber *rhs,
5205
                         decContext *set, uInt *status) {
5206
  uInt ignore=0;            /* working status */
5207
  Int h;                           /* adjusted exponent for 0.xxxx */
5208
  Int p;                           /* working precision */
5209
  Int residue;                     /* rounding residue */
5210
  uInt needbytes;                  /* for space calculations */
5211
  const decNumber *x=rhs;          /* (may point to safe copy later) */
5212
  decContext aset, tset, dset;     /* working contexts */
5213
  Int comp;                        /* work */
5214
 
5215
  /* the argument is often copied to normalize it, so (unusually) it */
5216
  /* is treated like other buffers, using DECBUFFER, +1 in case */
5217
  /* DECBUFFER is 0 */
5218
  decNumber bufr[D2N(DECBUFFER*2+1)];
5219
  decNumber *allocrhs=NULL;        /* non-NULL if rhs buffer allocated */
5220
 
5221
  /* the working precision will be no more than set->digits+8+1 */
5222
  /* so for on-stack buffers DECBUFFER+9 is used, +1 in case DECBUFFER */
5223
  /* is 0 (and twice that for the accumulator) */
5224
 
5225
  /* buffer for t, term (working precision plus) */
5226
  decNumber buft[D2N(DECBUFFER*2+9+1)];
5227
  decNumber *allocbuft=NULL;       /* -> allocated buft, iff allocated */
5228
  decNumber *t=buft;               /* term */
5229
  /* buffer for a, accumulator (working precision * 2), at least 9 */
5230
  decNumber bufa[D2N(DECBUFFER*4+18+1)];
5231
  decNumber *allocbufa=NULL;       /* -> allocated bufa, iff allocated */
5232
  decNumber *a=bufa;               /* accumulator */
5233
  /* decNumber for the divisor term; this needs at most 9 digits */
5234
  /* and so can be fixed size [16 so can use standard context] */
5235
  decNumber bufd[D2N(16)];
5236
  decNumber *d=bufd;               /* divisor */
5237
  decNumber numone;                /* constant 1 */
5238
 
5239
  #if DECCHECK
5240
  Int iterations=0;                 /* for later sanity check */
5241
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
5242
  #endif
5243
 
5244
  do {                                  /* protect allocated storage */
5245
    if (SPECIALARG) {                   /* handle infinities and NaNs */
5246
      if (decNumberIsInfinite(rhs)) {   /* an infinity */
5247
        if (decNumberIsNegative(rhs))   /* -Infinity -> +0 */
5248
          decNumberZero(res);
5249
         else decNumberCopy(res, rhs);  /* +Infinity -> self */
5250
        }
5251
       else decNaNs(res, rhs, NULL, set, status); /* a NaN */
5252
      break;}
5253
 
5254
    if (ISZERO(rhs)) {                  /* zeros -> exact 1 */
5255
      decNumberZero(res);               /* make clean 1 */
5256
      *res->lsu=1;                      /* .. */
5257
      break;}                           /* [no status to set] */
5258
 
5259
    /* e**x when 0 < x < 0.66 is < 1+3x/2, hence can fast-path */
5260
    /* positive and negative tiny cases which will result in inexact */
5261
    /* 1.  This also allows the later add-accumulate to always be */
5262
    /* exact (because its length will never be more than twice the */
5263
    /* working precision). */
5264
    /* The comparator (tiny) needs just one digit, so use the */
5265
    /* decNumber d for it (reused as the divisor, etc., below); its */
5266
    /* exponent is such that if x is positive it will have */
5267
    /* set->digits-1 zeros between the decimal point and the digit, */
5268
    /* which is 4, and if x is negative one more zero there as the */
5269
    /* more precise result will be of the form 0.9999999 rather than */
5270
    /* 1.0000001.  Hence, tiny will be 0.0000004  if digits=7 and x>0 */
5271
    /* or 0.00000004 if digits=7 and x<0.  If RHS not larger than */
5272
    /* this then the result will be 1.000000 */
5273
    decNumberZero(d);                   /* clean */
5274
    *d->lsu=4;                          /* set 4 .. */
5275
    d->exponent=-set->digits;           /* * 10**(-d) */
5276
    if (decNumberIsNegative(rhs)) d->exponent--;  /* negative case */
5277
    comp=decCompare(d, rhs, 1);         /* signless compare */
5278
    if (comp==BADINT) {
5279
      *status|=DEC_Insufficient_storage;
5280
      break;}
5281
    if (comp>=0) {                       /* rhs < d */
5282
      Int shift=set->digits-1;
5283
      decNumberZero(res);               /* set 1 */
5284
      *res->lsu=1;                      /* .. */
5285
      res->digits=decShiftToMost(res->lsu, 1, shift);
5286
      res->exponent=-shift;                  /* make 1.0000... */
5287
      *status|=DEC_Inexact | DEC_Rounded;    /* .. inexactly */
5288
      break;} /* tiny */
5289
 
5290
    /* set up the context to be used for calculating a, as this is */
5291
    /* used on both paths below */
5292
    decContextDefault(&aset, DEC_INIT_DECIMAL64);
5293
    /* accumulator bounds are as requested (could underflow) */
5294
    aset.emax=set->emax;                /* usual bounds */
5295
    aset.emin=set->emin;                /* .. */
5296
    aset.clamp=0;                        /* and no concrete format */
5297
 
5298
    /* calculate the adjusted (Hull & Abrham) exponent (where the */
5299
    /* decimal point is just to the left of the coefficient msd) */
5300
    h=rhs->exponent+rhs->digits;
5301
    /* if h>8 then 10**h cannot be calculated safely; however, when */
5302
    /* h=8 then exp(|rhs|) will be at least exp(1E+7) which is at */
5303
    /* least 6.59E+4342944, so (due to the restriction on Emax/Emin) */
5304
    /* overflow (or underflow to 0) is guaranteed -- so this case can */
5305
    /* be handled by simply forcing the appropriate excess */
5306
    if (h>8) {                          /* overflow/underflow */
5307
      /* set up here so Power call below will over or underflow to */
5308
      /* zero; set accumulator to either 2 or 0.02 */
5309
      /* [stack buffer for a is always big enough for this] */
5310
      decNumberZero(a);
5311
      *a->lsu=2;                        /* not 1 but < exp(1) */
5312
      if (decNumberIsNegative(rhs)) a->exponent=-2; /* make 0.02 */
5313
      h=8;                              /* clamp so 10**h computable */
5314
      p=9;                              /* set a working precision */
5315
      }
5316
     else {                             /* h<=8 */
5317
      Int maxlever=(rhs->digits>8?1:0);
5318
      /* [could/should increase this for precisions >40 or so, too] */
5319
 
5320
      /* if h is 8, cannot normalize to a lower upper limit because */
5321
      /* the final result will not be computable (see notes above), */
5322
      /* but leverage can be applied whenever h is less than 8. */
5323
      /* Apply as much as possible, up to a MAXLEVER digits, which */
5324
      /* sets the tradeoff against the cost of the later a**(10**h). */
5325
      /* As h is increased, the working precision below also */
5326
      /* increases to compensate for the "constant digits at the */
5327
      /* front" effect. */
5328
      Int lever=MINI(8-h, maxlever);    /* leverage attainable */
5329
      Int use=-rhs->digits-lever;       /* exponent to use for RHS */
5330
      h+=lever;                         /* apply leverage selected */
5331
      if (h<0) {                 /* clamp */
5332
        use+=h;                         /* [may end up subnormal] */
5333
        h=0;
5334
        }
5335
      /* Take a copy of RHS if it needs normalization (true whenever x>=1) */
5336
      if (rhs->exponent!=use) {
5337
        decNumber *newrhs=bufr;         /* assume will fit on stack */
5338
        needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
5339
        if (needbytes>sizeof(bufr)) {   /* need malloc space */
5340
          allocrhs=(decNumber *)malloc(needbytes);
5341
          if (allocrhs==NULL) {         /* hopeless -- abandon */
5342
            *status|=DEC_Insufficient_storage;
5343
            break;}
5344
          newrhs=allocrhs;              /* use the allocated space */
5345
          }
5346
        decNumberCopy(newrhs, rhs);     /* copy to safe space */
5347
        newrhs->exponent=use;           /* normalize; now <1 */
5348
        x=newrhs;                       /* ready for use */
5349
        /* decNumberShow(x); */
5350
        }
5351
 
5352
      /* Now use the usual power series to evaluate exp(x).  The */
5353
      /* series starts as 1 + x + x^2/2 ... so prime ready for the */
5354
      /* third term by setting the term variable t=x, the accumulator */
5355
      /* a=1, and the divisor d=2. */
5356
 
5357
      /* First determine the working precision.  From Hull & Abrham */
5358
      /* this is set->digits+h+2.  However, if x is 'over-precise' we */
5359
      /* need to allow for all its digits to potentially participate */
5360
      /* (consider an x where all the excess digits are 9s) so in */
5361
      /* this case use x->digits+h+2 */
5362
      p=MAXI(x->digits, set->digits)+h+2;    /* [h<=8] */
5363
 
5364
      /* a and t are variable precision, and depend on p, so space */
5365
      /* must be allocated for them if necessary */
5366
 
5367
      /* the accumulator needs to be able to hold 2p digits so that */
5368
      /* the additions on the second and subsequent iterations are */
5369
      /* sufficiently exact. */
5370
      needbytes=sizeof(decNumber)+(D2U(p*2)-1)*sizeof(Unit);
5371
      if (needbytes>sizeof(bufa)) {     /* need malloc space */
5372
        allocbufa=(decNumber *)malloc(needbytes);
5373
        if (allocbufa==NULL) {          /* hopeless -- abandon */
5374
          *status|=DEC_Insufficient_storage;
5375
          break;}
5376
        a=allocbufa;                    /* use the allocated space */
5377
        }
5378
      /* the term needs to be able to hold p digits (which is */
5379
      /* guaranteed to be larger than x->digits, so the initial copy */
5380
      /* is safe); it may also be used for the raise-to-power */
5381
      /* calculation below, which needs an extra two digits */
5382
      needbytes=sizeof(decNumber)+(D2U(p+2)-1)*sizeof(Unit);
5383
      if (needbytes>sizeof(buft)) {     /* need malloc space */
5384
        allocbuft=(decNumber *)malloc(needbytes);
5385
        if (allocbuft==NULL) {          /* hopeless -- abandon */
5386
          *status|=DEC_Insufficient_storage;
5387
          break;}
5388
        t=allocbuft;                    /* use the allocated space */
5389
        }
5390
 
5391
      decNumberCopy(t, x);              /* term=x */
5392
      decNumberZero(a); *a->lsu=1;      /* accumulator=1 */
5393
      decNumberZero(d); *d->lsu=2;      /* divisor=2 */
5394
      decNumberZero(&numone); *numone.lsu=1; /* constant 1 for increment */
5395
 
5396
      /* set up the contexts for calculating a, t, and d */
5397
      decContextDefault(&tset, DEC_INIT_DECIMAL64);
5398
      dset=tset;
5399
      /* accumulator bounds are set above, set precision now */
5400
      aset.digits=p*2;                  /* double */
5401
      /* term bounds avoid any underflow or overflow */
5402
      tset.digits=p;
5403
      tset.emin=DEC_MIN_EMIN;           /* [emax is plenty] */
5404
      /* [dset.digits=16, etc., are sufficient] */
5405
 
5406
      /* finally ready to roll */
5407
      for (;;) {
5408
        #if DECCHECK
5409
        iterations++;
5410
        #endif
5411
        /* only the status from the accumulation is interesting */
5412
        /* [but it should remain unchanged after first add] */
5413
        decAddOp(a, a, t, &aset, 0, status);            /* a=a+t */
5414
        decMultiplyOp(t, t, x, &tset, &ignore);        /* t=t*x */
5415
        decDivideOp(t, t, d, &tset, DIVIDE, &ignore);  /* t=t/d */
5416
        /* the iteration ends when the term cannot affect the result, */
5417
        /* if rounded to p digits, which is when its value is smaller */
5418
        /* than the accumulator by p+1 digits.  There must also be */
5419
        /* full precision in a. */
5420
        if (((a->digits+a->exponent)>=(t->digits+t->exponent+p+1))
5421
            && (a->digits>=p)) break;
5422
        decAddOp(d, d, &numone, &dset, 0, &ignore);    /* d=d+1 */
5423
        } /* iterate */
5424
 
5425
      #if DECCHECK
5426
      /* just a sanity check; comment out test to show always */
5427
      if (iterations>p+3)
5428
        printf("Exp iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
5429
               iterations, *status, p, x->digits);
5430
      #endif
5431
      } /* h<=8 */
5432
 
5433
    /* apply postconditioning: a=a**(10**h) -- this is calculated */
5434
    /* at a slightly higher precision than Hull & Abrham suggest */
5435
    if (h>0) {
5436
      Int seenbit=0;                /* set once a 1-bit is seen */
5437
      Int i;                       /* counter */
5438
      Int n=powers[h];             /* always positive */
5439
      aset.digits=p+2;             /* sufficient precision */
5440
      /* avoid the overhead and many extra digits of decNumberPower */
5441
      /* as all that is needed is the short 'multipliers' loop; here */
5442
      /* accumulate the answer into t */
5443
      decNumberZero(t); *t->lsu=1; /* acc=1 */
5444
      for (i=1;;i++){              /* for each bit [top bit ignored] */
5445
        /* abandon if have had overflow or terminal underflow */
5446
        if (*status & (DEC_Overflow|DEC_Underflow)) { /* interesting? */
5447
          if (*status&DEC_Overflow || ISZERO(t)) break;}
5448
        n=n<<1;                    /* move next bit to testable position */
5449
        if (n<0) {                  /* top bit is set */
5450
          seenbit=1;               /* OK, have a significant bit */
5451
          decMultiplyOp(t, t, a, &aset, status); /* acc=acc*x */
5452
          }
5453
        if (i==31) break;          /* that was the last bit */
5454
        if (!seenbit) continue;    /* no need to square 1 */
5455
        decMultiplyOp(t, t, t, &aset, status); /* acc=acc*acc [square] */
5456
        } /*i*/ /* 32 bits */
5457
      /* decNumberShow(t); */
5458
      a=t;                         /* and carry on using t instead of a */
5459
      }
5460
 
5461
    /* Copy and round the result to res */
5462
    residue=1;                          /* indicate dirt to right .. */
5463
    if (ISZERO(a)) residue=0;            /* .. unless underflowed to 0 */
5464
    aset.digits=set->digits;            /* [use default rounding] */
5465
    decCopyFit(res, a, &aset, &residue, status); /* copy & shorten */
5466
    decFinish(res, set, &residue, status);       /* cleanup/set flags */
5467
    } while(0);                          /* end protected */
5468
 
5469
  if (allocrhs !=NULL) free(allocrhs);  /* drop any storage used */
5470
  if (allocbufa!=NULL) free(allocbufa); /* .. */
5471
  if (allocbuft!=NULL) free(allocbuft); /* .. */
5472
  /* [status is handled by caller] */
5473
  return res;
5474
  } /* decExpOp */
5475
 
5476
/* ------------------------------------------------------------------ */
5477
/* Initial-estimate natural logarithm table                           */
5478
/*                                                                    */
5479
/*   LNnn -- 90-entry 16-bit table for values from .10 through .99.   */
5480
/*           The result is a 4-digit encode of the coefficient (c=the */
5481
/*           top 14 bits encoding 0-9999) and a 2-digit encode of the */
5482
/*           exponent (e=the bottom 2 bits encoding 0-3)              */
5483
/*                                                                    */
5484
/*           The resulting value is given by:                         */
5485
/*                                                                    */
5486
/*             v = -c * 10**(-e-3)                                    */
5487
/*                                                                    */
5488
/*           where e and c are extracted from entry k = LNnn[x-10]    */
5489
/*           where x is truncated (NB) into the range 10 through 99,  */
5490
/*           and then c = k>>2 and e = k&3.                           */
5491
/* ------------------------------------------------------------------ */
5492
const uShort LNnn[90]={9016,  8652,  8316,  8008,  7724,  7456,  7208,
5493
  6972,  6748,  6540,  6340,  6148,  5968,  5792,  5628,  5464,  5312,
5494
  5164,  5020,  4884,  4748,  4620,  4496,  4376,  4256,  4144,  4032,
5495
 39233, 38181, 37157, 36157, 35181, 34229, 33297, 32389, 31501, 30629,
5496
 29777, 28945, 28129, 27329, 26545, 25777, 25021, 24281, 23553, 22837,
5497
 22137, 21445, 20769, 20101, 19445, 18801, 18165, 17541, 16925, 16321,
5498
 15721, 15133, 14553, 13985, 13421, 12865, 12317, 11777, 11241, 10717,
5499
 10197,  9685,  9177,  8677,  8185,  7697,  7213,  6737,  6269,  5801,
5500
  5341,  4889,  4437, 39930, 35534, 31186, 26886, 22630, 18418, 14254,
5501
 10130,  6046, 20055};
5502
 
5503
/* ------------------------------------------------------------------ */
5504
/* decLnOp -- effect natural logarithm                                */
5505
/*                                                                    */
5506
/*   This computes C = ln(A)                                          */
5507
/*                                                                    */
5508
/*   res is C, the result.  C may be A                                */
5509
/*   rhs is A                                                         */
5510
/*   set is the context; note that rounding mode has no effect        */
5511
/*                                                                    */
5512
/* C must have space for set->digits digits.                          */
5513
/*                                                                    */
5514
/* Notable cases:                                                     */
5515
/*   A<0 -> Invalid                                                   */
5516
/*   A=0 -> -Infinity (Exact)                                         */
5517
/*   A=+Infinity -> +Infinity (Exact)                                 */
5518
/*   A=1 exactly -> 0 (Exact)                                         */
5519
/*                                                                    */
5520
/* Restrictions (as for Exp):                                         */
5521
/*                                                                    */
5522
/*   digits, emax, and -emin in the context must be less than         */
5523
/*   DEC_MAX_MATH+11 (1000010), and the rhs must be within these      */
5524
/*   bounds or a zero.  This is an internal routine, so these         */
5525
/*   restrictions are contractual and not enforced.                   */
5526
/*                                                                    */
5527
/* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will      */
5528
/* almost always be correctly rounded, but may be up to 1 ulp in      */
5529
/* error in rare cases.                                               */
5530
/* ------------------------------------------------------------------ */
5531
/* The result is calculated using Newton's method, with each          */
5532
/* iteration calculating a' = a + x * exp(-a) - 1.  See, for example, */
5533
/* Epperson 1989.                                                     */
5534
/*                                                                    */
5535
/* The iteration ends when the adjustment x*exp(-a)-1 is tiny enough. */
5536
/* This has to be calculated at the sum of the precision of x and the */
5537
/* working precision.                                                 */
5538
/*                                                                    */
5539
/* Implementation notes:                                              */
5540
/*                                                                    */
5541
/* 1. This is separated out as decLnOp so it can be called from       */
5542
/*    other Mathematical functions (e.g., Log 10) with a wider range  */
5543
/*    than normal.  In particular, it can handle the slightly wider   */
5544
/*    (+9+2) range needed by a power function.                        */
5545
/*                                                                    */
5546
/* 2. The speed of this function is about 10x slower than exp, as     */
5547
/*    it typically needs 4-6 iterations for short numbers, and the    */
5548
/*    extra precision needed adds a squaring effect, twice.           */
5549
/*                                                                    */
5550
/* 3. Fastpaths are included for ln(10) and ln(2), up to length 40,   */
5551
/*    as these are common requests.  ln(10) is used by log10(x).      */
5552
/*                                                                    */
5553
/* 4. An iteration might be saved by widening the LNnn table, and     */
5554
/*    would certainly save at least one if it were made ten times     */
5555
/*    bigger, too (for truncated fractions 0.100 through 0.999).      */
5556
/*    However, for most practical evaluations, at least four or five  */
5557
/*    iterations will be neede -- so this would only speed up by      */
5558
/*    20-25% and that probably does not justify increasing the table  */
5559
/*    size.                                                           */
5560
/*                                                                    */
5561
/* 5. The static buffers are larger than might be expected to allow   */
5562
/*    for calls from decNumberPower.                                  */
5563
/* ------------------------------------------------------------------ */
5564
decNumber * decLnOp(decNumber *res, const decNumber *rhs,
5565
                    decContext *set, uInt *status) {
5566
  uInt ignore=0;            /* working status accumulator */
5567
  uInt needbytes;                  /* for space calculations */
5568
  Int residue;                     /* rounding residue */
5569
  Int r;                           /* rhs=f*10**r [see below] */
5570
  Int p;                           /* working precision */
5571
  Int pp;                          /* precision for iteration */
5572
  Int t;                           /* work */
5573
 
5574
  /* buffers for a (accumulator, typically precision+2) and b */
5575
  /* (adjustment calculator, same size) */
5576
  decNumber bufa[D2N(DECBUFFER+12)];
5577
  decNumber *allocbufa=NULL;       /* -> allocated bufa, iff allocated */
5578
  decNumber *a=bufa;               /* accumulator/work */
5579
  decNumber bufb[D2N(DECBUFFER*2+2)];
5580
  decNumber *allocbufb=NULL;       /* -> allocated bufa, iff allocated */
5581
  decNumber *b=bufb;               /* adjustment/work */
5582
 
5583
  decNumber  numone;               /* constant 1 */
5584
  decNumber  cmp;                  /* work */
5585
  decContext aset, bset;           /* working contexts */
5586
 
5587
  #if DECCHECK
5588
  Int iterations=0;                 /* for later sanity check */
5589
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
5590
  #endif
5591
 
5592
  do {                                  /* protect allocated storage */
5593
    if (SPECIALARG) {                   /* handle infinities and NaNs */
5594
      if (decNumberIsInfinite(rhs)) {   /* an infinity */
5595
        if (decNumberIsNegative(rhs))   /* -Infinity -> error */
5596
          *status|=DEC_Invalid_operation;
5597
         else decNumberCopy(res, rhs);  /* +Infinity -> self */
5598
        }
5599
       else decNaNs(res, rhs, NULL, set, status); /* a NaN */
5600
      break;}
5601
 
5602
    if (ISZERO(rhs)) {                  /* +/- zeros -> -Infinity */
5603
      decNumberZero(res);               /* make clean */
5604
      res->bits=DECINF|DECNEG;          /* set - infinity */
5605
      break;}                           /* [no status to set] */
5606
 
5607
    /* Non-zero negatives are bad... */
5608
    if (decNumberIsNegative(rhs)) {     /* -x -> error */
5609
      *status|=DEC_Invalid_operation;
5610
      break;}
5611
 
5612
    /* Here, rhs is positive, finite, and in range */
5613
 
5614
    /* lookaside fastpath code for ln(2) and ln(10) at common lengths */
5615
    if (rhs->exponent==0 && set->digits<=40) {
5616
      #if DECDPUN==1
5617
      if (rhs->lsu[0]==0 && rhs->lsu[1]==1 && rhs->digits==2) { /* ln(10) */
5618
      #else
5619
      if (rhs->lsu[0]==10 && rhs->digits==2) {                   /* ln(10) */
5620
      #endif
5621
        aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
5622
        #define LN10 "2.302585092994045684017991454684364207601"
5623
        decNumberFromString(res, LN10, &aset);
5624
        *status|=(DEC_Inexact | DEC_Rounded); /* is inexact */
5625
        break;}
5626
      if (rhs->lsu[0]==2 && rhs->digits==1) { /* ln(2) */
5627
        aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
5628
        #define LN2 "0.6931471805599453094172321214581765680755"
5629
        decNumberFromString(res, LN2, &aset);
5630
        *status|=(DEC_Inexact | DEC_Rounded);
5631
        break;}
5632
      } /* integer and short */
5633
 
5634
    /* Determine the working precision.  This is normally the */
5635
    /* requested precision + 2, with a minimum of 9.  However, if */
5636
    /* the rhs is 'over-precise' then allow for all its digits to */
5637
    /* potentially participate (consider an rhs where all the excess */
5638
    /* digits are 9s) so in this case use rhs->digits+2. */
5639
    p=MAXI(rhs->digits, MAXI(set->digits, 7))+2;
5640
 
5641
    /* Allocate space for the accumulator and the high-precision */
5642
    /* adjustment calculator, if necessary.  The accumulator must */
5643
    /* be able to hold p digits, and the adjustment up to */
5644
    /* rhs->digits+p digits.  They are also made big enough for 16 */
5645
    /* digits so that they can be used for calculating the initial */
5646
    /* estimate. */
5647
    needbytes=sizeof(decNumber)+(D2U(MAXI(p,16))-1)*sizeof(Unit);
5648
    if (needbytes>sizeof(bufa)) {     /* need malloc space */
5649
      allocbufa=(decNumber *)malloc(needbytes);
5650
      if (allocbufa==NULL) {          /* hopeless -- abandon */
5651
        *status|=DEC_Insufficient_storage;
5652
        break;}
5653
      a=allocbufa;                    /* use the allocated space */
5654
      }
5655
    pp=p+rhs->digits;
5656
    needbytes=sizeof(decNumber)+(D2U(MAXI(pp,16))-1)*sizeof(Unit);
5657
    if (needbytes>sizeof(bufb)) {     /* need malloc space */
5658
      allocbufb=(decNumber *)malloc(needbytes);
5659
      if (allocbufb==NULL) {          /* hopeless -- abandon */
5660
        *status|=DEC_Insufficient_storage;
5661
        break;}
5662
      b=allocbufb;                    /* use the allocated space */
5663
      }
5664
 
5665
    /* Prepare an initial estimate in acc. Calculate this by */
5666
    /* considering the coefficient of x to be a normalized fraction, */
5667
    /* f, with the decimal point at far left and multiplied by */
5668
    /* 10**r.  Then, rhs=f*10**r and 0.1<=f<1, and */
5669
    /*   ln(x) = ln(f) + ln(10)*r */
5670
    /* Get the initial estimate for ln(f) from a small lookup */
5671
    /* table (see above) indexed by the first two digits of f, */
5672
    /* truncated. */
5673
 
5674
    decContextDefault(&aset, DEC_INIT_DECIMAL64); /* 16-digit extended */
5675
    r=rhs->exponent+rhs->digits;        /* 'normalised' exponent */
5676
    decNumberFromInt32(a, r);           /* a=r */
5677
    decNumberFromInt32(b, 2302585);     /* b=ln(10) (2.302585) */
5678
    b->exponent=-6;                     /*  .. */
5679
    decMultiplyOp(a, a, b, &aset, &ignore);  /* a=a*b */
5680
    /* now get top two digits of rhs into b by simple truncate and */
5681
    /* force to integer */
5682
    residue=0;                           /* (no residue) */
5683
    aset.digits=2; aset.round=DEC_ROUND_DOWN;
5684
    decCopyFit(b, rhs, &aset, &residue, &ignore); /* copy & shorten */
5685
    b->exponent=0;                       /* make integer */
5686
    t=decGetInt(b);                     /* [cannot fail] */
5687
    if (t<10) t=X10(t);                 /* adjust single-digit b */
5688
    t=LNnn[t-10];                       /* look up ln(b) */
5689
    decNumberFromInt32(b, t>>2);        /* b=ln(b) coefficient */
5690
    b->exponent=-(t&3)-3;               /* set exponent */
5691
    b->bits=DECNEG;                     /* ln(0.10)->ln(0.99) always -ve */
5692
    aset.digits=16; aset.round=DEC_ROUND_HALF_EVEN; /* restore */
5693
    decAddOp(a, a, b, &aset, 0, &ignore); /* acc=a+b */
5694
    /* the initial estimate is now in a, with up to 4 digits correct. */
5695
    /* When rhs is at or near Nmax the estimate will be low, so we */
5696
    /* will approach it from below, avoiding overflow when calling exp. */
5697
 
5698
    decNumberZero(&numone); *numone.lsu=1;   /* constant 1 for adjustment */
5699
 
5700
    /* accumulator bounds are as requested (could underflow, but */
5701
    /* cannot overflow) */
5702
    aset.emax=set->emax;
5703
    aset.emin=set->emin;
5704
    aset.clamp=0;                        /* no concrete format */
5705
    /* set up a context to be used for the multiply and subtract */
5706
    bset=aset;
5707
    bset.emax=DEC_MAX_MATH*2;           /* use double bounds for the */
5708
    bset.emin=-DEC_MAX_MATH*2;          /* adjustment calculation */
5709
                                        /* [see decExpOp call below] */
5710
    /* for each iteration double the number of digits to calculate, */
5711
    /* up to a maximum of p */
5712
    pp=9;                               /* initial precision */
5713
    /* [initially 9 as then the sequence starts 7+2, 16+2, and */
5714
    /* 34+2, which is ideal for standard-sized numbers] */
5715
    aset.digits=pp;                     /* working context */
5716
    bset.digits=pp+rhs->digits;         /* wider context */
5717
    for (;;) {                          /* iterate */
5718
      #if DECCHECK
5719
      iterations++;
5720
      if (iterations>24) break;         /* consider 9 * 2**24 */
5721
      #endif
5722
      /* calculate the adjustment (exp(-a)*x-1) into b.  This is a */
5723
      /* catastrophic subtraction but it really is the difference */
5724
      /* from 1 that is of interest. */
5725
      /* Use the internal entry point to Exp as it allows the double */
5726
      /* range for calculating exp(-a) when a is the tiniest subnormal. */
5727
      a->bits^=DECNEG;                  /* make -a */
5728
      decExpOp(b, a, &bset, &ignore);   /* b=exp(-a) */
5729
      a->bits^=DECNEG;                  /* restore sign of a */
5730
      /* now multiply by rhs and subtract 1, at the wider precision */
5731
      decMultiplyOp(b, b, rhs, &bset, &ignore);        /* b=b*rhs */
5732
      decAddOp(b, b, &numone, &bset, DECNEG, &ignore); /* b=b-1 */
5733
 
5734
      /* the iteration ends when the adjustment cannot affect the */
5735
      /* result by >=0.5 ulp (at the requested digits), which */
5736
      /* is when its value is smaller than the accumulator by */
5737
      /* set->digits+1 digits (or it is zero) -- this is a looser */
5738
      /* requirement than for Exp because all that happens to the */
5739
      /* accumulator after this is the final rounding (but note that */
5740
      /* there must also be full precision in a, or a=0). */
5741
 
5742
      if (decNumberIsZero(b) ||
5743
          (a->digits+a->exponent)>=(b->digits+b->exponent+set->digits+1)) {
5744
        if (a->digits==p) break;
5745
        if (decNumberIsZero(a)) {
5746
          decCompareOp(&cmp, rhs, &numone, &aset, COMPARE, &ignore); /* rhs=1 ? */
5747
          if (cmp.lsu[0]==0) a->exponent=0;               /* yes, exact 0 */
5748
           else *status|=(DEC_Inexact | DEC_Rounded);  /* no, inexact */
5749
          break;
5750
          }
5751
        /* force padding if adjustment has gone to 0 before full length */
5752
        if (decNumberIsZero(b)) b->exponent=a->exponent-p;
5753
        }
5754
 
5755
      /* not done yet ... */
5756
      decAddOp(a, a, b, &aset, 0, &ignore);  /* a=a+b for next estimate */
5757
      if (pp==p) continue;                   /* precision is at maximum */
5758
      /* lengthen the next calculation */
5759
      pp=pp*2;                               /* double precision */
5760
      if (pp>p) pp=p;                        /* clamp to maximum */
5761
      aset.digits=pp;                        /* working context */
5762
      bset.digits=pp+rhs->digits;            /* wider context */
5763
      } /* Newton's iteration */
5764
 
5765
    #if DECCHECK
5766
    /* just a sanity check; remove the test to show always */
5767
    if (iterations>24)
5768
      printf("Ln iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
5769
            iterations, *status, p, rhs->digits);
5770
    #endif
5771
 
5772
    /* Copy and round the result to res */
5773
    residue=1;                          /* indicate dirt to right */
5774
    if (ISZERO(a)) residue=0;            /* .. unless underflowed to 0 */
5775
    aset.digits=set->digits;            /* [use default rounding] */
5776
    decCopyFit(res, a, &aset, &residue, status); /* copy & shorten */
5777
    decFinish(res, set, &residue, status);       /* cleanup/set flags */
5778
    } while(0);                          /* end protected */
5779
 
5780
  if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
5781
  if (allocbufb!=NULL) free(allocbufb); /* .. */
5782
  /* [status is handled by caller] */
5783
  return res;
5784
  } /* decLnOp */
5785
 
5786
/* ------------------------------------------------------------------ */
5787
/* decQuantizeOp  -- force exponent to requested value                */
5788
/*                                                                    */
5789
/*   This computes C = op(A, B), where op adjusts the coefficient     */
5790
/*   of C (by rounding or shifting) such that the exponent (-scale)   */
5791
/*   of C has the value B or matches the exponent of B.               */
5792
/*   The numerical value of C will equal A, except for the effects of */
5793
/*   any rounding that occurred.                                      */
5794
/*                                                                    */
5795
/*   res is C, the result.  C may be A or B                           */
5796
/*   lhs is A, the number to adjust                                   */
5797
/*   rhs is B, the requested exponent                                 */
5798
/*   set is the context                                               */
5799
/*   quant is 1 for quantize or 0 for rescale                         */
5800
/*   status is the status accumulator (this can be called without     */
5801
/*          risk of control loss)                                     */
5802
/*                                                                    */
5803
/* C must have space for set->digits digits.                          */
5804
/*                                                                    */
5805
/* Unless there is an error or the result is infinite, the exponent   */
5806
/* after the operation is guaranteed to be that requested.            */
5807
/* ------------------------------------------------------------------ */
5808
static decNumber * decQuantizeOp(decNumber *res, const decNumber *lhs,
5809
                                 const decNumber *rhs, decContext *set,
5810
                                 Flag quant, uInt *status) {
5811
  #if DECSUBSET
5812
  decNumber *alloclhs=NULL;        /* non-NULL if rounded lhs allocated */
5813
  decNumber *allocrhs=NULL;        /* .., rhs */
5814
  #endif
5815
  const decNumber *inrhs=rhs;      /* save original rhs */
5816
  Int   reqdigits=set->digits;     /* requested DIGITS */
5817
  Int   reqexp;                    /* requested exponent [-scale] */
5818
  Int   residue=0;                  /* rounding residue */
5819
  Int   etiny=set->emin-(reqdigits-1);
5820
 
5821
  #if DECCHECK
5822
  if (decCheckOperands(res, lhs, rhs, set)) return res;
5823
  #endif
5824
 
5825
  do {                             /* protect allocated storage */
5826
    #if DECSUBSET
5827
    if (!set->extended) {
5828
      /* reduce operands and set lostDigits status, as needed */
5829
      if (lhs->digits>reqdigits) {
5830
        alloclhs=decRoundOperand(lhs, set, status);
5831
        if (alloclhs==NULL) break;
5832
        lhs=alloclhs;
5833
        }
5834
      if (rhs->digits>reqdigits) { /* [this only checks lostDigits] */
5835
        allocrhs=decRoundOperand(rhs, set, status);
5836
        if (allocrhs==NULL) break;
5837
        rhs=allocrhs;
5838
        }
5839
      }
5840
    #endif
5841
    /* [following code does not require input rounding] */
5842
 
5843
    /* Handle special values */
5844
    if (SPECIALARGS) {
5845
      /* NaNs get usual processing */
5846
      if (SPECIALARGS & (DECSNAN | DECNAN))
5847
        decNaNs(res, lhs, rhs, set, status);
5848
      /* one infinity but not both is bad */
5849
      else if ((lhs->bits ^ rhs->bits) & DECINF)
5850
        *status|=DEC_Invalid_operation;
5851
      /* both infinity: return lhs */
5852
      else decNumberCopy(res, lhs);          /* [nop if in place] */
5853
      break;
5854
      }
5855
 
5856
    /* set requested exponent */
5857
    if (quant) reqexp=inrhs->exponent;  /* quantize -- match exponents */
5858
     else {                             /* rescale -- use value of rhs */
5859
      /* Original rhs must be an integer that fits and is in range, */
5860
      /* which could be from -1999999997 to +999999999, thanks to */
5861
      /* subnormals */
5862
      reqexp=decGetInt(inrhs);               /* [cannot fail] */
5863
      }
5864
 
5865
    #if DECSUBSET
5866
    if (!set->extended) etiny=set->emin;     /* no subnormals */
5867
    #endif
5868
 
5869
    if (reqexp==BADINT                       /* bad (rescale only) or .. */
5870
     || reqexp==BIGODD || reqexp==BIGEVEN    /* very big (ditto) or .. */
5871
     || (reqexp<etiny)                       /* < lowest */
5872
     || (reqexp>set->emax)) {                /* > emax */
5873
      *status|=DEC_Invalid_operation;
5874
      break;}
5875
 
5876
    /* the RHS has been processed, so it can be overwritten now if necessary */
5877
    if (ISZERO(lhs)) {                       /* zero coefficient unchanged */
5878
      decNumberCopy(res, lhs);               /* [nop if in place] */
5879
      res->exponent=reqexp;                  /* .. just set exponent */
5880
      #if DECSUBSET
5881
      if (!set->extended) res->bits=0;        /* subset specification; no -0 */
5882
      #endif
5883
      }
5884
     else {                                  /* non-zero lhs */
5885
      Int adjust=reqexp-lhs->exponent;       /* digit adjustment needed */
5886
      /* if adjusted coefficient will definitely not fit, give up now */
5887
      if ((lhs->digits-adjust)>reqdigits) {
5888
        *status|=DEC_Invalid_operation;
5889
        break;
5890
        }
5891
 
5892
      if (adjust>0) {                         /* increasing exponent */
5893
        /* this will decrease the length of the coefficient by adjust */
5894
        /* digits, and must round as it does so */
5895
        decContext workset;                  /* work */
5896
        workset=*set;                        /* clone rounding, etc. */
5897
        workset.digits=lhs->digits-adjust;   /* set requested length */
5898
        /* [note that the latter can be <1, here] */
5899
        decCopyFit(res, lhs, &workset, &residue, status); /* fit to result */
5900
        decApplyRound(res, &workset, residue, status);    /* .. and round */
5901
        residue=0;                                         /* [used] */
5902
        /* If just rounded a 999s case, exponent will be off by one; */
5903
        /* adjust back (after checking space), if so. */
5904
        if (res->exponent>reqexp) {
5905
          /* re-check needed, e.g., for quantize(0.9999, 0.001) under */
5906
          /* set->digits==3 */
5907
          if (res->digits==reqdigits) {      /* cannot shift by 1 */
5908
            *status&=~(DEC_Inexact | DEC_Rounded); /* [clean these] */
5909
            *status|=DEC_Invalid_operation;
5910
            break;
5911
            }
5912
          res->digits=decShiftToMost(res->lsu, res->digits, 1); /* shift */
5913
          res->exponent--;                   /* (re)adjust the exponent. */
5914
          }
5915
        #if DECSUBSET
5916
        if (ISZERO(res) && !set->extended) res->bits=0; /* subset; no -0 */
5917
        #endif
5918
        } /* increase */
5919
       else /* adjust<=0 */ {                /* decreasing or = exponent */
5920
        /* this will increase the length of the coefficient by -adjust */
5921
        /* digits, by adding zero or more trailing zeros; this is */
5922
        /* already checked for fit, above */
5923
        decNumberCopy(res, lhs);             /* [it will fit] */
5924
        /* if padding needed (adjust<0), add it now... */
5925
        if (adjust<0) {
5926
          res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
5927
          res->exponent+=adjust;             /* adjust the exponent */
5928
          }
5929
        } /* decrease */
5930
      } /* non-zero */
5931
 
5932
    /* Check for overflow [do not use Finalize in this case, as an */
5933
    /* overflow here is a "don't fit" situation] */
5934
    if (res->exponent>set->emax-res->digits+1) {  /* too big */
5935
      *status|=DEC_Invalid_operation;
5936
      break;
5937
      }
5938
     else {
5939
      decFinalize(res, set, &residue, status);    /* set subnormal flags */
5940
      *status&=~DEC_Underflow;          /* suppress Underflow [754r] */
5941
      }
5942
    } while(0);                          /* end protected */
5943
 
5944
  #if DECSUBSET
5945
  if (allocrhs!=NULL) free(allocrhs);   /* drop any storage used */
5946
  if (alloclhs!=NULL) free(alloclhs);   /* .. */
5947
  #endif
5948
  return res;
5949
  } /* decQuantizeOp */
5950
 
5951
/* ------------------------------------------------------------------ */
5952
/* decCompareOp -- compare, min, or max two Numbers                   */
5953
/*                                                                    */
5954
/*   This computes C = A ? B and carries out one of four operations:  */
5955
/*     COMPARE    -- returns the signum (as a number) giving the      */
5956
/*                   result of a comparison unless one or both        */
5957
/*                   operands is a NaN (in which case a NaN results)  */
5958
/*     COMPSIG    -- as COMPARE except that a quiet NaN raises        */
5959
/*                   Invalid operation.                               */
5960
/*     COMPMAX    -- returns the larger of the operands, using the    */
5961
/*                   754r maxnum operation                            */
5962
/*     COMPMAXMAG -- ditto, comparing absolute values                 */
5963
/*     COMPMIN    -- the 754r minnum operation                        */
5964
/*     COMPMINMAG -- ditto, comparing absolute values                 */
5965
/*     COMTOTAL   -- returns the signum (as a number) giving the      */
5966
/*                   result of a comparison using 754r total ordering */
5967
/*                                                                    */
5968
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
5969
/*   lhs is A                                                         */
5970
/*   rhs is B                                                         */
5971
/*   set is the context                                               */
5972
/*   op  is the operation flag                                        */
5973
/*   status is the usual accumulator                                  */
5974
/*                                                                    */
5975
/* C must have space for one digit for COMPARE or set->digits for     */
5976
/* COMPMAX, COMPMIN, COMPMAXMAG, or COMPMINMAG.                       */
5977
/* ------------------------------------------------------------------ */
5978
/* The emphasis here is on speed for common cases, and avoiding       */
5979
/* coefficient comparison if possible.                                */
5980
/* ------------------------------------------------------------------ */
5981
decNumber * decCompareOp(decNumber *res, const decNumber *lhs,
5982
                         const decNumber *rhs, decContext *set,
5983
                         Flag op, uInt *status) {
5984
  #if DECSUBSET
5985
  decNumber *alloclhs=NULL;        /* non-NULL if rounded lhs allocated */
5986
  decNumber *allocrhs=NULL;        /* .., rhs */
5987
  #endif
5988
  Int   result=0;                   /* default result value */
5989
  uByte merged;                    /* work */
5990
 
5991
  #if DECCHECK
5992
  if (decCheckOperands(res, lhs, rhs, set)) return res;
5993
  #endif
5994
 
5995
  do {                             /* protect allocated storage */
5996
    #if DECSUBSET
5997
    if (!set->extended) {
5998
      /* reduce operands and set lostDigits status, as needed */
5999
      if (lhs->digits>set->digits) {
6000
        alloclhs=decRoundOperand(lhs, set, status);
6001
        if (alloclhs==NULL) {result=BADINT; break;}
6002
        lhs=alloclhs;
6003
        }
6004
      if (rhs->digits>set->digits) {
6005
        allocrhs=decRoundOperand(rhs, set, status);
6006
        if (allocrhs==NULL) {result=BADINT; break;}
6007
        rhs=allocrhs;
6008
        }
6009
      }
6010
    #endif
6011
    /* [following code does not require input rounding] */
6012
 
6013
    /* If total ordering then handle differing signs 'up front' */
6014
    if (op==COMPTOTAL) {                /* total ordering */
6015
      if (decNumberIsNegative(lhs) & !decNumberIsNegative(rhs)) {
6016
        result=-1;
6017
        break;
6018
        }
6019
      if (!decNumberIsNegative(lhs) & decNumberIsNegative(rhs)) {
6020
        result=+1;
6021
        break;
6022
        }
6023
      }
6024
 
6025
    /* handle NaNs specially; let infinities drop through */
6026
    /* This assumes sNaN (even just one) leads to NaN. */
6027
    merged=(lhs->bits | rhs->bits) & (DECSNAN | DECNAN);
6028
    if (merged) {                       /* a NaN bit set */
6029
      if (op==COMPARE);                 /* result will be NaN */
6030
       else if (op==COMPSIG)            /* treat qNaN as sNaN */
6031
        *status|=DEC_Invalid_operation | DEC_sNaN;
6032
       else if (op==COMPTOTAL) {        /* total ordering, always finite */
6033
        /* signs are known to be the same; compute the ordering here */
6034
        /* as if the signs are both positive, then invert for negatives */
6035
        if (!decNumberIsNaN(lhs)) result=-1;
6036
         else if (!decNumberIsNaN(rhs)) result=+1;
6037
         /* here if both NaNs */
6038
         else if (decNumberIsSNaN(lhs) && decNumberIsQNaN(rhs)) result=-1;
6039
         else if (decNumberIsQNaN(lhs) && decNumberIsSNaN(rhs)) result=+1;
6040
         else { /* both NaN or both sNaN */
6041
          /* now it just depends on the payload */
6042
          result=decUnitCompare(lhs->lsu, D2U(lhs->digits),
6043
                                rhs->lsu, D2U(rhs->digits), 0);
6044
          /* [Error not possible, as these are 'aligned'] */
6045
          } /* both same NaNs */
6046
        if (decNumberIsNegative(lhs)) result=-result;
6047
        break;
6048
        } /* total order */
6049
 
6050
       else if (merged & DECSNAN);           /* sNaN -> qNaN */
6051
       else { /* here if MIN or MAX and one or two quiet NaNs */
6052
        /* min or max -- 754r rules ignore single NaN */
6053
        if (!decNumberIsNaN(lhs) || !decNumberIsNaN(rhs)) {
6054
          /* just one NaN; force choice to be the non-NaN operand */
6055
          op=COMPMAX;
6056
          if (lhs->bits & DECNAN) result=-1; /* pick rhs */
6057
                             else result=+1; /* pick lhs */
6058
          break;
6059
          }
6060
        } /* max or min */
6061
      op=COMPNAN;                            /* use special path */
6062
      decNaNs(res, lhs, rhs, set, status);   /* propagate NaN */
6063
      break;
6064
      }
6065
    /* have numbers */
6066
    if (op==COMPMAXMAG || op==COMPMINMAG) result=decCompare(lhs, rhs, 1);
6067
     else result=decCompare(lhs, rhs, 0);    /* sign matters */
6068
    } while(0);                               /* end protected */
6069
 
6070
  if (result==BADINT) *status|=DEC_Insufficient_storage; /* rare */
6071
   else {
6072
    if (op==COMPARE || op==COMPSIG ||op==COMPTOTAL) { /* returning signum */
6073
      if (op==COMPTOTAL && result==0) {
6074
        /* operands are numerically equal or same NaN (and same sign, */
6075
        /* tested first); if identical, leave result 0 */
6076
        if (lhs->exponent!=rhs->exponent) {
6077
          if (lhs->exponent<rhs->exponent) result=-1;
6078
           else result=+1;
6079
          if (decNumberIsNegative(lhs)) result=-result;
6080
          } /* lexp!=rexp */
6081
        } /* total-order by exponent */
6082
      decNumberZero(res);               /* [always a valid result] */
6083
      if (result!=0) {                   /* must be -1 or +1 */
6084
        *res->lsu=1;
6085
        if (result<0) res->bits=DECNEG;
6086
        }
6087
      }
6088
     else if (op==COMPNAN);             /* special, drop through */
6089
     else {                             /* MAX or MIN, non-NaN result */
6090
      Int residue=0;                     /* rounding accumulator */
6091
      /* choose the operand for the result */
6092
      const decNumber *choice;
6093
      if (result==0) { /* operands are numerically equal */
6094
        /* choose according to sign then exponent (see 754r) */
6095
        uByte slhs=(lhs->bits & DECNEG);
6096
        uByte srhs=(rhs->bits & DECNEG);
6097
        #if DECSUBSET
6098
        if (!set->extended) {           /* subset: force left-hand */
6099
          op=COMPMAX;
6100
          result=+1;
6101
          }
6102
        else
6103
        #endif
6104
        if (slhs!=srhs) {          /* signs differ */
6105
          if (slhs) result=-1;     /* rhs is max */
6106
               else result=+1;     /* lhs is max */
6107
          }
6108
         else if (slhs && srhs) {  /* both negative */
6109
          if (lhs->exponent<rhs->exponent) result=+1;
6110
                                      else result=-1;
6111
          /* [if equal, use lhs, technically identical] */
6112
          }
6113
         else {                    /* both positive */
6114
          if (lhs->exponent>rhs->exponent) result=+1;
6115
                                      else result=-1;
6116
          /* [ditto] */
6117
          }
6118
        } /* numerically equal */
6119
      /* here result will be non-0; reverse if looking for MIN */
6120
      if (op==COMPMIN || op==COMPMINMAG) result=-result;
6121
      choice=(result>0 ? lhs : rhs);     /* choose */
6122
      /* copy chosen to result, rounding if need be */
6123
      decCopyFit(res, choice, set, &residue, status);
6124
      decFinish(res, set, &residue, status);
6125
      }
6126
    }
6127
  #if DECSUBSET
6128
  if (allocrhs!=NULL) free(allocrhs);   /* free any storage used */
6129
  if (alloclhs!=NULL) free(alloclhs);   /* .. */
6130
  #endif
6131
  return res;
6132
  } /* decCompareOp */
6133
 
6134
/* ------------------------------------------------------------------ */
6135
/* decCompare -- compare two decNumbers by numerical value            */
6136
/*                                                                    */
6137
/*  This routine compares A ? B without altering them.                */
6138
/*                                                                    */
6139
/*  Arg1 is A, a decNumber which is not a NaN                         */
6140
/*  Arg2 is B, a decNumber which is not a NaN                         */
6141
/*  Arg3 is 1 for a sign-independent compare, 0 otherwise             */
6142
/*                                                                    */
6143
/*  returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure   */
6144
/*  (the only possible failure is an allocation error)                */
6145
/* ------------------------------------------------------------------ */
6146
static Int decCompare(const decNumber *lhs, const decNumber *rhs,
6147
                      Flag abs) {
6148
  Int   result;                    /* result value */
6149
  Int   sigr;                      /* rhs signum */
6150
  Int   compare;                   /* work */
6151
 
6152
  result=1;                                  /* assume signum(lhs) */
6153
  if (ISZERO(lhs)) result=0;
6154
  if (abs) {
6155
    if (ISZERO(rhs)) return result;          /* LHS wins or both 0 */
6156
    /* RHS is non-zero */
6157
    if (result==0) return -1;                 /* LHS is 0; RHS wins */
6158
    /* [here, both non-zero, result=1] */
6159
    }
6160
   else {                                    /* signs matter */
6161
    if (result && decNumberIsNegative(lhs)) result=-1;
6162
    sigr=1;                                  /* compute signum(rhs) */
6163
    if (ISZERO(rhs)) sigr=0;
6164
     else if (decNumberIsNegative(rhs)) sigr=-1;
6165
    if (result > sigr) return +1;            /* L > R, return 1 */
6166
    if (result < sigr) return -1;            /* L < R, return -1 */
6167
    if (result==0) return 0;                     /* both 0 */
6168
    }
6169
 
6170
  /* signums are the same; both are non-zero */
6171
  if ((lhs->bits | rhs->bits) & DECINF) {    /* one or more infinities */
6172
    if (decNumberIsInfinite(rhs)) {
6173
      if (decNumberIsInfinite(lhs)) result=0;/* both infinite */
6174
       else result=-result;                  /* only rhs infinite */
6175
      }
6176
    return result;
6177
    }
6178
  /* must compare the coefficients, allowing for exponents */
6179
  if (lhs->exponent>rhs->exponent) {         /* LHS exponent larger */
6180
    /* swap sides, and sign */
6181
    const decNumber *temp=lhs;
6182
    lhs=rhs;
6183
    rhs=temp;
6184
    result=-result;
6185
    }
6186
  compare=decUnitCompare(lhs->lsu, D2U(lhs->digits),
6187
                         rhs->lsu, D2U(rhs->digits),
6188
                         rhs->exponent-lhs->exponent);
6189
  if (compare!=BADINT) compare*=result;      /* comparison succeeded */
6190
  return compare;
6191
  } /* decCompare */
6192
 
6193
/* ------------------------------------------------------------------ */
6194
/* decUnitCompare -- compare two >=0 integers in Unit arrays          */
6195
/*                                                                    */
6196
/*  This routine compares A ? B*10**E where A and B are unit arrays   */
6197
/*  A is a plain integer                                              */
6198
/*  B has an exponent of E (which must be non-negative)               */
6199
/*                                                                    */
6200
/*  Arg1 is A first Unit (lsu)                                        */
6201
/*  Arg2 is A length in Units                                         */
6202
/*  Arg3 is B first Unit (lsu)                                        */
6203
/*  Arg4 is B length in Units                                         */
6204
/*  Arg5 is E (0 if the units are aligned)                            */
6205
/*                                                                    */
6206
/*  returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure   */
6207
/*  (the only possible failure is an allocation error, which can      */
6208
/*  only occur if E!=0)                                               */
6209
/* ------------------------------------------------------------------ */
6210
static Int decUnitCompare(const Unit *a, Int alength,
6211
                          const Unit *b, Int blength, Int exp) {
6212
  Unit  *acc;                      /* accumulator for result */
6213
  Unit  accbuff[SD2U(DECBUFFER*2+1)]; /* local buffer */
6214
  Unit  *allocacc=NULL;            /* -> allocated acc buffer, iff allocated */
6215
  Int   accunits, need;            /* units in use or needed for acc */
6216
  const Unit *l, *r, *u;           /* work */
6217
  Int   expunits, exprem, result;  /* .. */
6218
 
6219
  if (exp==0) {                     /* aligned; fastpath */
6220
    if (alength>blength) return 1;
6221
    if (alength<blength) return -1;
6222
    /* same number of units in both -- need unit-by-unit compare */
6223
    l=a+alength-1;
6224
    r=b+alength-1;
6225
    for (;l>=a; l--, r--) {
6226
      if (*l>*r) return 1;
6227
      if (*l<*r) return -1;
6228
      }
6229
    return 0;                       /* all units match */
6230
    } /* aligned */
6231
 
6232
  /* Unaligned.  If one is >1 unit longer than the other, padded */
6233
  /* approximately, then can return easily */
6234
  if (alength>blength+(Int)D2U(exp)) return 1;
6235
  if (alength+1<blength+(Int)D2U(exp)) return -1;
6236
 
6237
  /* Need to do a real subtract.  For this, a result buffer is needed */
6238
  /* even though only the sign is of interest.  Its length needs */
6239
  /* to be the larger of alength and padded blength, +2 */
6240
  need=blength+D2U(exp);                /* maximum real length of B */
6241
  if (need<alength) need=alength;
6242
  need+=2;
6243
  acc=accbuff;                          /* assume use local buffer */
6244
  if (need*sizeof(Unit)>sizeof(accbuff)) {
6245
    allocacc=(Unit *)malloc(need*sizeof(Unit));
6246
    if (allocacc==NULL) return BADINT;  /* hopeless -- abandon */
6247
    acc=allocacc;
6248
    }
6249
  /* Calculate units and remainder from exponent. */
6250
  expunits=exp/DECDPUN;
6251
  exprem=exp%DECDPUN;
6252
  /* subtract [A+B*(-m)] */
6253
  accunits=decUnitAddSub(a, alength, b, blength, expunits, acc,
6254
                         -(Int)powers[exprem]);
6255
  /* [UnitAddSub result may have leading zeros, even on zero] */
6256
  if (accunits<0) result=-1;             /* negative result */
6257
   else {                               /* non-negative result */
6258
    /* check units of the result before freeing any storage */
6259
    for (u=acc; u<acc+accunits-1 && *u==0;) u++;
6260
    result=(*u==0 ? 0 : +1);
6261
    }
6262
  /* clean up and return the result */
6263
  if (allocacc!=NULL) free(allocacc);   /* drop any storage used */
6264
  return result;
6265
  } /* decUnitCompare */
6266
 
6267
/* ------------------------------------------------------------------ */
6268
/* decUnitAddSub -- add or subtract two >=0 integers in Unit arrays   */
6269
/*                                                                    */
6270
/*  This routine performs the calculation:                            */
6271
/*                                                                    */
6272
/*  C=A+(B*M)                                                         */
6273
/*                                                                    */
6274
/*  Where M is in the range -DECDPUNMAX through +DECDPUNMAX.          */
6275
/*                                                                    */
6276
/*  A may be shorter or longer than B.                                */
6277
/*                                                                    */
6278
/*  Leading zeros are not removed after a calculation.  The result is */
6279
/*  either the same length as the longer of A and B (adding any       */
6280
/*  shift), or one Unit longer than that (if a Unit carry occurred).  */
6281
/*                                                                    */
6282
/*  A and B content are not altered unless C is also A or B.          */
6283
/*  C may be the same array as A or B, but only if no zero padding is */
6284
/*  requested (that is, C may be B only if bshift==0).                */
6285
/*  C is filled from the lsu; only those units necessary to complete  */
6286
/*  the calculation are referenced.                                   */
6287
/*                                                                    */
6288
/*  Arg1 is A first Unit (lsu)                                        */
6289
/*  Arg2 is A length in Units                                         */
6290
/*  Arg3 is B first Unit (lsu)                                        */
6291
/*  Arg4 is B length in Units                                         */
6292
/*  Arg5 is B shift in Units  (>=0; pads with 0 units if positive)    */
6293
/*  Arg6 is C first Unit (lsu)                                        */
6294
/*  Arg7 is M, the multiplier                                         */
6295
/*                                                                    */
6296
/*  returns the count of Units written to C, which will be non-zero   */
6297
/*  and negated if the result is negative.  That is, the sign of the  */
6298
/*  returned Int is the sign of the result (positive for zero) and    */
6299
/*  the absolute value of the Int is the count of Units.              */
6300
/*                                                                    */
6301
/*  It is the caller's responsibility to make sure that C size is     */
6302
/*  safe, allowing space if necessary for a one-Unit carry.           */
6303
/*                                                                    */
6304
/*  This routine is severely performance-critical; *any* change here  */
6305
/*  must be measured (timed) to assure no performance degradation.    */
6306
/*  In particular, trickery here tends to be counter-productive, as   */
6307
/*  increased complexity of code hurts register optimizations on      */
6308
/*  register-poor architectures.  Avoiding divisions is nearly        */
6309
/*  always a Good Idea, however.                                      */
6310
/*                                                                    */
6311
/* Special thanks to Rick McGuire (IBM Cambridge, MA) and Dave Clark  */
6312
/* (IBM Warwick, UK) for some of the ideas used in this routine.      */
6313
/* ------------------------------------------------------------------ */
6314
static Int decUnitAddSub(const Unit *a, Int alength,
6315
                         const Unit *b, Int blength, Int bshift,
6316
                         Unit *c, Int m) {
6317
  const Unit *alsu=a;              /* A lsu [need to remember it] */
6318
  Unit *clsu=c;                    /* C ditto */
6319
  Unit *minC;                      /* low water mark for C */
6320
  Unit *maxC;                      /* high water mark for C */
6321
  eInt carry=0;                     /* carry integer (could be Long) */
6322
  Int  add;                        /* work */
6323
  #if DECDPUN<=4                   /* myriadal, millenary, etc. */
6324
  Int  est;                        /* estimated quotient */
6325
  #endif
6326
 
6327
  #if DECTRACE
6328
  if (alength<1 || blength<1)
6329
    printf("decUnitAddSub: alen blen m %ld %ld [%ld]\n", alength, blength, m);
6330
  #endif
6331
 
6332
  maxC=c+alength;                  /* A is usually the longer */
6333
  minC=c+blength;                  /* .. and B the shorter */
6334
  if (bshift!=0) {                  /* B is shifted; low As copy across */
6335
    minC+=bshift;
6336
    /* if in place [common], skip copy unless there's a gap [rare] */
6337
    if (a==c && bshift<=alength) {
6338
      c+=bshift;
6339
      a+=bshift;
6340
      }
6341
     else for (; c<clsu+bshift; a++, c++) {  /* copy needed */
6342
      if (a<alsu+alength) *c=*a;
6343
       else *c=0;
6344
      }
6345
    }
6346
  if (minC>maxC) { /* swap */
6347
    Unit *hold=minC;
6348
    minC=maxC;
6349
    maxC=hold;
6350
    }
6351
 
6352
  /* For speed, do the addition as two loops; the first where both A */
6353
  /* and B contribute, and the second (if necessary) where only one or */
6354
  /* other of the numbers contribute. */
6355
  /* Carry handling is the same (i.e., duplicated) in each case. */
6356
  for (; c<minC; c++) {
6357
    carry+=*a;
6358
    a++;
6359
    carry+=((eInt)*b)*m;                /* [special-casing m=1/-1 */
6360
    b++;                                /* here is not a win] */
6361
    /* here carry is new Unit of digits; it could be +ve or -ve */
6362
    if ((ueInt)carry<=DECDPUNMAX) {     /* fastpath 0-DECDPUNMAX */
6363
      *c=(Unit)carry;
6364
      carry=0;
6365
      continue;
6366
      }
6367
    #if DECDPUN==4                           /* use divide-by-multiply */
6368
      if (carry>=0) {
6369
        est=(((ueInt)carry>>11)*53687)>>18;
6370
        *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6371
        carry=est;                           /* likely quotient [89%] */
6372
        if (*c<DECDPUNMAX+1) continue;       /* estimate was correct */
6373
        carry++;
6374
        *c-=DECDPUNMAX+1;
6375
        continue;
6376
        }
6377
      /* negative case */
6378
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6379
      est=(((ueInt)carry>>11)*53687)>>18;
6380
      *c=(Unit)(carry-est*(DECDPUNMAX+1));
6381
      carry=est-(DECDPUNMAX+1);              /* correctly negative */
6382
      if (*c<DECDPUNMAX+1) continue;         /* was OK */
6383
      carry++;
6384
      *c-=DECDPUNMAX+1;
6385
    #elif DECDPUN==3
6386
      if (carry>=0) {
6387
        est=(((ueInt)carry>>3)*16777)>>21;
6388
        *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6389
        carry=est;                           /* likely quotient [99%] */
6390
        if (*c<DECDPUNMAX+1) continue;       /* estimate was correct */
6391
        carry++;
6392
        *c-=DECDPUNMAX+1;
6393
        continue;
6394
        }
6395
      /* negative case */
6396
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6397
      est=(((ueInt)carry>>3)*16777)>>21;
6398
      *c=(Unit)(carry-est*(DECDPUNMAX+1));
6399
      carry=est-(DECDPUNMAX+1);              /* correctly negative */
6400
      if (*c<DECDPUNMAX+1) continue;         /* was OK */
6401
      carry++;
6402
      *c-=DECDPUNMAX+1;
6403
    #elif DECDPUN<=2
6404
      /* Can use QUOT10 as carry <= 4 digits */
6405
      if (carry>=0) {
6406
        est=QUOT10(carry, DECDPUN);
6407
        *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6408
        carry=est;                           /* quotient */
6409
        continue;
6410
        }
6411
      /* negative case */
6412
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6413
      est=QUOT10(carry, DECDPUN);
6414
      *c=(Unit)(carry-est*(DECDPUNMAX+1));
6415
      carry=est-(DECDPUNMAX+1);              /* correctly negative */
6416
    #else
6417
      /* remainder operator is undefined if negative, so must test */
6418
      if ((ueInt)carry<(DECDPUNMAX+1)*2) {   /* fastpath carry +1 */
6419
        *c=(Unit)(carry-(DECDPUNMAX+1));     /* [helps additions] */
6420
        carry=1;
6421
        continue;
6422
        }
6423
      if (carry>=0) {
6424
        *c=(Unit)(carry%(DECDPUNMAX+1));
6425
        carry=carry/(DECDPUNMAX+1);
6426
        continue;
6427
        }
6428
      /* negative case */
6429
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6430
      *c=(Unit)(carry%(DECDPUNMAX+1));
6431
      carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
6432
    #endif
6433
    } /* c */
6434
 
6435
  /* now may have one or other to complete */
6436
  /* [pretest to avoid loop setup/shutdown] */
6437
  if (c<maxC) for (; c<maxC; c++) {
6438
    if (a<alsu+alength) {               /* still in A */
6439
      carry+=*a;
6440
      a++;
6441
      }
6442
     else {                             /* inside B */
6443
      carry+=((eInt)*b)*m;
6444
      b++;
6445
      }
6446
    /* here carry is new Unit of digits; it could be +ve or -ve and */
6447
    /* magnitude up to DECDPUNMAX squared */
6448
    if ((ueInt)carry<=DECDPUNMAX) {     /* fastpath 0-DECDPUNMAX */
6449
      *c=(Unit)carry;
6450
      carry=0;
6451
      continue;
6452
      }
6453
    /* result for this unit is negative or >DECDPUNMAX */
6454
    #if DECDPUN==4                           /* use divide-by-multiply */
6455
      if (carry>=0) {
6456
        est=(((ueInt)carry>>11)*53687)>>18;
6457
        *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6458
        carry=est;                           /* likely quotient [79.7%] */
6459
        if (*c<DECDPUNMAX+1) continue;       /* estimate was correct */
6460
        carry++;
6461
        *c-=DECDPUNMAX+1;
6462
        continue;
6463
        }
6464
      /* negative case */
6465
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6466
      est=(((ueInt)carry>>11)*53687)>>18;
6467
      *c=(Unit)(carry-est*(DECDPUNMAX+1));
6468
      carry=est-(DECDPUNMAX+1);              /* correctly negative */
6469
      if (*c<DECDPUNMAX+1) continue;         /* was OK */
6470
      carry++;
6471
      *c-=DECDPUNMAX+1;
6472
    #elif DECDPUN==3
6473
      if (carry>=0) {
6474
        est=(((ueInt)carry>>3)*16777)>>21;
6475
        *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6476
        carry=est;                           /* likely quotient [99%] */
6477
        if (*c<DECDPUNMAX+1) continue;       /* estimate was correct */
6478
        carry++;
6479
        *c-=DECDPUNMAX+1;
6480
        continue;
6481
        }
6482
      /* negative case */
6483
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6484
      est=(((ueInt)carry>>3)*16777)>>21;
6485
      *c=(Unit)(carry-est*(DECDPUNMAX+1));
6486
      carry=est-(DECDPUNMAX+1);              /* correctly negative */
6487
      if (*c<DECDPUNMAX+1) continue;         /* was OK */
6488
      carry++;
6489
      *c-=DECDPUNMAX+1;
6490
    #elif DECDPUN<=2
6491
      if (carry>=0) {
6492
        est=QUOT10(carry, DECDPUN);
6493
        *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6494
        carry=est;                           /* quotient */
6495
        continue;
6496
        }
6497
      /* negative case */
6498
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6499
      est=QUOT10(carry, DECDPUN);
6500
      *c=(Unit)(carry-est*(DECDPUNMAX+1));
6501
      carry=est-(DECDPUNMAX+1);              /* correctly negative */
6502
    #else
6503
      if ((ueInt)carry<(DECDPUNMAX+1)*2){    /* fastpath carry 1 */
6504
        *c=(Unit)(carry-(DECDPUNMAX+1));
6505
        carry=1;
6506
        continue;
6507
        }
6508
      /* remainder operator is undefined if negative, so must test */
6509
      if (carry>=0) {
6510
        *c=(Unit)(carry%(DECDPUNMAX+1));
6511
        carry=carry/(DECDPUNMAX+1);
6512
        continue;
6513
        }
6514
      /* negative case */
6515
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6516
      *c=(Unit)(carry%(DECDPUNMAX+1));
6517
      carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
6518
    #endif
6519
    } /* c */
6520
 
6521
  /* OK, all A and B processed; might still have carry or borrow */
6522
  /* return number of Units in the result, negated if a borrow */
6523
  if (carry==0) return c-clsu;      /* no carry, so no more to do */
6524
  if (carry>0) {            /* positive carry */
6525
    *c=(Unit)carry;                /* place as new unit */
6526
    c++;                           /* .. */
6527
    return c-clsu;
6528
    }
6529
  /* -ve carry: it's a borrow; complement needed */
6530
  add=1;                           /* temporary carry... */
6531
  for (c=clsu; c<maxC; c++) {
6532
    add=DECDPUNMAX+add-*c;
6533
    if (add<=DECDPUNMAX) {
6534
      *c=(Unit)add;
6535
      add=0;
6536
      }
6537
     else {
6538
      *c=0;
6539
      add=1;
6540
      }
6541
    }
6542
  /* add an extra unit iff it would be non-zero */
6543
  #if DECTRACE
6544
    printf("UAS borrow: add %ld, carry %ld\n", add, carry);
6545
  #endif
6546
  if ((add-carry-1)!=0) {
6547
    *c=(Unit)(add-carry-1);
6548
    c++;                      /* interesting, include it */
6549
    }
6550
  return clsu-c;              /* -ve result indicates borrowed */
6551
  } /* decUnitAddSub */
6552
 
6553
/* ------------------------------------------------------------------ */
6554
/* decTrim -- trim trailing zeros or normalize                        */
6555
/*                                                                    */
6556
/*   dn is the number to trim or normalize                            */
6557
/*   set is the context to use to check for clamp                     */
6558
/*   all is 1 to remove all trailing zeros, 0 for just fraction ones  */
6559
/*   dropped returns the number of discarded trailing zeros           */
6560
/*   returns dn                                                       */
6561
/*                                                                    */
6562
/* If clamp is set in the context then the number of zeros trimmed    */
6563
/* may be limited if the exponent is high.                            */
6564
/* All fields are updated as required.  This is a utility operation,  */
6565
/* so special values are unchanged and no error is possible.          */
6566
/* ------------------------------------------------------------------ */
6567
static decNumber * decTrim(decNumber *dn, decContext *set, Flag all,
6568
                           Int *dropped) {
6569
  Int   d, exp;                    /* work */
6570
  uInt  cut;                       /* .. */
6571
  Unit  *up;                       /* -> current Unit */
6572
 
6573
  #if DECCHECK
6574
  if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
6575
  #endif
6576
 
6577
  *dropped=0;                            /* assume no zeros dropped */
6578
  if ((dn->bits & DECSPECIAL)           /* fast exit if special .. */
6579
    || (*dn->lsu & 0x01)) return dn;    /* .. or odd */
6580
  if (ISZERO(dn)) {                     /* .. or 0 */
6581
    dn->exponent=0;                      /* (sign is preserved) */
6582
    return dn;
6583
    }
6584
 
6585
  /* have a finite number which is even */
6586
  exp=dn->exponent;
6587
  cut=1;                           /* digit (1-DECDPUN) in Unit */
6588
  up=dn->lsu;                      /* -> current Unit */
6589
  for (d=0; d<dn->digits-1; d++) { /* [don't strip the final digit] */
6590
    /* slice by powers */
6591
    #if DECDPUN<=4
6592
      uInt quot=QUOT10(*up, cut);
6593
      if ((*up-quot*powers[cut])!=0) break;  /* found non-0 digit */
6594
    #else
6595
      if (*up%powers[cut]!=0) break;          /* found non-0 digit */
6596
    #endif
6597
    /* have a trailing 0 */
6598
    if (!all) {                    /* trimming */
6599
      /* [if exp>0 then all trailing 0s are significant for trim] */
6600
      if (exp<=0) {                 /* if digit might be significant */
6601
        if (exp==0) break;          /* then quit */
6602
        exp++;                     /* next digit might be significant */
6603
        }
6604
      }
6605
    cut++;                         /* next power */
6606
    if (cut>DECDPUN) {             /* need new Unit */
6607
      up++;
6608
      cut=1;
6609
      }
6610
    } /* d */
6611
  if (d==0) return dn;              /* none to drop */
6612
 
6613
  /* may need to limit drop if clamping */
6614
  if (set->clamp) {
6615
    Int maxd=set->emax-set->digits+1-dn->exponent;
6616
    if (maxd<=0) return dn;         /* nothing possible */
6617
    if (d>maxd) d=maxd;
6618
    }
6619
 
6620
  /* effect the drop */
6621
  decShiftToLeast(dn->lsu, D2U(dn->digits), d);
6622
  dn->exponent+=d;                 /* maintain numerical value */
6623
  dn->digits-=d;                   /* new length */
6624
  *dropped=d;                      /* report the count */
6625
  return dn;
6626
  } /* decTrim */
6627
 
6628
/* ------------------------------------------------------------------ */
6629
/* decReverse -- reverse a Unit array in place                        */
6630
/*                                                                    */
6631
/*   ulo    is the start of the array                                 */
6632
/*   uhi    is the end of the array (highest Unit to include)         */
6633
/*                                                                    */
6634
/* The units ulo through uhi are reversed in place (if the number     */
6635
/* of units is odd, the middle one is untouched).  Note that the      */
6636
/* digit(s) in each unit are unaffected.                              */
6637
/* ------------------------------------------------------------------ */
6638
static void decReverse(Unit *ulo, Unit *uhi) {
6639
  Unit temp;
6640
  for (; ulo<uhi; ulo++, uhi--) {
6641
    temp=*ulo;
6642
    *ulo=*uhi;
6643
    *uhi=temp;
6644
    }
6645
  return;
6646
  } /* decReverse */
6647
 
6648
/* ------------------------------------------------------------------ */
6649
/* decShiftToMost -- shift digits in array towards most significant   */
6650
/*                                                                    */
6651
/*   uar    is the array                                              */
6652
/*   digits is the count of digits in use in the array                */
6653
/*   shift  is the number of zeros to pad with (least significant);   */
6654
/*     it must be zero or positive                                    */
6655
/*                                                                    */
6656
/*   returns the new length of the integer in the array, in digits    */
6657
/*                                                                    */
6658
/* No overflow is permitted (that is, the uar array must be known to  */
6659
/* be large enough to hold the result, after shifting).               */
6660
/* ------------------------------------------------------------------ */
6661
static Int decShiftToMost(Unit *uar, Int digits, Int shift) {
6662
  Unit  *target, *source, *first;  /* work */
6663
  Int   cut;                       /* odd 0's to add */
6664
  uInt  next;                      /* work */
6665
 
6666
  if (shift==0) return digits;      /* [fastpath] nothing to do */
6667
  if ((digits+shift)<=DECDPUN) {   /* [fastpath] single-unit case */
6668
    *uar=(Unit)(*uar*powers[shift]);
6669
    return digits+shift;
6670
    }
6671
 
6672
  next=0;                           /* all paths */
6673
  source=uar+D2U(digits)-1;        /* where msu comes from */
6674
  target=source+D2U(shift);        /* where upper part of first cut goes */
6675
  cut=DECDPUN-MSUDIGITS(shift);    /* where to slice */
6676
  if (cut==0) {                     /* unit-boundary case */
6677
    for (; source>=uar; source--, target--) *target=*source;
6678
    }
6679
   else {
6680
    first=uar+D2U(digits+shift)-1; /* where msu of source will end up */
6681
    for (; source>=uar; source--, target--) {
6682
      /* split the source Unit and accumulate remainder for next */
6683
      #if DECDPUN<=4
6684
        uInt quot=QUOT10(*source, cut);
6685
        uInt rem=*source-quot*powers[cut];
6686
        next+=quot;
6687
      #else
6688
        uInt rem=*source%powers[cut];
6689
        next+=*source/powers[cut];
6690
      #endif
6691
      if (target<=first) *target=(Unit)next;   /* write to target iff valid */
6692
      next=rem*powers[DECDPUN-cut];            /* save remainder for next Unit */
6693
      }
6694
    } /* shift-move */
6695
 
6696
  /* propagate any partial unit to one below and clear the rest */
6697
  for (; target>=uar; target--) {
6698
    *target=(Unit)next;
6699
    next=0;
6700
    }
6701
  return digits+shift;
6702
  } /* decShiftToMost */
6703
 
6704
/* ------------------------------------------------------------------ */
6705
/* decShiftToLeast -- shift digits in array towards least significant */
6706
/*                                                                    */
6707
/*   uar   is the array                                               */
6708
/*   units is length of the array, in units                           */
6709
/*   shift is the number of digits to remove from the lsu end; it     */
6710
/*     must be zero or positive and <= than units*DECDPUN.            */
6711
/*                                                                    */
6712
/*   returns the new length of the integer in the array, in units     */
6713
/*                                                                    */
6714
/* Removed digits are discarded (lost).  Units not required to hold   */
6715
/* the final result are unchanged.                                    */
6716
/* ------------------------------------------------------------------ */
6717
static Int decShiftToLeast(Unit *uar, Int units, Int shift) {
6718
  Unit  *target, *up;              /* work */
6719
  Int   cut, count;                /* work */
6720
  Int   quot, rem;                 /* for division */
6721
 
6722
  if (shift==0) return units;       /* [fastpath] nothing to do */
6723
  if (shift==units*DECDPUN) {      /* [fastpath] little to do */
6724
    *uar=0;                         /* all digits cleared gives zero */
6725
    return 1;                      /* leaves just the one */
6726
    }
6727
 
6728
  target=uar;                      /* both paths */
6729
  cut=MSUDIGITS(shift);
6730
  if (cut==DECDPUN) {              /* unit-boundary case; easy */
6731
    up=uar+D2U(shift);
6732
    for (; up<uar+units; target++, up++) *target=*up;
6733
    return target-uar;
6734
    }
6735
 
6736
  /* messier */
6737
  up=uar+D2U(shift-cut);           /* source; correct to whole Units */
6738
  count=units*DECDPUN-shift;       /* the maximum new length */
6739
  #if DECDPUN<=4
6740
    quot=QUOT10(*up, cut);
6741
  #else
6742
    quot=*up/powers[cut];
6743
  #endif
6744
  for (; ; target++) {
6745
    *target=(Unit)quot;
6746
    count-=(DECDPUN-cut);
6747
    if (count<=0) break;
6748
    up++;
6749
    quot=*up;
6750
    #if DECDPUN<=4
6751
      quot=QUOT10(quot, cut);
6752
      rem=*up-quot*powers[cut];
6753
    #else
6754
      rem=quot%powers[cut];
6755
      quot=quot/powers[cut];
6756
    #endif
6757
    *target=(Unit)(*target+rem*powers[DECDPUN-cut]);
6758
    count-=cut;
6759
    if (count<=0) break;
6760
    }
6761
  return target-uar+1;
6762
  } /* decShiftToLeast */
6763
 
6764
#if DECSUBSET
6765
/* ------------------------------------------------------------------ */
6766
/* decRoundOperand -- round an operand  [used for subset only]        */
6767
/*                                                                    */
6768
/*   dn is the number to round (dn->digits is > set->digits)          */
6769
/*   set is the relevant context                                      */
6770
/*   status is the status accumulator                                 */
6771
/*                                                                    */
6772
/*   returns an allocated decNumber with the rounded result.          */
6773
/*                                                                    */
6774
/* lostDigits and other status may be set by this.                    */
6775
/*                                                                    */
6776
/* Since the input is an operand, it must not be modified.            */
6777
/* Instead, return an allocated decNumber, rounded as required.       */
6778
/* It is the caller's responsibility to free the allocated storage.   */
6779
/*                                                                    */
6780
/* If no storage is available then the result cannot be used, so NULL */
6781
/* is returned.                                                       */
6782
/* ------------------------------------------------------------------ */
6783
static decNumber *decRoundOperand(const decNumber *dn, decContext *set,
6784
                                  uInt *status) {
6785
  decNumber *res;                       /* result structure */
6786
  uInt newstatus=0;                      /* status from round */
6787
  Int  residue=0;                        /* rounding accumulator */
6788
 
6789
  /* Allocate storage for the returned decNumber, big enough for the */
6790
  /* length specified by the context */
6791
  res=(decNumber *)malloc(sizeof(decNumber)
6792
                          +(D2U(set->digits)-1)*sizeof(Unit));
6793
  if (res==NULL) {
6794
    *status|=DEC_Insufficient_storage;
6795
    return NULL;
6796
    }
6797
  decCopyFit(res, dn, set, &residue, &newstatus);
6798
  decApplyRound(res, set, residue, &newstatus);
6799
 
6800
  /* If that set Inexact then "lost digits" is raised... */
6801
  if (newstatus & DEC_Inexact) newstatus|=DEC_Lost_digits;
6802
  *status|=newstatus;
6803
  return res;
6804
  } /* decRoundOperand */
6805
#endif
6806
 
6807
/* ------------------------------------------------------------------ */
6808
/* decCopyFit -- copy a number, truncating the coefficient if needed  */
6809
/*                                                                    */
6810
/*   dest is the target decNumber                                     */
6811
/*   src  is the source decNumber                                     */
6812
/*   set is the context [used for length (digits) and rounding mode]  */
6813
/*   residue is the residue accumulator                               */
6814
/*   status contains the current status to be updated                 */
6815
/*                                                                    */
6816
/* (dest==src is allowed and will be a no-op if fits)                 */
6817
/* All fields are updated as required.                                */
6818
/* ------------------------------------------------------------------ */
6819
static void decCopyFit(decNumber *dest, const decNumber *src,
6820
                       decContext *set, Int *residue, uInt *status) {
6821
  dest->bits=src->bits;
6822
  dest->exponent=src->exponent;
6823
  decSetCoeff(dest, set, src->lsu, src->digits, residue, status);
6824
  } /* decCopyFit */
6825
 
6826
/* ------------------------------------------------------------------ */
6827
/* decSetCoeff -- set the coefficient of a number                     */
6828
/*                                                                    */
6829
/*   dn    is the number whose coefficient array is to be set.        */
6830
/*         It must have space for set->digits digits                  */
6831
/*   set   is the context [for size]                                  */
6832
/*   lsu   -> lsu of the source coefficient [may be dn->lsu]          */
6833
/*   len   is digits in the source coefficient [may be dn->digits]    */
6834
/*   residue is the residue accumulator.  This has values as in       */
6835
/*         decApplyRound, and will be unchanged unless the            */
6836
/*         target size is less than len.  In this case, the           */
6837
/*         coefficient is truncated and the residue is updated to     */
6838
/*         reflect the previous residue and the dropped digits.       */
6839
/*   status is the status accumulator, as usual                       */
6840
/*                                                                    */
6841
/* The coefficient may already be in the number, or it can be an      */
6842
/* external intermediate array.  If it is in the number, lsu must ==  */
6843
/* dn->lsu and len must == dn->digits.                                */
6844
/*                                                                    */
6845
/* Note that the coefficient length (len) may be < set->digits, and   */
6846
/* in this case this merely copies the coefficient (or is a no-op     */
6847
/* if dn->lsu==lsu).                                                  */
6848
/*                                                                    */
6849
/* Note also that (only internally, from decQuantizeOp and            */
6850
/* decSetSubnormal) the value of set->digits may be less than one,    */
6851
/* indicating a round to left.  This routine handles that case        */
6852
/* correctly; caller ensures space.                                   */
6853
/*                                                                    */
6854
/* dn->digits, dn->lsu (and as required), and dn->exponent are        */
6855
/* updated as necessary.   dn->bits (sign) is unchanged.              */
6856
/*                                                                    */
6857
/* DEC_Rounded status is set if any digits are discarded.             */
6858
/* DEC_Inexact status is set if any non-zero digits are discarded, or */
6859
/*                       incoming residue was non-0 (implies rounded) */
6860
/* ------------------------------------------------------------------ */
6861
/* mapping array: maps 0-9 to canonical residues, so that a residue */
6862
/* can be adjusted in the range [-1, +1] and achieve correct rounding */
6863
/*                             0  1  2  3  4  5  6  7  8  9 */
6864
static const uByte resmap[10]={0, 3, 3, 3, 3, 5, 7, 7, 7, 7};
6865
static void decSetCoeff(decNumber *dn, decContext *set, const Unit *lsu,
6866
                        Int len, Int *residue, uInt *status) {
6867
  Int   discard;              /* number of digits to discard */
6868
  uInt  cut;                  /* cut point in Unit */
6869
  const Unit *up;             /* work */
6870
  Unit  *target;              /* .. */
6871
  Int   count;                /* .. */
6872
  #if DECDPUN<=4
6873
  uInt  temp;                 /* .. */
6874
  #endif
6875
 
6876
  discard=len-set->digits;    /* digits to discard */
6877
  if (discard<=0) {            /* no digits are being discarded */
6878
    if (dn->lsu!=lsu) {       /* copy needed */
6879
      /* copy the coefficient array to the result number; no shift needed */
6880
      count=len;              /* avoids D2U */
6881
      up=lsu;
6882
      for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
6883
        *target=*up;
6884
      dn->digits=len;         /* set the new length */
6885
      }
6886
    /* dn->exponent and residue are unchanged, record any inexactitude */
6887
    if (*residue!=0) *status|=(DEC_Inexact | DEC_Rounded);
6888
    return;
6889
    }
6890
 
6891
  /* some digits must be discarded ... */
6892
  dn->exponent+=discard;      /* maintain numerical value */
6893
  *status|=DEC_Rounded;       /* accumulate Rounded status */
6894
  if (*residue>1) *residue=1; /* previous residue now to right, so reduce */
6895
 
6896
  if (discard>len) {          /* everything, +1, is being discarded */
6897
    /* guard digit is 0 */
6898
    /* residue is all the number [NB could be all 0s] */
6899
    if (*residue<=0) {         /* not already positive */
6900
      count=len;              /* avoids D2U */
6901
      for (up=lsu; count>0; up++, count-=DECDPUN) if (*up!=0) { /* found non-0 */
6902
        *residue=1;
6903
        break;                /* no need to check any others */
6904
        }
6905
      }
6906
    if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude */
6907
    *dn->lsu=0;                /* coefficient will now be 0 */
6908
    dn->digits=1;             /* .. */
6909
    return;
6910
    } /* total discard */
6911
 
6912
  /* partial discard [most common case] */
6913
  /* here, at least the first (most significant) discarded digit exists */
6914
 
6915
  /* spin up the number, noting residue during the spin, until get to */
6916
  /* the Unit with the first discarded digit.  When reach it, extract */
6917
  /* it and remember its position */
6918
  count=0;
6919
  for (up=lsu;; up++) {
6920
    count+=DECDPUN;
6921
    if (count>=discard) break; /* full ones all checked */
6922
    if (*up!=0) *residue=1;
6923
    } /* up */
6924
 
6925
  /* here up -> Unit with first discarded digit */
6926
  cut=discard-(count-DECDPUN)-1;
6927
  if (cut==DECDPUN-1) {       /* unit-boundary case (fast) */
6928
    Unit half=(Unit)powers[DECDPUN]>>1;
6929
    /* set residue directly */
6930
    if (*up>=half) {
6931
      if (*up>half) *residue=7;
6932
      else *residue+=5;       /* add sticky bit */
6933
      }
6934
     else { /* <half */
6935
      if (*up!=0) *residue=3; /* [else is 0, leave as sticky bit] */
6936
      }
6937
    if (set->digits<=0) {     /* special for Quantize/Subnormal :-( */
6938
      *dn->lsu=0;              /* .. result is 0 */
6939
      dn->digits=1;           /* .. */
6940
      }
6941
     else {                   /* shift to least */
6942
      count=set->digits;      /* now digits to end up with */
6943
      dn->digits=count;       /* set the new length */
6944
      up++;                   /* move to next */
6945
      /* on unit boundary, so shift-down copy loop is simple */
6946
      for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
6947
        *target=*up;
6948
      }
6949
    } /* unit-boundary case */
6950
 
6951
   else { /* discard digit is in low digit(s), and not top digit */
6952
    uInt  discard1;                /* first discarded digit */
6953
    uInt  quot, rem;               /* for divisions */
6954
    if (cut==0) quot=*up;           /* is at bottom of unit */
6955
     else /* cut>0 */ {            /* it's not at bottom of unit */
6956
      #if DECDPUN<=4
6957
        quot=QUOT10(*up, cut);
6958
        rem=*up-quot*powers[cut];
6959
      #else
6960
        rem=*up%powers[cut];
6961
        quot=*up/powers[cut];
6962
      #endif
6963
      if (rem!=0) *residue=1;
6964
      }
6965
    /* discard digit is now at bottom of quot */
6966
    #if DECDPUN<=4
6967
      temp=(quot*6554)>>16;        /* fast /10 */
6968
      /* Vowels algorithm here not a win (9 instructions) */
6969
      discard1=quot-X10(temp);
6970
      quot=temp;
6971
    #else
6972
      discard1=quot%10;
6973
      quot=quot/10;
6974
    #endif
6975
    /* here, discard1 is the guard digit, and residue is everything */
6976
    /* else [use mapping array to accumulate residue safely] */
6977
    *residue+=resmap[discard1];
6978
    cut++;                         /* update cut */
6979
    /* here: up -> Unit of the array with bottom digit */
6980
    /*       cut is the division point for each Unit */
6981
    /*       quot holds the uncut high-order digits for the current unit */
6982
    if (set->digits<=0) {           /* special for Quantize/Subnormal :-( */
6983
      *dn->lsu=0;                   /* .. result is 0 */
6984
      dn->digits=1;                /* .. */
6985
      }
6986
     else {                        /* shift to least needed */
6987
      count=set->digits;           /* now digits to end up with */
6988
      dn->digits=count;            /* set the new length */
6989
      /* shift-copy the coefficient array to the result number */
6990
      for (target=dn->lsu; ; target++) {
6991
        *target=(Unit)quot;
6992
        count-=(DECDPUN-cut);
6993
        if (count<=0) break;
6994
        up++;
6995
        quot=*up;
6996
        #if DECDPUN<=4
6997
          quot=QUOT10(quot, cut);
6998
          rem=*up-quot*powers[cut];
6999
        #else
7000
          rem=quot%powers[cut];
7001
          quot=quot/powers[cut];
7002
        #endif
7003
        *target=(Unit)(*target+rem*powers[DECDPUN-cut]);
7004
        count-=cut;
7005
        if (count<=0) break;
7006
        } /* shift-copy loop */
7007
      } /* shift to least */
7008
    } /* not unit boundary */
7009
 
7010
  if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude */
7011
  return;
7012
  } /* decSetCoeff */
7013
 
7014
/* ------------------------------------------------------------------ */
7015
/* decApplyRound -- apply pending rounding to a number                */
7016
/*                                                                    */
7017
/*   dn    is the number, with space for set->digits digits           */
7018
/*   set   is the context [for size and rounding mode]                */
7019
/*   residue indicates pending rounding, being any accumulated        */
7020
/*         guard and sticky information.  It may be:                  */
7021
/*         6-9: rounding digit is >5                                  */
7022
/*         5:   rounding digit is exactly half-way                    */
7023
/*         1-4: rounding digit is <5 and >0                            */
7024
/*         0:   the coefficient is exact                              */
7025
/*        -1:   as 1, but the hidden digits are subtractive, that     */
7026
/*              is, of the opposite sign to dn.  In this case the     */
7027
/*              coefficient must be non-0.  This case occurs when     */
7028
/*              subtracting a small number (which can be reduced to   */
7029
/*              a sticky bit); see decAddOp.                          */
7030
/*   status is the status accumulator, as usual                       */
7031
/*                                                                    */
7032
/* This routine applies rounding while keeping the length of the      */
7033
/* coefficient constant.  The exponent and status are unchanged       */
7034
/* except if:                                                         */
7035
/*                                                                    */
7036
/*   -- the coefficient was increased and is all nines (in which      */
7037
/*      case Overflow could occur, and is handled directly here so    */
7038
/*      the caller does not need to re-test for overflow)             */
7039
/*                                                                    */
7040
/*   -- the coefficient was decreased and becomes all nines (in which */
7041
/*      case Underflow could occur, and is also handled directly).    */
7042
/*                                                                    */
7043
/* All fields in dn are updated as required.                          */
7044
/*                                                                    */
7045
/* ------------------------------------------------------------------ */
7046
static void decApplyRound(decNumber *dn, decContext *set, Int residue,
7047
                          uInt *status) {
7048
  Int  bump;                  /* 1 if coefficient needs to be incremented */
7049
                              /* -1 if coefficient needs to be decremented */
7050
 
7051
  if (residue==0) return;     /* nothing to apply */
7052
 
7053
  bump=0;                      /* assume a smooth ride */
7054
 
7055
  /* now decide whether, and how, to round, depending on mode */
7056
  switch (set->round) {
7057
    case DEC_ROUND_05UP: {    /* round zero or five up (for reround) */
7058
      /* This is the same as DEC_ROUND_DOWN unless there is a */
7059
      /* positive residue and the lsd of dn is 0 or 5, in which case */
7060
      /* it is bumped; when residue is <0, the number is therefore */
7061
      /* bumped down unless the final digit was 1 or 6 (in which */
7062
      /* case it is bumped down and then up -- a no-op) */
7063
      Int lsd5=*dn->lsu%5;     /* get lsd and quintate */
7064
      if (residue<0 && lsd5!=1) bump=-1;
7065
       else if (residue>0 && lsd5==0) bump=1;
7066
      /* [bump==1 could be applied directly; use common path for clarity] */
7067
      break;} /* r-05 */
7068
 
7069
    case DEC_ROUND_DOWN: {
7070
      /* no change, except if negative residue */
7071
      if (residue<0) bump=-1;
7072
      break;} /* r-d */
7073
 
7074
    case DEC_ROUND_HALF_DOWN: {
7075
      if (residue>5) bump=1;
7076
      break;} /* r-h-d */
7077
 
7078
    case DEC_ROUND_HALF_EVEN: {
7079
      if (residue>5) bump=1;            /* >0.5 goes up */
7080
       else if (residue==5) {           /* exactly 0.5000... */
7081
        /* 0.5 goes up iff [new] lsd is odd */
7082
        if (*dn->lsu & 0x01) bump=1;
7083
        }
7084
      break;} /* r-h-e */
7085
 
7086
    case DEC_ROUND_HALF_UP: {
7087
      if (residue>=5) bump=1;
7088
      break;} /* r-h-u */
7089
 
7090
    case DEC_ROUND_UP: {
7091
      if (residue>0) bump=1;
7092
      break;} /* r-u */
7093
 
7094
    case DEC_ROUND_CEILING: {
7095
      /* same as _UP for positive numbers, and as _DOWN for negatives */
7096
      /* [negative residue cannot occur on 0] */
7097
      if (decNumberIsNegative(dn)) {
7098
        if (residue<0) bump=-1;
7099
        }
7100
       else {
7101
        if (residue>0) bump=1;
7102
        }
7103
      break;} /* r-c */
7104
 
7105
    case DEC_ROUND_FLOOR: {
7106
      /* same as _UP for negative numbers, and as _DOWN for positive */
7107
      /* [negative residue cannot occur on 0] */
7108
      if (!decNumberIsNegative(dn)) {
7109
        if (residue<0) bump=-1;
7110
        }
7111
       else {
7112
        if (residue>0) bump=1;
7113
        }
7114
      break;} /* r-f */
7115
 
7116
    default: {      /* e.g., DEC_ROUND_MAX */
7117
      *status|=DEC_Invalid_context;
7118
      #if DECTRACE || (DECCHECK && DECVERB)
7119
      printf("Unknown rounding mode: %d\n", set->round);
7120
      #endif
7121
      break;}
7122
    } /* switch */
7123
 
7124
  /* now bump the number, up or down, if need be */
7125
  if (bump==0) return;                        /* no action required */
7126
 
7127
  /* Simply use decUnitAddSub unless bumping up and the number is */
7128
  /* all nines.  In this special case set to 100... explicitly */
7129
  /* and adjust the exponent by one (as otherwise could overflow */
7130
  /* the array) */
7131
  /* Similarly handle all-nines result if bumping down. */
7132
  if (bump>0) {
7133
    Unit *up;                                /* work */
7134
    uInt count=dn->digits;                   /* digits to be checked */
7135
    for (up=dn->lsu; ; up++) {
7136
      if (count<=DECDPUN) {
7137
        /* this is the last Unit (the msu) */
7138
        if (*up!=powers[count]-1) break;     /* not still 9s */
7139
        /* here if it, too, is all nines */
7140
        *up=(Unit)powers[count-1];           /* here 999 -> 100 etc. */
7141
        for (up=up-1; up>=dn->lsu; up--) *up=0; /* others all to 0 */
7142
        dn->exponent++;                      /* and bump exponent */
7143
        /* [which, very rarely, could cause Overflow...] */
7144
        if ((dn->exponent+dn->digits)>set->emax+1) {
7145
          decSetOverflow(dn, set, status);
7146
          }
7147
        return;                              /* done */
7148
        }
7149
      /* a full unit to check, with more to come */
7150
      if (*up!=DECDPUNMAX) break;            /* not still 9s */
7151
      count-=DECDPUN;
7152
      } /* up */
7153
    } /* bump>0 */
7154
   else {                                    /* -1 */
7155
    /* here checking for a pre-bump of 1000... (leading 1, all */
7156
    /* other digits zero) */
7157
    Unit *up, *sup;                          /* work */
7158
    uInt count=dn->digits;                   /* digits to be checked */
7159
    for (up=dn->lsu; ; up++) {
7160
      if (count<=DECDPUN) {
7161
        /* this is the last Unit (the msu) */
7162
        if (*up!=powers[count-1]) break;     /* not 100.. */
7163
        /* here if have the 1000... case */
7164
        sup=up;                              /* save msu pointer */
7165
        *up=(Unit)powers[count]-1;           /* here 100 in msu -> 999 */
7166
        /* others all to all-nines, too */
7167
        for (up=up-1; up>=dn->lsu; up--) *up=(Unit)powers[DECDPUN]-1;
7168
        dn->exponent--;                      /* and bump exponent */
7169
 
7170
        /* iff the number was at the subnormal boundary (exponent=etiny) */
7171
        /* then the exponent is now out of range, so it will in fact get */
7172
        /* clamped to etiny and the final 9 dropped. */
7173
        /* printf(">> emin=%d exp=%d sdig=%d\n", set->emin, */
7174
        /*        dn->exponent, set->digits); */
7175
        if (dn->exponent+1==set->emin-set->digits+1) {
7176
          if (count==1 && dn->digits==1) *sup=0;  /* here 9 -> 0[.9] */
7177
           else {
7178
            *sup=(Unit)powers[count-1]-1;    /* here 999.. in msu -> 99.. */
7179
            dn->digits--;
7180
            }
7181
          dn->exponent++;
7182
          *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
7183
          }
7184
        return;                              /* done */
7185
        }
7186
 
7187
      /* a full unit to check, with more to come */
7188
      if (*up!=0) break;              /* not still 0s */
7189
      count-=DECDPUN;
7190
      } /* up */
7191
 
7192
    } /* bump<0 */
7193
 
7194
  /* Actual bump needed.  Do it. */
7195
  decUnitAddSub(dn->lsu, D2U(dn->digits), uarrone, 1, 0, dn->lsu, bump);
7196
  } /* decApplyRound */
7197
 
7198
#if DECSUBSET
7199
/* ------------------------------------------------------------------ */
7200
/* decFinish -- finish processing a number                            */
7201
/*                                                                    */
7202
/*   dn is the number                                                 */
7203
/*   set is the context                                               */
7204
/*   residue is the rounding accumulator (as in decApplyRound)        */
7205
/*   status is the accumulator                                        */
7206
/*                                                                    */
7207
/* This finishes off the current number by:                           */
7208
/*    1. If not extended:                                             */
7209
/*       a. Converting a zero result to clean '0'                     */
7210
/*       b. Reducing positive exponents to 0, if would fit in digits  */
7211
/*    2. Checking for overflow and subnormals (always)                */
7212
/* Note this is just Finalize when no subset arithmetic.              */
7213
/* All fields are updated as required.                                */
7214
/* ------------------------------------------------------------------ */
7215
static void decFinish(decNumber *dn, decContext *set, Int *residue,
7216
                      uInt *status) {
7217
  if (!set->extended) {
7218
    if ISZERO(dn) {                /* value is zero */
7219
      dn->exponent=0;               /* clean exponent .. */
7220
      dn->bits=0;                   /* .. and sign */
7221
      return;                      /* no error possible */
7222
      }
7223
    if (dn->exponent>=0) {          /* non-negative exponent */
7224
      /* >0; reduce to integer if possible */
7225
      if (set->digits >= (dn->exponent+dn->digits)) {
7226
        dn->digits=decShiftToMost(dn->lsu, dn->digits, dn->exponent);
7227
        dn->exponent=0;
7228
        }
7229
      }
7230
    } /* !extended */
7231
 
7232
  decFinalize(dn, set, residue, status);
7233
  } /* decFinish */
7234
#endif
7235
 
7236
/* ------------------------------------------------------------------ */
7237
/* decFinalize -- final check, clamp, and round of a number           */
7238
/*                                                                    */
7239
/*   dn is the number                                                 */
7240
/*   set is the context                                               */
7241
/*   residue is the rounding accumulator (as in decApplyRound)        */
7242
/*   status is the status accumulator                                 */
7243
/*                                                                    */
7244
/* This finishes off the current number by checking for subnormal     */
7245
/* results, applying any pending rounding, checking for overflow,     */
7246
/* and applying any clamping.                                         */
7247
/* Underflow and overflow conditions are raised as appropriate.       */
7248
/* All fields are updated as required.                                */
7249
/* ------------------------------------------------------------------ */
7250
static void decFinalize(decNumber *dn, decContext *set, Int *residue,
7251
                        uInt *status) {
7252
  Int shift;                            /* shift needed if clamping */
7253
  Int tinyexp=set->emin-dn->digits+1;   /* precalculate subnormal boundary */
7254
 
7255
  /* Must be careful, here, when checking the exponent as the */
7256
  /* adjusted exponent could overflow 31 bits [because it may already */
7257
  /* be up to twice the expected]. */
7258
 
7259
  /* First test for subnormal.  This must be done before any final */
7260
  /* round as the result could be rounded to Nmin or 0. */
7261
  if (dn->exponent<=tinyexp) {          /* prefilter */
7262
    Int comp;
7263
    decNumber nmin;
7264
    /* A very nasty case here is dn == Nmin and residue<0 */
7265
    if (dn->exponent<tinyexp) {
7266
      /* Go handle subnormals; this will apply round if needed. */
7267
      decSetSubnormal(dn, set, residue, status);
7268
      return;
7269
      }
7270
    /* Equals case: only subnormal if dn=Nmin and negative residue */
7271
    decNumberZero(&nmin);
7272
    nmin.lsu[0]=1;
7273
    nmin.exponent=set->emin;
7274
    comp=decCompare(dn, &nmin, 1);                /* (signless compare) */
7275
    if (comp==BADINT) {                           /* oops */
7276
      *status|=DEC_Insufficient_storage;          /* abandon... */
7277
      return;
7278
      }
7279
    if (*residue<0 && comp==0) {            /* neg residue and dn==Nmin */
7280
      decApplyRound(dn, set, *residue, status);   /* might force down */
7281
      decSetSubnormal(dn, set, residue, status);
7282
      return;
7283
      }
7284
    }
7285
 
7286
  /* now apply any pending round (this could raise overflow). */
7287
  if (*residue!=0) decApplyRound(dn, set, *residue, status);
7288
 
7289
  /* Check for overflow [redundant in the 'rare' case] or clamp */
7290
  if (dn->exponent<=set->emax-set->digits+1) return;   /* neither needed */
7291
 
7292
 
7293
  /* here when might have an overflow or clamp to do */
7294
  if (dn->exponent>set->emax-dn->digits+1) {           /* too big */
7295
    decSetOverflow(dn, set, status);
7296
    return;
7297
    }
7298
  /* here when the result is normal but in clamp range */
7299
  if (!set->clamp) return;
7300
 
7301
  /* here when need to apply the IEEE exponent clamp (fold-down) */
7302
  shift=dn->exponent-(set->emax-set->digits+1);
7303
 
7304
  /* shift coefficient (if non-zero) */
7305
  if (!ISZERO(dn)) {
7306
    dn->digits=decShiftToMost(dn->lsu, dn->digits, shift);
7307
    }
7308
  dn->exponent-=shift;   /* adjust the exponent to match */
7309
  *status|=DEC_Clamped;  /* and record the dirty deed */
7310
  return;
7311
  } /* decFinalize */
7312
 
7313
/* ------------------------------------------------------------------ */
7314
/* decSetOverflow -- set number to proper overflow value              */
7315
/*                                                                    */
7316
/*   dn is the number (used for sign [only] and result)               */
7317
/*   set is the context [used for the rounding mode, etc.]            */
7318
/*   status contains the current status to be updated                 */
7319
/*                                                                    */
7320
/* This sets the sign of a number and sets its value to either        */
7321
/* Infinity or the maximum finite value, depending on the sign of     */
7322
/* dn and the rounding mode, following IEEE 854 rules.                */
7323
/* ------------------------------------------------------------------ */
7324
static void decSetOverflow(decNumber *dn, decContext *set, uInt *status) {
7325
  Flag needmax=0;                   /* result is maximum finite value */
7326
  uByte sign=dn->bits&DECNEG;      /* clean and save sign bit */
7327
 
7328
  if (ISZERO(dn)) {                /* zero does not overflow magnitude */
7329
    Int emax=set->emax;                      /* limit value */
7330
    if (set->clamp) emax-=set->digits-1;     /* lower if clamping */
7331
    if (dn->exponent>emax) {                 /* clamp required */
7332
      dn->exponent=emax;
7333
      *status|=DEC_Clamped;
7334
      }
7335
    return;
7336
    }
7337
 
7338
  decNumberZero(dn);
7339
  switch (set->round) {
7340
    case DEC_ROUND_DOWN: {
7341
      needmax=1;                   /* never Infinity */
7342
      break;} /* r-d */
7343
    case DEC_ROUND_05UP: {
7344
      needmax=1;                   /* never Infinity */
7345
      break;} /* r-05 */
7346
    case DEC_ROUND_CEILING: {
7347
      if (sign) needmax=1;         /* Infinity if non-negative */
7348
      break;} /* r-c */
7349
    case DEC_ROUND_FLOOR: {
7350
      if (!sign) needmax=1;        /* Infinity if negative */
7351
      break;} /* r-f */
7352
    default: break;                /* Infinity in all other cases */
7353
    }
7354
  if (needmax) {
7355
    decSetMaxValue(dn, set);
7356
    dn->bits=sign;                 /* set sign */
7357
    }
7358
   else dn->bits=sign|DECINF;      /* Value is +/-Infinity */
7359
  *status|=DEC_Overflow | DEC_Inexact | DEC_Rounded;
7360
  } /* decSetOverflow */
7361
 
7362
/* ------------------------------------------------------------------ */
7363
/* decSetMaxValue -- set number to +Nmax (maximum normal value)       */
7364
/*                                                                    */
7365
/*   dn is the number to set                                          */
7366
/*   set is the context [used for digits and emax]                    */
7367
/*                                                                    */
7368
/* This sets the number to the maximum positive value.                */
7369
/* ------------------------------------------------------------------ */
7370
static void decSetMaxValue(decNumber *dn, decContext *set) {
7371
  Unit *up;                        /* work */
7372
  Int count=set->digits;           /* nines to add */
7373
  dn->digits=count;
7374
  /* fill in all nines to set maximum value */
7375
  for (up=dn->lsu; ; up++) {
7376
    if (count>DECDPUN) *up=DECDPUNMAX;  /* unit full o'nines */
7377
     else {                             /* this is the msu */
7378
      *up=(Unit)(powers[count]-1);
7379
      break;
7380
      }
7381
    count-=DECDPUN;                /* filled those digits */
7382
    } /* up */
7383
  dn->bits=0;                       /* + sign */
7384
  dn->exponent=set->emax-set->digits+1;
7385
  } /* decSetMaxValue */
7386
 
7387
/* ------------------------------------------------------------------ */
7388
/* decSetSubnormal -- process value whose exponent is <Emin           */
7389
/*                                                                    */
7390
/*   dn is the number (used as input as well as output; it may have   */
7391
/*         an allowed subnormal value, which may need to be rounded)  */
7392
/*   set is the context [used for the rounding mode]                  */
7393
/*   residue is any pending residue                                   */
7394
/*   status contains the current status to be updated                 */
7395
/*                                                                    */
7396
/* If subset mode, set result to zero and set Underflow flags.        */
7397
/*                                                                    */
7398
/* Value may be zero with a low exponent; this does not set Subnormal */
7399
/* but the exponent will be clamped to Etiny.                         */
7400
/*                                                                    */
7401
/* Otherwise ensure exponent is not out of range, and round as        */
7402
/* necessary.  Underflow is set if the result is Inexact.             */
7403
/* ------------------------------------------------------------------ */
7404
static void decSetSubnormal(decNumber *dn, decContext *set, Int *residue,
7405
                            uInt *status) {
7406
  Int        dnexp;           /* saves original exponent */
7407
  decContext workset;         /* work */
7408
  Int        etiny, adjust;   /* .. */
7409
 
7410
  #if DECSUBSET
7411
  /* simple set to zero and 'hard underflow' for subset */
7412
  if (!set->extended) {
7413
    decNumberZero(dn);
7414
    /* always full overflow */
7415
    *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
7416
    return;
7417
    }
7418
  #endif
7419
 
7420
  /* Full arithmetic -- allow subnormals, rounded to minimum exponent */
7421
  /* (Etiny) if needed */
7422
  etiny=set->emin-(set->digits-1);      /* smallest allowed exponent */
7423
 
7424
  if ISZERO(dn) {                       /* value is zero */
7425
    /* residue can never be non-zero here */
7426
    #if DECCHECK
7427
      if (*residue!=0) {
7428
        printf("++ Subnormal 0 residue %ld\n", (LI)*residue);
7429
        *status|=DEC_Invalid_operation;
7430
        }
7431
    #endif
7432
    if (dn->exponent<etiny) {           /* clamp required */
7433
      dn->exponent=etiny;
7434
      *status|=DEC_Clamped;
7435
      }
7436
    return;
7437
    }
7438
 
7439
  *status|=DEC_Subnormal;               /* have a non-zero subnormal */
7440
  adjust=etiny-dn->exponent;            /* calculate digits to remove */
7441
  if (adjust<=0) {                       /* not out of range; unrounded */
7442
    /* residue can never be non-zero here, except in the Nmin-residue */
7443
    /* case (which is a subnormal result), so can take fast-path here */
7444
    /* it may already be inexact (from setting the coefficient) */
7445
    if (*status&DEC_Inexact) *status|=DEC_Underflow;
7446
    return;
7447
    }
7448
 
7449
  /* adjust>0, so need to rescale the result so exponent becomes Etiny */
7450
  /* [this code is similar to that in rescale] */
7451
  dnexp=dn->exponent;                   /* save exponent */
7452
  workset=*set;                         /* clone rounding, etc. */
7453
  workset.digits=dn->digits-adjust;     /* set requested length */
7454
  workset.emin-=adjust;                 /* and adjust emin to match */
7455
  /* [note that the latter can be <1, here, similar to Rescale case] */
7456
  decSetCoeff(dn, &workset, dn->lsu, dn->digits, residue, status);
7457
  decApplyRound(dn, &workset, *residue, status);
7458
 
7459
  /* Use 754R/854 default rule: Underflow is set iff Inexact */
7460
  /* [independent of whether trapped] */
7461
  if (*status&DEC_Inexact) *status|=DEC_Underflow;
7462
 
7463
  /* if rounded up a 999s case, exponent will be off by one; adjust */
7464
  /* back if so [it will fit, because it was shortened earlier] */
7465
  if (dn->exponent>etiny) {
7466
    dn->digits=decShiftToMost(dn->lsu, dn->digits, 1);
7467
    dn->exponent--;                     /* (re)adjust the exponent. */
7468
    }
7469
 
7470
  /* if rounded to zero, it is by definition clamped... */
7471
  if (ISZERO(dn)) *status|=DEC_Clamped;
7472
  } /* decSetSubnormal */
7473
 
7474
/* ------------------------------------------------------------------ */
7475
/* decCheckMath - check entry conditions for a math function          */
7476
/*                                                                    */
7477
/*   This checks the context and the operand                          */
7478
/*                                                                    */
7479
/*   rhs is the operand to check                                      */
7480
/*   set is the context to check                                      */
7481
/*   status is unchanged if both are good                             */
7482
/*                                                                    */
7483
/* returns non-zero if status is changed, 0 otherwise                 */
7484
/*                                                                    */
7485
/* Restrictions enforced:                                             */
7486
/*                                                                    */
7487
/*   digits, emax, and -emin in the context must be less than         */
7488
/*   DEC_MAX_MATH (999999), and A must be within these bounds if      */
7489
/*   non-zero.  Invalid_operation is set in the status if a           */
7490
/*   restriction is violated.                                         */
7491
/* ------------------------------------------------------------------ */
7492
static uInt decCheckMath(const decNumber *rhs, decContext *set,
7493
                         uInt *status) {
7494
  uInt save=*status;                         /* record */
7495
  if (set->digits>DEC_MAX_MATH
7496
   || set->emax>DEC_MAX_MATH
7497
   || -set->emin>DEC_MAX_MATH) *status|=DEC_Invalid_context;
7498
   else if ((rhs->digits>DEC_MAX_MATH
7499
     || rhs->exponent+rhs->digits>DEC_MAX_MATH+1
7500
     || rhs->exponent+rhs->digits<2*(1-DEC_MAX_MATH))
7501
     && !ISZERO(rhs)) *status|=DEC_Invalid_operation;
7502
  return (*status!=save);
7503
  } /* decCheckMath */
7504
 
7505
/* ------------------------------------------------------------------ */
7506
/* decGetInt -- get integer from a number                             */
7507
/*                                                                    */
7508
/*   dn is the number [which will not be altered]                     */
7509
/*                                                                    */
7510
/*   returns one of:                                                  */
7511
/*     BADINT if there is a non-zero fraction                         */
7512
/*     the converted integer                                          */
7513
/*     BIGEVEN if the integer is even and magnitude > 2*10**9         */
7514
/*     BIGODD  if the integer is odd  and magnitude > 2*10**9         */
7515
/*                                                                    */
7516
/* This checks and gets a whole number from the input decNumber.      */
7517
/* The sign can be determined from dn by the caller when BIGEVEN or   */
7518
/* BIGODD is returned.                                                */
7519
/* ------------------------------------------------------------------ */
7520
static Int decGetInt(const decNumber *dn) {
7521
  Int  theInt;                          /* result accumulator */
7522
  const Unit *up;                       /* work */
7523
  Int  got;                             /* digits (real or not) processed */
7524
  Int  ilength=dn->digits+dn->exponent; /* integral length */
7525
  Flag neg=decNumberIsNegative(dn);     /* 1 if -ve */
7526
 
7527
  /* The number must be an integer that fits in 10 digits */
7528
  /* Assert, here, that 10 is enough for any rescale Etiny */
7529
  #if DEC_MAX_EMAX > 999999999
7530
    #error GetInt may need updating [for Emax]
7531
  #endif
7532
  #if DEC_MIN_EMIN < -999999999
7533
    #error GetInt may need updating [for Emin]
7534
  #endif
7535
  if (ISZERO(dn)) return 0;              /* zeros are OK, with any exponent */
7536
 
7537
  up=dn->lsu;                           /* ready for lsu */
7538
  theInt=0;                              /* ready to accumulate */
7539
  if (dn->exponent>=0) {         /* relatively easy */
7540
    /* no fractional part [usual]; allow for positive exponent */
7541
    got=dn->exponent;
7542
    }
7543
   else { /* -ve exponent; some fractional part to check and discard */
7544
    Int count=-dn->exponent;            /* digits to discard */
7545
    /* spin up whole units until reach the Unit with the unit digit */
7546
    for (; count>=DECDPUN; up++) {
7547
      if (*up!=0) return BADINT; /* non-zero Unit to discard */
7548
      count-=DECDPUN;
7549
      }
7550
    if (count==0) got=0;          /* [a multiple of DECDPUN] */
7551
     else {                             /* [not multiple of DECDPUN] */
7552
      Int rem;                          /* work */
7553
      /* slice off fraction digits and check for non-zero */
7554
      #if DECDPUN<=4
7555
        theInt=QUOT10(*up, count);
7556
        rem=*up-theInt*powers[count];
7557
      #else
7558
        rem=*up%powers[count];          /* slice off discards */
7559
        theInt=*up/powers[count];
7560
      #endif
7561
      if (rem!=0) return BADINT; /* non-zero fraction */
7562
      /* it looks good */
7563
      got=DECDPUN-count;                /* number of digits so far */
7564
      up++;                             /* ready for next */
7565
      }
7566
    }
7567
  /* now it's known there's no fractional part */
7568
 
7569
  /* tricky code now, to accumulate up to 9.3 digits */
7570
  if (got==0) {theInt=*up; got+=DECDPUN; up++;} /* ensure lsu is there */
7571
 
7572
  if (ilength<11) {
7573
    Int save=theInt;
7574
    /* collect any remaining unit(s) */
7575
    for (; got<ilength; up++) {
7576
      theInt+=*up*powers[got];
7577
      got+=DECDPUN;
7578
      }
7579
    if (ilength==10) {                  /* need to check for wrap */
7580
      if (theInt/(Int)powers[got-DECDPUN]!=(Int)*(up-1)) ilength=11;
7581
         /* [that test also disallows the BADINT result case] */
7582
       else if (neg && theInt>1999999997) ilength=11;
7583
       else if (!neg && theInt>999999999) ilength=11;
7584
      if (ilength==11) theInt=save;     /* restore correct low bit */
7585
      }
7586
    }
7587
 
7588
  if (ilength>10) {                     /* too big */
7589
    if (theInt&1) return BIGODD;        /* bottom bit 1 */
7590
    return BIGEVEN;                     /* bottom bit 0 */
7591
    }
7592
 
7593
  if (neg) theInt=-theInt;              /* apply sign */
7594
  return theInt;
7595
  } /* decGetInt */
7596
 
7597
/* ------------------------------------------------------------------ */
7598
/* decDecap -- decapitate the coefficient of a number                 */
7599
/*                                                                    */
7600
/*   dn   is the number to be decapitated                             */
7601
/*   drop is the number of digits to be removed from the left of dn;  */
7602
/*     this must be <= dn->digits (if equal, the coefficient is       */
7603
/*     set to 0)                                                      */
7604
/*                                                                    */
7605
/* Returns dn; dn->digits will be <= the initial digits less drop     */
7606
/* (after removing drop digits there may be leading zero digits       */
7607
/* which will also be removed).  Only dn->lsu and dn->digits change.  */
7608
/* ------------------------------------------------------------------ */
7609
static decNumber *decDecap(decNumber *dn, Int drop) {
7610
  Unit *msu;                            /* -> target cut point */
7611
  Int cut;                              /* work */
7612
  if (drop>=dn->digits) {               /* losing the whole thing */
7613
    #if DECCHECK
7614
    if (drop>dn->digits)
7615
      printf("decDecap called with drop>digits [%ld>%ld]\n",
7616
             (LI)drop, (LI)dn->digits);
7617
    #endif
7618
    dn->lsu[0]=0;
7619
    dn->digits=1;
7620
    return dn;
7621
    }
7622
  msu=dn->lsu+D2U(dn->digits-drop)-1;   /* -> likely msu */
7623
  cut=MSUDIGITS(dn->digits-drop);       /* digits to be in use in msu */
7624
  if (cut!=DECDPUN) *msu%=powers[cut];  /* clear left digits */
7625
  /* that may have left leading zero digits, so do a proper count... */
7626
  dn->digits=decGetDigits(dn->lsu, msu-dn->lsu+1);
7627
  return dn;
7628
  } /* decDecap */
7629
 
7630
/* ------------------------------------------------------------------ */
7631
/* decBiStr -- compare string with pairwise options                   */
7632
/*                                                                    */
7633
/*   targ is the string to compare                                    */
7634
/*   str1 is one of the strings to compare against (length may be 0)  */
7635
/*   str2 is the other; it must be the same length as str1            */
7636
/*                                                                    */
7637
/*   returns 1 if strings compare equal, (that is, it is the same     */
7638
/*   length as str1 and str2, and each character of targ is in either */
7639
/*   str1 or str2 in the corresponding position), or 0 otherwise      */
7640
/*                                                                    */
7641
/* This is used for generic caseless compare, including the awkward   */
7642
/* case of the Turkish dotted and dotless Is.  Use as (for example):  */
7643
/*   if (decBiStr(test, "mike", "MIKE")) ...                          */
7644
/* ------------------------------------------------------------------ */
7645
static Flag decBiStr(const char *targ, const char *str1, const char *str2) {
7646
  for (;;targ++, str1++, str2++) {
7647
    if (*targ!=*str1 && *targ!=*str2) return 0;
7648
    /* *targ has a match in one (or both, if terminator) */
7649
    if (*targ=='\0') break;
7650
    } /* forever */
7651
  return 1;
7652
  } /* decBiStr */
7653
 
7654
/* ------------------------------------------------------------------ */
7655
/* decNaNs -- handle NaN operand or operands                          */
7656
/*                                                                    */
7657
/*   res     is the result number                                     */
7658
/*   lhs     is the first operand                                     */
7659
/*   rhs     is the second operand, or NULL if none                   */
7660
/*   context is used to limit payload length                          */
7661
/*   status  contains the current status                              */
7662
/*   returns res in case convenient                                   */
7663
/*                                                                    */
7664
/* Called when one or both operands is a NaN, and propagates the      */
7665
/* appropriate result to res.  When an sNaN is found, it is changed   */
7666
/* to a qNaN and Invalid operation is set.                            */
7667
/* ------------------------------------------------------------------ */
7668
static decNumber * decNaNs(decNumber *res, const decNumber *lhs,
7669
                           const decNumber *rhs, decContext *set,
7670
                           uInt *status) {
7671
  /* This decision tree ends up with LHS being the source pointer, */
7672
  /* and status updated if need be */
7673
  if (lhs->bits & DECSNAN)
7674
    *status|=DEC_Invalid_operation | DEC_sNaN;
7675
   else if (rhs==NULL);
7676
   else if (rhs->bits & DECSNAN) {
7677
    lhs=rhs;
7678
    *status|=DEC_Invalid_operation | DEC_sNaN;
7679
    }
7680
   else if (lhs->bits & DECNAN);
7681
   else lhs=rhs;
7682
 
7683
  /* propagate the payload */
7684
  if (lhs->digits<=set->digits) decNumberCopy(res, lhs); /* easy */
7685
   else { /* too long */
7686
    const Unit *ul;
7687
    Unit *ur, *uresp1;
7688
    /* copy safe number of units, then decapitate */
7689
    res->bits=lhs->bits;                /* need sign etc. */
7690
    uresp1=res->lsu+D2U(set->digits);
7691
    for (ur=res->lsu, ul=lhs->lsu; ur<uresp1; ur++, ul++) *ur=*ul;
7692
    res->digits=D2U(set->digits)*DECDPUN;
7693
    /* maybe still too long */
7694
    if (res->digits>set->digits) decDecap(res, res->digits-set->digits);
7695
    }
7696
 
7697
  res->bits&=~DECSNAN;        /* convert any sNaN to NaN, while */
7698
  res->bits|=DECNAN;          /* .. preserving sign */
7699
  res->exponent=0;             /* clean exponent */
7700
                              /* [coefficient was copied/decapitated] */
7701
  return res;
7702
  } /* decNaNs */
7703
 
7704
/* ------------------------------------------------------------------ */
7705
/* decStatus -- apply non-zero status                                 */
7706
/*                                                                    */
7707
/*   dn     is the number to set if error                             */
7708
/*   status contains the current status (not yet in context)          */
7709
/*   set    is the context                                            */
7710
/*                                                                    */
7711
/* If the status is an error status, the number is set to a NaN,      */
7712
/* unless the error was an overflow, divide-by-zero, or underflow,    */
7713
/* in which case the number will have already been set.               */
7714
/*                                                                    */
7715
/* The context status is then updated with the new status.  Note that */
7716
/* this may raise a signal, so control may never return from this     */
7717
/* routine (hence resources must be recovered before it is called).   */
7718
/* ------------------------------------------------------------------ */
7719
static void decStatus(decNumber *dn, uInt status, decContext *set) {
7720
  if (status & DEC_NaNs) {              /* error status -> NaN */
7721
    /* if cause was an sNaN, clear and propagate [NaN is already set up] */
7722
    if (status & DEC_sNaN) status&=~DEC_sNaN;
7723
     else {
7724
      decNumberZero(dn);                /* other error: clean throughout */
7725
      dn->bits=DECNAN;                  /* and make a quiet NaN */
7726
      }
7727
    }
7728
  decContextSetStatus(set, status);     /* [may not return] */
7729
  return;
7730
  } /* decStatus */
7731
 
7732
/* ------------------------------------------------------------------ */
7733
/* decGetDigits -- count digits in a Units array                      */
7734
/*                                                                    */
7735
/*   uar is the Unit array holding the number (this is often an       */
7736
/*          accumulator of some sort)                                 */
7737
/*   len is the length of the array in units [>=1]                    */
7738
/*                                                                    */
7739
/*   returns the number of (significant) digits in the array          */
7740
/*                                                                    */
7741
/* All leading zeros are excluded, except the last if the array has   */
7742
/* only zero Units.                                                   */
7743
/* ------------------------------------------------------------------ */
7744
/* This may be called twice during some operations. */
7745
static Int decGetDigits(Unit *uar, Int len) {
7746
  Unit *up=uar+(len-1);            /* -> msu */
7747
  Int  digits=(len-1)*DECDPUN+1;   /* possible digits excluding msu */
7748
  #if DECDPUN>4
7749
  uInt const *pow;                 /* work */
7750
  #endif
7751
                                   /* (at least 1 in final msu) */
7752
  #if DECCHECK
7753
  if (len<1) printf("decGetDigits called with len<1 [%ld]\n", (LI)len);
7754
  #endif
7755
 
7756
  for (; up>=uar; up--) {
7757
    if (*up==0) {                   /* unit is all 0s */
7758
      if (digits==1) break;        /* a zero has one digit */
7759
      digits-=DECDPUN;             /* adjust for 0 unit */
7760
      continue;}
7761
    /* found the first (most significant) non-zero Unit */
7762
    #if DECDPUN>1                  /* not done yet */
7763
    if (*up<10) break;             /* is 1-9 */
7764
    digits++;
7765
    #if DECDPUN>2                  /* not done yet */
7766
    if (*up<100) break;            /* is 10-99 */
7767
    digits++;
7768
    #if DECDPUN>3                  /* not done yet */
7769
    if (*up<1000) break;           /* is 100-999 */
7770
    digits++;
7771
    #if DECDPUN>4                  /* count the rest ... */
7772
    for (pow=&powers[4]; *up>=*pow; pow++) digits++;
7773
    #endif
7774
    #endif
7775
    #endif
7776
    #endif
7777
    break;
7778
    } /* up */
7779
  return digits;
7780
  } /* decGetDigits */
7781
 
7782
#if DECTRACE | DECCHECK
7783
/* ------------------------------------------------------------------ */
7784
/* decNumberShow -- display a number [debug aid]                      */
7785
/*   dn is the number to show                                         */
7786
/*                                                                    */
7787
/* Shows: sign, exponent, coefficient (msu first), digits             */
7788
/*    or: sign, special-value                                         */
7789
/* ------------------------------------------------------------------ */
7790
/* this is public so other modules can use it */
7791
void decNumberShow(const decNumber *dn) {
7792
  const Unit *up;                  /* work */
7793
  uInt u, d;                       /* .. */
7794
  Int cut;                         /* .. */
7795
  char isign='+';                  /* main sign */
7796
  if (dn==NULL) {
7797
    printf("NULL\n");
7798
    return;}
7799
  if (decNumberIsNegative(dn)) isign='-';
7800
  printf(" >> %c ", isign);
7801
  if (dn->bits&DECSPECIAL) {       /* Is a special value */
7802
    if (decNumberIsInfinite(dn)) printf("Infinity");
7803
     else {                                  /* a NaN */
7804
      if (dn->bits&DECSNAN) printf("sNaN");  /* signalling NaN */
7805
       else printf("NaN");
7806
      }
7807
    /* if coefficient and exponent are 0, no more to do */
7808
    if (dn->exponent==0 && dn->digits==1 && *dn->lsu==0) {
7809
      printf("\n");
7810
      return;}
7811
    /* drop through to report other information */
7812
    printf(" ");
7813
    }
7814
 
7815
  /* now carefully display the coefficient */
7816
  up=dn->lsu+D2U(dn->digits)-1;         /* msu */
7817
  printf("%ld", (LI)*up);
7818
  for (up=up-1; up>=dn->lsu; up--) {
7819
    u=*up;
7820
    printf(":");
7821
    for (cut=DECDPUN-1; cut>=0; cut--) {
7822
      d=u/powers[cut];
7823
      u-=d*powers[cut];
7824
      printf("%ld", (LI)d);
7825
      } /* cut */
7826
    } /* up */
7827
  if (dn->exponent!=0) {
7828
    char esign='+';
7829
    if (dn->exponent<0) esign='-';
7830
    printf(" E%c%ld", esign, (LI)abs(dn->exponent));
7831
    }
7832
  printf(" [%ld]\n", (LI)dn->digits);
7833
  } /* decNumberShow */
7834
#endif
7835
 
7836
#if DECTRACE || DECCHECK
7837
/* ------------------------------------------------------------------ */
7838
/* decDumpAr -- display a unit array [debug/check aid]                */
7839
/*   name is a single-character tag name                              */
7840
/*   ar   is the array to display                                     */
7841
/*   len  is the length of the array in Units                         */
7842
/* ------------------------------------------------------------------ */
7843
static void decDumpAr(char name, const Unit *ar, Int len) {
7844
  Int i;
7845
  const char *spec;
7846
  #if DECDPUN==9
7847
    spec="%09d ";
7848
  #elif DECDPUN==8
7849
    spec="%08d ";
7850
  #elif DECDPUN==7
7851
    spec="%07d ";
7852
  #elif DECDPUN==6
7853
    spec="%06d ";
7854
  #elif DECDPUN==5
7855
    spec="%05d ";
7856
  #elif DECDPUN==4
7857
    spec="%04d ";
7858
  #elif DECDPUN==3
7859
    spec="%03d ";
7860
  #elif DECDPUN==2
7861
    spec="%02d ";
7862
  #else
7863
    spec="%d ";
7864
  #endif
7865
  printf("  :%c: ", name);
7866
  for (i=len-1; i>=0; i--) {
7867
    if (i==len-1) printf("%ld ", (LI)ar[i]);
7868
     else printf(spec, ar[i]);
7869
    }
7870
  printf("\n");
7871
  return;}
7872
#endif
7873
 
7874
#if DECCHECK
7875
/* ------------------------------------------------------------------ */
7876
/* decCheckOperands -- check operand(s) to a routine                  */
7877
/*   res is the result structure (not checked; it will be set to      */
7878
/*          quiet NaN if error found (and it is not NULL))            */
7879
/*   lhs is the first operand (may be DECUNRESU)                      */
7880
/*   rhs is the second (may be DECUNUSED)                             */
7881
/*   set is the context (may be DECUNCONT)                            */
7882
/*   returns 0 if both operands, and the context are clean, or 1      */
7883
/*     otherwise (in which case the context will show an error,       */
7884
/*     unless NULL).  Note that res is not cleaned; caller should     */
7885
/*     handle this so res=NULL case is safe.                          */
7886
/* The caller is expected to abandon immediately if 1 is returned.    */
7887
/* ------------------------------------------------------------------ */
7888
static Flag decCheckOperands(decNumber *res, const decNumber *lhs,
7889
                             const decNumber *rhs, decContext *set) {
7890
  Flag bad=0;
7891
  if (set==NULL) {                 /* oops; hopeless */
7892
    #if DECTRACE || DECVERB
7893
    printf("Reference to context is NULL.\n");
7894
    #endif
7895
    bad=1;
7896
    return 1;}
7897
   else if (set!=DECUNCONT
7898
     && (set->digits<1 || set->round>=DEC_ROUND_MAX)) {
7899
    bad=1;
7900
    #if DECTRACE || DECVERB
7901
    printf("Bad context [digits=%ld round=%ld].\n",
7902
           (LI)set->digits, (LI)set->round);
7903
    #endif
7904
    }
7905
   else {
7906
    if (res==NULL) {
7907
      bad=1;
7908
      #if DECTRACE
7909
      /* this one not DECVERB as standard tests include NULL */
7910
      printf("Reference to result is NULL.\n");
7911
      #endif
7912
      }
7913
    if (!bad && lhs!=DECUNUSED) bad=(decCheckNumber(lhs));
7914
    if (!bad && rhs!=DECUNUSED) bad=(decCheckNumber(rhs));
7915
    }
7916
  if (bad) {
7917
    if (set!=DECUNCONT) decContextSetStatus(set, DEC_Invalid_operation);
7918
    if (res!=DECUNRESU && res!=NULL) {
7919
      decNumberZero(res);
7920
      res->bits=DECNAN;       /* qNaN */
7921
      }
7922
    }
7923
  return bad;
7924
  } /* decCheckOperands */
7925
 
7926
/* ------------------------------------------------------------------ */
7927
/* decCheckNumber -- check a number                                   */
7928
/*   dn is the number to check                                        */
7929
/*   returns 0 if the number is clean, or 1 otherwise                 */
7930
/*                                                                    */
7931
/* The number is considered valid if it could be a result from some   */
7932
/* operation in some valid context.                                   */
7933
/* ------------------------------------------------------------------ */
7934
static Flag decCheckNumber(const decNumber *dn) {
7935
  const Unit *up;             /* work */
7936
  uInt maxuint;               /* .. */
7937
  Int ae, d, digits;          /* .. */
7938
  Int emin, emax;             /* .. */
7939
 
7940
  if (dn==NULL) {             /* hopeless */
7941
    #if DECTRACE
7942
    /* this one not DECVERB as standard tests include NULL */
7943
    printf("Reference to decNumber is NULL.\n");
7944
    #endif
7945
    return 1;}
7946
 
7947
  /* check special values */
7948
  if (dn->bits & DECSPECIAL) {
7949
    if (dn->exponent!=0) {
7950
      #if DECTRACE || DECVERB
7951
      printf("Exponent %ld (not 0) for a special value [%02x].\n",
7952
             (LI)dn->exponent, dn->bits);
7953
      #endif
7954
      return 1;}
7955
 
7956
    /* 2003.09.08: NaNs may now have coefficients, so next tests Inf only */
7957
    if (decNumberIsInfinite(dn)) {
7958
      if (dn->digits!=1) {
7959
        #if DECTRACE || DECVERB
7960
        printf("Digits %ld (not 1) for an infinity.\n", (LI)dn->digits);
7961
        #endif
7962
        return 1;}
7963
      if (*dn->lsu!=0) {
7964
        #if DECTRACE || DECVERB
7965
        printf("LSU %ld (not 0) for an infinity.\n", (LI)*dn->lsu);
7966
        #endif
7967
        decDumpAr('I', dn->lsu, D2U(dn->digits));
7968
        return 1;}
7969
      } /* Inf */
7970
    /* 2002.12.26: negative NaNs can now appear through proposed IEEE */
7971
    /*             concrete formats (decimal64, etc.). */
7972
    return 0;
7973
    }
7974
 
7975
  /* check the coefficient */
7976
  if (dn->digits<1 || dn->digits>DECNUMMAXP) {
7977
    #if DECTRACE || DECVERB
7978
    printf("Digits %ld in number.\n", (LI)dn->digits);
7979
    #endif
7980
    return 1;}
7981
 
7982
  d=dn->digits;
7983
 
7984
  for (up=dn->lsu; d>0; up++) {
7985
    if (d>DECDPUN) maxuint=DECDPUNMAX;
7986
     else {                   /* reached the msu */
7987
      maxuint=powers[d]-1;
7988
      if (dn->digits>1 && *up<powers[d-1]) {
7989
        #if DECTRACE || DECVERB
7990
        printf("Leading 0 in number.\n");
7991
        decNumberShow(dn);
7992
        #endif
7993
        return 1;}
7994
      }
7995
    if (*up>maxuint) {
7996
      #if DECTRACE || DECVERB
7997
      printf("Bad Unit [%08lx] in %ld-digit number at offset %ld [maxuint %ld].\n",
7998
              (LI)*up, (LI)dn->digits, (LI)(up-dn->lsu), (LI)maxuint);
7999
      #endif
8000
      return 1;}
8001
    d-=DECDPUN;
8002
    }
8003
 
8004
  /* check the exponent.  Note that input operands can have exponents */
8005
  /* which are out of the set->emin/set->emax and set->digits range */
8006
  /* (just as they can have more digits than set->digits). */
8007
  ae=dn->exponent+dn->digits-1;    /* adjusted exponent */
8008
  emax=DECNUMMAXE;
8009
  emin=DECNUMMINE;
8010
  digits=DECNUMMAXP;
8011
  if (ae<emin-(digits-1)) {
8012
    #if DECTRACE || DECVERB
8013
    printf("Adjusted exponent underflow [%ld].\n", (LI)ae);
8014
    decNumberShow(dn);
8015
    #endif
8016
    return 1;}
8017
  if (ae>+emax) {
8018
    #if DECTRACE || DECVERB
8019
    printf("Adjusted exponent overflow [%ld].\n", (LI)ae);
8020
    decNumberShow(dn);
8021
    #endif
8022
    return 1;}
8023
 
8024
  return 0;               /* it's OK */
8025
  } /* decCheckNumber */
8026
 
8027
/* ------------------------------------------------------------------ */
8028
/* decCheckInexact -- check a normal finite inexact result has digits */
8029
/*   dn is the number to check                                        */
8030
/*   set is the context (for status and precision)                    */
8031
/*   sets Invalid operation, etc., if some digits are missing         */
8032
/* [this check is not made for DECSUBSET compilation or when          */
8033
/* subnormal is not set]                                              */
8034
/* ------------------------------------------------------------------ */
8035
static void decCheckInexact(const decNumber *dn, decContext *set) {
8036
  #if !DECSUBSET && DECEXTFLAG
8037
    if ((set->status & (DEC_Inexact|DEC_Subnormal))==DEC_Inexact
8038
     && (set->digits!=dn->digits) && !(dn->bits & DECSPECIAL)) {
8039
      #if DECTRACE || DECVERB
8040
      printf("Insufficient digits [%ld] on normal Inexact result.\n",
8041
             (LI)dn->digits);
8042
      decNumberShow(dn);
8043
      #endif
8044
      decContextSetStatus(set, DEC_Invalid_operation);
8045
      }
8046
  #else
8047
    /* next is a noop for quiet compiler */
8048
    if (dn!=NULL && dn->digits==0) set->status|=DEC_Invalid_operation;
8049
  #endif
8050
  return;
8051
  } /* decCheckInexact */
8052
#endif
8053
 
8054
#if DECALLOC
8055
#undef malloc
8056
#undef free
8057
/* ------------------------------------------------------------------ */
8058
/* decMalloc -- accountable allocation routine                        */
8059
/*   n is the number of bytes to allocate                             */
8060
/*                                                                    */
8061
/* Semantics is the same as the stdlib malloc routine, but bytes      */
8062
/* allocated are accounted for globally, and corruption fences are    */
8063
/* added before and after the 'actual' storage.                       */
8064
/* ------------------------------------------------------------------ */
8065
/* This routine allocates storage with an extra twelve bytes; 8 are   */
8066
/* at the start and hold:                                             */
8067
/*   0-3 the original length requested                                */
8068
/*   4-7 buffer corruption detection fence (DECFENCE, x4)             */
8069
/* The 4 bytes at the end also hold a corruption fence (DECFENCE, x4) */
8070
/* ------------------------------------------------------------------ */
8071
static void *decMalloc(size_t n) {
8072
  uInt  size=n+12;                 /* true size */
8073
  void  *alloc;                    /* -> allocated storage */
8074
  uInt  *j;                        /* work */
8075
  uByte *b, *b0;                   /* .. */
8076
 
8077
  alloc=malloc(size);              /* -> allocated storage */
8078
  if (alloc==NULL) return NULL;    /* out of strorage */
8079
  b0=(uByte *)alloc;               /* as bytes */
8080
  decAllocBytes+=n;                /* account for storage */
8081
  j=(uInt *)alloc;                 /* -> first four bytes */
8082
  *j=n;                            /* save n */
8083
  /* printf(" alloc ++ dAB: %ld (%d)\n", decAllocBytes, n); */
8084
  for (b=b0+4; b<b0+8; b++) *b=DECFENCE;
8085
  for (b=b0+n+8; b<b0+n+12; b++) *b=DECFENCE;
8086
  return b0+8;                     /* -> play area */
8087
  } /* decMalloc */
8088
 
8089
/* ------------------------------------------------------------------ */
8090
/* decFree -- accountable free routine                                */
8091
/*   alloc is the storage to free                                     */
8092
/*                                                                    */
8093
/* Semantics is the same as the stdlib malloc routine, except that    */
8094
/* the global storage accounting is updated and the fences are        */
8095
/* checked to ensure that no routine has written 'out of bounds'.     */
8096
/* ------------------------------------------------------------------ */
8097
/* This routine first checks that the fences have not been corrupted. */
8098
/* It then frees the storage using the 'truw' storage address (that   */
8099
/* is, offset by 8).                                                  */
8100
/* ------------------------------------------------------------------ */
8101
static void decFree(void *alloc) {
8102
  uInt  *j, n;                     /* pointer, original length */
8103
  uByte *b, *b0;                   /* work */
8104
 
8105
  if (alloc==NULL) return;         /* allowed; it's a nop */
8106
  b0=(uByte *)alloc;               /* as bytes */
8107
  b0-=8;                           /* -> true start of storage */
8108
  j=(uInt *)b0;                    /* -> first four bytes */
8109
  n=*j;                            /* lift */
8110
  for (b=b0+4; b<b0+8; b++) if (*b!=DECFENCE)
8111
    printf("=== Corrupt byte [%02x] at offset %d from %ld ===\n", *b,
8112
           b-b0-8, (Int)b0);
8113
  for (b=b0+n+8; b<b0+n+12; b++) if (*b!=DECFENCE)
8114
    printf("=== Corrupt byte [%02x] at offset +%d from %ld, n=%ld ===\n", *b,
8115
           b-b0-8, (Int)b0, n);
8116
  free(b0);                        /* drop the storage */
8117
  decAllocBytes-=n;                /* account for storage */
8118
  /* printf(" free -- dAB: %d (%d)\n", decAllocBytes, -n); */
8119
  } /* decFree */
8120
#define malloc(a) decMalloc(a)
8121
#define free(a) decFree(a)
8122
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.