Home | History | Annotate | Line # | Download | only in libdecnumber
      1       1.1  mrg /* Decimal number arithmetic module for the decNumber C Library.
      2  1.1.1.12  mrg    Copyright (C) 2005-2024 Free Software Foundation, Inc.
      3       1.1  mrg    Contributed by IBM Corporation.  Author Mike Cowlishaw.
      4       1.1  mrg 
      5       1.1  mrg    This file is part of GCC.
      6       1.1  mrg 
      7       1.1  mrg    GCC is free software; you can redistribute it and/or modify it under
      8       1.1  mrg    the terms of the GNU General Public License as published by the Free
      9       1.1  mrg    Software Foundation; either version 3, or (at your option) any later
     10       1.1  mrg    version.
     11       1.1  mrg 
     12       1.1  mrg    GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     13       1.1  mrg    WARRANTY; without even the implied warranty of MERCHANTABILITY or
     14       1.1  mrg    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     15       1.1  mrg    for more details.
     16       1.1  mrg 
     17       1.1  mrg Under Section 7 of GPL version 3, you are granted additional
     18       1.1  mrg permissions described in the GCC Runtime Library Exception, version
     19       1.1  mrg 3.1, as published by the Free Software Foundation.
     20       1.1  mrg 
     21       1.1  mrg You should have received a copy of the GNU General Public License and
     22       1.1  mrg a copy of the GCC Runtime Library Exception along with this program;
     23       1.1  mrg see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     24       1.1  mrg <http://www.gnu.org/licenses/>.  */
     25       1.1  mrg 
     26       1.1  mrg /* ------------------------------------------------------------------ */
     27       1.1  mrg /* Decimal Number arithmetic module				      */
     28       1.1  mrg /* ------------------------------------------------------------------ */
     29       1.1  mrg /* This module comprises the routines for arbitrary-precision General */
     30       1.1  mrg /* Decimal Arithmetic as defined in the specification which may be    */
     31       1.1  mrg /* found on the General Decimal Arithmetic pages.  It implements both */
     32       1.1  mrg /* the full ('extended') arithmetic and the simpler ('subset')	      */
     33       1.1  mrg /* arithmetic.							      */
     34       1.1  mrg /*								      */
     35       1.1  mrg /* Usage notes: 						      */
     36       1.1  mrg /*								      */
     37       1.1  mrg /* 1. This code is ANSI C89 except:				      */
     38       1.1  mrg /*								      */
     39       1.1  mrg /*    a) C99 line comments (double forward slash) are used.  (Most C  */
     40       1.1  mrg /*	 compilers accept these.  If yours does not, a simple script  */
     41       1.1  mrg /*	 can be used to convert them to ANSI C comments.)	      */
     42       1.1  mrg /*								      */
     43       1.1  mrg /*    b) Types from C99 stdint.h are used.  If you do not have this   */
     44       1.1  mrg /*	 header file, see the User's Guide section of the decNumber   */
     45       1.1  mrg /*	 documentation; this lists the necessary definitions.	      */
     46       1.1  mrg /*								      */
     47       1.1  mrg /*    c) If DECDPUN>4 or DECUSE64=1, the C99 64-bit int64_t and       */
     48       1.1  mrg /*	 uint64_t types may be used.  To avoid these, set DECUSE64=0  */
     49       1.1  mrg /*	 and DECDPUN<=4 (see documentation).			      */
     50       1.1  mrg /*								      */
     51       1.1  mrg /*    The code also conforms to C99 restrictions; in particular,      */
     52       1.1  mrg /*    strict aliasing rules are observed.			      */
     53       1.1  mrg /*								      */
     54       1.1  mrg /* 2. The decNumber format which this library uses is optimized for   */
     55       1.1  mrg /*    efficient processing of relatively short numbers; in particular */
     56       1.1  mrg /*    it allows the use of fixed sized structures and minimizes copy  */
     57       1.1  mrg /*    and move operations.  It does, however, support arbitrary       */
     58       1.1  mrg /*    precision (up to 999,999,999 digits) and arbitrary exponent     */
     59       1.1  mrg /*    range (Emax in the range 0 through 999,999,999 and Emin in the  */
     60       1.1  mrg /*    range -999,999,999 through 0).  Mathematical functions (for     */
     61       1.1  mrg /*    example decNumberExp) as identified below are restricted more   */
     62       1.1  mrg /*    tightly: digits, emax, and -emin in the context must be <=      */
     63       1.1  mrg /*    DEC_MAX_MATH (999999), and their operand(s) must be within      */
     64       1.1  mrg /*    these bounds.						      */
     65       1.1  mrg /*								      */
     66       1.1  mrg /* 3. Logical functions are further restricted; their operands must   */
     67       1.1  mrg /*    be finite, positive, have an exponent of zero, and all digits   */
     68       1.1  mrg /*    must be either 0 or 1.  The result will only contain digits     */
     69       1.1  mrg /*    which are 0 or 1 (and will have exponent=0 and a sign of 0).    */
     70       1.1  mrg /*								      */
     71       1.1  mrg /* 4. Operands to operator functions are never modified unless they   */
     72       1.1  mrg /*    are also specified to be the result number (which is always     */
     73       1.1  mrg /*    permitted).  Other than that case, operands must not overlap.   */
     74       1.1  mrg /*								      */
     75       1.1  mrg /* 5. Error handling: the type of the error is ORed into the status   */
     76       1.1  mrg /*    flags in the current context (decContext structure).  The       */
     77       1.1  mrg /*    SIGFPE signal is then raised if the corresponding trap-enabler  */
     78       1.1  mrg /*    flag in the decContext is set (is 1).			      */
     79       1.1  mrg /*								      */
     80       1.1  mrg /*    It is the responsibility of the caller to clear the status      */
     81       1.1  mrg /*    flags as required.					      */
     82       1.1  mrg /*								      */
     83       1.1  mrg /*    The result of any routine which returns a number will always    */
     84       1.1  mrg /*    be a valid number (which may be a special value, such as an     */
     85       1.1  mrg /*    Infinity or NaN). 					      */
     86       1.1  mrg /*								      */
     87       1.1  mrg /* 6. The decNumber format is not an exchangeable concrete	      */
     88       1.1  mrg /*    representation as it comprises fields which may be machine-     */
     89       1.1  mrg /*    dependent (packed or unpacked, or special length, for example). */
     90       1.1  mrg /*    Canonical conversions to and from strings are provided; other   */
     91       1.1  mrg /*    conversions are available in separate modules.		      */
     92       1.1  mrg /*								      */
     93       1.1  mrg /* 7. Normally, input operands are assumed to be valid.  Set DECCHECK */
     94       1.1  mrg /*    to 1 for extended operand checking (including NULL operands).   */
     95       1.1  mrg /*    Results are undefined if a badly-formed structure (or a NULL    */
     96       1.1  mrg /*    pointer to a structure) is provided, though with DECCHECK       */
     97       1.1  mrg /*    enabled the operator routines are protected against exceptions. */
     98       1.1  mrg /*    (Except if the result pointer is NULL, which is unrecoverable.) */
     99       1.1  mrg /*								      */
    100       1.1  mrg /*    However, the routines will never cause exceptions if they are   */
    101       1.1  mrg /*    given well-formed operands, even if the value of the operands   */
    102       1.1  mrg /*    is inappropriate for the operation and DECCHECK is not set.     */
    103       1.1  mrg /*    (Except for SIGFPE, as and where documented.)		      */
    104       1.1  mrg /*								      */
    105       1.1  mrg /* 8. Subset arithmetic is available only if DECSUBSET is set to 1.   */
    106       1.1  mrg /* ------------------------------------------------------------------ */
    107       1.1  mrg /* Implementation notes for maintenance of this module: 	      */
    108       1.1  mrg /*								      */
    109       1.1  mrg /* 1. Storage leak protection:	Routines which use malloc are not     */
    110       1.1  mrg /*    permitted to use return for fastpath or error exits (i.e.,      */
    111       1.1  mrg /*    they follow strict structured programming conventions).	      */
    112       1.1  mrg /*    Instead they have a do{}while(0); construct surrounding the     */
    113       1.1  mrg /*    code which is protected -- break may be used to exit this.      */
    114       1.1  mrg /*    Other routines can safely use the return statement inline.      */
    115       1.1  mrg /*								      */
    116       1.1  mrg /*    Storage leak accounting can be enabled using DECALLOC.	      */
    117       1.1  mrg /*								      */
    118       1.1  mrg /* 2. All loops use the for(;;) construct.  Any do construct does     */
    119       1.1  mrg /*    not loop; it is for allocation protection as just described.    */
    120       1.1  mrg /*								      */
    121       1.1  mrg /* 3. Setting status in the context must always be the very last      */
    122       1.1  mrg /*    action in a routine, as non-0 status may raise a trap and hence */
    123       1.1  mrg /*    the call to set status may not return (if the handler uses long */
    124       1.1  mrg /*    jump).  Therefore all cleanup must be done first.  In general,  */
    125       1.1  mrg /*    to achieve this status is accumulated and is only applied just  */
    126       1.1  mrg /*    before return by calling decContextSetStatus (via decStatus).   */
    127       1.1  mrg /*								      */
    128       1.1  mrg /*    Routines which allocate storage cannot, in general, use the     */
    129       1.1  mrg /*    'top level' routines which could cause a non-returning	      */
    130       1.1  mrg /*    transfer of control.  The decXxxxOp routines are safe (do not   */
    131       1.1  mrg /*    call decStatus even if traps are set in the context) and should */
    132       1.1  mrg /*    be used instead (they are also a little faster).		      */
    133       1.1  mrg /*								      */
    134       1.1  mrg /* 4. Exponent checking is minimized by allowing the exponent to      */
    135       1.1  mrg /*    grow outside its limits during calculations, provided that      */
    136       1.1  mrg /*    the decFinalize function is called later.  Multiplication and   */
    137       1.1  mrg /*    division, and intermediate calculations in exponentiation,      */
    138       1.1  mrg /*    require more careful checks because of the risk of 31-bit       */
    139       1.1  mrg /*    overflow (the most negative valid exponent is -1999999997, for  */
    140       1.1  mrg /*    a 999999999-digit number with adjusted exponent of -999999999). */
    141       1.1  mrg /*								      */
    142       1.1  mrg /* 5. Rounding is deferred until finalization of results, with any    */
    143       1.1  mrg /*    'off to the right' data being represented as a single digit     */
    144       1.1  mrg /*    residue (in the range -1 through 9).  This avoids any double-   */
    145       1.1  mrg /*    rounding when more than one shortening takes place (for	      */
    146       1.1  mrg /*    example, when a result is subnormal).			      */
    147       1.1  mrg /*								      */
    148       1.1  mrg /* 6. The digits count is allowed to rise to a multiple of DECDPUN    */
    149       1.1  mrg /*    during many operations, so whole Units are handled and exact    */
    150       1.1  mrg /*    accounting of digits is not needed.  The correct digits value   */
    151       1.1  mrg /*    is found by decGetDigits, which accounts for leading zeros.     */
    152       1.1  mrg /*    This must be called before any rounding if the number of digits */
    153       1.1  mrg /*    is not known exactly.					      */
    154       1.1  mrg /*								      */
    155       1.1  mrg /* 7. The multiply-by-reciprocal 'trick' is used for partitioning     */
    156       1.1  mrg /*    numbers up to four digits, using appropriate constants.  This   */
    157       1.1  mrg /*    is not useful for longer numbers because overflow of 32 bits    */
    158       1.1  mrg /*    would lead to 4 multiplies, which is almost as expensive as     */
    159       1.1  mrg /*    a divide (unless a floating-point or 64-bit multiply is	      */
    160       1.1  mrg /*    assumed to be available). 				      */
    161       1.1  mrg /*								      */
    162       1.1  mrg /* 8. Unusual abbreviations that may be used in the commentary:       */
    163       1.1  mrg /*	lhs -- left hand side (operand, of an operation)	      */
    164       1.1  mrg /*	lsd -- least significant digit (of coefficient) 	      */
    165       1.1  mrg /*	lsu -- least significant Unit (of coefficient)		      */
    166       1.1  mrg /*	msd -- most significant digit (of coefficient)		      */
    167       1.1  mrg /*	msi -- most significant item (in an array)		      */
    168       1.1  mrg /*	msu -- most significant Unit (of coefficient)		      */
    169       1.1  mrg /*	rhs -- right hand side (operand, of an operation)	      */
    170       1.1  mrg /*	+ve -- positive 					      */
    171       1.1  mrg /*	-ve -- negative 					      */
    172       1.1  mrg /*	**  -- raise to the power				      */
    173       1.1  mrg /* ------------------------------------------------------------------ */
    174       1.1  mrg 
    175       1.1  mrg #include <stdlib.h>		   /* for malloc, free, etc. */
    176       1.1  mrg #include <stdio.h>		   /* for printf [if needed] */
    177       1.1  mrg #include <string.h>		   /* for strcpy */
    178       1.1  mrg #include <ctype.h>		   /* for lower */
    179       1.1  mrg #include "dconfig.h"		   /* for GCC definitions */
    180       1.1  mrg #include "decNumber.h"		   /* base number library */
    181       1.1  mrg #include "decNumberLocal.h"	   /* decNumber local types, etc. */
    182       1.1  mrg 
    183       1.1  mrg /* Constants */
    184       1.1  mrg /* Public lookup table used by the D2U macro */
    185       1.1  mrg const uByte d2utable[DECMAXD2U+1]=D2UTABLE;
    186       1.1  mrg 
    187       1.1  mrg #define DECVERB     1		   /* set to 1 for verbose DECCHECK */
    188       1.1  mrg #define powers	    DECPOWERS	   /* old internal name */
    189       1.1  mrg 
    190       1.1  mrg /* Local constants */
    191       1.1  mrg #define DIVIDE	    0x80	   /* Divide operators */
    192       1.1  mrg #define REMAINDER   0x40	   /* .. */
    193       1.1  mrg #define DIVIDEINT   0x20	   /* .. */
    194       1.1  mrg #define REMNEAR     0x10	   /* .. */
    195       1.1  mrg #define COMPARE     0x01	   /* Compare operators */
    196       1.1  mrg #define COMPMAX     0x02	   /* .. */
    197       1.1  mrg #define COMPMIN     0x03	   /* .. */
    198       1.1  mrg #define COMPTOTAL   0x04	   /* .. */
    199       1.1  mrg #define COMPNAN     0x05	   /* .. [NaN processing] */
    200       1.1  mrg #define COMPSIG     0x06	   /* .. [signaling COMPARE] */
    201       1.1  mrg #define COMPMAXMAG  0x07	   /* .. */
    202       1.1  mrg #define COMPMINMAG  0x08	   /* .. */
    203       1.1  mrg 
    204       1.1  mrg #define DEC_sNaN     0x40000000    /* local status: sNaN signal */
    205       1.1  mrg #define BADINT	(Int)0x80000000    /* most-negative Int; error indicator */
    206       1.1  mrg /* Next two indicate an integer >= 10**6, and its parity (bottom bit) */
    207       1.1  mrg #define BIGEVEN (Int)0x80000002
    208       1.1  mrg #define BIGODD	(Int)0x80000003
    209       1.1  mrg 
    210       1.1  mrg static Unit uarrone[1]={1};   /* Unit array of 1, used for incrementing */
    211       1.1  mrg 
    212       1.1  mrg /* Granularity-dependent code */
    213       1.1  mrg #if DECDPUN<=4
    214       1.1  mrg   #define eInt	Int	      /* extended integer */
    215       1.1  mrg   #define ueInt uInt	      /* unsigned extended integer */
    216       1.1  mrg   /* Constant multipliers for divide-by-power-of five using reciprocal */
    217       1.1  mrg   /* multiply, after removing powers of 2 by shifting, and final shift */
    218       1.1  mrg   /* of 17 [we only need up to **4] */
    219       1.1  mrg   static const uInt multies[]={131073, 26215, 5243, 1049, 210};
    220       1.1  mrg   /* QUOT10 -- macro to return the quotient of unit u divided by 10**n */
    221       1.1  mrg   #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
    222       1.1  mrg #else
    223       1.1  mrg   /* For DECDPUN>4 non-ANSI-89 64-bit types are needed. */
    224       1.1  mrg   #if !DECUSE64
    225       1.1  mrg     #error decNumber.c: DECUSE64 must be 1 when DECDPUN>4
    226       1.1  mrg   #endif
    227       1.1  mrg   #define eInt	Long	      /* extended integer */
    228       1.1  mrg   #define ueInt uLong	      /* unsigned extended integer */
    229       1.1  mrg #endif
    230       1.1  mrg 
    231       1.1  mrg /* Local routines */
    232       1.1  mrg static decNumber * decAddOp(decNumber *, const decNumber *, const decNumber *,
    233       1.1  mrg 			      decContext *, uByte, uInt *);
    234       1.1  mrg static Flag	   decBiStr(const char *, const char *, const char *);
    235       1.1  mrg static uInt	   decCheckMath(const decNumber *, decContext *, uInt *);
    236       1.1  mrg static void	   decApplyRound(decNumber *, decContext *, Int, uInt *);
    237       1.1  mrg static Int	   decCompare(const decNumber *lhs, const decNumber *rhs, Flag);
    238       1.1  mrg static decNumber * decCompareOp(decNumber *, const decNumber *,
    239       1.1  mrg 			      const decNumber *, decContext *,
    240       1.1  mrg 			      Flag, uInt *);
    241       1.1  mrg static void	   decCopyFit(decNumber *, const decNumber *, decContext *,
    242       1.1  mrg 			      Int *, uInt *);
    243       1.1  mrg static decNumber * decDecap(decNumber *, Int);
    244       1.1  mrg static decNumber * decDivideOp(decNumber *, const decNumber *,
    245       1.1  mrg 			      const decNumber *, decContext *, Flag, uInt *);
    246       1.1  mrg static decNumber * decExpOp(decNumber *, const decNumber *,
    247       1.1  mrg 			      decContext *, uInt *);
    248       1.1  mrg static void	   decFinalize(decNumber *, decContext *, Int *, uInt *);
    249       1.1  mrg static Int	   decGetDigits(Unit *, Int);
    250       1.1  mrg static Int	   decGetInt(const decNumber *);
    251       1.1  mrg static decNumber * decLnOp(decNumber *, const decNumber *,
    252       1.1  mrg 			      decContext *, uInt *);
    253       1.1  mrg static decNumber * decMultiplyOp(decNumber *, const decNumber *,
    254       1.1  mrg 			      const decNumber *, decContext *,
    255       1.1  mrg 			      uInt *);
    256       1.1  mrg static decNumber * decNaNs(decNumber *, const decNumber *,
    257       1.1  mrg 			      const decNumber *, decContext *, uInt *);
    258       1.1  mrg static decNumber * decQuantizeOp(decNumber *, const decNumber *,
    259       1.1  mrg 			      const decNumber *, decContext *, Flag,
    260       1.1  mrg 			      uInt *);
    261       1.1  mrg static void	   decReverse(Unit *, Unit *);
    262       1.1  mrg static void	   decSetCoeff(decNumber *, decContext *, const Unit *,
    263       1.1  mrg 			      Int, Int *, uInt *);
    264       1.1  mrg static void	   decSetMaxValue(decNumber *, decContext *);
    265       1.1  mrg static void	   decSetOverflow(decNumber *, decContext *, uInt *);
    266       1.1  mrg static void	   decSetSubnormal(decNumber *, decContext *, Int *, uInt *);
    267       1.1  mrg static Int	   decShiftToLeast(Unit *, Int, Int);
    268       1.1  mrg static Int	   decShiftToMost(Unit *, Int, Int);
    269       1.1  mrg static void	   decStatus(decNumber *, uInt, decContext *);
    270       1.1  mrg static void	   decToString(const decNumber *, char[], Flag);
    271       1.1  mrg static decNumber * decTrim(decNumber *, decContext *, Flag, Flag, Int *);
    272       1.1  mrg static Int	   decUnitAddSub(const Unit *, Int, const Unit *, Int, Int,
    273       1.1  mrg 			      Unit *, Int);
    274       1.1  mrg static Int	   decUnitCompare(const Unit *, Int, const Unit *, Int, Int);
    275       1.1  mrg 
    276       1.1  mrg #if !DECSUBSET
    277       1.1  mrg /* decFinish == decFinalize when no subset arithmetic needed */
    278       1.1  mrg #define decFinish(a,b,c,d) decFinalize(a,b,c,d)
    279       1.1  mrg #else
    280       1.1  mrg static void	   decFinish(decNumber *, decContext *, Int *, uInt *);
    281       1.1  mrg static decNumber * decRoundOperand(const decNumber *, decContext *, uInt *);
    282       1.1  mrg #endif
    283       1.1  mrg 
    284       1.1  mrg /* Local macros */
    285       1.1  mrg /* masked special-values bits */
    286       1.1  mrg #define SPECIALARG  (rhs->bits & DECSPECIAL)
    287       1.1  mrg #define SPECIALARGS ((lhs->bits | rhs->bits) & DECSPECIAL)
    288       1.1  mrg 
    289       1.1  mrg /* Diagnostic macros, etc. */
    290       1.1  mrg #if DECALLOC
    291       1.1  mrg /* Handle malloc/free accounting.  If enabled, our accountable routines */
    292       1.1  mrg /* are used; otherwise the code just goes straight to the system malloc */
    293       1.1  mrg /* and free routines. */
    294       1.1  mrg #define malloc(a) decMalloc(a)
    295       1.1  mrg #define free(a) decFree(a)
    296       1.1  mrg #define DECFENCE 0x5a		   /* corruption detector */
    297       1.1  mrg /* 'Our' malloc and free: */
    298       1.1  mrg static void *decMalloc(size_t);
    299       1.1  mrg static void  decFree(void *);
    300       1.1  mrg uInt decAllocBytes=0;		   /* count of bytes allocated */
    301       1.1  mrg /* Note that DECALLOC code only checks for storage buffer overflow. */
    302       1.1  mrg /* To check for memory leaks, the decAllocBytes variable must be */
    303       1.1  mrg /* checked to be 0 at appropriate times (e.g., after the test */
    304       1.1  mrg /* harness completes a set of tests).  This checking may be unreliable */
    305       1.1  mrg /* if the testing is done in a multi-thread environment. */
    306       1.1  mrg #endif
    307       1.1  mrg 
    308       1.1  mrg #if DECCHECK
    309       1.1  mrg /* Optional checking routines.	Enabling these means that decNumber */
    310       1.1  mrg /* and decContext operands to operator routines are checked for */
    311       1.1  mrg /* correctness.  This roughly doubles the execution time of the */
    312       1.1  mrg /* fastest routines (and adds 600+ bytes), so should not normally be */
    313       1.1  mrg /* used in 'production'. */
    314       1.1  mrg /* decCheckInexact is used to check that inexact results have a full */
    315       1.1  mrg /* complement of digits (where appropriate -- this is not the case */
    316       1.1  mrg /* for Quantize, for example) */
    317       1.1  mrg #define DECUNRESU ((decNumber *)(void *)0xffffffff)
    318       1.1  mrg #define DECUNUSED ((const decNumber *)(void *)0xffffffff)
    319       1.1  mrg #define DECUNCONT ((decContext *)(void *)(0xffffffff))
    320       1.1  mrg static Flag decCheckOperands(decNumber *, const decNumber *,
    321       1.1  mrg 			     const decNumber *, decContext *);
    322       1.1  mrg static Flag decCheckNumber(const decNumber *);
    323       1.1  mrg static void decCheckInexact(const decNumber *, decContext *);
    324       1.1  mrg #endif
    325       1.1  mrg 
    326       1.1  mrg #if DECTRACE || DECCHECK
    327       1.1  mrg /* Optional trace/debugging routines (may or may not be used) */
    328       1.1  mrg void decNumberShow(const decNumber *);	/* displays the components of a number */
    329       1.1  mrg static void decDumpAr(char, const Unit *, Int);
    330       1.1  mrg #endif
    331       1.1  mrg 
    332       1.1  mrg /* ================================================================== */
    333       1.1  mrg /* Conversions							      */
    334       1.1  mrg /* ================================================================== */
    335       1.1  mrg 
    336       1.1  mrg /* ------------------------------------------------------------------ */
    337       1.1  mrg /* from-int32 -- conversion from Int or uInt			      */
    338       1.1  mrg /*								      */
    339       1.1  mrg /*  dn is the decNumber to receive the integer			      */
    340       1.1  mrg /*  in or uin is the integer to be converted			      */
    341       1.1  mrg /*  returns dn							      */
    342       1.1  mrg /*								      */
    343       1.1  mrg /* No error is possible.					      */
    344       1.1  mrg /* ------------------------------------------------------------------ */
    345       1.1  mrg decNumber * decNumberFromInt32(decNumber *dn, Int in) {
    346       1.1  mrg   uInt unsig;
    347       1.1  mrg   if (in>=0) unsig=in;
    348       1.1  mrg    else {				/* negative (possibly BADINT) */
    349       1.1  mrg     if (in==BADINT) unsig=(uInt)1073741824*2; /* special case */
    350       1.1  mrg      else unsig=-in;			/* invert */
    351       1.1  mrg     }
    352       1.1  mrg   /* in is now positive */
    353       1.1  mrg   decNumberFromUInt32(dn, unsig);
    354       1.1  mrg   if (in<0) dn->bits=DECNEG;		/* sign needed */
    355       1.1  mrg   return dn;
    356       1.1  mrg   } /* decNumberFromInt32 */
    357       1.1  mrg 
    358       1.1  mrg decNumber * decNumberFromUInt32(decNumber *dn, uInt uin) {
    359       1.1  mrg   Unit *up;				/* work pointer */
    360       1.1  mrg   decNumberZero(dn);			/* clean */
    361       1.1  mrg   if (uin==0) return dn;		/* [or decGetDigits bad call] */
    362       1.1  mrg   for (up=dn->lsu; uin>0; up++) {
    363       1.1  mrg     *up=(Unit)(uin%(DECDPUNMAX+1));
    364       1.1  mrg     uin=uin/(DECDPUNMAX+1);
    365       1.1  mrg     }
    366       1.1  mrg   dn->digits=decGetDigits(dn->lsu, up-dn->lsu);
    367       1.1  mrg   return dn;
    368       1.1  mrg   } /* decNumberFromUInt32 */
    369       1.1  mrg 
    370       1.1  mrg /* ------------------------------------------------------------------ */
    371       1.1  mrg /* to-int32 -- conversion to Int or uInt			      */
    372       1.1  mrg /*								      */
    373       1.1  mrg /*  dn is the decNumber to convert				      */
    374       1.1  mrg /*  set is the context for reporting errors			      */
    375       1.1  mrg /*  returns the converted decNumber, or 0 if Invalid is set	      */
    376       1.1  mrg /*								      */
    377       1.1  mrg /* Invalid is set if the decNumber does not have exponent==0 or if    */
    378       1.1  mrg /* it is a NaN, Infinite, or out-of-range.			      */
    379       1.1  mrg /* ------------------------------------------------------------------ */
    380       1.1  mrg Int decNumberToInt32(const decNumber *dn, decContext *set) {
    381       1.1  mrg   #if DECCHECK
    382       1.1  mrg   if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
    383       1.1  mrg   #endif
    384       1.1  mrg 
    385       1.1  mrg   /* special or too many digits, or bad exponent */
    386       1.1  mrg   if (dn->bits&DECSPECIAL || dn->digits>10 || dn->exponent!=0) ; /* bad */
    387       1.1  mrg    else { /* is a finite integer with 10 or fewer digits */
    388       1.1  mrg     Int d;			   /* work */
    389       1.1  mrg     const Unit *up;		   /* .. */
    390       1.1  mrg     uInt hi=0, lo;		   /* .. */
    391       1.1  mrg     up=dn->lsu; 		   /* -> lsu */
    392       1.1  mrg     lo=*up;			   /* get 1 to 9 digits */
    393       1.1  mrg     #if DECDPUN>1		   /* split to higher */
    394       1.1  mrg       hi=lo/10;
    395       1.1  mrg       lo=lo%10;
    396       1.1  mrg     #endif
    397       1.1  mrg     up++;
    398       1.1  mrg     /* collect remaining Units, if any, into hi */
    399       1.1  mrg     for (d=DECDPUN; d<dn->digits; up++, d+=DECDPUN) hi+=*up*powers[d-1];
    400       1.1  mrg     /* now low has the lsd, hi the remainder */
    401       1.1  mrg     if (hi>214748364 || (hi==214748364 && lo>7)) { /* out of range? */
    402       1.1  mrg       /* most-negative is a reprieve */
    403       1.1  mrg       if (dn->bits&DECNEG && hi==214748364 && lo==8) return 0x80000000;
    404       1.1  mrg       /* bad -- drop through */
    405       1.1  mrg       }
    406       1.1  mrg      else { /* in-range always */
    407       1.1  mrg       Int i=X10(hi)+lo;
    408       1.1  mrg       if (dn->bits&DECNEG) return -i;
    409       1.1  mrg       return i;
    410       1.1  mrg       }
    411       1.1  mrg     } /* integer */
    412       1.1  mrg   decContextSetStatus(set, DEC_Invalid_operation); /* [may not return] */
    413       1.1  mrg   return 0;
    414       1.1  mrg   } /* decNumberToInt32 */
    415       1.1  mrg 
    416       1.1  mrg uInt decNumberToUInt32(const decNumber *dn, decContext *set) {
    417       1.1  mrg   #if DECCHECK
    418       1.1  mrg   if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
    419       1.1  mrg   #endif
    420       1.1  mrg   /* special or too many digits, or bad exponent, or negative (<0) */
    421       1.1  mrg   if (dn->bits&DECSPECIAL || dn->digits>10 || dn->exponent!=0
    422       1.1  mrg     || (dn->bits&DECNEG && !ISZERO(dn)));		    /* bad */
    423       1.1  mrg    else { /* is a finite integer with 10 or fewer digits */
    424       1.1  mrg     Int d;			   /* work */
    425       1.1  mrg     const Unit *up;		   /* .. */
    426       1.1  mrg     uInt hi=0, lo;		   /* .. */
    427       1.1  mrg     up=dn->lsu; 		   /* -> lsu */
    428       1.1  mrg     lo=*up;			   /* get 1 to 9 digits */
    429       1.1  mrg     #if DECDPUN>1		   /* split to higher */
    430       1.1  mrg       hi=lo/10;
    431       1.1  mrg       lo=lo%10;
    432       1.1  mrg     #endif
    433       1.1  mrg     up++;
    434       1.1  mrg     /* collect remaining Units, if any, into hi */
    435       1.1  mrg     for (d=DECDPUN; d<dn->digits; up++, d+=DECDPUN) hi+=*up*powers[d-1];
    436       1.1  mrg 
    437       1.1  mrg     /* now low has the lsd, hi the remainder */
    438       1.1  mrg     if (hi>429496729 || (hi==429496729 && lo>5)) ; /* no reprieve possible */
    439       1.1  mrg      else return X10(hi)+lo;
    440       1.1  mrg     } /* integer */
    441       1.1  mrg   decContextSetStatus(set, DEC_Invalid_operation); /* [may not return] */
    442       1.1  mrg   return 0;
    443       1.1  mrg   } /* decNumberToUInt32 */
    444       1.1  mrg 
    445       1.1  mrg /* ------------------------------------------------------------------ */
    446       1.1  mrg /* to-scientific-string -- conversion to numeric string 	      */
    447       1.1  mrg /* to-engineering-string -- conversion to numeric string	      */
    448       1.1  mrg /*								      */
    449       1.1  mrg /*   decNumberToString(dn, string);				      */
    450       1.1  mrg /*   decNumberToEngString(dn, string);				      */
    451       1.1  mrg /*								      */
    452       1.1  mrg /*  dn is the decNumber to convert				      */
    453       1.1  mrg /*  string is the string where the result will be laid out	      */
    454       1.1  mrg /*								      */
    455       1.1  mrg /*  string must be at least dn->digits+14 characters long	      */
    456       1.1  mrg /*								      */
    457       1.1  mrg /*  No error is possible, and no status can be set.		      */
    458       1.1  mrg /* ------------------------------------------------------------------ */
    459       1.1  mrg char * decNumberToString(const decNumber *dn, char *string){
    460       1.1  mrg   decToString(dn, string, 0);
    461       1.1  mrg   return string;
    462       1.1  mrg   } /* DecNumberToString */
    463       1.1  mrg 
    464       1.1  mrg char * decNumberToEngString(const decNumber *dn, char *string){
    465       1.1  mrg   decToString(dn, string, 1);
    466       1.1  mrg   return string;
    467       1.1  mrg   } /* DecNumberToEngString */
    468       1.1  mrg 
    469       1.1  mrg /* ------------------------------------------------------------------ */
    470       1.1  mrg /* to-number -- conversion from numeric string			      */
    471       1.1  mrg /*								      */
    472       1.1  mrg /* decNumberFromString -- convert string to decNumber		      */
    473       1.1  mrg /*   dn        -- the number structure to fill			      */
    474       1.1  mrg /*   chars[]   -- the string to convert ('\0' terminated)	      */
    475       1.1  mrg /*   set       -- the context used for processing any error,	      */
    476       1.1  mrg /*		  determining the maximum precision available	      */
    477       1.1  mrg /*		  (set.digits), determining the maximum and minimum   */
    478       1.1  mrg /*		  exponent (set.emax and set.emin), determining if    */
    479       1.1  mrg /*		  extended values are allowed, and checking the       */
    480       1.1  mrg /*		  rounding mode if overflow occurs or rounding is     */
    481       1.1  mrg /*		  needed.					      */
    482       1.1  mrg /*								      */
    483       1.1  mrg /* The length of the coefficient and the size of the exponent are     */
    484       1.1  mrg /* checked by this routine, so the correct error (Underflow or	      */
    485       1.1  mrg /* Overflow) can be reported or rounding applied, as necessary.       */
    486       1.1  mrg /*								      */
    487       1.1  mrg /* If bad syntax is detected, the result will be a quiet NaN.	      */
    488       1.1  mrg /* ------------------------------------------------------------------ */
    489       1.1  mrg decNumber * decNumberFromString(decNumber *dn, const char chars[],
    490       1.1  mrg 				decContext *set) {
    491       1.1  mrg   Int	exponent=0;		   /* working exponent [assume 0] */
    492       1.1  mrg   uByte bits=0; 		   /* working flags [assume +ve] */
    493       1.1  mrg   Unit	*res;			   /* where result will be built */
    494       1.1  mrg   Unit	resbuff[SD2U(DECBUFFER+9)];/* local buffer in case need temporary */
    495       1.1  mrg 				   /* [+9 allows for ln() constants] */
    496       1.1  mrg   Unit	*allocres=NULL; 	   /* -> allocated result, iff allocated */
    497       1.1  mrg   Int	d=0;			   /* count of digits found in decimal part */
    498       1.1  mrg   const char *dotchar=NULL;	   /* where dot was found */
    499       1.1  mrg   const char *cfirst=chars;	   /* -> first character of decimal part */
    500       1.1  mrg   const char *last=NULL;	   /* -> last digit of decimal part */
    501       1.1  mrg   const char *c;		   /* work */
    502       1.1  mrg   Unit	*up;			   /* .. */
    503       1.1  mrg   #if DECDPUN>1
    504       1.1  mrg   Int	cut, out;		   /* .. */
    505       1.1  mrg   #endif
    506       1.1  mrg   Int	residue;		   /* rounding residue */
    507       1.1  mrg   uInt	status=0;		   /* error code */
    508       1.1  mrg 
    509       1.1  mrg   #if DECCHECK
    510       1.1  mrg   if (decCheckOperands(DECUNRESU, DECUNUSED, DECUNUSED, set))
    511       1.1  mrg     return decNumberZero(dn);
    512       1.1  mrg   #endif
    513       1.1  mrg 
    514       1.1  mrg   do {				   /* status & malloc protection */
    515       1.1  mrg     for (c=chars;; c++) {	   /* -> input character */
    516       1.1  mrg       if (*c>='0' && *c<='9') {    /* test for Arabic digit */
    517       1.1  mrg 	last=c;
    518       1.1  mrg 	d++;			   /* count of real digits */
    519       1.1  mrg 	continue;		   /* still in decimal part */
    520       1.1  mrg 	}
    521       1.1  mrg       if (*c=='.' && dotchar==NULL) { /* first '.' */
    522       1.1  mrg 	dotchar=c;		   /* record offset into decimal part */
    523       1.1  mrg 	if (c==cfirst) cfirst++;   /* first digit must follow */
    524       1.1  mrg 	continue;}
    525       1.1  mrg       if (c==chars) {		   /* first in string... */
    526       1.1  mrg 	if (*c=='-') {		   /* valid - sign */
    527       1.1  mrg 	  cfirst++;
    528       1.1  mrg 	  bits=DECNEG;
    529       1.1  mrg 	  continue;}
    530       1.1  mrg 	if (*c=='+') {		   /* valid + sign */
    531       1.1  mrg 	  cfirst++;
    532       1.1  mrg 	  continue;}
    533       1.1  mrg 	}
    534       1.1  mrg       /* *c is not a digit, or a valid +, -, or '.' */
    535       1.1  mrg       break;
    536       1.1  mrg       } /* c */
    537       1.1  mrg 
    538       1.1  mrg     if (last==NULL) {		   /* no digits yet */
    539       1.1  mrg       status=DEC_Conversion_syntax;/* assume the worst */
    540       1.1  mrg       if (*c=='\0') break;	   /* and no more to come... */
    541       1.1  mrg       #if DECSUBSET
    542       1.1  mrg       /* if subset then infinities and NaNs are not allowed */
    543       1.1  mrg       if (!set->extended) break;   /* hopeless */
    544       1.1  mrg       #endif
    545       1.1  mrg       /* Infinities and NaNs are possible, here */
    546       1.1  mrg       if (dotchar!=NULL) break;    /* .. unless had a dot */
    547       1.1  mrg       decNumberZero(dn);	   /* be optimistic */
    548       1.1  mrg       if (decBiStr(c, "infinity", "INFINITY")
    549       1.1  mrg        || decBiStr(c, "inf", "INF")) {
    550       1.1  mrg 	dn->bits=bits | DECINF;
    551       1.1  mrg 	status=0;		   /* is OK */
    552       1.1  mrg 	break; /* all done */
    553       1.1  mrg 	}
    554       1.1  mrg       /* a NaN expected */
    555       1.1  mrg       /* 2003.09.10 NaNs are now permitted to have a sign */
    556       1.1  mrg       dn->bits=bits | DECNAN;	   /* assume simple NaN */
    557       1.1  mrg       if (*c=='s' || *c=='S') {    /* looks like an sNaN */
    558       1.1  mrg 	c++;
    559       1.1  mrg 	dn->bits=bits | DECSNAN;
    560       1.1  mrg 	}
    561       1.1  mrg       if (*c!='n' && *c!='N') break;	/* check caseless "NaN" */
    562       1.1  mrg       c++;
    563       1.1  mrg       if (*c!='a' && *c!='A') break;	/* .. */
    564       1.1  mrg       c++;
    565       1.1  mrg       if (*c!='n' && *c!='N') break;	/* .. */
    566       1.1  mrg       c++;
    567       1.1  mrg       /* now either nothing, or nnnn payload, expected */
    568       1.1  mrg       /* -> start of integer and skip leading 0s [including plain 0] */
    569       1.1  mrg       for (cfirst=c; *cfirst=='0';) cfirst++;
    570       1.1  mrg       if (*cfirst=='\0') {	   /* "NaN" or "sNaN", maybe with all 0s */
    571       1.1  mrg 	status=0;		   /* it's good */
    572       1.1  mrg 	break;			   /* .. */
    573       1.1  mrg 	}
    574       1.1  mrg       /* something other than 0s; setup last and d as usual [no dots] */
    575       1.1  mrg       for (c=cfirst;; c++, d++) {
    576       1.1  mrg 	if (*c<'0' || *c>'9') break; /* test for Arabic digit */
    577       1.1  mrg 	last=c;
    578       1.1  mrg 	}
    579       1.1  mrg       if (*c!='\0') break;	   /* not all digits */
    580       1.1  mrg       if (d>set->digits-1) {
    581       1.1  mrg 	/* [NB: payload in a decNumber can be full length unless */
    582       1.1  mrg 	/* clamped, in which case can only be digits-1] */
    583       1.1  mrg 	if (set->clamp) break;
    584       1.1  mrg 	if (d>set->digits) break;
    585       1.1  mrg 	} /* too many digits? */
    586       1.1  mrg       /* good; drop through to convert the integer to coefficient */
    587       1.1  mrg       status=0; 		   /* syntax is OK */
    588       1.1  mrg       bits=dn->bits;		   /* for copy-back */
    589       1.1  mrg       } /* last==NULL */
    590       1.1  mrg 
    591       1.1  mrg      else if (*c!='\0') {	   /* more to process... */
    592       1.1  mrg       /* had some digits; exponent is only valid sequence now */
    593       1.1  mrg       Flag nege;		   /* 1=negative exponent */
    594       1.1  mrg       const char *firstexp;	   /* -> first significant exponent digit */
    595       1.1  mrg       status=DEC_Conversion_syntax;/* assume the worst */
    596       1.1  mrg       if (*c!='e' && *c!='E') break;
    597       1.1  mrg       /* Found 'e' or 'E' -- now process explicit exponent */
    598       1.1  mrg       /* 1998.07.11: sign no longer required */
    599       1.1  mrg       nege=0;
    600       1.1  mrg       c++;			   /* to (possible) sign */
    601       1.1  mrg       if (*c=='-') {nege=1; c++;}
    602       1.1  mrg        else if (*c=='+') c++;
    603       1.1  mrg       if (*c=='\0') break;
    604       1.1  mrg 
    605       1.1  mrg       for (; *c=='0' && *(c+1)!='\0';) c++;  /* strip insignificant zeros */
    606       1.1  mrg       firstexp=c;			     /* save exponent digit place */
    607       1.1  mrg       for (; ;c++) {
    608       1.1  mrg 	if (*c<'0' || *c>'9') break;	     /* not a digit */
    609       1.1  mrg 	exponent=X10(exponent)+(Int)*c-(Int)'0';
    610       1.1  mrg 	} /* c */
    611       1.1  mrg       /* if not now on a '\0', *c must not be a digit */
    612       1.1  mrg       if (*c!='\0') break;
    613       1.1  mrg 
    614       1.1  mrg       /* (this next test must be after the syntax checks) */
    615       1.1  mrg       /* if it was too long the exponent may have wrapped, so check */
    616       1.1  mrg       /* carefully and set it to a certain overflow if wrap possible */
    617       1.1  mrg       if (c>=firstexp+9+1) {
    618       1.1  mrg 	if (c>firstexp+9+1 || *firstexp>'1') exponent=DECNUMMAXE*2;
    619       1.1  mrg 	/* [up to 1999999999 is OK, for example 1E-1000000998] */
    620       1.1  mrg 	}
    621       1.1  mrg       if (nege) exponent=-exponent;	/* was negative */
    622       1.1  mrg       status=0; 			/* is OK */
    623       1.1  mrg       } /* stuff after digits */
    624       1.1  mrg 
    625       1.1  mrg     /* Here when whole string has been inspected; syntax is good */
    626       1.1  mrg     /* cfirst->first digit (never dot), last->last digit (ditto) */
    627       1.1  mrg 
    628       1.1  mrg     /* strip leading zeros/dot [leave final 0 if all 0's] */
    629       1.1  mrg     if (*cfirst=='0') { 		/* [cfirst has stepped over .] */
    630       1.1  mrg       for (c=cfirst; c<last; c++, cfirst++) {
    631       1.1  mrg 	if (*c=='.') continue;		/* ignore dots */
    632       1.1  mrg 	if (*c!='0') break;		/* non-zero found */
    633       1.1  mrg 	d--;				/* 0 stripped */
    634       1.1  mrg 	} /* c */
    635       1.1  mrg       #if DECSUBSET
    636       1.1  mrg       /* make a rapid exit for easy zeros if !extended */
    637       1.1  mrg       if (*cfirst=='0' && !set->extended) {
    638       1.1  mrg 	decNumberZero(dn);		/* clean result */
    639       1.1  mrg 	break;				/* [could be return] */
    640       1.1  mrg 	}
    641       1.1  mrg       #endif
    642       1.1  mrg       } /* at least one leading 0 */
    643       1.1  mrg 
    644       1.1  mrg     /* Handle decimal point... */
    645       1.1  mrg     if (dotchar!=NULL && dotchar<last)	/* non-trailing '.' found? */
    646       1.1  mrg       exponent-=(last-dotchar); 	/* adjust exponent */
    647       1.1  mrg     /* [we can now ignore the .] */
    648       1.1  mrg 
    649       1.1  mrg     /* OK, the digits string is good.  Assemble in the decNumber, or in */
    650       1.1  mrg     /* a temporary units array if rounding is needed */
    651       1.1  mrg     if (d<=set->digits) res=dn->lsu;	/* fits into supplied decNumber */
    652       1.1  mrg      else {				/* rounding needed */
    653       1.1  mrg       Int needbytes=D2U(d)*sizeof(Unit);/* bytes needed */
    654       1.1  mrg       res=resbuff;			/* assume use local buffer */
    655       1.1  mrg       if (needbytes>(Int)sizeof(resbuff)) { /* too big for local */
    656       1.1  mrg 	allocres=(Unit *)malloc(needbytes);
    657       1.1  mrg 	if (allocres==NULL) {status|=DEC_Insufficient_storage; break;}
    658       1.1  mrg 	res=allocres;
    659       1.1  mrg 	}
    660       1.1  mrg       }
    661       1.1  mrg     /* res now -> number lsu, buffer, or allocated storage for Unit array */
    662       1.1  mrg 
    663       1.1  mrg     /* Place the coefficient into the selected Unit array */
    664       1.1  mrg     /* [this is often 70% of the cost of this function when DECDPUN>1] */
    665       1.1  mrg     #if DECDPUN>1
    666       1.1  mrg     out=0;			   /* accumulator */
    667       1.1  mrg     up=res+D2U(d)-1;		   /* -> msu */
    668       1.1  mrg     cut=d-(up-res)*DECDPUN;	   /* digits in top unit */
    669       1.1  mrg     for (c=cfirst;; c++) {	   /* along the digits */
    670       1.1  mrg       if (*c=='.') continue;	   /* ignore '.' [don't decrement cut] */
    671       1.1  mrg       out=X10(out)+(Int)*c-(Int)'0';
    672       1.1  mrg       if (c==last) break;	   /* done [never get to trailing '.'] */
    673       1.1  mrg       cut--;
    674       1.1  mrg       if (cut>0) continue;	   /* more for this unit */
    675       1.1  mrg       *up=(Unit)out;		   /* write unit */
    676       1.1  mrg       up--;			   /* prepare for unit below.. */
    677       1.1  mrg       cut=DECDPUN;		   /* .. */
    678       1.1  mrg       out=0;			   /* .. */
    679       1.1  mrg       } /* c */
    680       1.1  mrg     *up=(Unit)out;		   /* write lsu */
    681       1.1  mrg 
    682       1.1  mrg     #else
    683       1.1  mrg     /* DECDPUN==1 */
    684       1.1  mrg     up=res;			   /* -> lsu */
    685       1.1  mrg     for (c=last; c>=cfirst; c--) { /* over each character, from least */
    686       1.1  mrg       if (*c=='.') continue;	   /* ignore . [don't step up] */
    687       1.1  mrg       *up=(Unit)((Int)*c-(Int)'0');
    688       1.1  mrg       up++;
    689       1.1  mrg       } /* c */
    690       1.1  mrg     #endif
    691       1.1  mrg 
    692       1.1  mrg     dn->bits=bits;
    693       1.1  mrg     dn->exponent=exponent;
    694       1.1  mrg     dn->digits=d;
    695       1.1  mrg 
    696       1.1  mrg     /* if not in number (too long) shorten into the number */
    697       1.1  mrg     if (d>set->digits) {
    698       1.1  mrg       residue=0;
    699       1.1  mrg       decSetCoeff(dn, set, res, d, &residue, &status);
    700       1.1  mrg       /* always check for overflow or subnormal and round as needed */
    701       1.1  mrg       decFinalize(dn, set, &residue, &status);
    702       1.1  mrg       }
    703       1.1  mrg      else { /* no rounding, but may still have overflow or subnormal */
    704       1.1  mrg       /* [these tests are just for performance; finalize repeats them] */
    705       1.1  mrg       if ((dn->exponent-1<set->emin-dn->digits)
    706       1.1  mrg        || (dn->exponent-1>set->emax-set->digits)) {
    707       1.1  mrg 	residue=0;
    708       1.1  mrg 	decFinalize(dn, set, &residue, &status);
    709       1.1  mrg 	}
    710       1.1  mrg       }
    711       1.1  mrg     /* decNumberShow(dn); */
    712       1.1  mrg     } while(0); 			/* [for break] */
    713       1.1  mrg 
    714   1.1.1.2  mrg   free(allocres);	/* drop any storage used */
    715       1.1  mrg   if (status!=0) decStatus(dn, status, set);
    716       1.1  mrg   return dn;
    717       1.1  mrg   } /* decNumberFromString */
    718       1.1  mrg 
    719       1.1  mrg /* ================================================================== */
    720       1.1  mrg /* Operators							      */
    721       1.1  mrg /* ================================================================== */
    722       1.1  mrg 
    723       1.1  mrg /* ------------------------------------------------------------------ */
    724       1.1  mrg /* decNumberAbs -- absolute value operator			      */
    725       1.1  mrg /*								      */
    726       1.1  mrg /*   This computes C = abs(A)					      */
    727       1.1  mrg /*								      */
    728       1.1  mrg /*   res is C, the result.  C may be A				      */
    729       1.1  mrg /*   rhs is A							      */
    730       1.1  mrg /*   set is the context 					      */
    731       1.1  mrg /*								      */
    732       1.1  mrg /* See also decNumberCopyAbs for a quiet bitwise version of this.     */
    733       1.1  mrg /* C must have space for set->digits digits.			      */
    734       1.1  mrg /* ------------------------------------------------------------------ */
    735       1.1  mrg /* This has the same effect as decNumberPlus unless A is negative,    */
    736       1.1  mrg /* in which case it has the same effect as decNumberMinus.	      */
    737       1.1  mrg /* ------------------------------------------------------------------ */
    738       1.1  mrg decNumber * decNumberAbs(decNumber *res, const decNumber *rhs,
    739       1.1  mrg 			 decContext *set) {
    740       1.1  mrg   decNumber dzero;			/* for 0 */
    741       1.1  mrg   uInt status=0;			/* accumulator */
    742       1.1  mrg 
    743       1.1  mrg   #if DECCHECK
    744       1.1  mrg   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
    745       1.1  mrg   #endif
    746       1.1  mrg 
    747       1.1  mrg   decNumberZero(&dzero);		/* set 0 */
    748       1.1  mrg   dzero.exponent=rhs->exponent; 	/* [no coefficient expansion] */
    749       1.1  mrg   decAddOp(res, &dzero, rhs, set, (uByte)(rhs->bits & DECNEG), &status);
    750       1.1  mrg   if (status!=0) decStatus(res, status, set);
    751       1.1  mrg   #if DECCHECK
    752       1.1  mrg   decCheckInexact(res, set);
    753       1.1  mrg   #endif
    754       1.1  mrg   return res;
    755       1.1  mrg   } /* decNumberAbs */
    756       1.1  mrg 
    757       1.1  mrg /* ------------------------------------------------------------------ */
    758       1.1  mrg /* decNumberAdd -- add two Numbers				      */
    759       1.1  mrg /*								      */
    760       1.1  mrg /*   This computes C = A + B					      */
    761       1.1  mrg /*								      */
    762       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X+X)	      */
    763       1.1  mrg /*   lhs is A							      */
    764       1.1  mrg /*   rhs is B							      */
    765       1.1  mrg /*   set is the context 					      */
    766       1.1  mrg /*								      */
    767       1.1  mrg /* C must have space for set->digits digits.			      */
    768       1.1  mrg /* ------------------------------------------------------------------ */
    769       1.1  mrg /* This just calls the routine shared with Subtract		      */
    770       1.1  mrg decNumber * decNumberAdd(decNumber *res, const decNumber *lhs,
    771       1.1  mrg 			 const decNumber *rhs, decContext *set) {
    772       1.1  mrg   uInt status=0;			/* accumulator */
    773       1.1  mrg   decAddOp(res, lhs, rhs, set, 0, &status);
    774       1.1  mrg   if (status!=0) decStatus(res, status, set);
    775       1.1  mrg   #if DECCHECK
    776       1.1  mrg   decCheckInexact(res, set);
    777       1.1  mrg   #endif
    778       1.1  mrg   return res;
    779       1.1  mrg   } /* decNumberAdd */
    780       1.1  mrg 
    781       1.1  mrg /* ------------------------------------------------------------------ */
    782       1.1  mrg /* decNumberAnd -- AND two Numbers, digitwise			      */
    783       1.1  mrg /*								      */
    784       1.1  mrg /*   This computes C = A & B					      */
    785       1.1  mrg /*								      */
    786       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X&X)	      */
    787       1.1  mrg /*   lhs is A							      */
    788       1.1  mrg /*   rhs is B							      */
    789       1.1  mrg /*   set is the context (used for result length and error report)     */
    790       1.1  mrg /*								      */
    791       1.1  mrg /* C must have space for set->digits digits.			      */
    792       1.1  mrg /*								      */
    793       1.1  mrg /* Logical function restrictions apply (see above); a NaN is	      */
    794       1.1  mrg /* returned with Invalid_operation if a restriction is violated.      */
    795       1.1  mrg /* ------------------------------------------------------------------ */
    796       1.1  mrg decNumber * decNumberAnd(decNumber *res, const decNumber *lhs,
    797       1.1  mrg 			 const decNumber *rhs, decContext *set) {
    798       1.1  mrg   const Unit *ua, *ub;			/* -> operands */
    799       1.1  mrg   const Unit *msua, *msub;		/* -> operand msus */
    800       1.1  mrg   Unit *uc,  *msuc;			/* -> result and its msu */
    801       1.1  mrg   Int	msudigs;			/* digits in res msu */
    802       1.1  mrg   #if DECCHECK
    803       1.1  mrg   if (decCheckOperands(res, lhs, rhs, set)) return res;
    804       1.1  mrg   #endif
    805       1.1  mrg 
    806       1.1  mrg   if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
    807       1.1  mrg    || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
    808       1.1  mrg     decStatus(res, DEC_Invalid_operation, set);
    809       1.1  mrg     return res;
    810       1.1  mrg     }
    811       1.1  mrg 
    812       1.1  mrg   /* operands are valid */
    813       1.1  mrg   ua=lhs->lsu;				/* bottom-up */
    814       1.1  mrg   ub=rhs->lsu;				/* .. */
    815       1.1  mrg   uc=res->lsu;				/* .. */
    816       1.1  mrg   msua=ua+D2U(lhs->digits)-1;		/* -> msu of lhs */
    817       1.1  mrg   msub=ub+D2U(rhs->digits)-1;		/* -> msu of rhs */
    818       1.1  mrg   msuc=uc+D2U(set->digits)-1;		/* -> msu of result */
    819       1.1  mrg   msudigs=MSUDIGITS(set->digits);	/* [faster than remainder] */
    820       1.1  mrg   for (; uc<=msuc; ua++, ub++, uc++) {	/* Unit loop */
    821       1.1  mrg     Unit a, b;				/* extract units */
    822       1.1  mrg     if (ua>msua) a=0;
    823       1.1  mrg      else a=*ua;
    824       1.1  mrg     if (ub>msub) b=0;
    825       1.1  mrg      else b=*ub;
    826       1.1  mrg     *uc=0;				/* can now write back */
    827       1.1  mrg     if (a|b) {				/* maybe 1 bits to examine */
    828       1.1  mrg       Int i, j;
    829       1.1  mrg       *uc=0;				/* can now write back */
    830       1.1  mrg       /* This loop could be unrolled and/or use BIN2BCD tables */
    831       1.1  mrg       for (i=0; i<DECDPUN; i++) {
    832       1.1  mrg 	if (a&b&1) *uc=*uc+(Unit)powers[i];  /* effect AND */
    833       1.1  mrg 	j=a%10;
    834       1.1  mrg 	a=a/10;
    835       1.1  mrg 	j|=b%10;
    836       1.1  mrg 	b=b/10;
    837       1.1  mrg 	if (j>1) {
    838       1.1  mrg 	  decStatus(res, DEC_Invalid_operation, set);
    839       1.1  mrg 	  return res;
    840       1.1  mrg 	  }
    841       1.1  mrg 	if (uc==msuc && i==msudigs-1) break; /* just did final digit */
    842       1.1  mrg 	} /* each digit */
    843       1.1  mrg       } /* both OK */
    844       1.1  mrg     } /* each unit */
    845       1.1  mrg   /* [here uc-1 is the msu of the result] */
    846       1.1  mrg   res->digits=decGetDigits(res->lsu, uc-res->lsu);
    847       1.1  mrg   res->exponent=0;			/* integer */
    848       1.1  mrg   res->bits=0;				/* sign=0 */
    849       1.1  mrg   return res;  /* [no status to set] */
    850       1.1  mrg   } /* decNumberAnd */
    851       1.1  mrg 
    852       1.1  mrg /* ------------------------------------------------------------------ */
    853       1.1  mrg /* decNumberCompare -- compare two Numbers			      */
    854       1.1  mrg /*								      */
    855       1.1  mrg /*   This computes C = A ? B					      */
    856       1.1  mrg /*								      */
    857       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
    858       1.1  mrg /*   lhs is A							      */
    859       1.1  mrg /*   rhs is B							      */
    860       1.1  mrg /*   set is the context 					      */
    861       1.1  mrg /*								      */
    862       1.1  mrg /* C must have space for one digit (or NaN).			      */
    863       1.1  mrg /* ------------------------------------------------------------------ */
    864       1.1  mrg decNumber * decNumberCompare(decNumber *res, const decNumber *lhs,
    865       1.1  mrg 			     const decNumber *rhs, decContext *set) {
    866       1.1  mrg   uInt status=0;			/* accumulator */
    867       1.1  mrg   decCompareOp(res, lhs, rhs, set, COMPARE, &status);
    868       1.1  mrg   if (status!=0) decStatus(res, status, set);
    869       1.1  mrg   return res;
    870       1.1  mrg   } /* decNumberCompare */
    871       1.1  mrg 
    872       1.1  mrg /* ------------------------------------------------------------------ */
    873       1.1  mrg /* decNumberCompareSignal -- compare, signalling on all NaNs	      */
    874       1.1  mrg /*								      */
    875       1.1  mrg /*   This computes C = A ? B					      */
    876       1.1  mrg /*								      */
    877       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
    878       1.1  mrg /*   lhs is A							      */
    879       1.1  mrg /*   rhs is B							      */
    880       1.1  mrg /*   set is the context 					      */
    881       1.1  mrg /*								      */
    882       1.1  mrg /* C must have space for one digit (or NaN).			      */
    883       1.1  mrg /* ------------------------------------------------------------------ */
    884       1.1  mrg decNumber * decNumberCompareSignal(decNumber *res, const decNumber *lhs,
    885       1.1  mrg 				   const decNumber *rhs, decContext *set) {
    886       1.1  mrg   uInt status=0;			/* accumulator */
    887       1.1  mrg   decCompareOp(res, lhs, rhs, set, COMPSIG, &status);
    888       1.1  mrg   if (status!=0) decStatus(res, status, set);
    889       1.1  mrg   return res;
    890       1.1  mrg   } /* decNumberCompareSignal */
    891       1.1  mrg 
    892       1.1  mrg /* ------------------------------------------------------------------ */
    893       1.1  mrg /* decNumberCompareTotal -- compare two Numbers, using total ordering */
    894       1.1  mrg /*								      */
    895       1.1  mrg /*   This computes C = A ? B, under total ordering		      */
    896       1.1  mrg /*								      */
    897       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
    898       1.1  mrg /*   lhs is A							      */
    899       1.1  mrg /*   rhs is B							      */
    900       1.1  mrg /*   set is the context 					      */
    901       1.1  mrg /*								      */
    902       1.1  mrg /* C must have space for one digit; the result will always be one of  */
    903       1.1  mrg /* -1, 0, or 1. 						      */
    904       1.1  mrg /* ------------------------------------------------------------------ */
    905       1.1  mrg decNumber * decNumberCompareTotal(decNumber *res, const decNumber *lhs,
    906       1.1  mrg 				  const decNumber *rhs, decContext *set) {
    907       1.1  mrg   uInt status=0;			/* accumulator */
    908       1.1  mrg   decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
    909       1.1  mrg   if (status!=0) decStatus(res, status, set);
    910       1.1  mrg   return res;
    911       1.1  mrg   } /* decNumberCompareTotal */
    912       1.1  mrg 
    913       1.1  mrg /* ------------------------------------------------------------------ */
    914       1.1  mrg /* decNumberCompareTotalMag -- compare, total ordering of magnitudes  */
    915       1.1  mrg /*								      */
    916       1.1  mrg /*   This computes C = |A| ? |B|, under total ordering		      */
    917       1.1  mrg /*								      */
    918       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
    919       1.1  mrg /*   lhs is A							      */
    920       1.1  mrg /*   rhs is B							      */
    921       1.1  mrg /*   set is the context 					      */
    922       1.1  mrg /*								      */
    923       1.1  mrg /* C must have space for one digit; the result will always be one of  */
    924       1.1  mrg /* -1, 0, or 1. 						      */
    925       1.1  mrg /* ------------------------------------------------------------------ */
    926       1.1  mrg decNumber * decNumberCompareTotalMag(decNumber *res, const decNumber *lhs,
    927       1.1  mrg 				     const decNumber *rhs, decContext *set) {
    928       1.1  mrg   uInt status=0;		   /* accumulator */
    929       1.1  mrg   uInt needbytes;		   /* for space calculations */
    930       1.1  mrg   decNumber bufa[D2N(DECBUFFER+1)];/* +1 in case DECBUFFER=0 */
    931       1.1  mrg   decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
    932       1.1  mrg   decNumber bufb[D2N(DECBUFFER+1)];
    933       1.1  mrg   decNumber *allocbufb=NULL;	   /* -> allocated bufb, iff allocated */
    934       1.1  mrg   decNumber *a, *b;		   /* temporary pointers */
    935       1.1  mrg 
    936       1.1  mrg   #if DECCHECK
    937       1.1  mrg   if (decCheckOperands(res, lhs, rhs, set)) return res;
    938       1.1  mrg   #endif
    939       1.1  mrg 
    940       1.1  mrg   do {					/* protect allocated storage */
    941       1.1  mrg     /* if either is negative, take a copy and absolute */
    942       1.1  mrg     if (decNumberIsNegative(lhs)) {	/* lhs<0 */
    943       1.1  mrg       a=bufa;
    944       1.1  mrg       needbytes=sizeof(decNumber)+(D2U(lhs->digits)-1)*sizeof(Unit);
    945       1.1  mrg       if (needbytes>sizeof(bufa)) {	/* need malloc space */
    946       1.1  mrg 	allocbufa=(decNumber *)malloc(needbytes);
    947       1.1  mrg 	if (allocbufa==NULL) {		/* hopeless -- abandon */
    948       1.1  mrg 	  status|=DEC_Insufficient_storage;
    949       1.1  mrg 	  break;}
    950       1.1  mrg 	a=allocbufa;			/* use the allocated space */
    951       1.1  mrg 	}
    952       1.1  mrg       decNumberCopy(a, lhs);		/* copy content */
    953       1.1  mrg       a->bits&=~DECNEG; 		/* .. and clear the sign */
    954       1.1  mrg       lhs=a;				/* use copy from here on */
    955       1.1  mrg       }
    956       1.1  mrg     if (decNumberIsNegative(rhs)) {	/* rhs<0 */
    957       1.1  mrg       b=bufb;
    958       1.1  mrg       needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
    959       1.1  mrg       if (needbytes>sizeof(bufb)) {	/* need malloc space */
    960       1.1  mrg 	allocbufb=(decNumber *)malloc(needbytes);
    961       1.1  mrg 	if (allocbufb==NULL) {		/* hopeless -- abandon */
    962       1.1  mrg 	  status|=DEC_Insufficient_storage;
    963       1.1  mrg 	  break;}
    964       1.1  mrg 	b=allocbufb;			/* use the allocated space */
    965       1.1  mrg 	}
    966       1.1  mrg       decNumberCopy(b, rhs);		/* copy content */
    967       1.1  mrg       b->bits&=~DECNEG; 		/* .. and clear the sign */
    968       1.1  mrg       rhs=b;				/* use copy from here on */
    969       1.1  mrg       }
    970       1.1  mrg     decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
    971       1.1  mrg     } while(0); 			/* end protected */
    972       1.1  mrg 
    973   1.1.1.2  mrg   free(allocbufa); /* drop any storage used */
    974   1.1.1.2  mrg   free(allocbufb); /* .. */
    975       1.1  mrg   if (status!=0) decStatus(res, status, set);
    976       1.1  mrg   return res;
    977       1.1  mrg   } /* decNumberCompareTotalMag */
    978       1.1  mrg 
    979       1.1  mrg /* ------------------------------------------------------------------ */
    980       1.1  mrg /* decNumberDivide -- divide one number by another		      */
    981       1.1  mrg /*								      */
    982       1.1  mrg /*   This computes C = A / B					      */
    983       1.1  mrg /*								      */
    984       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X/X)	      */
    985       1.1  mrg /*   lhs is A							      */
    986       1.1  mrg /*   rhs is B							      */
    987       1.1  mrg /*   set is the context 					      */
    988       1.1  mrg /*								      */
    989       1.1  mrg /* C must have space for set->digits digits.			      */
    990       1.1  mrg /* ------------------------------------------------------------------ */
    991       1.1  mrg decNumber * decNumberDivide(decNumber *res, const decNumber *lhs,
    992       1.1  mrg 			    const decNumber *rhs, decContext *set) {
    993       1.1  mrg   uInt status=0;			/* accumulator */
    994       1.1  mrg   decDivideOp(res, lhs, rhs, set, DIVIDE, &status);
    995       1.1  mrg   if (status!=0) decStatus(res, status, set);
    996       1.1  mrg   #if DECCHECK
    997       1.1  mrg   decCheckInexact(res, set);
    998       1.1  mrg   #endif
    999       1.1  mrg   return res;
   1000       1.1  mrg   } /* decNumberDivide */
   1001       1.1  mrg 
   1002       1.1  mrg /* ------------------------------------------------------------------ */
   1003       1.1  mrg /* decNumberDivideInteger -- divide and return integer quotient       */
   1004       1.1  mrg /*								      */
   1005       1.1  mrg /*   This computes C = A # B, where # is the integer divide operator  */
   1006       1.1  mrg /*								      */
   1007       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X#X)	      */
   1008       1.1  mrg /*   lhs is A							      */
   1009       1.1  mrg /*   rhs is B							      */
   1010       1.1  mrg /*   set is the context 					      */
   1011       1.1  mrg /*								      */
   1012       1.1  mrg /* C must have space for set->digits digits.			      */
   1013       1.1  mrg /* ------------------------------------------------------------------ */
   1014       1.1  mrg decNumber * decNumberDivideInteger(decNumber *res, const decNumber *lhs,
   1015       1.1  mrg 				   const decNumber *rhs, decContext *set) {
   1016       1.1  mrg   uInt status=0;			/* accumulator */
   1017       1.1  mrg   decDivideOp(res, lhs, rhs, set, DIVIDEINT, &status);
   1018       1.1  mrg   if (status!=0) decStatus(res, status, set);
   1019       1.1  mrg   return res;
   1020       1.1  mrg   } /* decNumberDivideInteger */
   1021       1.1  mrg 
   1022       1.1  mrg /* ------------------------------------------------------------------ */
   1023       1.1  mrg /* decNumberExp -- exponentiation				      */
   1024       1.1  mrg /*								      */
   1025       1.1  mrg /*   This computes C = exp(A)					      */
   1026       1.1  mrg /*								      */
   1027       1.1  mrg /*   res is C, the result.  C may be A				      */
   1028       1.1  mrg /*   rhs is A							      */
   1029       1.1  mrg /*   set is the context; note that rounding mode has no effect	      */
   1030       1.1  mrg /*								      */
   1031       1.1  mrg /* C must have space for set->digits digits.			      */
   1032       1.1  mrg /*								      */
   1033       1.1  mrg /* Mathematical function restrictions apply (see above); a NaN is     */
   1034       1.1  mrg /* returned with Invalid_operation if a restriction is violated.      */
   1035       1.1  mrg /*								      */
   1036       1.1  mrg /* Finite results will always be full precision and Inexact, except   */
   1037       1.1  mrg /* when A is a zero or -Infinity (giving 1 or 0 respectively).	      */
   1038       1.1  mrg /*								      */
   1039       1.1  mrg /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
   1040       1.1  mrg /* almost always be correctly rounded, but may be up to 1 ulp in      */
   1041       1.1  mrg /* error in rare cases. 					      */
   1042       1.1  mrg /* ------------------------------------------------------------------ */
   1043       1.1  mrg /* This is a wrapper for decExpOp which can handle the slightly wider */
   1044       1.1  mrg /* (double) range needed by Ln (which has to be able to calculate     */
   1045       1.1  mrg /* exp(-a) where a can be the tiniest number (Ntiny).		      */
   1046       1.1  mrg /* ------------------------------------------------------------------ */
   1047       1.1  mrg decNumber * decNumberExp(decNumber *res, const decNumber *rhs,
   1048       1.1  mrg 			 decContext *set) {
   1049       1.1  mrg   uInt status=0;			/* accumulator */
   1050       1.1  mrg   #if DECSUBSET
   1051       1.1  mrg   decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
   1052       1.1  mrg   #endif
   1053       1.1  mrg 
   1054       1.1  mrg   #if DECCHECK
   1055       1.1  mrg   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1056       1.1  mrg   #endif
   1057       1.1  mrg 
   1058       1.1  mrg   /* Check restrictions; these restrictions ensure that if h=8 (see */
   1059       1.1  mrg   /* decExpOp) then the result will either overflow or underflow to 0. */
   1060       1.1  mrg   /* Other math functions restrict the input range, too, for inverses. */
   1061       1.1  mrg   /* If not violated then carry out the operation. */
   1062       1.1  mrg   if (!decCheckMath(rhs, set, &status)) do { /* protect allocation */
   1063       1.1  mrg     #if DECSUBSET
   1064       1.1  mrg     if (!set->extended) {
   1065       1.1  mrg       /* reduce operand and set lostDigits status, as needed */
   1066       1.1  mrg       if (rhs->digits>set->digits) {
   1067       1.1  mrg 	allocrhs=decRoundOperand(rhs, set, &status);
   1068       1.1  mrg 	if (allocrhs==NULL) break;
   1069       1.1  mrg 	rhs=allocrhs;
   1070       1.1  mrg 	}
   1071       1.1  mrg       }
   1072       1.1  mrg     #endif
   1073       1.1  mrg     decExpOp(res, rhs, set, &status);
   1074       1.1  mrg     } while(0); 			/* end protected */
   1075       1.1  mrg 
   1076       1.1  mrg   #if DECSUBSET
   1077   1.1.1.2  mrg   free(allocrhs);	/* drop any storage used */
   1078       1.1  mrg   #endif
   1079       1.1  mrg   /* apply significant status */
   1080       1.1  mrg   if (status!=0) decStatus(res, status, set);
   1081       1.1  mrg   #if DECCHECK
   1082       1.1  mrg   decCheckInexact(res, set);
   1083       1.1  mrg   #endif
   1084       1.1  mrg   return res;
   1085       1.1  mrg   } /* decNumberExp */
   1086       1.1  mrg 
   1087       1.1  mrg /* ------------------------------------------------------------------ */
   1088       1.1  mrg /* decNumberFMA -- fused multiply add				      */
   1089       1.1  mrg /*								      */
   1090       1.1  mrg /*   This computes D = (A * B) + C with only one rounding	      */
   1091       1.1  mrg /*								      */
   1092       1.1  mrg /*   res is D, the result.  D may be A or B or C (e.g., X=FMA(X,X,X)) */
   1093       1.1  mrg /*   lhs is A							      */
   1094       1.1  mrg /*   rhs is B							      */
   1095       1.1  mrg /*   fhs is C [far hand side]					      */
   1096       1.1  mrg /*   set is the context 					      */
   1097       1.1  mrg /*								      */
   1098       1.1  mrg /* Mathematical function restrictions apply (see above); a NaN is     */
   1099       1.1  mrg /* returned with Invalid_operation if a restriction is violated.      */
   1100       1.1  mrg /*								      */
   1101       1.1  mrg /* C must have space for set->digits digits.			      */
   1102       1.1  mrg /* ------------------------------------------------------------------ */
   1103       1.1  mrg decNumber * decNumberFMA(decNumber *res, const decNumber *lhs,
   1104       1.1  mrg 			 const decNumber *rhs, const decNumber *fhs,
   1105       1.1  mrg 			 decContext *set) {
   1106       1.1  mrg   uInt status=0;		   /* accumulator */
   1107       1.1  mrg   decContext dcmul;		   /* context for the multiplication */
   1108       1.1  mrg   uInt needbytes;		   /* for space calculations */
   1109       1.1  mrg   decNumber bufa[D2N(DECBUFFER*2+1)];
   1110       1.1  mrg   decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
   1111       1.1  mrg   decNumber *acc;		   /* accumulator pointer */
   1112       1.1  mrg   decNumber dzero;		   /* work */
   1113       1.1  mrg 
   1114       1.1  mrg   #if DECCHECK
   1115       1.1  mrg   if (decCheckOperands(res, lhs, rhs, set)) return res;
   1116       1.1  mrg   if (decCheckOperands(res, fhs, DECUNUSED, set)) return res;
   1117       1.1  mrg   #endif
   1118       1.1  mrg 
   1119       1.1  mrg   do {					/* protect allocated storage */
   1120       1.1  mrg     #if DECSUBSET
   1121       1.1  mrg     if (!set->extended) {		/* [undefined if subset] */
   1122       1.1  mrg       status|=DEC_Invalid_operation;
   1123       1.1  mrg       break;}
   1124       1.1  mrg     #endif
   1125       1.1  mrg     /* Check math restrictions [these ensure no overflow or underflow] */
   1126       1.1  mrg     if ((!decNumberIsSpecial(lhs) && decCheckMath(lhs, set, &status))
   1127       1.1  mrg      || (!decNumberIsSpecial(rhs) && decCheckMath(rhs, set, &status))
   1128       1.1  mrg      || (!decNumberIsSpecial(fhs) && decCheckMath(fhs, set, &status))) break;
   1129       1.1  mrg     /* set up context for multiply */
   1130       1.1  mrg     dcmul=*set;
   1131       1.1  mrg     dcmul.digits=lhs->digits+rhs->digits; /* just enough */
   1132       1.1  mrg     /* [The above may be an over-estimate for subset arithmetic, but that's OK] */
   1133       1.1  mrg     dcmul.emax=DEC_MAX_EMAX;		/* effectively unbounded .. */
   1134       1.1  mrg     dcmul.emin=DEC_MIN_EMIN;		/* [thanks to Math restrictions] */
   1135       1.1  mrg     /* set up decNumber space to receive the result of the multiply */
   1136       1.1  mrg     acc=bufa;				/* may fit */
   1137       1.1  mrg     needbytes=sizeof(decNumber)+(D2U(dcmul.digits)-1)*sizeof(Unit);
   1138       1.1  mrg     if (needbytes>sizeof(bufa)) {	/* need malloc space */
   1139       1.1  mrg       allocbufa=(decNumber *)malloc(needbytes);
   1140       1.1  mrg       if (allocbufa==NULL) {		/* hopeless -- abandon */
   1141       1.1  mrg 	status|=DEC_Insufficient_storage;
   1142       1.1  mrg 	break;}
   1143       1.1  mrg       acc=allocbufa;			/* use the allocated space */
   1144       1.1  mrg       }
   1145       1.1  mrg     /* multiply with extended range and necessary precision */
   1146       1.1  mrg     /*printf("emin=%ld\n", dcmul.emin); */
   1147       1.1  mrg     decMultiplyOp(acc, lhs, rhs, &dcmul, &status);
   1148       1.1  mrg     /* Only Invalid operation (from sNaN or Inf * 0) is possible in */
   1149       1.1  mrg     /* status; if either is seen than ignore fhs (in case it is */
   1150       1.1  mrg     /* another sNaN) and set acc to NaN unless we had an sNaN */
   1151       1.1  mrg     /* [decMultiplyOp leaves that to caller] */
   1152       1.1  mrg     /* Note sNaN has to go through addOp to shorten payload if */
   1153       1.1  mrg     /* necessary */
   1154       1.1  mrg     if ((status&DEC_Invalid_operation)!=0) {
   1155       1.1  mrg       if (!(status&DEC_sNaN)) { 	/* but be true invalid */
   1156       1.1  mrg 	decNumberZero(res);		/* acc not yet set */
   1157       1.1  mrg 	res->bits=DECNAN;
   1158       1.1  mrg 	break;
   1159       1.1  mrg 	}
   1160       1.1  mrg       decNumberZero(&dzero);		/* make 0 (any non-NaN would do) */
   1161       1.1  mrg       fhs=&dzero;			/* use that */
   1162       1.1  mrg       }
   1163       1.1  mrg     #if DECCHECK
   1164       1.1  mrg      else { /* multiply was OK */
   1165       1.1  mrg       if (status!=0) printf("Status=%08lx after FMA multiply\n", (LI)status);
   1166       1.1  mrg       }
   1167       1.1  mrg     #endif
   1168       1.1  mrg     /* add the third operand and result -> res, and all is done */
   1169       1.1  mrg     decAddOp(res, acc, fhs, set, 0, &status);
   1170       1.1  mrg     } while(0); 			/* end protected */
   1171       1.1  mrg 
   1172   1.1.1.2  mrg   free(allocbufa); /* drop any storage used */
   1173       1.1  mrg   if (status!=0) decStatus(res, status, set);
   1174       1.1  mrg   #if DECCHECK
   1175       1.1  mrg   decCheckInexact(res, set);
   1176       1.1  mrg   #endif
   1177       1.1  mrg   return res;
   1178       1.1  mrg   } /* decNumberFMA */
   1179       1.1  mrg 
   1180       1.1  mrg /* ------------------------------------------------------------------ */
   1181       1.1  mrg /* decNumberInvert -- invert a Number, digitwise		      */
   1182       1.1  mrg /*								      */
   1183       1.1  mrg /*   This computes C = ~A					      */
   1184       1.1  mrg /*								      */
   1185       1.1  mrg /*   res is C, the result.  C may be A (e.g., X=~X)		      */
   1186       1.1  mrg /*   rhs is A							      */
   1187       1.1  mrg /*   set is the context (used for result length and error report)     */
   1188       1.1  mrg /*								      */
   1189       1.1  mrg /* C must have space for set->digits digits.			      */
   1190       1.1  mrg /*								      */
   1191       1.1  mrg /* Logical function restrictions apply (see above); a NaN is	      */
   1192       1.1  mrg /* returned with Invalid_operation if a restriction is violated.      */
   1193       1.1  mrg /* ------------------------------------------------------------------ */
   1194       1.1  mrg decNumber * decNumberInvert(decNumber *res, const decNumber *rhs,
   1195       1.1  mrg 			    decContext *set) {
   1196       1.1  mrg   const Unit *ua, *msua;		/* -> operand and its msu */
   1197       1.1  mrg   Unit	*uc, *msuc;			/* -> result and its msu */
   1198       1.1  mrg   Int	msudigs;			/* digits in res msu */
   1199       1.1  mrg   #if DECCHECK
   1200       1.1  mrg   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1201       1.1  mrg   #endif
   1202       1.1  mrg 
   1203       1.1  mrg   if (rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
   1204       1.1  mrg     decStatus(res, DEC_Invalid_operation, set);
   1205       1.1  mrg     return res;
   1206       1.1  mrg     }
   1207       1.1  mrg   /* operand is valid */
   1208       1.1  mrg   ua=rhs->lsu;				/* bottom-up */
   1209       1.1  mrg   uc=res->lsu;				/* .. */
   1210       1.1  mrg   msua=ua+D2U(rhs->digits)-1;		/* -> msu of rhs */
   1211       1.1  mrg   msuc=uc+D2U(set->digits)-1;		/* -> msu of result */
   1212       1.1  mrg   msudigs=MSUDIGITS(set->digits);	/* [faster than remainder] */
   1213       1.1  mrg   for (; uc<=msuc; ua++, uc++) {	/* Unit loop */
   1214       1.1  mrg     Unit a;				/* extract unit */
   1215       1.1  mrg     Int  i, j;				/* work */
   1216       1.1  mrg     if (ua>msua) a=0;
   1217       1.1  mrg      else a=*ua;
   1218       1.1  mrg     *uc=0;				/* can now write back */
   1219       1.1  mrg     /* always need to examine all bits in rhs */
   1220       1.1  mrg     /* This loop could be unrolled and/or use BIN2BCD tables */
   1221       1.1  mrg     for (i=0; i<DECDPUN; i++) {
   1222       1.1  mrg       if ((~a)&1) *uc=*uc+(Unit)powers[i];   /* effect INVERT */
   1223       1.1  mrg       j=a%10;
   1224       1.1  mrg       a=a/10;
   1225       1.1  mrg       if (j>1) {
   1226       1.1  mrg 	decStatus(res, DEC_Invalid_operation, set);
   1227       1.1  mrg 	return res;
   1228       1.1  mrg 	}
   1229       1.1  mrg       if (uc==msuc && i==msudigs-1) break;   /* just did final digit */
   1230       1.1  mrg       } /* each digit */
   1231       1.1  mrg     } /* each unit */
   1232       1.1  mrg   /* [here uc-1 is the msu of the result] */
   1233       1.1  mrg   res->digits=decGetDigits(res->lsu, uc-res->lsu);
   1234       1.1  mrg   res->exponent=0;			/* integer */
   1235       1.1  mrg   res->bits=0;				/* sign=0 */
   1236       1.1  mrg   return res;  /* [no status to set] */
   1237       1.1  mrg   } /* decNumberInvert */
   1238       1.1  mrg 
   1239       1.1  mrg /* ------------------------------------------------------------------ */
   1240       1.1  mrg /* decNumberLn -- natural logarithm				      */
   1241       1.1  mrg /*								      */
   1242       1.1  mrg /*   This computes C = ln(A)					      */
   1243       1.1  mrg /*								      */
   1244       1.1  mrg /*   res is C, the result.  C may be A				      */
   1245       1.1  mrg /*   rhs is A							      */
   1246       1.1  mrg /*   set is the context; note that rounding mode has no effect	      */
   1247       1.1  mrg /*								      */
   1248       1.1  mrg /* C must have space for set->digits digits.			      */
   1249       1.1  mrg /*								      */
   1250       1.1  mrg /* Notable cases:						      */
   1251       1.1  mrg /*   A<0 -> Invalid						      */
   1252       1.1  mrg /*   A=0 -> -Infinity (Exact)					      */
   1253       1.1  mrg /*   A=+Infinity -> +Infinity (Exact)				      */
   1254       1.1  mrg /*   A=1 exactly -> 0 (Exact)					      */
   1255       1.1  mrg /*								      */
   1256       1.1  mrg /* Mathematical function restrictions apply (see above); a NaN is     */
   1257       1.1  mrg /* returned with Invalid_operation if a restriction is violated.      */
   1258       1.1  mrg /*								      */
   1259       1.1  mrg /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
   1260       1.1  mrg /* almost always be correctly rounded, but may be up to 1 ulp in      */
   1261       1.1  mrg /* error in rare cases. 					      */
   1262       1.1  mrg /* ------------------------------------------------------------------ */
   1263       1.1  mrg /* This is a wrapper for decLnOp which can handle the slightly wider  */
   1264       1.1  mrg /* (+11) range needed by Ln, Log10, etc. (which may have to be able   */
   1265       1.1  mrg /* to calculate at p+e+2).					      */
   1266       1.1  mrg /* ------------------------------------------------------------------ */
   1267       1.1  mrg decNumber * decNumberLn(decNumber *res, const decNumber *rhs,
   1268       1.1  mrg 			decContext *set) {
   1269       1.1  mrg   uInt status=0;		   /* accumulator */
   1270       1.1  mrg   #if DECSUBSET
   1271       1.1  mrg   decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
   1272       1.1  mrg   #endif
   1273       1.1  mrg 
   1274       1.1  mrg   #if DECCHECK
   1275       1.1  mrg   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1276       1.1  mrg   #endif
   1277       1.1  mrg 
   1278       1.1  mrg   /* Check restrictions; this is a math function; if not violated */
   1279       1.1  mrg   /* then carry out the operation. */
   1280       1.1  mrg   if (!decCheckMath(rhs, set, &status)) do { /* protect allocation */
   1281       1.1  mrg     #if DECSUBSET
   1282       1.1  mrg     if (!set->extended) {
   1283       1.1  mrg       /* reduce operand and set lostDigits status, as needed */
   1284       1.1  mrg       if (rhs->digits>set->digits) {
   1285       1.1  mrg 	allocrhs=decRoundOperand(rhs, set, &status);
   1286       1.1  mrg 	if (allocrhs==NULL) break;
   1287       1.1  mrg 	rhs=allocrhs;
   1288       1.1  mrg 	}
   1289       1.1  mrg       /* special check in subset for rhs=0 */
   1290       1.1  mrg       if (ISZERO(rhs)) {		/* +/- zeros -> error */
   1291       1.1  mrg 	status|=DEC_Invalid_operation;
   1292       1.1  mrg 	break;}
   1293       1.1  mrg       } /* extended=0 */
   1294       1.1  mrg     #endif
   1295       1.1  mrg     decLnOp(res, rhs, set, &status);
   1296       1.1  mrg     } while(0); 			/* end protected */
   1297       1.1  mrg 
   1298       1.1  mrg   #if DECSUBSET
   1299   1.1.1.2  mrg   free(allocrhs);	/* drop any storage used */
   1300       1.1  mrg   #endif
   1301       1.1  mrg   /* apply significant status */
   1302       1.1  mrg   if (status!=0) decStatus(res, status, set);
   1303       1.1  mrg   #if DECCHECK
   1304       1.1  mrg   decCheckInexact(res, set);
   1305       1.1  mrg   #endif
   1306       1.1  mrg   return res;
   1307       1.1  mrg   } /* decNumberLn */
   1308       1.1  mrg 
   1309       1.1  mrg /* ------------------------------------------------------------------ */
   1310       1.1  mrg /* decNumberLogB - get adjusted exponent, by 754 rules		      */
   1311       1.1  mrg /*								      */
   1312       1.1  mrg /*   This computes C = adjustedexponent(A)			      */
   1313       1.1  mrg /*								      */
   1314       1.1  mrg /*   res is C, the result.  C may be A				      */
   1315       1.1  mrg /*   rhs is A							      */
   1316       1.1  mrg /*   set is the context, used only for digits and status	      */
   1317       1.1  mrg /*								      */
   1318       1.1  mrg /* C must have space for 10 digits (A might have 10**9 digits and     */
   1319       1.1  mrg /* an exponent of +999999999, or one digit and an exponent of	      */
   1320       1.1  mrg /* -1999999999).						      */
   1321       1.1  mrg /*								      */
   1322       1.1  mrg /* This returns the adjusted exponent of A after (in theory) padding  */
   1323       1.1  mrg /* with zeros on the right to set->digits digits while keeping the    */
   1324       1.1  mrg /* same value.	The exponent is not limited by emin/emax.	      */
   1325       1.1  mrg /*								      */
   1326       1.1  mrg /* Notable cases:						      */
   1327       1.1  mrg /*   A<0 -> Use |A|						      */
   1328       1.1  mrg /*   A=0 -> -Infinity (Division by zero)			      */
   1329       1.1  mrg /*   A=Infinite -> +Infinity (Exact)				      */
   1330       1.1  mrg /*   A=1 exactly -> 0 (Exact)					      */
   1331       1.1  mrg /*   NaNs are propagated as usual				      */
   1332       1.1  mrg /* ------------------------------------------------------------------ */
   1333       1.1  mrg decNumber * decNumberLogB(decNumber *res, const decNumber *rhs,
   1334       1.1  mrg 			  decContext *set) {
   1335       1.1  mrg   uInt status=0;		   /* accumulator */
   1336       1.1  mrg 
   1337       1.1  mrg   #if DECCHECK
   1338       1.1  mrg   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1339       1.1  mrg   #endif
   1340       1.1  mrg 
   1341       1.1  mrg   /* NaNs as usual; Infinities return +Infinity; 0->oops */
   1342       1.1  mrg   if (decNumberIsNaN(rhs)) decNaNs(res, rhs, NULL, set, &status);
   1343       1.1  mrg    else if (decNumberIsInfinite(rhs)) decNumberCopyAbs(res, rhs);
   1344       1.1  mrg    else if (decNumberIsZero(rhs)) {
   1345       1.1  mrg     decNumberZero(res); 		/* prepare for Infinity */
   1346       1.1  mrg     res->bits=DECNEG|DECINF;		/* -Infinity */
   1347       1.1  mrg     status|=DEC_Division_by_zero;	/* as per 754 */
   1348       1.1  mrg     }
   1349       1.1  mrg    else { /* finite non-zero */
   1350       1.1  mrg     Int ae=rhs->exponent+rhs->digits-1; /* adjusted exponent */
   1351       1.1  mrg     decNumberFromInt32(res, ae);	/* lay it out */
   1352       1.1  mrg     }
   1353       1.1  mrg 
   1354       1.1  mrg   if (status!=0) decStatus(res, status, set);
   1355       1.1  mrg   return res;
   1356       1.1  mrg   } /* decNumberLogB */
   1357       1.1  mrg 
   1358       1.1  mrg /* ------------------------------------------------------------------ */
   1359       1.1  mrg /* decNumberLog10 -- logarithm in base 10			      */
   1360       1.1  mrg /*								      */
   1361       1.1  mrg /*   This computes C = log10(A) 				      */
   1362       1.1  mrg /*								      */
   1363       1.1  mrg /*   res is C, the result.  C may be A				      */
   1364       1.1  mrg /*   rhs is A							      */
   1365       1.1  mrg /*   set is the context; note that rounding mode has no effect	      */
   1366       1.1  mrg /*								      */
   1367       1.1  mrg /* C must have space for set->digits digits.			      */
   1368       1.1  mrg /*								      */
   1369       1.1  mrg /* Notable cases:						      */
   1370       1.1  mrg /*   A<0 -> Invalid						      */
   1371       1.1  mrg /*   A=0 -> -Infinity (Exact)					      */
   1372       1.1  mrg /*   A=+Infinity -> +Infinity (Exact)				      */
   1373       1.1  mrg /*   A=10**n (if n is an integer) -> n (Exact)			      */
   1374       1.1  mrg /*								      */
   1375       1.1  mrg /* Mathematical function restrictions apply (see above); a NaN is     */
   1376       1.1  mrg /* returned with Invalid_operation if a restriction is violated.      */
   1377       1.1  mrg /*								      */
   1378       1.1  mrg /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
   1379       1.1  mrg /* almost always be correctly rounded, but may be up to 1 ulp in      */
   1380       1.1  mrg /* error in rare cases. 					      */
   1381       1.1  mrg /* ------------------------------------------------------------------ */
   1382       1.1  mrg /* This calculates ln(A)/ln(10) using appropriate precision.  For     */
   1383       1.1  mrg /* ln(A) this is the max(p, rhs->digits + t) + 3, where p is the      */
   1384       1.1  mrg /* requested digits and t is the number of digits in the exponent     */
   1385       1.1  mrg /* (maximum 6).  For ln(10) it is p + 3; this is often handled by the */
   1386       1.1  mrg /* fastpath in decLnOp.  The final division is done to the requested  */
   1387       1.1  mrg /* precision.							      */
   1388       1.1  mrg /* ------------------------------------------------------------------ */
   1389       1.1  mrg decNumber * decNumberLog10(decNumber *res, const decNumber *rhs,
   1390       1.1  mrg 			  decContext *set) {
   1391       1.1  mrg   uInt status=0, ignore=0;	   /* status accumulators */
   1392       1.1  mrg   uInt needbytes;		   /* for space calculations */
   1393       1.1  mrg   Int p;			   /* working precision */
   1394       1.1  mrg   Int t;			   /* digits in exponent of A */
   1395       1.1  mrg 
   1396       1.1  mrg   /* buffers for a and b working decimals */
   1397       1.1  mrg   /* (adjustment calculator, same size) */
   1398       1.1  mrg   decNumber bufa[D2N(DECBUFFER+2)];
   1399       1.1  mrg   decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
   1400       1.1  mrg   decNumber *a=bufa;		   /* temporary a */
   1401       1.1  mrg   decNumber bufb[D2N(DECBUFFER+2)];
   1402       1.1  mrg   decNumber *allocbufb=NULL;	   /* -> allocated bufb, iff allocated */
   1403       1.1  mrg   decNumber *b=bufb;		   /* temporary b */
   1404       1.1  mrg   decNumber bufw[D2N(10)];	   /* working 2-10 digit number */
   1405       1.1  mrg   decNumber *w=bufw;		   /* .. */
   1406       1.1  mrg   #if DECSUBSET
   1407       1.1  mrg   decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
   1408       1.1  mrg   #endif
   1409       1.1  mrg 
   1410       1.1  mrg   decContext aset;		   /* working context */
   1411       1.1  mrg 
   1412       1.1  mrg   #if DECCHECK
   1413       1.1  mrg   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1414       1.1  mrg   #endif
   1415       1.1  mrg 
   1416       1.1  mrg   /* Check restrictions; this is a math function; if not violated */
   1417       1.1  mrg   /* then carry out the operation. */
   1418       1.1  mrg   if (!decCheckMath(rhs, set, &status)) do { /* protect malloc */
   1419       1.1  mrg     #if DECSUBSET
   1420       1.1  mrg     if (!set->extended) {
   1421       1.1  mrg       /* reduce operand and set lostDigits status, as needed */
   1422       1.1  mrg       if (rhs->digits>set->digits) {
   1423       1.1  mrg 	allocrhs=decRoundOperand(rhs, set, &status);
   1424       1.1  mrg 	if (allocrhs==NULL) break;
   1425       1.1  mrg 	rhs=allocrhs;
   1426       1.1  mrg 	}
   1427       1.1  mrg       /* special check in subset for rhs=0 */
   1428       1.1  mrg       if (ISZERO(rhs)) {		/* +/- zeros -> error */
   1429       1.1  mrg 	status|=DEC_Invalid_operation;
   1430       1.1  mrg 	break;}
   1431       1.1  mrg       } /* extended=0 */
   1432       1.1  mrg     #endif
   1433       1.1  mrg 
   1434       1.1  mrg     decContextDefault(&aset, DEC_INIT_DECIMAL64); /* clean context */
   1435       1.1  mrg 
   1436       1.1  mrg     /* handle exact powers of 10; only check if +ve finite */
   1437       1.1  mrg     if (!(rhs->bits&(DECNEG|DECSPECIAL)) && !ISZERO(rhs)) {
   1438       1.1  mrg       Int residue=0;		   /* (no residue) */
   1439       1.1  mrg       uInt copystat=0;		   /* clean status */
   1440       1.1  mrg 
   1441       1.1  mrg       /* round to a single digit... */
   1442       1.1  mrg       aset.digits=1;
   1443       1.1  mrg       decCopyFit(w, rhs, &aset, &residue, &copystat); /* copy & shorten */
   1444       1.1  mrg       /* if exact and the digit is 1, rhs is a power of 10 */
   1445       1.1  mrg       if (!(copystat&DEC_Inexact) && w->lsu[0]==1) {
   1446       1.1  mrg 	/* the exponent, conveniently, is the power of 10; making */
   1447       1.1  mrg 	/* this the result needs a little care as it might not fit, */
   1448       1.1  mrg 	/* so first convert it into the working number, and then move */
   1449       1.1  mrg 	/* to res */
   1450       1.1  mrg 	decNumberFromInt32(w, w->exponent);
   1451       1.1  mrg 	residue=0;
   1452       1.1  mrg 	decCopyFit(res, w, set, &residue, &status); /* copy & round */
   1453       1.1  mrg 	decFinish(res, set, &residue, &status);     /* cleanup/set flags */
   1454       1.1  mrg 	break;
   1455       1.1  mrg 	} /* not a power of 10 */
   1456       1.1  mrg       } /* not a candidate for exact */
   1457       1.1  mrg 
   1458       1.1  mrg     /* simplify the information-content calculation to use 'total */
   1459       1.1  mrg     /* number of digits in a, including exponent' as compared to the */
   1460       1.1  mrg     /* requested digits, as increasing this will only rarely cost an */
   1461       1.1  mrg     /* iteration in ln(a) anyway */
   1462       1.1  mrg     t=6;				/* it can never be >6 */
   1463       1.1  mrg 
   1464       1.1  mrg     /* allocate space when needed... */
   1465       1.1  mrg     p=(rhs->digits+t>set->digits?rhs->digits+t:set->digits)+3;
   1466       1.1  mrg     needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
   1467       1.1  mrg     if (needbytes>sizeof(bufa)) {	/* need malloc space */
   1468       1.1  mrg       allocbufa=(decNumber *)malloc(needbytes);
   1469       1.1  mrg       if (allocbufa==NULL) {		/* hopeless -- abandon */
   1470       1.1  mrg 	status|=DEC_Insufficient_storage;
   1471       1.1  mrg 	break;}
   1472       1.1  mrg       a=allocbufa;			/* use the allocated space */
   1473       1.1  mrg       }
   1474       1.1  mrg     aset.digits=p;			/* as calculated */
   1475       1.1  mrg     aset.emax=DEC_MAX_MATH;		/* usual bounds */
   1476       1.1  mrg     aset.emin=-DEC_MAX_MATH;		/* .. */
   1477       1.1  mrg     aset.clamp=0;			/* and no concrete format */
   1478       1.1  mrg     decLnOp(a, rhs, &aset, &status);	/* a=ln(rhs) */
   1479       1.1  mrg 
   1480       1.1  mrg     /* skip the division if the result so far is infinite, NaN, or */
   1481       1.1  mrg     /* zero, or there was an error; note NaN from sNaN needs copy */
   1482       1.1  mrg     if (status&DEC_NaNs && !(status&DEC_sNaN)) break;
   1483       1.1  mrg     if (a->bits&DECSPECIAL || ISZERO(a)) {
   1484       1.1  mrg       decNumberCopy(res, a);		/* [will fit] */
   1485       1.1  mrg       break;}
   1486       1.1  mrg 
   1487       1.1  mrg     /* for ln(10) an extra 3 digits of precision are needed */
   1488       1.1  mrg     p=set->digits+3;
   1489       1.1  mrg     needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
   1490       1.1  mrg     if (needbytes>sizeof(bufb)) {	/* need malloc space */
   1491       1.1  mrg       allocbufb=(decNumber *)malloc(needbytes);
   1492       1.1  mrg       if (allocbufb==NULL) {		/* hopeless -- abandon */
   1493       1.1  mrg 	status|=DEC_Insufficient_storage;
   1494       1.1  mrg 	break;}
   1495       1.1  mrg       b=allocbufb;			/* use the allocated space */
   1496       1.1  mrg       }
   1497       1.1  mrg     decNumberZero(w);			/* set up 10... */
   1498       1.1  mrg     #if DECDPUN==1
   1499       1.1  mrg     w->lsu[1]=1; w->lsu[0]=0;		/* .. */
   1500       1.1  mrg     #else
   1501       1.1  mrg     w->lsu[0]=10;			/* .. */
   1502       1.1  mrg     #endif
   1503       1.1  mrg     w->digits=2;			/* .. */
   1504       1.1  mrg 
   1505       1.1  mrg     aset.digits=p;
   1506       1.1  mrg     decLnOp(b, w, &aset, &ignore);	/* b=ln(10) */
   1507       1.1  mrg 
   1508       1.1  mrg     aset.digits=set->digits;		/* for final divide */
   1509       1.1  mrg     decDivideOp(res, a, b, &aset, DIVIDE, &status); /* into result */
   1510       1.1  mrg     } while(0); 			/* [for break] */
   1511       1.1  mrg 
   1512   1.1.1.2  mrg   free(allocbufa); /* drop any storage used */
   1513   1.1.1.2  mrg   free(allocbufb); /* .. */
   1514       1.1  mrg   #if DECSUBSET
   1515   1.1.1.2  mrg   free(allocrhs);	/* .. */
   1516       1.1  mrg   #endif
   1517       1.1  mrg   /* apply significant status */
   1518       1.1  mrg   if (status!=0) decStatus(res, status, set);
   1519       1.1  mrg   #if DECCHECK
   1520       1.1  mrg   decCheckInexact(res, set);
   1521       1.1  mrg   #endif
   1522       1.1  mrg   return res;
   1523       1.1  mrg   } /* decNumberLog10 */
   1524       1.1  mrg 
   1525       1.1  mrg /* ------------------------------------------------------------------ */
   1526       1.1  mrg /* decNumberMax -- compare two Numbers and return the maximum	      */
   1527       1.1  mrg /*								      */
   1528       1.1  mrg /*   This computes C = A ? B, returning the maximum by 754 rules      */
   1529       1.1  mrg /*								      */
   1530       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
   1531       1.1  mrg /*   lhs is A							      */
   1532       1.1  mrg /*   rhs is B							      */
   1533       1.1  mrg /*   set is the context 					      */
   1534       1.1  mrg /*								      */
   1535       1.1  mrg /* C must have space for set->digits digits.			      */
   1536       1.1  mrg /* ------------------------------------------------------------------ */
   1537       1.1  mrg decNumber * decNumberMax(decNumber *res, const decNumber *lhs,
   1538       1.1  mrg 			 const decNumber *rhs, decContext *set) {
   1539       1.1  mrg   uInt status=0;			/* accumulator */
   1540       1.1  mrg   decCompareOp(res, lhs, rhs, set, COMPMAX, &status);
   1541       1.1  mrg   if (status!=0) decStatus(res, status, set);
   1542       1.1  mrg   #if DECCHECK
   1543       1.1  mrg   decCheckInexact(res, set);
   1544       1.1  mrg   #endif
   1545       1.1  mrg   return res;
   1546       1.1  mrg   } /* decNumberMax */
   1547       1.1  mrg 
   1548       1.1  mrg /* ------------------------------------------------------------------ */
   1549       1.1  mrg /* decNumberMaxMag -- compare and return the maximum by magnitude     */
   1550       1.1  mrg /*								      */
   1551       1.1  mrg /*   This computes C = A ? B, returning the maximum by 754 rules      */
   1552       1.1  mrg /*								      */
   1553       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
   1554       1.1  mrg /*   lhs is A							      */
   1555       1.1  mrg /*   rhs is B							      */
   1556       1.1  mrg /*   set is the context 					      */
   1557       1.1  mrg /*								      */
   1558       1.1  mrg /* C must have space for set->digits digits.			      */
   1559       1.1  mrg /* ------------------------------------------------------------------ */
   1560       1.1  mrg decNumber * decNumberMaxMag(decNumber *res, const decNumber *lhs,
   1561       1.1  mrg 			 const decNumber *rhs, decContext *set) {
   1562       1.1  mrg   uInt status=0;			/* accumulator */
   1563       1.1  mrg   decCompareOp(res, lhs, rhs, set, COMPMAXMAG, &status);
   1564       1.1  mrg   if (status!=0) decStatus(res, status, set);
   1565       1.1  mrg   #if DECCHECK
   1566       1.1  mrg   decCheckInexact(res, set);
   1567       1.1  mrg   #endif
   1568       1.1  mrg   return res;
   1569       1.1  mrg   } /* decNumberMaxMag */
   1570       1.1  mrg 
   1571       1.1  mrg /* ------------------------------------------------------------------ */
   1572       1.1  mrg /* decNumberMin -- compare two Numbers and return the minimum	      */
   1573       1.1  mrg /*								      */
   1574       1.1  mrg /*   This computes C = A ? B, returning the minimum by 754 rules      */
   1575       1.1  mrg /*								      */
   1576       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
   1577       1.1  mrg /*   lhs is A							      */
   1578       1.1  mrg /*   rhs is B							      */
   1579       1.1  mrg /*   set is the context 					      */
   1580       1.1  mrg /*								      */
   1581       1.1  mrg /* C must have space for set->digits digits.			      */
   1582       1.1  mrg /* ------------------------------------------------------------------ */
   1583       1.1  mrg decNumber * decNumberMin(decNumber *res, const decNumber *lhs,
   1584       1.1  mrg 			 const decNumber *rhs, decContext *set) {
   1585       1.1  mrg   uInt status=0;			/* accumulator */
   1586       1.1  mrg   decCompareOp(res, lhs, rhs, set, COMPMIN, &status);
   1587       1.1  mrg   if (status!=0) decStatus(res, status, set);
   1588       1.1  mrg   #if DECCHECK
   1589       1.1  mrg   decCheckInexact(res, set);
   1590       1.1  mrg   #endif
   1591       1.1  mrg   return res;
   1592       1.1  mrg   } /* decNumberMin */
   1593       1.1  mrg 
   1594       1.1  mrg /* ------------------------------------------------------------------ */
   1595       1.1  mrg /* decNumberMinMag -- compare and return the minimum by magnitude     */
   1596       1.1  mrg /*								      */
   1597       1.1  mrg /*   This computes C = A ? B, returning the minimum by 754 rules      */
   1598       1.1  mrg /*								      */
   1599       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
   1600       1.1  mrg /*   lhs is A							      */
   1601       1.1  mrg /*   rhs is B							      */
   1602       1.1  mrg /*   set is the context 					      */
   1603       1.1  mrg /*								      */
   1604       1.1  mrg /* C must have space for set->digits digits.			      */
   1605       1.1  mrg /* ------------------------------------------------------------------ */
   1606       1.1  mrg decNumber * decNumberMinMag(decNumber *res, const decNumber *lhs,
   1607       1.1  mrg 			 const decNumber *rhs, decContext *set) {
   1608       1.1  mrg   uInt status=0;			/* accumulator */
   1609       1.1  mrg   decCompareOp(res, lhs, rhs, set, COMPMINMAG, &status);
   1610       1.1  mrg   if (status!=0) decStatus(res, status, set);
   1611       1.1  mrg   #if DECCHECK
   1612       1.1  mrg   decCheckInexact(res, set);
   1613       1.1  mrg   #endif
   1614       1.1  mrg   return res;
   1615       1.1  mrg   } /* decNumberMinMag */
   1616       1.1  mrg 
   1617       1.1  mrg /* ------------------------------------------------------------------ */
   1618       1.1  mrg /* decNumberMinus -- prefix minus operator			      */
   1619       1.1  mrg /*								      */
   1620       1.1  mrg /*   This computes C = 0 - A					      */
   1621       1.1  mrg /*								      */
   1622       1.1  mrg /*   res is C, the result.  C may be A				      */
   1623       1.1  mrg /*   rhs is A							      */
   1624       1.1  mrg /*   set is the context 					      */
   1625       1.1  mrg /*								      */
   1626       1.1  mrg /* See also decNumberCopyNegate for a quiet bitwise version of this.  */
   1627       1.1  mrg /* C must have space for set->digits digits.			      */
   1628       1.1  mrg /* ------------------------------------------------------------------ */
   1629       1.1  mrg /* Simply use AddOp for the subtract, which will do the necessary.    */
   1630       1.1  mrg /* ------------------------------------------------------------------ */
   1631       1.1  mrg decNumber * decNumberMinus(decNumber *res, const decNumber *rhs,
   1632       1.1  mrg 			   decContext *set) {
   1633       1.1  mrg   decNumber dzero;
   1634       1.1  mrg   uInt status=0;			/* accumulator */
   1635       1.1  mrg 
   1636       1.1  mrg   #if DECCHECK
   1637       1.1  mrg   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1638       1.1  mrg   #endif
   1639       1.1  mrg 
   1640       1.1  mrg   decNumberZero(&dzero);		/* make 0 */
   1641       1.1  mrg   dzero.exponent=rhs->exponent; 	/* [no coefficient expansion] */
   1642       1.1  mrg   decAddOp(res, &dzero, rhs, set, DECNEG, &status);
   1643       1.1  mrg   if (status!=0) decStatus(res, status, set);
   1644       1.1  mrg   #if DECCHECK
   1645       1.1  mrg   decCheckInexact(res, set);
   1646       1.1  mrg   #endif
   1647       1.1  mrg   return res;
   1648       1.1  mrg   } /* decNumberMinus */
   1649       1.1  mrg 
   1650       1.1  mrg /* ------------------------------------------------------------------ */
   1651       1.1  mrg /* decNumberNextMinus -- next towards -Infinity 		      */
   1652       1.1  mrg /*								      */
   1653       1.1  mrg /*   This computes C = A - infinitesimal, rounded towards -Infinity   */
   1654       1.1  mrg /*								      */
   1655       1.1  mrg /*   res is C, the result.  C may be A				      */
   1656       1.1  mrg /*   rhs is A							      */
   1657       1.1  mrg /*   set is the context 					      */
   1658       1.1  mrg /*								      */
   1659       1.1  mrg /* This is a generalization of 754 NextDown.			      */
   1660       1.1  mrg /* ------------------------------------------------------------------ */
   1661       1.1  mrg decNumber * decNumberNextMinus(decNumber *res, const decNumber *rhs,
   1662       1.1  mrg 			       decContext *set) {
   1663       1.1  mrg   decNumber dtiny;			     /* constant */
   1664       1.1  mrg   decContext workset=*set;		     /* work */
   1665       1.1  mrg   uInt status=0;			     /* accumulator */
   1666       1.1  mrg   #if DECCHECK
   1667       1.1  mrg   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1668       1.1  mrg   #endif
   1669       1.1  mrg 
   1670       1.1  mrg   /* +Infinity is the special case */
   1671       1.1  mrg   if ((rhs->bits&(DECINF|DECNEG))==DECINF) {
   1672       1.1  mrg     decSetMaxValue(res, set);		     /* is +ve */
   1673       1.1  mrg     /* there is no status to set */
   1674       1.1  mrg     return res;
   1675       1.1  mrg     }
   1676       1.1  mrg   decNumberZero(&dtiny);		     /* start with 0 */
   1677       1.1  mrg   dtiny.lsu[0]=1;			     /* make number that is .. */
   1678       1.1  mrg   dtiny.exponent=DEC_MIN_EMIN-1;	     /* .. smaller than tiniest */
   1679       1.1  mrg   workset.round=DEC_ROUND_FLOOR;
   1680       1.1  mrg   decAddOp(res, rhs, &dtiny, &workset, DECNEG, &status);
   1681       1.1  mrg   status&=DEC_Invalid_operation|DEC_sNaN;    /* only sNaN Invalid please */
   1682       1.1  mrg   if (status!=0) decStatus(res, status, set);
   1683       1.1  mrg   return res;
   1684       1.1  mrg   } /* decNumberNextMinus */
   1685       1.1  mrg 
   1686       1.1  mrg /* ------------------------------------------------------------------ */
   1687       1.1  mrg /* decNumberNextPlus -- next towards +Infinity			      */
   1688       1.1  mrg /*								      */
   1689       1.1  mrg /*   This computes C = A + infinitesimal, rounded towards +Infinity   */
   1690       1.1  mrg /*								      */
   1691       1.1  mrg /*   res is C, the result.  C may be A				      */
   1692       1.1  mrg /*   rhs is A							      */
   1693       1.1  mrg /*   set is the context 					      */
   1694       1.1  mrg /*								      */
   1695       1.1  mrg /* This is a generalization of 754 NextUp.			      */
   1696       1.1  mrg /* ------------------------------------------------------------------ */
   1697       1.1  mrg decNumber * decNumberNextPlus(decNumber *res, const decNumber *rhs,
   1698       1.1  mrg 			      decContext *set) {
   1699       1.1  mrg   decNumber dtiny;			     /* constant */
   1700       1.1  mrg   decContext workset=*set;		     /* work */
   1701       1.1  mrg   uInt status=0;			     /* accumulator */
   1702       1.1  mrg   #if DECCHECK
   1703       1.1  mrg   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1704       1.1  mrg   #endif
   1705       1.1  mrg 
   1706       1.1  mrg   /* -Infinity is the special case */
   1707       1.1  mrg   if ((rhs->bits&(DECINF|DECNEG))==(DECINF|DECNEG)) {
   1708       1.1  mrg     decSetMaxValue(res, set);
   1709       1.1  mrg     res->bits=DECNEG;			     /* negative */
   1710       1.1  mrg     /* there is no status to set */
   1711       1.1  mrg     return res;
   1712       1.1  mrg     }
   1713       1.1  mrg   decNumberZero(&dtiny);		     /* start with 0 */
   1714       1.1  mrg   dtiny.lsu[0]=1;			     /* make number that is .. */
   1715       1.1  mrg   dtiny.exponent=DEC_MIN_EMIN-1;	     /* .. smaller than tiniest */
   1716       1.1  mrg   workset.round=DEC_ROUND_CEILING;
   1717       1.1  mrg   decAddOp(res, rhs, &dtiny, &workset, 0, &status);
   1718       1.1  mrg   status&=DEC_Invalid_operation|DEC_sNaN;    /* only sNaN Invalid please */
   1719       1.1  mrg   if (status!=0) decStatus(res, status, set);
   1720       1.1  mrg   return res;
   1721       1.1  mrg   } /* decNumberNextPlus */
   1722       1.1  mrg 
   1723       1.1  mrg /* ------------------------------------------------------------------ */
   1724       1.1  mrg /* decNumberNextToward -- next towards rhs			      */
   1725       1.1  mrg /*								      */
   1726       1.1  mrg /*   This computes C = A +/- infinitesimal, rounded towards	      */
   1727       1.1  mrg /*   +/-Infinity in the direction of B, as per 754-1985 nextafter     */
   1728       1.1  mrg /*   modified during revision but dropped from 754-2008.	      */
   1729       1.1  mrg /*								      */
   1730       1.1  mrg /*   res is C, the result.  C may be A or B.			      */
   1731       1.1  mrg /*   lhs is A							      */
   1732       1.1  mrg /*   rhs is B							      */
   1733       1.1  mrg /*   set is the context 					      */
   1734       1.1  mrg /*								      */
   1735       1.1  mrg /* This is a generalization of 754-1985 NextAfter.		      */
   1736       1.1  mrg /* ------------------------------------------------------------------ */
   1737       1.1  mrg decNumber * decNumberNextToward(decNumber *res, const decNumber *lhs,
   1738       1.1  mrg 				const decNumber *rhs, decContext *set) {
   1739       1.1  mrg   decNumber dtiny;			     /* constant */
   1740       1.1  mrg   decContext workset=*set;		     /* work */
   1741       1.1  mrg   Int result;				     /* .. */
   1742       1.1  mrg   uInt status=0;			     /* accumulator */
   1743       1.1  mrg   #if DECCHECK
   1744       1.1  mrg   if (decCheckOperands(res, lhs, rhs, set)) return res;
   1745       1.1  mrg   #endif
   1746       1.1  mrg 
   1747       1.1  mrg   if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs)) {
   1748       1.1  mrg     decNaNs(res, lhs, rhs, set, &status);
   1749       1.1  mrg     }
   1750       1.1  mrg    else { /* Is numeric, so no chance of sNaN Invalid, etc. */
   1751       1.1  mrg     result=decCompare(lhs, rhs, 0);	/* sign matters */
   1752       1.1  mrg     if (result==BADINT) status|=DEC_Insufficient_storage; /* rare */
   1753       1.1  mrg      else { /* valid compare */
   1754       1.1  mrg       if (result==0) decNumberCopySign(res, lhs, rhs); /* easy */
   1755       1.1  mrg        else { /* differ: need NextPlus or NextMinus */
   1756       1.1  mrg 	uByte sub;			/* add or subtract */
   1757       1.1  mrg 	if (result<0) { 		/* lhs<rhs, do nextplus */
   1758       1.1  mrg 	  /* -Infinity is the special case */
   1759       1.1  mrg 	  if ((lhs->bits&(DECINF|DECNEG))==(DECINF|DECNEG)) {
   1760       1.1  mrg 	    decSetMaxValue(res, set);
   1761       1.1  mrg 	    res->bits=DECNEG;		/* negative */
   1762       1.1  mrg 	    return res; 		/* there is no status to set */
   1763       1.1  mrg 	    }
   1764       1.1  mrg 	  workset.round=DEC_ROUND_CEILING;
   1765       1.1  mrg 	  sub=0;			/* add, please */
   1766       1.1  mrg 	  } /* plus */
   1767       1.1  mrg 	 else { 			/* lhs>rhs, do nextminus */
   1768       1.1  mrg 	  /* +Infinity is the special case */
   1769       1.1  mrg 	  if ((lhs->bits&(DECINF|DECNEG))==DECINF) {
   1770       1.1  mrg 	    decSetMaxValue(res, set);
   1771       1.1  mrg 	    return res; 		/* there is no status to set */
   1772       1.1  mrg 	    }
   1773       1.1  mrg 	  workset.round=DEC_ROUND_FLOOR;
   1774       1.1  mrg 	  sub=DECNEG;			/* subtract, please */
   1775       1.1  mrg 	  } /* minus */
   1776       1.1  mrg 	decNumberZero(&dtiny);		/* start with 0 */
   1777       1.1  mrg 	dtiny.lsu[0]=1; 		/* make number that is .. */
   1778       1.1  mrg 	dtiny.exponent=DEC_MIN_EMIN-1;	/* .. smaller than tiniest */
   1779       1.1  mrg 	decAddOp(res, lhs, &dtiny, &workset, sub, &status); /* + or - */
   1780       1.1  mrg 	/* turn off exceptions if the result is a normal number */
   1781       1.1  mrg 	/* (including Nmin), otherwise let all status through */
   1782       1.1  mrg 	if (decNumberIsNormal(res, set)) status=0;
   1783       1.1  mrg 	} /* unequal */
   1784       1.1  mrg       } /* compare OK */
   1785       1.1  mrg     } /* numeric */
   1786       1.1  mrg   if (status!=0) decStatus(res, status, set);
   1787       1.1  mrg   return res;
   1788       1.1  mrg   } /* decNumberNextToward */
   1789       1.1  mrg 
   1790       1.1  mrg /* ------------------------------------------------------------------ */
   1791       1.1  mrg /* decNumberOr -- OR two Numbers, digitwise			      */
   1792       1.1  mrg /*								      */
   1793       1.1  mrg /*   This computes C = A | B					      */
   1794       1.1  mrg /*								      */
   1795       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X|X)	      */
   1796       1.1  mrg /*   lhs is A							      */
   1797       1.1  mrg /*   rhs is B							      */
   1798       1.1  mrg /*   set is the context (used for result length and error report)     */
   1799       1.1  mrg /*								      */
   1800       1.1  mrg /* C must have space for set->digits digits.			      */
   1801       1.1  mrg /*								      */
   1802       1.1  mrg /* Logical function restrictions apply (see above); a NaN is	      */
   1803       1.1  mrg /* returned with Invalid_operation if a restriction is violated.      */
   1804       1.1  mrg /* ------------------------------------------------------------------ */
   1805       1.1  mrg decNumber * decNumberOr(decNumber *res, const decNumber *lhs,
   1806       1.1  mrg 			const decNumber *rhs, decContext *set) {
   1807       1.1  mrg   const Unit *ua, *ub;			/* -> operands */
   1808       1.1  mrg   const Unit *msua, *msub;		/* -> operand msus */
   1809       1.1  mrg   Unit	*uc, *msuc;			/* -> result and its msu */
   1810       1.1  mrg   Int	msudigs;			/* digits in res msu */
   1811       1.1  mrg   #if DECCHECK
   1812       1.1  mrg   if (decCheckOperands(res, lhs, rhs, set)) return res;
   1813       1.1  mrg   #endif
   1814       1.1  mrg 
   1815       1.1  mrg   if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
   1816       1.1  mrg    || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
   1817       1.1  mrg     decStatus(res, DEC_Invalid_operation, set);
   1818       1.1  mrg     return res;
   1819       1.1  mrg     }
   1820       1.1  mrg   /* operands are valid */
   1821       1.1  mrg   ua=lhs->lsu;				/* bottom-up */
   1822       1.1  mrg   ub=rhs->lsu;				/* .. */
   1823       1.1  mrg   uc=res->lsu;				/* .. */
   1824       1.1  mrg   msua=ua+D2U(lhs->digits)-1;		/* -> msu of lhs */
   1825       1.1  mrg   msub=ub+D2U(rhs->digits)-1;		/* -> msu of rhs */
   1826       1.1  mrg   msuc=uc+D2U(set->digits)-1;		/* -> msu of result */
   1827       1.1  mrg   msudigs=MSUDIGITS(set->digits);	/* [faster than remainder] */
   1828       1.1  mrg   for (; uc<=msuc; ua++, ub++, uc++) {	/* Unit loop */
   1829       1.1  mrg     Unit a, b;				/* extract units */
   1830       1.1  mrg     if (ua>msua) a=0;
   1831       1.1  mrg      else a=*ua;
   1832       1.1  mrg     if (ub>msub) b=0;
   1833       1.1  mrg      else b=*ub;
   1834       1.1  mrg     *uc=0;				/* can now write back */
   1835       1.1  mrg     if (a|b) {				/* maybe 1 bits to examine */
   1836       1.1  mrg       Int i, j;
   1837       1.1  mrg       /* This loop could be unrolled and/or use BIN2BCD tables */
   1838       1.1  mrg       for (i=0; i<DECDPUN; i++) {
   1839       1.1  mrg 	if ((a|b)&1) *uc=*uc+(Unit)powers[i];	  /* effect OR */
   1840       1.1  mrg 	j=a%10;
   1841       1.1  mrg 	a=a/10;
   1842       1.1  mrg 	j|=b%10;
   1843       1.1  mrg 	b=b/10;
   1844       1.1  mrg 	if (j>1) {
   1845       1.1  mrg 	  decStatus(res, DEC_Invalid_operation, set);
   1846       1.1  mrg 	  return res;
   1847       1.1  mrg 	  }
   1848       1.1  mrg 	if (uc==msuc && i==msudigs-1) break;	  /* just did final digit */
   1849       1.1  mrg 	} /* each digit */
   1850       1.1  mrg       } /* non-zero */
   1851       1.1  mrg     } /* each unit */
   1852       1.1  mrg   /* [here uc-1 is the msu of the result] */
   1853       1.1  mrg   res->digits=decGetDigits(res->lsu, uc-res->lsu);
   1854       1.1  mrg   res->exponent=0;			/* integer */
   1855       1.1  mrg   res->bits=0;				/* sign=0 */
   1856       1.1  mrg   return res;  /* [no status to set] */
   1857       1.1  mrg   } /* decNumberOr */
   1858       1.1  mrg 
   1859       1.1  mrg /* ------------------------------------------------------------------ */
   1860       1.1  mrg /* decNumberPlus -- prefix plus operator			      */
   1861       1.1  mrg /*								      */
   1862       1.1  mrg /*   This computes C = 0 + A					      */
   1863       1.1  mrg /*								      */
   1864       1.1  mrg /*   res is C, the result.  C may be A				      */
   1865       1.1  mrg /*   rhs is A							      */
   1866       1.1  mrg /*   set is the context 					      */
   1867       1.1  mrg /*								      */
   1868       1.1  mrg /* See also decNumberCopy for a quiet bitwise version of this.	      */
   1869       1.1  mrg /* C must have space for set->digits digits.			      */
   1870       1.1  mrg /* ------------------------------------------------------------------ */
   1871       1.1  mrg /* This simply uses AddOp; Add will take fast path after preparing A. */
   1872       1.1  mrg /* Performance is a concern here, as this routine is often used to    */
   1873       1.1  mrg /* check operands and apply rounding and overflow/underflow testing.  */
   1874       1.1  mrg /* ------------------------------------------------------------------ */
   1875       1.1  mrg decNumber * decNumberPlus(decNumber *res, const decNumber *rhs,
   1876       1.1  mrg 			  decContext *set) {
   1877       1.1  mrg   decNumber dzero;
   1878       1.1  mrg   uInt status=0;			/* accumulator */
   1879       1.1  mrg   #if DECCHECK
   1880       1.1  mrg   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1881       1.1  mrg   #endif
   1882       1.1  mrg 
   1883       1.1  mrg   decNumberZero(&dzero);		/* make 0 */
   1884       1.1  mrg   dzero.exponent=rhs->exponent; 	/* [no coefficient expansion] */
   1885       1.1  mrg   decAddOp(res, &dzero, rhs, set, 0, &status);
   1886       1.1  mrg   if (status!=0) decStatus(res, status, set);
   1887       1.1  mrg   #if DECCHECK
   1888       1.1  mrg   decCheckInexact(res, set);
   1889       1.1  mrg   #endif
   1890       1.1  mrg   return res;
   1891       1.1  mrg   } /* decNumberPlus */
   1892       1.1  mrg 
   1893       1.1  mrg /* ------------------------------------------------------------------ */
   1894       1.1  mrg /* decNumberMultiply -- multiply two Numbers			      */
   1895       1.1  mrg /*								      */
   1896       1.1  mrg /*   This computes C = A x B					      */
   1897       1.1  mrg /*								      */
   1898       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X+X)	      */
   1899       1.1  mrg /*   lhs is A							      */
   1900       1.1  mrg /*   rhs is B							      */
   1901       1.1  mrg /*   set is the context 					      */
   1902       1.1  mrg /*								      */
   1903       1.1  mrg /* C must have space for set->digits digits.			      */
   1904       1.1  mrg /* ------------------------------------------------------------------ */
   1905       1.1  mrg decNumber * decNumberMultiply(decNumber *res, const decNumber *lhs,
   1906       1.1  mrg 			      const decNumber *rhs, decContext *set) {
   1907       1.1  mrg   uInt status=0;		   /* accumulator */
   1908       1.1  mrg   decMultiplyOp(res, lhs, rhs, set, &status);
   1909       1.1  mrg   if (status!=0) decStatus(res, status, set);
   1910       1.1  mrg   #if DECCHECK
   1911       1.1  mrg   decCheckInexact(res, set);
   1912       1.1  mrg   #endif
   1913       1.1  mrg   return res;
   1914       1.1  mrg   } /* decNumberMultiply */
   1915       1.1  mrg 
   1916       1.1  mrg /* ------------------------------------------------------------------ */
   1917       1.1  mrg /* decNumberPower -- raise a number to a power			      */
   1918       1.1  mrg /*								      */
   1919       1.1  mrg /*   This computes C = A ** B					      */
   1920       1.1  mrg /*								      */
   1921       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X**X)	      */
   1922       1.1  mrg /*   lhs is A							      */
   1923       1.1  mrg /*   rhs is B							      */
   1924       1.1  mrg /*   set is the context 					      */
   1925       1.1  mrg /*								      */
   1926       1.1  mrg /* C must have space for set->digits digits.			      */
   1927       1.1  mrg /*								      */
   1928       1.1  mrg /* Mathematical function restrictions apply (see above); a NaN is     */
   1929       1.1  mrg /* returned with Invalid_operation if a restriction is violated.      */
   1930       1.1  mrg /*								      */
   1931       1.1  mrg /* However, if 1999999997<=B<=999999999 and B is an integer then the  */
   1932       1.1  mrg /* restrictions on A and the context are relaxed to the usual bounds, */
   1933       1.1  mrg /* for compatibility with the earlier (integer power only) version    */
   1934       1.1  mrg /* of this function.						      */
   1935       1.1  mrg /*								      */
   1936       1.1  mrg /* When B is an integer, the result may be exact, even if rounded.    */
   1937       1.1  mrg /*								      */
   1938       1.1  mrg /* The final result is rounded according to the context; it will      */
   1939       1.1  mrg /* almost always be correctly rounded, but may be up to 1 ulp in      */
   1940       1.1  mrg /* error in rare cases. 					      */
   1941       1.1  mrg /* ------------------------------------------------------------------ */
   1942       1.1  mrg decNumber * decNumberPower(decNumber *res, const decNumber *lhs,
   1943       1.1  mrg 			   const decNumber *rhs, decContext *set) {
   1944       1.1  mrg   #if DECSUBSET
   1945       1.1  mrg   decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
   1946       1.1  mrg   decNumber *allocrhs=NULL;	   /* .., rhs */
   1947       1.1  mrg   #endif
   1948       1.1  mrg   decNumber *allocdac=NULL;	   /* -> allocated acc buffer, iff used */
   1949       1.1  mrg   decNumber *allocinv=NULL;	   /* -> allocated 1/x buffer, iff used */
   1950       1.1  mrg   Int	reqdigits=set->digits;	   /* requested DIGITS */
   1951       1.1  mrg   Int	n;			   /* rhs in binary */
   1952       1.1  mrg   Flag	rhsint=0;		   /* 1 if rhs is an integer */
   1953       1.1  mrg   Flag	useint=0;		   /* 1 if can use integer calculation */
   1954       1.1  mrg   Flag	isoddint=0;		   /* 1 if rhs is an integer and odd */
   1955       1.1  mrg   Int	i;			   /* work */
   1956       1.1  mrg   #if DECSUBSET
   1957       1.1  mrg   Int	dropped;		   /* .. */
   1958       1.1  mrg   #endif
   1959       1.1  mrg   uInt	needbytes;		   /* buffer size needed */
   1960       1.1  mrg   Flag	seenbit;		   /* seen a bit while powering */
   1961       1.1  mrg   Int	residue=0;		   /* rounding residue */
   1962       1.1  mrg   uInt	status=0;		   /* accumulators */
   1963       1.1  mrg   uByte bits=0; 		   /* result sign if errors */
   1964       1.1  mrg   decContext aset;		   /* working context */
   1965       1.1  mrg   decNumber dnOne;		   /* work value 1... */
   1966       1.1  mrg   /* local accumulator buffer [a decNumber, with digits+elength+1 digits] */
   1967       1.1  mrg   decNumber dacbuff[D2N(DECBUFFER+9)];
   1968       1.1  mrg   decNumber *dac=dacbuff;	   /* -> result accumulator */
   1969       1.1  mrg   /* same again for possible 1/lhs calculation */
   1970       1.1  mrg   decNumber invbuff[D2N(DECBUFFER+9)];
   1971       1.1  mrg 
   1972       1.1  mrg   #if DECCHECK
   1973       1.1  mrg   if (decCheckOperands(res, lhs, rhs, set)) return res;
   1974       1.1  mrg   #endif
   1975       1.1  mrg 
   1976       1.1  mrg   do {				   /* protect allocated storage */
   1977       1.1  mrg     #if DECSUBSET
   1978       1.1  mrg     if (!set->extended) { /* reduce operands and set status, as needed */
   1979       1.1  mrg       if (lhs->digits>reqdigits) {
   1980       1.1  mrg 	alloclhs=decRoundOperand(lhs, set, &status);
   1981       1.1  mrg 	if (alloclhs==NULL) break;
   1982       1.1  mrg 	lhs=alloclhs;
   1983       1.1  mrg 	}
   1984       1.1  mrg       if (rhs->digits>reqdigits) {
   1985       1.1  mrg 	allocrhs=decRoundOperand(rhs, set, &status);
   1986       1.1  mrg 	if (allocrhs==NULL) break;
   1987       1.1  mrg 	rhs=allocrhs;
   1988       1.1  mrg 	}
   1989       1.1  mrg       }
   1990       1.1  mrg     #endif
   1991       1.1  mrg     /* [following code does not require input rounding] */
   1992       1.1  mrg 
   1993       1.1  mrg     /* handle NaNs and rhs Infinity (lhs infinity is harder) */
   1994       1.1  mrg     if (SPECIALARGS) {
   1995       1.1  mrg       if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs)) { /* NaNs */
   1996       1.1  mrg 	decNaNs(res, lhs, rhs, set, &status);
   1997       1.1  mrg 	break;}
   1998       1.1  mrg       if (decNumberIsInfinite(rhs)) {	/* rhs Infinity */
   1999       1.1  mrg 	Flag rhsneg=rhs->bits&DECNEG;	/* save rhs sign */
   2000       1.1  mrg 	if (decNumberIsNegative(lhs)	/* lhs<0 */
   2001       1.1  mrg 	 && !decNumberIsZero(lhs))	/* .. */
   2002       1.1  mrg 	  status|=DEC_Invalid_operation;
   2003       1.1  mrg 	 else { 			/* lhs >=0 */
   2004       1.1  mrg 	  decNumberZero(&dnOne);	/* set up 1 */
   2005       1.1  mrg 	  dnOne.lsu[0]=1;
   2006       1.1  mrg 	  decNumberCompare(dac, lhs, &dnOne, set); /* lhs ? 1 */
   2007       1.1  mrg 	  decNumberZero(res);		/* prepare for 0/1/Infinity */
   2008       1.1  mrg 	  if (decNumberIsNegative(dac)) {    /* lhs<1 */
   2009       1.1  mrg 	    if (rhsneg) res->bits|=DECINF;   /* +Infinity [else is +0] */
   2010       1.1  mrg 	    }
   2011       1.1  mrg 	   else if (dac->lsu[0]==0) {	     /* lhs=1 */
   2012       1.1  mrg 	    /* 1**Infinity is inexact, so return fully-padded 1.0000 */
   2013       1.1  mrg 	    Int shift=set->digits-1;
   2014       1.1  mrg 	    *res->lsu=1;		     /* was 0, make int 1 */
   2015       1.1  mrg 	    res->digits=decShiftToMost(res->lsu, 1, shift);
   2016       1.1  mrg 	    res->exponent=-shift;	     /* make 1.0000... */
   2017       1.1  mrg 	    status|=DEC_Inexact|DEC_Rounded; /* deemed inexact */
   2018       1.1  mrg 	    }
   2019       1.1  mrg 	   else {			     /* lhs>1 */
   2020       1.1  mrg 	    if (!rhsneg) res->bits|=DECINF;  /* +Infinity [else is +0] */
   2021       1.1  mrg 	    }
   2022       1.1  mrg 	  } /* lhs>=0 */
   2023       1.1  mrg 	break;}
   2024       1.1  mrg       /* [lhs infinity drops through] */
   2025       1.1  mrg       } /* specials */
   2026       1.1  mrg 
   2027       1.1  mrg     /* Original rhs may be an integer that fits and is in range */
   2028       1.1  mrg     n=decGetInt(rhs);
   2029       1.1  mrg     if (n!=BADINT) {			/* it is an integer */
   2030       1.1  mrg       rhsint=1; 			/* record the fact for 1**n */
   2031       1.1  mrg       isoddint=(Flag)n&1;		/* [works even if big] */
   2032       1.1  mrg       if (n!=BIGEVEN && n!=BIGODD)	/* can use integer path? */
   2033       1.1  mrg 	useint=1;			/* looks good */
   2034       1.1  mrg       }
   2035       1.1  mrg 
   2036       1.1  mrg     if (decNumberIsNegative(lhs)	/* -x .. */
   2037       1.1  mrg       && isoddint) bits=DECNEG; 	/* .. to an odd power */
   2038       1.1  mrg 
   2039       1.1  mrg     /* handle LHS infinity */
   2040       1.1  mrg     if (decNumberIsInfinite(lhs)) {	/* [NaNs already handled] */
   2041       1.1  mrg       uByte rbits=rhs->bits;		/* save */
   2042       1.1  mrg       decNumberZero(res);		/* prepare */
   2043       1.1  mrg       if (n==0) *res->lsu=1;		/* [-]Inf**0 => 1 */
   2044       1.1  mrg        else {
   2045       1.1  mrg 	/* -Inf**nonint -> error */
   2046       1.1  mrg 	if (!rhsint && decNumberIsNegative(lhs)) {
   2047       1.1  mrg 	  status|=DEC_Invalid_operation;     /* -Inf**nonint is error */
   2048       1.1  mrg 	  break;}
   2049       1.1  mrg 	if (!(rbits & DECNEG)) bits|=DECINF; /* was not a **-n */
   2050       1.1  mrg 	/* [otherwise will be 0 or -0] */
   2051       1.1  mrg 	res->bits=bits;
   2052       1.1  mrg 	}
   2053       1.1  mrg       break;}
   2054       1.1  mrg 
   2055       1.1  mrg     /* similarly handle LHS zero */
   2056       1.1  mrg     if (decNumberIsZero(lhs)) {
   2057       1.1  mrg       if (n==0) {			     /* 0**0 => Error */
   2058       1.1  mrg 	#if DECSUBSET
   2059       1.1  mrg 	if (!set->extended) {		     /* [unless subset] */
   2060       1.1  mrg 	  decNumberZero(res);
   2061       1.1  mrg 	  *res->lsu=1;			     /* return 1 */
   2062       1.1  mrg 	  break;}
   2063       1.1  mrg 	#endif
   2064       1.1  mrg 	status|=DEC_Invalid_operation;
   2065       1.1  mrg 	}
   2066       1.1  mrg        else {				     /* 0**x */
   2067       1.1  mrg 	uByte rbits=rhs->bits;		     /* save */
   2068       1.1  mrg 	if (rbits & DECNEG) {		     /* was a 0**(-n) */
   2069       1.1  mrg 	  #if DECSUBSET
   2070       1.1  mrg 	  if (!set->extended) { 	     /* [bad if subset] */
   2071       1.1  mrg 	    status|=DEC_Invalid_operation;
   2072       1.1  mrg 	    break;}
   2073       1.1  mrg 	  #endif
   2074       1.1  mrg 	  bits|=DECINF;
   2075       1.1  mrg 	  }
   2076       1.1  mrg 	decNumberZero(res);		     /* prepare */
   2077       1.1  mrg 	/* [otherwise will be 0 or -0] */
   2078       1.1  mrg 	res->bits=bits;
   2079       1.1  mrg 	}
   2080       1.1  mrg       break;}
   2081       1.1  mrg 
   2082       1.1  mrg     /* here both lhs and rhs are finite; rhs==0 is handled in the */
   2083       1.1  mrg     /* integer path.  Next handle the non-integer cases */
   2084       1.1  mrg     if (!useint) {			/* non-integral rhs */
   2085       1.1  mrg       /* any -ve lhs is bad, as is either operand or context out of */
   2086       1.1  mrg       /* bounds */
   2087       1.1  mrg       if (decNumberIsNegative(lhs)) {
   2088       1.1  mrg 	status|=DEC_Invalid_operation;
   2089       1.1  mrg 	break;}
   2090       1.1  mrg       if (decCheckMath(lhs, set, &status)
   2091       1.1  mrg        || decCheckMath(rhs, set, &status)) break; /* variable status */
   2092       1.1  mrg 
   2093       1.1  mrg       decContextDefault(&aset, DEC_INIT_DECIMAL64); /* clean context */
   2094       1.1  mrg       aset.emax=DEC_MAX_MATH;		/* usual bounds */
   2095       1.1  mrg       aset.emin=-DEC_MAX_MATH;		/* .. */
   2096       1.1  mrg       aset.clamp=0;			/* and no concrete format */
   2097       1.1  mrg 
   2098       1.1  mrg       /* calculate the result using exp(ln(lhs)*rhs), which can */
   2099       1.1  mrg       /* all be done into the accumulator, dac.  The precision needed */
   2100       1.1  mrg       /* is enough to contain the full information in the lhs (which */
   2101       1.1  mrg       /* is the total digits, including exponent), or the requested */
   2102       1.1  mrg       /* precision, if larger, + 4; 6 is used for the exponent */
   2103       1.1  mrg       /* maximum length, and this is also used when it is shorter */
   2104       1.1  mrg       /* than the requested digits as it greatly reduces the >0.5 ulp */
   2105       1.1  mrg       /* cases at little cost (because Ln doubles digits each */
   2106       1.1  mrg       /* iteration so a few extra digits rarely causes an extra */
   2107       1.1  mrg       /* iteration) */
   2108       1.1  mrg       aset.digits=MAXI(lhs->digits, set->digits)+6+4;
   2109       1.1  mrg       } /* non-integer rhs */
   2110       1.1  mrg 
   2111       1.1  mrg      else { /* rhs is in-range integer */
   2112       1.1  mrg       if (n==0) {			/* x**0 = 1 */
   2113       1.1  mrg 	/* (0**0 was handled above) */
   2114       1.1  mrg 	decNumberZero(res);		/* result=1 */
   2115       1.1  mrg 	*res->lsu=1;			/* .. */
   2116       1.1  mrg 	break;}
   2117       1.1  mrg       /* rhs is a non-zero integer */
   2118       1.1  mrg       if (n<0) n=-n;			/* use abs(n) */
   2119       1.1  mrg 
   2120       1.1  mrg       aset=*set;			/* clone the context */
   2121       1.1  mrg       aset.round=DEC_ROUND_HALF_EVEN;	/* internally use balanced */
   2122       1.1  mrg       /* calculate the working DIGITS */
   2123       1.1  mrg       aset.digits=reqdigits+(rhs->digits+rhs->exponent)+2;
   2124       1.1  mrg       #if DECSUBSET
   2125       1.1  mrg       if (!set->extended) aset.digits--;     /* use classic precision */
   2126       1.1  mrg       #endif
   2127       1.1  mrg       /* it's an error if this is more than can be handled */
   2128       1.1  mrg       if (aset.digits>DECNUMMAXP) {status|=DEC_Invalid_operation; break;}
   2129       1.1  mrg       } /* integer path */
   2130       1.1  mrg 
   2131       1.1  mrg     /* aset.digits is the count of digits for the accumulator needed */
   2132       1.1  mrg     /* if accumulator is too long for local storage, then allocate */
   2133       1.1  mrg     needbytes=sizeof(decNumber)+(D2U(aset.digits)-1)*sizeof(Unit);
   2134       1.1  mrg     /* [needbytes also used below if 1/lhs needed] */
   2135       1.1  mrg     if (needbytes>sizeof(dacbuff)) {
   2136       1.1  mrg       allocdac=(decNumber *)malloc(needbytes);
   2137       1.1  mrg       if (allocdac==NULL) {   /* hopeless -- abandon */
   2138       1.1  mrg 	status|=DEC_Insufficient_storage;
   2139       1.1  mrg 	break;}
   2140       1.1  mrg       dac=allocdac;	      /* use the allocated space */
   2141       1.1  mrg       }
   2142       1.1  mrg     /* here, aset is set up and accumulator is ready for use */
   2143       1.1  mrg 
   2144       1.1  mrg     if (!useint) {			     /* non-integral rhs */
   2145       1.1  mrg       /* x ** y; special-case x=1 here as it will otherwise always */
   2146       1.1  mrg       /* reduce to integer 1; decLnOp has a fastpath which detects */
   2147       1.1  mrg       /* the case of x=1 */
   2148       1.1  mrg       decLnOp(dac, lhs, &aset, &status);     /* dac=ln(lhs) */
   2149       1.1  mrg       /* [no error possible, as lhs 0 already handled] */
   2150       1.1  mrg       if (ISZERO(dac)) {		     /* x==1, 1.0, etc. */
   2151       1.1  mrg 	/* need to return fully-padded 1.0000 etc., but rhsint->1 */
   2152       1.1  mrg 	*dac->lsu=1;			     /* was 0, make int 1 */
   2153       1.1  mrg 	if (!rhsint) {			     /* add padding */
   2154       1.1  mrg 	  Int shift=set->digits-1;
   2155       1.1  mrg 	  dac->digits=decShiftToMost(dac->lsu, 1, shift);
   2156       1.1  mrg 	  dac->exponent=-shift; 	     /* make 1.0000... */
   2157       1.1  mrg 	  status|=DEC_Inexact|DEC_Rounded;   /* deemed inexact */
   2158       1.1  mrg 	  }
   2159       1.1  mrg 	}
   2160       1.1  mrg        else {
   2161       1.1  mrg 	decMultiplyOp(dac, dac, rhs, &aset, &status);  /* dac=dac*rhs */
   2162       1.1  mrg 	decExpOp(dac, dac, &aset, &status);	       /* dac=exp(dac) */
   2163       1.1  mrg 	}
   2164       1.1  mrg       /* and drop through for final rounding */
   2165       1.1  mrg       } /* non-integer rhs */
   2166       1.1  mrg 
   2167       1.1  mrg      else {				/* carry on with integer */
   2168       1.1  mrg       decNumberZero(dac);		/* acc=1 */
   2169       1.1  mrg       *dac->lsu=1;			/* .. */
   2170       1.1  mrg 
   2171       1.1  mrg       /* if a negative power the constant 1 is needed, and if not subset */
   2172       1.1  mrg       /* invert the lhs now rather than inverting the result later */
   2173       1.1  mrg       if (decNumberIsNegative(rhs)) {	/* was a **-n [hence digits>0] */
   2174   1.1.1.5  mrg 	decNumber *inv=invbuff; 	/* assume use fixed buffer */
   2175       1.1  mrg 	decNumberCopy(&dnOne, dac);	/* dnOne=1;  [needed now or later] */
   2176       1.1  mrg 	#if DECSUBSET
   2177       1.1  mrg 	if (set->extended) {		/* need to calculate 1/lhs */
   2178       1.1  mrg 	#endif
   2179       1.1  mrg 	  /* divide lhs into 1, putting result in dac [dac=1/dac] */
   2180       1.1  mrg 	  decDivideOp(dac, &dnOne, lhs, &aset, DIVIDE, &status);
   2181       1.1  mrg 	  /* now locate or allocate space for the inverted lhs */
   2182       1.1  mrg 	  if (needbytes>sizeof(invbuff)) {
   2183       1.1  mrg 	    allocinv=(decNumber *)malloc(needbytes);
   2184       1.1  mrg 	    if (allocinv==NULL) {	/* hopeless -- abandon */
   2185       1.1  mrg 	      status|=DEC_Insufficient_storage;
   2186       1.1  mrg 	      break;}
   2187       1.1  mrg 	    inv=allocinv;		/* use the allocated space */
   2188       1.1  mrg 	    }
   2189       1.1  mrg 	  /* [inv now points to big-enough buffer or allocated storage] */
   2190       1.1  mrg 	  decNumberCopy(inv, dac);	/* copy the 1/lhs */
   2191       1.1  mrg 	  decNumberCopy(dac, &dnOne);	/* restore acc=1 */
   2192       1.1  mrg 	  lhs=inv;			/* .. and go forward with new lhs */
   2193       1.1  mrg 	#if DECSUBSET
   2194       1.1  mrg 	  }
   2195       1.1  mrg 	#endif
   2196       1.1  mrg 	}
   2197       1.1  mrg 
   2198       1.1  mrg       /* Raise-to-the-power loop... */
   2199       1.1  mrg       seenbit=0;		   /* set once a 1-bit is encountered */
   2200       1.1  mrg       for (i=1;;i++){		   /* for each bit [top bit ignored] */
   2201       1.1  mrg 	/* abandon if had overflow or terminal underflow */
   2202       1.1  mrg 	if (status & (DEC_Overflow|DEC_Underflow)) { /* interesting? */
   2203       1.1  mrg 	  if (status&DEC_Overflow || ISZERO(dac)) break;
   2204       1.1  mrg 	  }
   2205       1.1  mrg 	/* [the following two lines revealed an optimizer bug in a C++ */
   2206       1.1  mrg 	/* compiler, with symptom: 5**3 -> 25, when n=n+n was used] */
   2207       1.1  mrg 	n=n<<1; 		   /* move next bit to testable position */
   2208       1.1  mrg 	if (n<0) {		   /* top bit is set */
   2209       1.1  mrg 	  seenbit=1;		   /* OK, significant bit seen */
   2210       1.1  mrg 	  decMultiplyOp(dac, dac, lhs, &aset, &status); /* dac=dac*x */
   2211       1.1  mrg 	  }
   2212       1.1  mrg 	if (i==31) break;	   /* that was the last bit */
   2213       1.1  mrg 	if (!seenbit) continue;    /* no need to square 1 */
   2214       1.1  mrg 	decMultiplyOp(dac, dac, dac, &aset, &status); /* dac=dac*dac [square] */
   2215       1.1  mrg 	} /*i*/ /* 32 bits */
   2216       1.1  mrg 
   2217       1.1  mrg       /* complete internal overflow or underflow processing */
   2218       1.1  mrg       if (status & (DEC_Overflow|DEC_Underflow)) {
   2219       1.1  mrg 	#if DECSUBSET
   2220       1.1  mrg 	/* If subset, and power was negative, reverse the kind of -erflow */
   2221       1.1  mrg 	/* [1/x not yet done] */
   2222       1.1  mrg 	if (!set->extended && decNumberIsNegative(rhs)) {
   2223       1.1  mrg 	  if (status & DEC_Overflow)
   2224       1.1  mrg 	    status^=DEC_Overflow | DEC_Underflow | DEC_Subnormal;
   2225       1.1  mrg 	   else { /* trickier -- Underflow may or may not be set */
   2226       1.1  mrg 	    status&=~(DEC_Underflow | DEC_Subnormal); /* [one or both] */
   2227       1.1  mrg 	    status|=DEC_Overflow;
   2228       1.1  mrg 	    }
   2229       1.1  mrg 	  }
   2230       1.1  mrg 	#endif
   2231       1.1  mrg 	dac->bits=(dac->bits & ~DECNEG) | bits; /* force correct sign */
   2232       1.1  mrg 	/* round subnormals [to set.digits rather than aset.digits] */
   2233       1.1  mrg 	/* or set overflow result similarly as required */
   2234       1.1  mrg 	decFinalize(dac, set, &residue, &status);
   2235       1.1  mrg 	decNumberCopy(res, dac);   /* copy to result (is now OK length) */
   2236       1.1  mrg 	break;
   2237       1.1  mrg 	}
   2238       1.1  mrg 
   2239       1.1  mrg       #if DECSUBSET
   2240       1.1  mrg       if (!set->extended &&		     /* subset math */
   2241       1.1  mrg 	  decNumberIsNegative(rhs)) {	     /* was a **-n [hence digits>0] */
   2242       1.1  mrg 	/* so divide result into 1 [dac=1/dac] */
   2243       1.1  mrg 	decDivideOp(dac, &dnOne, dac, &aset, DIVIDE, &status);
   2244       1.1  mrg 	}
   2245       1.1  mrg       #endif
   2246       1.1  mrg       } /* rhs integer path */
   2247       1.1  mrg 
   2248       1.1  mrg     /* reduce result to the requested length and copy to result */
   2249       1.1  mrg     decCopyFit(res, dac, set, &residue, &status);
   2250       1.1  mrg     decFinish(res, set, &residue, &status);  /* final cleanup */
   2251       1.1  mrg     #if DECSUBSET
   2252       1.1  mrg     if (!set->extended) decTrim(res, set, 0, 1, &dropped); /* trailing zeros */
   2253       1.1  mrg     #endif
   2254       1.1  mrg     } while(0); 			/* end protected */
   2255       1.1  mrg 
   2256   1.1.1.2  mrg   free(allocdac);	/* drop any storage used */
   2257   1.1.1.2  mrg   free(allocinv);	/* .. */
   2258       1.1  mrg   #if DECSUBSET
   2259   1.1.1.2  mrg   free(alloclhs);	/* .. */
   2260   1.1.1.2  mrg   free(allocrhs);	/* .. */
   2261       1.1  mrg   #endif
   2262       1.1  mrg   if (status!=0) decStatus(res, status, set);
   2263       1.1  mrg   #if DECCHECK
   2264       1.1  mrg   decCheckInexact(res, set);
   2265       1.1  mrg   #endif
   2266       1.1  mrg   return res;
   2267       1.1  mrg   } /* decNumberPower */
   2268       1.1  mrg 
   2269       1.1  mrg /* ------------------------------------------------------------------ */
   2270       1.1  mrg /* decNumberQuantize -- force exponent to requested value	      */
   2271       1.1  mrg /*								      */
   2272       1.1  mrg /*   This computes C = op(A, B), where op adjusts the coefficient     */
   2273       1.1  mrg /*   of C (by rounding or shifting) such that the exponent (-scale)   */
   2274       1.1  mrg /*   of C has exponent of B.  The numerical value of C will equal A,  */
   2275       1.1  mrg /*   except for the effects of any rounding that occurred.	      */
   2276       1.1  mrg /*								      */
   2277       1.1  mrg /*   res is C, the result.  C may be A or B			      */
   2278       1.1  mrg /*   lhs is A, the number to adjust				      */
   2279       1.1  mrg /*   rhs is B, the number with exponent to match		      */
   2280       1.1  mrg /*   set is the context 					      */
   2281       1.1  mrg /*								      */
   2282       1.1  mrg /* C must have space for set->digits digits.			      */
   2283       1.1  mrg /*								      */
   2284       1.1  mrg /* Unless there is an error or the result is infinite, the exponent   */
   2285       1.1  mrg /* after the operation is guaranteed to be equal to that of B.	      */
   2286       1.1  mrg /* ------------------------------------------------------------------ */
   2287       1.1  mrg decNumber * decNumberQuantize(decNumber *res, const decNumber *lhs,
   2288       1.1  mrg 			      const decNumber *rhs, decContext *set) {
   2289       1.1  mrg   uInt status=0;			/* accumulator */
   2290       1.1  mrg   decQuantizeOp(res, lhs, rhs, set, 1, &status);
   2291       1.1  mrg   if (status!=0) decStatus(res, status, set);
   2292       1.1  mrg   return res;
   2293       1.1  mrg   } /* decNumberQuantize */
   2294       1.1  mrg 
   2295       1.1  mrg /* ------------------------------------------------------------------ */
   2296       1.1  mrg /* decNumberReduce -- remove trailing zeros			      */
   2297       1.1  mrg /*								      */
   2298       1.1  mrg /*   This computes C = 0 + A, and normalizes the result 	      */
   2299       1.1  mrg /*								      */
   2300       1.1  mrg /*   res is C, the result.  C may be A				      */
   2301       1.1  mrg /*   rhs is A							      */
   2302       1.1  mrg /*   set is the context 					      */
   2303       1.1  mrg /*								      */
   2304       1.1  mrg /* C must have space for set->digits digits.			      */
   2305       1.1  mrg /* ------------------------------------------------------------------ */
   2306       1.1  mrg /* Previously known as Normalize */
   2307       1.1  mrg decNumber * decNumberNormalize(decNumber *res, const decNumber *rhs,
   2308       1.1  mrg 			       decContext *set) {
   2309       1.1  mrg   return decNumberReduce(res, rhs, set);
   2310       1.1  mrg   } /* decNumberNormalize */
   2311       1.1  mrg 
   2312       1.1  mrg decNumber * decNumberReduce(decNumber *res, const decNumber *rhs,
   2313       1.1  mrg 			    decContext *set) {
   2314       1.1  mrg   #if DECSUBSET
   2315       1.1  mrg   decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
   2316       1.1  mrg   #endif
   2317       1.1  mrg   uInt status=0;		   /* as usual */
   2318       1.1  mrg   Int  residue=0;		   /* as usual */
   2319       1.1  mrg   Int  dropped; 		   /* work */
   2320       1.1  mrg 
   2321       1.1  mrg   #if DECCHECK
   2322       1.1  mrg   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   2323       1.1  mrg   #endif
   2324       1.1  mrg 
   2325       1.1  mrg   do {				   /* protect allocated storage */
   2326       1.1  mrg     #if DECSUBSET
   2327       1.1  mrg     if (!set->extended) {
   2328       1.1  mrg       /* reduce operand and set lostDigits status, as needed */
   2329       1.1  mrg       if (rhs->digits>set->digits) {
   2330       1.1  mrg 	allocrhs=decRoundOperand(rhs, set, &status);
   2331       1.1  mrg 	if (allocrhs==NULL) break;
   2332       1.1  mrg 	rhs=allocrhs;
   2333       1.1  mrg 	}
   2334       1.1  mrg       }
   2335       1.1  mrg     #endif
   2336       1.1  mrg     /* [following code does not require input rounding] */
   2337       1.1  mrg 
   2338       1.1  mrg     /* Infinities copy through; NaNs need usual treatment */
   2339       1.1  mrg     if (decNumberIsNaN(rhs)) {
   2340       1.1  mrg       decNaNs(res, rhs, NULL, set, &status);
   2341       1.1  mrg       break;
   2342       1.1  mrg       }
   2343       1.1  mrg 
   2344       1.1  mrg     /* reduce result to the requested length and copy to result */
   2345       1.1  mrg     decCopyFit(res, rhs, set, &residue, &status); /* copy & round */
   2346       1.1  mrg     decFinish(res, set, &residue, &status);	  /* cleanup/set flags */
   2347       1.1  mrg     decTrim(res, set, 1, 0, &dropped);		  /* normalize in place */
   2348       1.1  mrg 						  /* [may clamp] */
   2349       1.1  mrg     } while(0); 			     /* end protected */
   2350       1.1  mrg 
   2351       1.1  mrg   #if DECSUBSET
   2352   1.1.1.2  mrg   free(allocrhs);	     /* .. */
   2353       1.1  mrg   #endif
   2354       1.1  mrg   if (status!=0) decStatus(res, status, set);/* then report status */
   2355       1.1  mrg   return res;
   2356       1.1  mrg   } /* decNumberReduce */
   2357       1.1  mrg 
   2358       1.1  mrg /* ------------------------------------------------------------------ */
   2359       1.1  mrg /* decNumberRescale -- force exponent to requested value	      */
   2360       1.1  mrg /*								      */
   2361       1.1  mrg /*   This computes C = op(A, B), where op adjusts the coefficient     */
   2362       1.1  mrg /*   of C (by rounding or shifting) such that the exponent (-scale)   */
   2363       1.1  mrg /*   of C has the value B.  The numerical value of C will equal A,    */
   2364       1.1  mrg /*   except for the effects of any rounding that occurred.	      */
   2365       1.1  mrg /*								      */
   2366       1.1  mrg /*   res is C, the result.  C may be A or B			      */
   2367       1.1  mrg /*   lhs is A, the number to adjust				      */
   2368       1.1  mrg /*   rhs is B, the requested exponent				      */
   2369       1.1  mrg /*   set is the context 					      */
   2370       1.1  mrg /*								      */
   2371       1.1  mrg /* C must have space for set->digits digits.			      */
   2372       1.1  mrg /*								      */
   2373       1.1  mrg /* Unless there is an error or the result is infinite, the exponent   */
   2374       1.1  mrg /* after the operation is guaranteed to be equal to B.		      */
   2375       1.1  mrg /* ------------------------------------------------------------------ */
   2376       1.1  mrg decNumber * decNumberRescale(decNumber *res, const decNumber *lhs,
   2377       1.1  mrg 			     const decNumber *rhs, decContext *set) {
   2378       1.1  mrg   uInt status=0;			/* accumulator */
   2379       1.1  mrg   decQuantizeOp(res, lhs, rhs, set, 0, &status);
   2380       1.1  mrg   if (status!=0) decStatus(res, status, set);
   2381       1.1  mrg   return res;
   2382       1.1  mrg   } /* decNumberRescale */
   2383       1.1  mrg 
   2384       1.1  mrg /* ------------------------------------------------------------------ */
   2385       1.1  mrg /* decNumberRemainder -- divide and return remainder		      */
   2386       1.1  mrg /*								      */
   2387       1.1  mrg /*   This computes C = A % B					      */
   2388       1.1  mrg /*								      */
   2389       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X%X)	      */
   2390       1.1  mrg /*   lhs is A							      */
   2391       1.1  mrg /*   rhs is B							      */
   2392       1.1  mrg /*   set is the context 					      */
   2393       1.1  mrg /*								      */
   2394       1.1  mrg /* C must have space for set->digits digits.			      */
   2395       1.1  mrg /* ------------------------------------------------------------------ */
   2396       1.1  mrg decNumber * decNumberRemainder(decNumber *res, const decNumber *lhs,
   2397       1.1  mrg 			       const decNumber *rhs, decContext *set) {
   2398       1.1  mrg   uInt status=0;			/* accumulator */
   2399       1.1  mrg   decDivideOp(res, lhs, rhs, set, REMAINDER, &status);
   2400       1.1  mrg   if (status!=0) decStatus(res, status, set);
   2401       1.1  mrg   #if DECCHECK
   2402       1.1  mrg   decCheckInexact(res, set);
   2403       1.1  mrg   #endif
   2404       1.1  mrg   return res;
   2405       1.1  mrg   } /* decNumberRemainder */
   2406       1.1  mrg 
   2407       1.1  mrg /* ------------------------------------------------------------------ */
   2408       1.1  mrg /* decNumberRemainderNear -- divide and return remainder from nearest */
   2409       1.1  mrg /*								      */
   2410       1.1  mrg /*   This computes C = A % B, where % is the IEEE remainder operator  */
   2411       1.1  mrg /*								      */
   2412       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X%X)	      */
   2413       1.1  mrg /*   lhs is A							      */
   2414       1.1  mrg /*   rhs is B							      */
   2415       1.1  mrg /*   set is the context 					      */
   2416       1.1  mrg /*								      */
   2417       1.1  mrg /* C must have space for set->digits digits.			      */
   2418       1.1  mrg /* ------------------------------------------------------------------ */
   2419       1.1  mrg decNumber * decNumberRemainderNear(decNumber *res, const decNumber *lhs,
   2420       1.1  mrg 				   const decNumber *rhs, decContext *set) {
   2421       1.1  mrg   uInt status=0;			/* accumulator */
   2422       1.1  mrg   decDivideOp(res, lhs, rhs, set, REMNEAR, &status);
   2423       1.1  mrg   if (status!=0) decStatus(res, status, set);
   2424       1.1  mrg   #if DECCHECK
   2425       1.1  mrg   decCheckInexact(res, set);
   2426       1.1  mrg   #endif
   2427       1.1  mrg   return res;
   2428       1.1  mrg   } /* decNumberRemainderNear */
   2429       1.1  mrg 
   2430       1.1  mrg /* ------------------------------------------------------------------ */
   2431       1.1  mrg /* decNumberRotate -- rotate the coefficient of a Number left/right   */
   2432       1.1  mrg /*								      */
   2433       1.1  mrg /*   This computes C = A rot B	(in base ten and rotating set->digits */
   2434       1.1  mrg /*   digits).							      */
   2435       1.1  mrg /*								      */
   2436       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=XrotX)       */
   2437       1.1  mrg /*   lhs is A							      */
   2438       1.1  mrg /*   rhs is B, the number of digits to rotate (-ve to right)	      */
   2439       1.1  mrg /*   set is the context 					      */
   2440       1.1  mrg /*								      */
   2441       1.1  mrg /* The digits of the coefficient of A are rotated to the left (if B   */
   2442       1.1  mrg /* is positive) or to the right (if B is negative) without adjusting  */
   2443       1.1  mrg /* the exponent or the sign of A.  If lhs->digits is less than	      */
   2444       1.1  mrg /* set->digits the coefficient is padded with zeros on the left       */
   2445       1.1  mrg /* before the rotate.  Any leading zeros in the result are removed    */
   2446       1.1  mrg /* as usual.							      */
   2447       1.1  mrg /*								      */
   2448       1.1  mrg /* B must be an integer (q=0) and in the range -set->digits through   */
   2449       1.1  mrg /* +set->digits.						      */
   2450       1.1  mrg /* C must have space for set->digits digits.			      */
   2451       1.1  mrg /* NaNs are propagated as usual.  Infinities are unaffected (but      */
   2452       1.1  mrg /* B must be valid).  No status is set unless B is invalid or an      */
   2453       1.1  mrg /* operand is an sNaN.						      */
   2454       1.1  mrg /* ------------------------------------------------------------------ */
   2455       1.1  mrg decNumber * decNumberRotate(decNumber *res, const decNumber *lhs,
   2456       1.1  mrg 			   const decNumber *rhs, decContext *set) {
   2457       1.1  mrg   uInt status=0;	      /* accumulator */
   2458       1.1  mrg   Int  rotate;		      /* rhs as an Int */
   2459       1.1  mrg 
   2460       1.1  mrg   #if DECCHECK
   2461       1.1  mrg   if (decCheckOperands(res, lhs, rhs, set)) return res;
   2462       1.1  mrg   #endif
   2463       1.1  mrg 
   2464       1.1  mrg   /* NaNs propagate as normal */
   2465       1.1  mrg   if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
   2466       1.1  mrg     decNaNs(res, lhs, rhs, set, &status);
   2467       1.1  mrg    /* rhs must be an integer */
   2468       1.1  mrg    else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
   2469       1.1  mrg     status=DEC_Invalid_operation;
   2470       1.1  mrg    else { /* both numeric, rhs is an integer */
   2471       1.1  mrg     rotate=decGetInt(rhs);		     /* [cannot fail] */
   2472       1.1  mrg     if (rotate==BADINT			     /* something bad .. */
   2473       1.1  mrg      || rotate==BIGODD || rotate==BIGEVEN    /* .. very big .. */
   2474       1.1  mrg      || abs(rotate)>set->digits)	     /* .. or out of range */
   2475       1.1  mrg       status=DEC_Invalid_operation;
   2476       1.1  mrg      else {				     /* rhs is OK */
   2477       1.1  mrg       decNumberCopy(res, lhs);
   2478       1.1  mrg       /* convert -ve rotate to equivalent positive rotation */
   2479       1.1  mrg       if (rotate<0) rotate=set->digits+rotate;
   2480       1.1  mrg       if (rotate!=0 && rotate!=set->digits   /* zero or full rotation */
   2481       1.1  mrg        && !decNumberIsInfinite(res)) {	     /* lhs was infinite */
   2482       1.1  mrg 	/* left-rotate to do; 0 < rotate < set->digits */
   2483       1.1  mrg 	uInt units, shift;		     /* work */
   2484       1.1  mrg 	uInt msudigits; 		     /* digits in result msu */
   2485       1.1  mrg 	Unit *msu=res->lsu+D2U(res->digits)-1;	  /* current msu */
   2486       1.1  mrg 	Unit *msumax=res->lsu+D2U(set->digits)-1; /* rotation msu */
   2487       1.1  mrg 	for (msu++; msu<=msumax; msu++) *msu=0;   /* ensure high units=0 */
   2488       1.1  mrg 	res->digits=set->digits;		  /* now full-length */
   2489       1.1  mrg 	msudigits=MSUDIGITS(res->digits);	  /* actual digits in msu */
   2490       1.1  mrg 
   2491       1.1  mrg 	/* rotation here is done in-place, in three steps */
   2492       1.1  mrg 	/* 1. shift all to least up to one unit to unit-align final */
   2493       1.1  mrg 	/*    lsd [any digits shifted out are rotated to the left, */
   2494       1.1  mrg 	/*    abutted to the original msd (which may require split)] */
   2495       1.1  mrg 	/* */
   2496       1.1  mrg 	/*    [if there are no whole units left to rotate, the */
   2497       1.1  mrg 	/*    rotation is now complete] */
   2498       1.1  mrg 	/* */
   2499       1.1  mrg 	/* 2. shift to least, from below the split point only, so that */
   2500       1.1  mrg 	/*    the final msd is in the right place in its Unit [any */
   2501       1.1  mrg 	/*    digits shifted out will fit exactly in the current msu, */
   2502       1.1  mrg 	/*    left aligned, no split required] */
   2503       1.1  mrg 	/* */
   2504       1.1  mrg 	/* 3. rotate all the units by reversing left part, right */
   2505       1.1  mrg 	/*    part, and then whole */
   2506       1.1  mrg 	/* */
   2507       1.1  mrg 	/* example: rotate right 8 digits (2 units + 2), DECDPUN=3. */
   2508       1.1  mrg 	/* */
   2509       1.1  mrg 	/*   start: 00a bcd efg hij klm npq */
   2510       1.1  mrg 	/* */
   2511       1.1  mrg 	/*	1a  000 0ab cde fgh|ijk lmn [pq saved] */
   2512       1.1  mrg 	/*	1b  00p qab cde fgh|ijk lmn */
   2513       1.1  mrg 	/* */
   2514       1.1  mrg 	/*	2a  00p qab cde fgh|00i jkl [mn saved] */
   2515       1.1  mrg 	/*	2b  mnp qab cde fgh|00i jkl */
   2516       1.1  mrg 	/* */
   2517       1.1  mrg 	/*	3a  fgh cde qab mnp|00i jkl */
   2518       1.1  mrg 	/*	3b  fgh cde qab mnp|jkl 00i */
   2519       1.1  mrg 	/*	3c  00i jkl mnp qab cde fgh */
   2520       1.1  mrg 
   2521       1.1  mrg 	/* Step 1: amount to shift is the partial right-rotate count */
   2522       1.1  mrg 	rotate=set->digits-rotate;	/* make it right-rotate */
   2523       1.1  mrg 	units=rotate/DECDPUN;		/* whole units to rotate */
   2524       1.1  mrg 	shift=rotate%DECDPUN;		/* left-over digits count */
   2525       1.1  mrg 	if (shift>0) {			/* not an exact number of units */
   2526       1.1  mrg 	  uInt save=res->lsu[0]%powers[shift];	  /* save low digit(s) */
   2527       1.1  mrg 	  decShiftToLeast(res->lsu, D2U(res->digits), shift);
   2528       1.1  mrg 	  if (shift>msudigits) {	/* msumax-1 needs >0 digits */
   2529       1.1  mrg 	    uInt rem=save%powers[shift-msudigits];/* split save */
   2530       1.1  mrg 	    *msumax=(Unit)(save/powers[shift-msudigits]); /* and insert */
   2531       1.1  mrg 	    *(msumax-1)=*(msumax-1)
   2532       1.1  mrg 		       +(Unit)(rem*powers[DECDPUN-(shift-msudigits)]); /* .. */
   2533       1.1  mrg 	    }
   2534       1.1  mrg 	   else { /* all fits in msumax */
   2535       1.1  mrg 	    *msumax=*msumax+(Unit)(save*powers[msudigits-shift]); /* [maybe *1] */
   2536       1.1  mrg 	    }
   2537       1.1  mrg 	  } /* digits shift needed */
   2538       1.1  mrg 
   2539       1.1  mrg 	/* If whole units to rotate... */
   2540       1.1  mrg 	if (units>0) {			/* some to do */
   2541       1.1  mrg 	  /* Step 2: the units to touch are the whole ones in rotate, */
   2542       1.1  mrg 	  /*   if any, and the shift is DECDPUN-msudigits (which may be */
   2543       1.1  mrg 	  /*   0, again) */
   2544       1.1  mrg 	  shift=DECDPUN-msudigits;
   2545       1.1  mrg 	  if (shift>0) {		/* not an exact number of units */
   2546       1.1  mrg 	    uInt save=res->lsu[0]%powers[shift];  /* save low digit(s) */
   2547       1.1  mrg 	    decShiftToLeast(res->lsu, units, shift);
   2548       1.1  mrg 	    *msumax=*msumax+(Unit)(save*powers[msudigits]);
   2549       1.1  mrg 	    } /* partial shift needed */
   2550       1.1  mrg 
   2551       1.1  mrg 	  /* Step 3: rotate the units array using triple reverse */
   2552       1.1  mrg 	  /* (reversing is easy and fast) */
   2553       1.1  mrg 	  decReverse(res->lsu+units, msumax);	  /* left part */
   2554       1.1  mrg 	  decReverse(res->lsu, res->lsu+units-1); /* right part */
   2555       1.1  mrg 	  decReverse(res->lsu, msumax); 	  /* whole */
   2556       1.1  mrg 	  } /* whole units to rotate */
   2557       1.1  mrg 	/* the rotation may have left an undetermined number of zeros */
   2558       1.1  mrg 	/* on the left, so true length needs to be calculated */
   2559       1.1  mrg 	res->digits=decGetDigits(res->lsu, msumax-res->lsu+1);
   2560       1.1  mrg 	} /* rotate needed */
   2561       1.1  mrg       } /* rhs OK */
   2562       1.1  mrg     } /* numerics */
   2563       1.1  mrg   if (status!=0) decStatus(res, status, set);
   2564       1.1  mrg   return res;
   2565       1.1  mrg   } /* decNumberRotate */
   2566       1.1  mrg 
   2567       1.1  mrg /* ------------------------------------------------------------------ */
   2568       1.1  mrg /* decNumberSameQuantum -- test for equal exponents		      */
   2569       1.1  mrg /*								      */
   2570       1.1  mrg /*   res is the result number, which will contain either 0 or 1       */
   2571       1.1  mrg /*   lhs is a number to test					      */
   2572       1.1  mrg /*   rhs is the second (usually a pattern)			      */
   2573       1.1  mrg /*								      */
   2574       1.1  mrg /* No errors are possible and no context is needed.		      */
   2575       1.1  mrg /* ------------------------------------------------------------------ */
   2576       1.1  mrg decNumber * decNumberSameQuantum(decNumber *res, const decNumber *lhs,
   2577       1.1  mrg 				 const decNumber *rhs) {
   2578       1.1  mrg   Unit ret=0;			   /* return value */
   2579       1.1  mrg 
   2580       1.1  mrg   #if DECCHECK
   2581       1.1  mrg   if (decCheckOperands(res, lhs, rhs, DECUNCONT)) return res;
   2582       1.1  mrg   #endif
   2583       1.1  mrg 
   2584       1.1  mrg   if (SPECIALARGS) {
   2585       1.1  mrg     if (decNumberIsNaN(lhs) && decNumberIsNaN(rhs)) ret=1;
   2586       1.1  mrg      else if (decNumberIsInfinite(lhs) && decNumberIsInfinite(rhs)) ret=1;
   2587       1.1  mrg      /* [anything else with a special gives 0] */
   2588       1.1  mrg     }
   2589       1.1  mrg    else if (lhs->exponent==rhs->exponent) ret=1;
   2590       1.1  mrg 
   2591       1.1  mrg   decNumberZero(res);		   /* OK to overwrite an operand now */
   2592       1.1  mrg   *res->lsu=ret;
   2593       1.1  mrg   return res;
   2594       1.1  mrg   } /* decNumberSameQuantum */
   2595       1.1  mrg 
   2596       1.1  mrg /* ------------------------------------------------------------------ */
   2597       1.1  mrg /* decNumberScaleB -- multiply by a power of 10 		      */
   2598       1.1  mrg /*								      */
   2599       1.1  mrg /* This computes C = A x 10**B where B is an integer (q=0) with       */
   2600       1.1  mrg /* maximum magnitude 2*(emax+digits)				      */
   2601       1.1  mrg /*								      */
   2602       1.1  mrg /*   res is C, the result.  C may be A or B			      */
   2603       1.1  mrg /*   lhs is A, the number to adjust				      */
   2604       1.1  mrg /*   rhs is B, the requested power of ten to use		      */
   2605       1.1  mrg /*   set is the context 					      */
   2606       1.1  mrg /*								      */
   2607       1.1  mrg /* C must have space for set->digits digits.			      */
   2608       1.1  mrg /*								      */
   2609       1.1  mrg /* The result may underflow or overflow.			      */
   2610       1.1  mrg /* ------------------------------------------------------------------ */
   2611       1.1  mrg decNumber * decNumberScaleB(decNumber *res, const decNumber *lhs,
   2612       1.1  mrg 			    const decNumber *rhs, decContext *set) {
   2613       1.1  mrg   Int  reqexp;		      /* requested exponent change [B] */
   2614       1.1  mrg   uInt status=0;	      /* accumulator */
   2615       1.1  mrg   Int  residue; 	      /* work */
   2616       1.1  mrg 
   2617       1.1  mrg   #if DECCHECK
   2618       1.1  mrg   if (decCheckOperands(res, lhs, rhs, set)) return res;
   2619       1.1  mrg   #endif
   2620       1.1  mrg 
   2621       1.1  mrg   /* Handle special values except lhs infinite */
   2622       1.1  mrg   if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
   2623       1.1  mrg     decNaNs(res, lhs, rhs, set, &status);
   2624       1.1  mrg     /* rhs must be an integer */
   2625       1.1  mrg    else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
   2626       1.1  mrg     status=DEC_Invalid_operation;
   2627       1.1  mrg    else {
   2628       1.1  mrg     /* lhs is a number; rhs is a finite with q==0 */
   2629       1.1  mrg     reqexp=decGetInt(rhs);		     /* [cannot fail] */
   2630       1.1  mrg     if (reqexp==BADINT			     /* something bad .. */
   2631       1.1  mrg      || reqexp==BIGODD || reqexp==BIGEVEN    /* .. very big .. */
   2632       1.1  mrg      || abs(reqexp)>(2*(set->digits+set->emax))) /* .. or out of range */
   2633       1.1  mrg       status=DEC_Invalid_operation;
   2634       1.1  mrg      else {				     /* rhs is OK */
   2635       1.1  mrg       decNumberCopy(res, lhs);		     /* all done if infinite lhs */
   2636       1.1  mrg       if (!decNumberIsInfinite(res)) {	     /* prepare to scale */
   2637       1.1  mrg 	res->exponent+=reqexp;		     /* adjust the exponent */
   2638       1.1  mrg 	residue=0;
   2639       1.1  mrg 	decFinalize(res, set, &residue, &status); /* .. and check */
   2640       1.1  mrg 	} /* finite LHS */
   2641       1.1  mrg       } /* rhs OK */
   2642       1.1  mrg     } /* rhs finite */
   2643       1.1  mrg   if (status!=0) decStatus(res, status, set);
   2644       1.1  mrg   return res;
   2645       1.1  mrg   } /* decNumberScaleB */
   2646       1.1  mrg 
   2647       1.1  mrg /* ------------------------------------------------------------------ */
   2648       1.1  mrg /* decNumberShift -- shift the coefficient of a Number left or right  */
   2649       1.1  mrg /*								      */
   2650       1.1  mrg /*   This computes C = A << B or C = A >> -B  (in base ten).	      */
   2651       1.1  mrg /*								      */
   2652       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X<<X)	      */
   2653       1.1  mrg /*   lhs is A							      */
   2654       1.1  mrg /*   rhs is B, the number of digits to shift (-ve to right)	      */
   2655       1.1  mrg /*   set is the context 					      */
   2656       1.1  mrg /*								      */
   2657       1.1  mrg /* The digits of the coefficient of A are shifted to the left (if B   */
   2658       1.1  mrg /* is positive) or to the right (if B is negative) without adjusting  */
   2659       1.1  mrg /* the exponent or the sign of A.				      */
   2660       1.1  mrg /*								      */
   2661       1.1  mrg /* B must be an integer (q=0) and in the range -set->digits through   */
   2662       1.1  mrg /* +set->digits.						      */
   2663       1.1  mrg /* C must have space for set->digits digits.			      */
   2664       1.1  mrg /* NaNs are propagated as usual.  Infinities are unaffected (but      */
   2665       1.1  mrg /* B must be valid).  No status is set unless B is invalid or an      */
   2666       1.1  mrg /* operand is an sNaN.						      */
   2667       1.1  mrg /* ------------------------------------------------------------------ */
   2668       1.1  mrg decNumber * decNumberShift(decNumber *res, const decNumber *lhs,
   2669       1.1  mrg 			   const decNumber *rhs, decContext *set) {
   2670       1.1  mrg   uInt status=0;	      /* accumulator */
   2671       1.1  mrg   Int  shift;		      /* rhs as an Int */
   2672       1.1  mrg 
   2673       1.1  mrg   #if DECCHECK
   2674       1.1  mrg   if (decCheckOperands(res, lhs, rhs, set)) return res;
   2675       1.1  mrg   #endif
   2676       1.1  mrg 
   2677       1.1  mrg   /* NaNs propagate as normal */
   2678       1.1  mrg   if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
   2679       1.1  mrg     decNaNs(res, lhs, rhs, set, &status);
   2680       1.1  mrg    /* rhs must be an integer */
   2681       1.1  mrg    else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
   2682       1.1  mrg     status=DEC_Invalid_operation;
   2683       1.1  mrg    else { /* both numeric, rhs is an integer */
   2684       1.1  mrg     shift=decGetInt(rhs);		     /* [cannot fail] */
   2685       1.1  mrg     if (shift==BADINT			     /* something bad .. */
   2686       1.1  mrg      || shift==BIGODD || shift==BIGEVEN      /* .. very big .. */
   2687       1.1  mrg      || abs(shift)>set->digits) 	     /* .. or out of range */
   2688       1.1  mrg       status=DEC_Invalid_operation;
   2689       1.1  mrg      else {				     /* rhs is OK */
   2690       1.1  mrg       decNumberCopy(res, lhs);
   2691       1.1  mrg       if (shift!=0 && !decNumberIsInfinite(res)) { /* something to do */
   2692       1.1  mrg 	if (shift>0) {			     /* to left */
   2693       1.1  mrg 	  if (shift==set->digits) {	     /* removing all */
   2694       1.1  mrg 	    *res->lsu=0;		     /* so place 0 */
   2695       1.1  mrg 	    res->digits=1;		     /* .. */
   2696       1.1  mrg 	    }
   2697       1.1  mrg 	   else {			     /* */
   2698       1.1  mrg 	    /* first remove leading digits if necessary */
   2699       1.1  mrg 	    if (res->digits+shift>set->digits) {
   2700       1.1  mrg 	      decDecap(res, res->digits+shift-set->digits);
   2701       1.1  mrg 	      /* that updated res->digits; may have gone to 1 (for a */
   2702       1.1  mrg 	      /* single digit or for zero */
   2703       1.1  mrg 	      }
   2704       1.1  mrg 	    if (res->digits>1 || *res->lsu)  /* if non-zero.. */
   2705       1.1  mrg 	      res->digits=decShiftToMost(res->lsu, res->digits, shift);
   2706       1.1  mrg 	    } /* partial left */
   2707       1.1  mrg 	  } /* left */
   2708       1.1  mrg 	 else { /* to right */
   2709       1.1  mrg 	  if (-shift>=res->digits) {	     /* discarding all */
   2710       1.1  mrg 	    *res->lsu=0;		     /* so place 0 */
   2711       1.1  mrg 	    res->digits=1;		     /* .. */
   2712       1.1  mrg 	    }
   2713       1.1  mrg 	   else {
   2714       1.1  mrg 	    decShiftToLeast(res->lsu, D2U(res->digits), -shift);
   2715       1.1  mrg 	    res->digits-=(-shift);
   2716       1.1  mrg 	    }
   2717       1.1  mrg 	  } /* to right */
   2718       1.1  mrg 	} /* non-0 non-Inf shift */
   2719       1.1  mrg       } /* rhs OK */
   2720       1.1  mrg     } /* numerics */
   2721       1.1  mrg   if (status!=0) decStatus(res, status, set);
   2722       1.1  mrg   return res;
   2723       1.1  mrg   } /* decNumberShift */
   2724       1.1  mrg 
   2725       1.1  mrg /* ------------------------------------------------------------------ */
   2726       1.1  mrg /* decNumberSquareRoot -- square root operator			      */
   2727       1.1  mrg /*								      */
   2728       1.1  mrg /*   This computes C = squareroot(A)				      */
   2729       1.1  mrg /*								      */
   2730       1.1  mrg /*   res is C, the result.  C may be A				      */
   2731       1.1  mrg /*   rhs is A							      */
   2732       1.1  mrg /*   set is the context; note that rounding mode has no effect	      */
   2733       1.1  mrg /*								      */
   2734       1.1  mrg /* C must have space for set->digits digits.			      */
   2735       1.1  mrg /* ------------------------------------------------------------------ */
   2736       1.1  mrg /* This uses the following varying-precision algorithm in:	      */
   2737       1.1  mrg /*								      */
   2738       1.1  mrg /*   Properly Rounded Variable Precision Square Root, T. E. Hull and  */
   2739       1.1  mrg /*   A. Abrham, ACM Transactions on Mathematical Software, Vol 11 #3, */
   2740       1.1  mrg /*   pp229-237, ACM, September 1985.				      */
   2741       1.1  mrg /*								      */
   2742       1.1  mrg /* The square-root is calculated using Newton's method, after which   */
   2743       1.1  mrg /* a check is made to ensure the result is correctly rounded.	      */
   2744       1.1  mrg /*								      */
   2745       1.1  mrg /* % [Reformatted original Numerical Turing source code follows.]     */
   2746       1.1  mrg /* function sqrt(x : real) : real				      */
   2747       1.1  mrg /* % sqrt(x) returns the properly rounded approximation to the square */
   2748       1.1  mrg /* % root of x, in the precision of the calling environment, or it    */
   2749       1.1  mrg /* % fails if x < 0.						      */
   2750       1.1  mrg /* % t e hull and a abrham, august, 1984			      */
   2751       1.1  mrg /* if x <= 0 then						      */
   2752       1.1  mrg /*   if x < 0 then						      */
   2753       1.1  mrg /*     assert false						      */
   2754       1.1  mrg /*   else							      */
   2755       1.1  mrg /*     result 0 						      */
   2756       1.1  mrg /*   end if							      */
   2757       1.1  mrg /* end if							      */
   2758       1.1  mrg /* var f := setexp(x, 0)  % fraction part of x	 [0.1 <= x < 1]       */
   2759       1.1  mrg /* var e := getexp(x)	  % exponent part of x			      */
   2760       1.1  mrg /* var approx : real						      */
   2761       1.1  mrg /* if e mod 2 = 0  then 					      */
   2762       1.1  mrg /*   approx := .259 + .819 * f	 % approx to root of f		      */
   2763       1.1  mrg /* else 							      */
   2764       1.1  mrg /*   f := f/l0			 % adjustments			      */
   2765       1.1  mrg /*   e := e + 1 		 %   for odd			      */
   2766       1.1  mrg /*   approx := .0819 + 2.59 * f  %   exponent			      */
   2767       1.1  mrg /* end if							      */
   2768       1.1  mrg /*								      */
   2769       1.1  mrg /* var p:= 3							      */
   2770       1.1  mrg /* const maxp := currentprecision + 2				      */
   2771       1.1  mrg /* loop 							      */
   2772       1.1  mrg /*   p := min(2*p - 2, maxp)	 % p = 4,6,10, . . . , maxp	      */
   2773       1.1  mrg /*   precision p						      */
   2774       1.1  mrg /*   approx := .5 * (approx + f/approx) 			      */
   2775       1.1  mrg /*   exit when p = maxp 					      */
   2776       1.1  mrg /* end loop							      */
   2777       1.1  mrg /*								      */
   2778       1.1  mrg /* % approx is now within 1 ulp of the properly rounded square root   */
   2779       1.1  mrg /* % of f; to ensure proper rounding, compare squares of (approx -    */
   2780       1.1  mrg /* % l/2 ulp) and (approx + l/2 ulp) with f.			      */
   2781       1.1  mrg /* p := currentprecision					      */
   2782       1.1  mrg /* begin							      */
   2783       1.1  mrg /*   precision p + 2						      */
   2784       1.1  mrg /*   const approxsubhalf := approx - setexp(.5, -p)		      */
   2785       1.1  mrg /*   if mulru(approxsubhalf, approxsubhalf) > f then		      */
   2786       1.1  mrg /*     approx := approx - setexp(.l, -p + 1)			      */
   2787       1.1  mrg /*   else							      */
   2788       1.1  mrg /*     const approxaddhalf := approx + setexp(.5, -p)		      */
   2789       1.1  mrg /*     if mulrd(approxaddhalf, approxaddhalf) < f then		      */
   2790       1.1  mrg /*	 approx := approx + setexp(.l, -p + 1)			      */
   2791       1.1  mrg /*     end if							      */
   2792       1.1  mrg /*   end if							      */
   2793       1.1  mrg /* end								      */
   2794       1.1  mrg /* result setexp(approx, e div 2)  % fix exponent		      */
   2795       1.1  mrg /* end sqrt							      */
   2796       1.1  mrg /* ------------------------------------------------------------------ */
   2797       1.1  mrg decNumber * decNumberSquareRoot(decNumber *res, const decNumber *rhs,
   2798       1.1  mrg 				decContext *set) {
   2799       1.1  mrg   decContext workset, approxset;   /* work contexts */
   2800       1.1  mrg   decNumber dzero;		   /* used for constant zero */
   2801       1.1  mrg   Int  maxp;			   /* largest working precision */
   2802       1.1  mrg   Int  workp;			   /* working precision */
   2803       1.1  mrg   Int  residue=0;		   /* rounding residue */
   2804       1.1  mrg   uInt status=0, ignore=0;	   /* status accumulators */
   2805       1.1  mrg   uInt rstatus; 		   /* .. */
   2806       1.1  mrg   Int  exp;			   /* working exponent */
   2807       1.1  mrg   Int  ideal;			   /* ideal (preferred) exponent */
   2808       1.1  mrg   Int  needbytes;		   /* work */
   2809       1.1  mrg   Int  dropped; 		   /* .. */
   2810       1.1  mrg 
   2811       1.1  mrg   #if DECSUBSET
   2812       1.1  mrg   decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
   2813       1.1  mrg   #endif
   2814       1.1  mrg   /* buffer for f [needs +1 in case DECBUFFER 0] */
   2815       1.1  mrg   decNumber buff[D2N(DECBUFFER+1)];
   2816       1.1  mrg   /* buffer for a [needs +2 to match likely maxp] */
   2817       1.1  mrg   decNumber bufa[D2N(DECBUFFER+2)];
   2818       1.1  mrg   /* buffer for temporary, b [must be same size as a] */
   2819       1.1  mrg   decNumber bufb[D2N(DECBUFFER+2)];
   2820       1.1  mrg   decNumber *allocbuff=NULL;	   /* -> allocated buff, iff allocated */
   2821       1.1  mrg   decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
   2822       1.1  mrg   decNumber *allocbufb=NULL;	   /* -> allocated bufb, iff allocated */
   2823       1.1  mrg   decNumber *f=buff;		   /* reduced fraction */
   2824       1.1  mrg   decNumber *a=bufa;		   /* approximation to result */
   2825       1.1  mrg   decNumber *b=bufb;		   /* intermediate result */
   2826       1.1  mrg   /* buffer for temporary variable, up to 3 digits */
   2827       1.1  mrg   decNumber buft[D2N(3)];
   2828       1.1  mrg   decNumber *t=buft;		   /* up-to-3-digit constant or work */
   2829       1.1  mrg 
   2830       1.1  mrg   #if DECCHECK
   2831       1.1  mrg   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   2832       1.1  mrg   #endif
   2833       1.1  mrg 
   2834       1.1  mrg   do {				   /* protect allocated storage */
   2835       1.1  mrg     #if DECSUBSET
   2836       1.1  mrg     if (!set->extended) {
   2837       1.1  mrg       /* reduce operand and set lostDigits status, as needed */
   2838       1.1  mrg       if (rhs->digits>set->digits) {
   2839       1.1  mrg 	allocrhs=decRoundOperand(rhs, set, &status);
   2840       1.1  mrg 	if (allocrhs==NULL) break;
   2841       1.1  mrg 	/* [Note: 'f' allocation below could reuse this buffer if */
   2842       1.1  mrg 	/* used, but as this is rare they are kept separate for clarity.] */
   2843       1.1  mrg 	rhs=allocrhs;
   2844       1.1  mrg 	}
   2845       1.1  mrg       }
   2846       1.1  mrg     #endif
   2847       1.1  mrg     /* [following code does not require input rounding] */
   2848       1.1  mrg 
   2849       1.1  mrg     /* handle infinities and NaNs */
   2850       1.1  mrg     if (SPECIALARG) {
   2851       1.1  mrg       if (decNumberIsInfinite(rhs)) {	      /* an infinity */
   2852       1.1  mrg 	if (decNumberIsNegative(rhs)) status|=DEC_Invalid_operation;
   2853       1.1  mrg 	 else decNumberCopy(res, rhs);	      /* +Infinity */
   2854       1.1  mrg 	}
   2855       1.1  mrg        else decNaNs(res, rhs, NULL, set, &status); /* a NaN */
   2856       1.1  mrg       break;
   2857       1.1  mrg       }
   2858       1.1  mrg 
   2859       1.1  mrg     /* calculate the ideal (preferred) exponent [floor(exp/2)] */
   2860       1.1  mrg     /* [It would be nicer to write: ideal=rhs->exponent>>1, but this */
   2861       1.1  mrg     /* generates a compiler warning.  Generated code is the same.] */
   2862       1.1  mrg     ideal=(rhs->exponent&~1)/2; 	/* target */
   2863       1.1  mrg 
   2864       1.1  mrg     /* handle zeros */
   2865       1.1  mrg     if (ISZERO(rhs)) {
   2866       1.1  mrg       decNumberCopy(res, rhs);		/* could be 0 or -0 */
   2867       1.1  mrg       res->exponent=ideal;		/* use the ideal [safe] */
   2868       1.1  mrg       /* use decFinish to clamp any out-of-range exponent, etc. */
   2869       1.1  mrg       decFinish(res, set, &residue, &status);
   2870       1.1  mrg       break;
   2871       1.1  mrg       }
   2872       1.1  mrg 
   2873       1.1  mrg     /* any other -x is an oops */
   2874       1.1  mrg     if (decNumberIsNegative(rhs)) {
   2875       1.1  mrg       status|=DEC_Invalid_operation;
   2876       1.1  mrg       break;
   2877       1.1  mrg       }
   2878       1.1  mrg 
   2879       1.1  mrg     /* space is needed for three working variables */
   2880       1.1  mrg     /*	 f -- the same precision as the RHS, reduced to 0.01->0.99... */
   2881       1.1  mrg     /*	 a -- Hull's approximation -- precision, when assigned, is */
   2882       1.1  mrg     /*	      currentprecision+1 or the input argument precision, */
   2883       1.1  mrg     /*	      whichever is larger (+2 for use as temporary) */
   2884       1.1  mrg     /*	 b -- intermediate temporary result (same size as a) */
   2885       1.1  mrg     /* if any is too long for local storage, then allocate */
   2886       1.1  mrg     workp=MAXI(set->digits+1, rhs->digits);  /* actual rounding precision */
   2887       1.1  mrg     workp=MAXI(workp, 7);		     /* at least 7 for low cases */
   2888       1.1  mrg     maxp=workp+2;			     /* largest working precision */
   2889       1.1  mrg 
   2890       1.1  mrg     needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
   2891       1.1  mrg     if (needbytes>(Int)sizeof(buff)) {
   2892       1.1  mrg       allocbuff=(decNumber *)malloc(needbytes);
   2893       1.1  mrg       if (allocbuff==NULL) {  /* hopeless -- abandon */
   2894       1.1  mrg 	status|=DEC_Insufficient_storage;
   2895       1.1  mrg 	break;}
   2896       1.1  mrg       f=allocbuff;	      /* use the allocated space */
   2897       1.1  mrg       }
   2898       1.1  mrg     /* a and b both need to be able to hold a maxp-length number */
   2899       1.1  mrg     needbytes=sizeof(decNumber)+(D2U(maxp)-1)*sizeof(Unit);
   2900       1.1  mrg     if (needbytes>(Int)sizeof(bufa)) {		  /* [same applies to b] */
   2901       1.1  mrg       allocbufa=(decNumber *)malloc(needbytes);
   2902       1.1  mrg       allocbufb=(decNumber *)malloc(needbytes);
   2903       1.1  mrg       if (allocbufa==NULL || allocbufb==NULL) {   /* hopeless */
   2904       1.1  mrg 	status|=DEC_Insufficient_storage;
   2905       1.1  mrg 	break;}
   2906       1.1  mrg       a=allocbufa;	      /* use the allocated spaces */
   2907       1.1  mrg       b=allocbufb;	      /* .. */
   2908       1.1  mrg       }
   2909       1.1  mrg 
   2910       1.1  mrg     /* copy rhs -> f, save exponent, and reduce so 0.1 <= f < 1 */
   2911       1.1  mrg     decNumberCopy(f, rhs);
   2912       1.1  mrg     exp=f->exponent+f->digits;		     /* adjusted to Hull rules */
   2913       1.1  mrg     f->exponent=-(f->digits);		     /* to range */
   2914       1.1  mrg 
   2915       1.1  mrg     /* set up working context */
   2916       1.1  mrg     decContextDefault(&workset, DEC_INIT_DECIMAL64);
   2917       1.1  mrg     workset.emax=DEC_MAX_EMAX;
   2918       1.1  mrg     workset.emin=DEC_MIN_EMIN;
   2919       1.1  mrg 
   2920       1.1  mrg     /* [Until further notice, no error is possible and status bits */
   2921       1.1  mrg     /* (Rounded, etc.) should be ignored, not accumulated.] */
   2922       1.1  mrg 
   2923       1.1  mrg     /* Calculate initial approximation, and allow for odd exponent */
   2924       1.1  mrg     workset.digits=workp;		     /* p for initial calculation */
   2925       1.1  mrg     t->bits=0; t->digits=3;
   2926       1.1  mrg     a->bits=0; a->digits=3;
   2927       1.1  mrg     if ((exp & 1)==0) { 		     /* even exponent */
   2928       1.1  mrg       /* Set t=0.259, a=0.819 */
   2929       1.1  mrg       t->exponent=-3;
   2930       1.1  mrg       a->exponent=-3;
   2931       1.1  mrg       #if DECDPUN>=3
   2932       1.1  mrg 	t->lsu[0]=259;
   2933       1.1  mrg 	a->lsu[0]=819;
   2934       1.1  mrg       #elif DECDPUN==2
   2935       1.1  mrg 	t->lsu[0]=59; t->lsu[1]=2;
   2936       1.1  mrg 	a->lsu[0]=19; a->lsu[1]=8;
   2937       1.1  mrg       #else
   2938       1.1  mrg 	t->lsu[0]=9; t->lsu[1]=5; t->lsu[2]=2;
   2939       1.1  mrg 	a->lsu[0]=9; a->lsu[1]=1; a->lsu[2]=8;
   2940       1.1  mrg       #endif
   2941       1.1  mrg       }
   2942       1.1  mrg      else {				     /* odd exponent */
   2943       1.1  mrg       /* Set t=0.0819, a=2.59 */
   2944       1.1  mrg       f->exponent--;			     /* f=f/10 */
   2945       1.1  mrg       exp++;				     /* e=e+1 */
   2946       1.1  mrg       t->exponent=-4;
   2947       1.1  mrg       a->exponent=-2;
   2948       1.1  mrg       #if DECDPUN>=3
   2949       1.1  mrg 	t->lsu[0]=819;
   2950       1.1  mrg 	a->lsu[0]=259;
   2951       1.1  mrg       #elif DECDPUN==2
   2952       1.1  mrg 	t->lsu[0]=19; t->lsu[1]=8;
   2953       1.1  mrg 	a->lsu[0]=59; a->lsu[1]=2;
   2954       1.1  mrg       #else
   2955       1.1  mrg 	t->lsu[0]=9; t->lsu[1]=1; t->lsu[2]=8;
   2956       1.1  mrg 	a->lsu[0]=9; a->lsu[1]=5; a->lsu[2]=2;
   2957       1.1  mrg       #endif
   2958       1.1  mrg       }
   2959       1.1  mrg 
   2960       1.1  mrg     decMultiplyOp(a, a, f, &workset, &ignore);	  /* a=a*f */
   2961       1.1  mrg     decAddOp(a, a, t, &workset, 0, &ignore);	  /* ..+t */
   2962       1.1  mrg     /* [a is now the initial approximation for sqrt(f), calculated with */
   2963       1.1  mrg     /* currentprecision, which is also a's precision.] */
   2964       1.1  mrg 
   2965       1.1  mrg     /* the main calculation loop */
   2966       1.1  mrg     decNumberZero(&dzero);		     /* make 0 */
   2967       1.1  mrg     decNumberZero(t);			     /* set t = 0.5 */
   2968       1.1  mrg     t->lsu[0]=5;			     /* .. */
   2969       1.1  mrg     t->exponent=-1;			     /* .. */
   2970       1.1  mrg     workset.digits=3;			     /* initial p */
   2971       1.1  mrg     for (; workset.digits<maxp;) {
   2972       1.1  mrg       /* set p to min(2*p - 2, maxp)  [hence 3; or: 4, 6, 10, ... , maxp] */
   2973       1.1  mrg       workset.digits=MINI(workset.digits*2-2, maxp);
   2974       1.1  mrg       /* a = 0.5 * (a + f/a) */
   2975       1.1  mrg       /* [calculated at p then rounded to currentprecision] */
   2976       1.1  mrg       decDivideOp(b, f, a, &workset, DIVIDE, &ignore); /* b=f/a */
   2977       1.1  mrg       decAddOp(b, b, a, &workset, 0, &ignore);	       /* b=b+a */
   2978       1.1  mrg       decMultiplyOp(a, b, t, &workset, &ignore);       /* a=b*0.5 */
   2979       1.1  mrg       } /* loop */
   2980       1.1  mrg 
   2981       1.1  mrg     /* Here, 0.1 <= a < 1 [Hull], and a has maxp digits */
   2982       1.1  mrg     /* now reduce to length, etc.; this needs to be done with a */
   2983       1.1  mrg     /* having the correct exponent so as to handle subnormals */
   2984       1.1  mrg     /* correctly */
   2985       1.1  mrg     approxset=*set;			     /* get emin, emax, etc. */
   2986       1.1  mrg     approxset.round=DEC_ROUND_HALF_EVEN;
   2987       1.1  mrg     a->exponent+=exp/2; 		     /* set correct exponent */
   2988       1.1  mrg     rstatus=0;				     /* clear status */
   2989       1.1  mrg     residue=0;				     /* .. and accumulator */
   2990       1.1  mrg     decCopyFit(a, a, &approxset, &residue, &rstatus);  /* reduce (if needed) */
   2991       1.1  mrg     decFinish(a, &approxset, &residue, &rstatus);      /* clean and finalize */
   2992       1.1  mrg 
   2993       1.1  mrg     /* Overflow was possible if the input exponent was out-of-range, */
   2994       1.1  mrg     /* in which case quit */
   2995       1.1  mrg     if (rstatus&DEC_Overflow) {
   2996       1.1  mrg       status=rstatus;			     /* use the status as-is */
   2997       1.1  mrg       decNumberCopy(res, a);		     /* copy to result */
   2998       1.1  mrg       break;
   2999       1.1  mrg       }
   3000       1.1  mrg 
   3001       1.1  mrg     /* Preserve status except Inexact/Rounded */
   3002       1.1  mrg     status|=(rstatus & ~(DEC_Rounded|DEC_Inexact));
   3003       1.1  mrg 
   3004       1.1  mrg     /* Carry out the Hull correction */
   3005       1.1  mrg     a->exponent-=exp/2; 		     /* back to 0.1->1 */
   3006       1.1  mrg 
   3007       1.1  mrg     /* a is now at final precision and within 1 ulp of the properly */
   3008       1.1  mrg     /* rounded square root of f; to ensure proper rounding, compare */
   3009       1.1  mrg     /* squares of (a - l/2 ulp) and (a + l/2 ulp) with f. */
   3010       1.1  mrg     /* Here workset.digits=maxp and t=0.5, and a->digits determines */
   3011       1.1  mrg     /* the ulp */
   3012       1.1  mrg     workset.digits--;				  /* maxp-1 is OK now */
   3013       1.1  mrg     t->exponent=-a->digits-1;			  /* make 0.5 ulp */
   3014       1.1  mrg     decAddOp(b, a, t, &workset, DECNEG, &ignore); /* b = a - 0.5 ulp */
   3015       1.1  mrg     workset.round=DEC_ROUND_UP;
   3016       1.1  mrg     decMultiplyOp(b, b, b, &workset, &ignore);	  /* b = mulru(b, b) */
   3017       1.1  mrg     decCompareOp(b, f, b, &workset, COMPARE, &ignore); /* b ? f, reversed */
   3018       1.1  mrg     if (decNumberIsNegative(b)) {		  /* f < b [i.e., b > f] */
   3019       1.1  mrg       /* this is the more common adjustment, though both are rare */
   3020       1.1  mrg       t->exponent++;				  /* make 1.0 ulp */
   3021       1.1  mrg       t->lsu[0]=1;				  /* .. */
   3022       1.1  mrg       decAddOp(a, a, t, &workset, DECNEG, &ignore); /* a = a - 1 ulp */
   3023       1.1  mrg       /* assign to approx [round to length] */
   3024       1.1  mrg       approxset.emin-=exp/2;			  /* adjust to match a */
   3025       1.1  mrg       approxset.emax-=exp/2;
   3026       1.1  mrg       decAddOp(a, &dzero, a, &approxset, 0, &ignore);
   3027       1.1  mrg       }
   3028       1.1  mrg      else {
   3029       1.1  mrg       decAddOp(b, a, t, &workset, 0, &ignore);	  /* b = a + 0.5 ulp */
   3030       1.1  mrg       workset.round=DEC_ROUND_DOWN;
   3031       1.1  mrg       decMultiplyOp(b, b, b, &workset, &ignore);  /* b = mulrd(b, b) */
   3032       1.1  mrg       decCompareOp(b, b, f, &workset, COMPARE, &ignore);   /* b ? f */
   3033       1.1  mrg       if (decNumberIsNegative(b)) {		  /* b < f */
   3034       1.1  mrg 	t->exponent++;				  /* make 1.0 ulp */
   3035       1.1  mrg 	t->lsu[0]=1;				  /* .. */
   3036       1.1  mrg 	decAddOp(a, a, t, &workset, 0, &ignore);  /* a = a + 1 ulp */
   3037       1.1  mrg 	/* assign to approx [round to length] */
   3038       1.1  mrg 	approxset.emin-=exp/2;			  /* adjust to match a */
   3039       1.1  mrg 	approxset.emax-=exp/2;
   3040       1.1  mrg 	decAddOp(a, &dzero, a, &approxset, 0, &ignore);
   3041       1.1  mrg 	}
   3042       1.1  mrg       }
   3043       1.1  mrg     /* [no errors are possible in the above, and rounding/inexact during */
   3044       1.1  mrg     /* estimation are irrelevant, so status was not accumulated] */
   3045       1.1  mrg 
   3046       1.1  mrg     /* Here, 0.1 <= a < 1  (still), so adjust back */
   3047       1.1  mrg     a->exponent+=exp/2; 		     /* set correct exponent */
   3048       1.1  mrg 
   3049       1.1  mrg     /* count droppable zeros [after any subnormal rounding] by */
   3050       1.1  mrg     /* trimming a copy */
   3051       1.1  mrg     decNumberCopy(b, a);
   3052       1.1  mrg     decTrim(b, set, 1, 1, &dropped);	     /* [drops trailing zeros] */
   3053       1.1  mrg 
   3054       1.1  mrg     /* Set Inexact and Rounded.  The answer can only be exact if */
   3055       1.1  mrg     /* it is short enough so that squaring it could fit in workp */
   3056       1.1  mrg     /* digits, so this is the only (relatively rare) condition that */
   3057       1.1  mrg     /* a careful check is needed */
   3058       1.1  mrg     if (b->digits*2-1 > workp) {	     /* cannot fit */
   3059       1.1  mrg       status|=DEC_Inexact|DEC_Rounded;
   3060       1.1  mrg       }
   3061       1.1  mrg      else {				     /* could be exact/unrounded */
   3062       1.1  mrg       uInt mstatus=0;			     /* local status */
   3063       1.1  mrg       decMultiplyOp(b, b, b, &workset, &mstatus); /* try the multiply */
   3064       1.1  mrg       if (mstatus&DEC_Overflow) {	     /* result just won't fit */
   3065       1.1  mrg 	status|=DEC_Inexact|DEC_Rounded;
   3066       1.1  mrg 	}
   3067       1.1  mrg        else {				     /* plausible */
   3068       1.1  mrg 	decCompareOp(t, b, rhs, &workset, COMPARE, &mstatus); /* b ? rhs */
   3069       1.1  mrg 	if (!ISZERO(t)) status|=DEC_Inexact|DEC_Rounded; /* not equal */
   3070       1.1  mrg 	 else { 			     /* is Exact */
   3071       1.1  mrg 	  /* here, dropped is the count of trailing zeros in 'a' */
   3072       1.1  mrg 	  /* use closest exponent to ideal... */
   3073       1.1  mrg 	  Int todrop=ideal-a->exponent;      /* most that can be dropped */
   3074       1.1  mrg 	  if (todrop<0) status|=DEC_Rounded; /* ideally would add 0s */
   3075       1.1  mrg 	   else {			     /* unrounded */
   3076       1.1  mrg 	    /* there are some to drop, but emax may not allow all */
   3077       1.1  mrg 	    Int maxexp=set->emax-set->digits+1;
   3078       1.1  mrg 	    Int maxdrop=maxexp-a->exponent;
   3079       1.1  mrg 	    if (todrop>maxdrop && set->clamp) { /* apply clamping */
   3080       1.1  mrg 	      todrop=maxdrop;
   3081       1.1  mrg 	      status|=DEC_Clamped;
   3082       1.1  mrg 	      }
   3083       1.1  mrg 	    if (dropped<todrop) {	     /* clamp to those available */
   3084       1.1  mrg 	      todrop=dropped;
   3085       1.1  mrg 	      status|=DEC_Clamped;
   3086       1.1  mrg 	      }
   3087       1.1  mrg 	    if (todrop>0) {		     /* have some to drop */
   3088       1.1  mrg 	      decShiftToLeast(a->lsu, D2U(a->digits), todrop);
   3089       1.1  mrg 	      a->exponent+=todrop;	     /* maintain numerical value */
   3090       1.1  mrg 	      a->digits-=todrop;	     /* new length */
   3091       1.1  mrg 	      }
   3092       1.1  mrg 	    }
   3093       1.1  mrg 	  }
   3094       1.1  mrg 	}
   3095       1.1  mrg       }
   3096       1.1  mrg 
   3097       1.1  mrg     /* double-check Underflow, as perhaps the result could not have */
   3098       1.1  mrg     /* been subnormal (initial argument too big), or it is now Exact */
   3099       1.1  mrg     if (status&DEC_Underflow) {
   3100       1.1  mrg       Int ae=rhs->exponent+rhs->digits-1;    /* adjusted exponent */
   3101       1.1  mrg       /* check if truly subnormal */
   3102       1.1  mrg       #if DECEXTFLAG			     /* DEC_Subnormal too */
   3103       1.1  mrg 	if (ae>=set->emin*2) status&=~(DEC_Subnormal|DEC_Underflow);
   3104       1.1  mrg       #else
   3105       1.1  mrg 	if (ae>=set->emin*2) status&=~DEC_Underflow;
   3106       1.1  mrg       #endif
   3107       1.1  mrg       /* check if truly inexact */
   3108       1.1  mrg       if (!(status&DEC_Inexact)) status&=~DEC_Underflow;
   3109       1.1  mrg       }
   3110       1.1  mrg 
   3111       1.1  mrg     decNumberCopy(res, a);		     /* a is now the result */
   3112       1.1  mrg     } while(0); 			     /* end protected */
   3113       1.1  mrg 
   3114   1.1.1.2  mrg   free(allocbuff);      /* drop any storage used */
   3115   1.1.1.2  mrg   free(allocbufa);      /* .. */
   3116   1.1.1.2  mrg   free(allocbufb);      /* .. */
   3117       1.1  mrg   #if DECSUBSET
   3118   1.1.1.2  mrg   free(allocrhs);	     /* .. */
   3119       1.1  mrg   #endif
   3120       1.1  mrg   if (status!=0) decStatus(res, status, set);/* then report status */
   3121       1.1  mrg   #if DECCHECK
   3122       1.1  mrg   decCheckInexact(res, set);
   3123       1.1  mrg   #endif
   3124       1.1  mrg   return res;
   3125       1.1  mrg   } /* decNumberSquareRoot */
   3126       1.1  mrg 
   3127       1.1  mrg /* ------------------------------------------------------------------ */
   3128       1.1  mrg /* decNumberSubtract -- subtract two Numbers			      */
   3129       1.1  mrg /*								      */
   3130       1.1  mrg /*   This computes C = A - B					      */
   3131       1.1  mrg /*								      */
   3132       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X-X)	      */
   3133       1.1  mrg /*   lhs is A							      */
   3134       1.1  mrg /*   rhs is B							      */
   3135       1.1  mrg /*   set is the context 					      */
   3136       1.1  mrg /*								      */
   3137       1.1  mrg /* C must have space for set->digits digits.			      */
   3138       1.1  mrg /* ------------------------------------------------------------------ */
   3139       1.1  mrg decNumber * decNumberSubtract(decNumber *res, const decNumber *lhs,
   3140       1.1  mrg 			      const decNumber *rhs, decContext *set) {
   3141       1.1  mrg   uInt status=0;			/* accumulator */
   3142       1.1  mrg 
   3143       1.1  mrg   decAddOp(res, lhs, rhs, set, DECNEG, &status);
   3144       1.1  mrg   if (status!=0) decStatus(res, status, set);
   3145       1.1  mrg   #if DECCHECK
   3146       1.1  mrg   decCheckInexact(res, set);
   3147       1.1  mrg   #endif
   3148       1.1  mrg   return res;
   3149       1.1  mrg   } /* decNumberSubtract */
   3150       1.1  mrg 
   3151       1.1  mrg /* ------------------------------------------------------------------ */
   3152       1.1  mrg /* decNumberToIntegralExact -- round-to-integral-value with InExact   */
   3153       1.1  mrg /* decNumberToIntegralValue -- round-to-integral-value		      */
   3154       1.1  mrg /*								      */
   3155       1.1  mrg /*   res is the result						      */
   3156       1.1  mrg /*   rhs is input number					      */
   3157       1.1  mrg /*   set is the context 					      */
   3158       1.1  mrg /*								      */
   3159       1.1  mrg /* res must have space for any value of rhs.			      */
   3160       1.1  mrg /*								      */
   3161       1.1  mrg /* This implements the IEEE special operators and therefore treats    */
   3162       1.1  mrg /* special values as valid.  For finite numbers it returns	      */
   3163       1.1  mrg /* rescale(rhs, 0) if rhs->exponent is <0.			      */
   3164       1.1  mrg /* Otherwise the result is rhs (so no error is possible, except for   */
   3165       1.1  mrg /* sNaN).							      */
   3166       1.1  mrg /*								      */
   3167       1.1  mrg /* The context is used for rounding mode and status after sNaN, but   */
   3168       1.1  mrg /* the digits setting is ignored.  The Exact version will signal      */
   3169       1.1  mrg /* Inexact if the result differs numerically from rhs; the other      */
   3170       1.1  mrg /* never signals Inexact.					      */
   3171       1.1  mrg /* ------------------------------------------------------------------ */
   3172       1.1  mrg decNumber * decNumberToIntegralExact(decNumber *res, const decNumber *rhs,
   3173       1.1  mrg 				     decContext *set) {
   3174       1.1  mrg   decNumber dn;
   3175       1.1  mrg   decContext workset;		   /* working context */
   3176       1.1  mrg   uInt status=0;		   /* accumulator */
   3177       1.1  mrg 
   3178       1.1  mrg   #if DECCHECK
   3179       1.1  mrg   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   3180       1.1  mrg   #endif
   3181       1.1  mrg 
   3182       1.1  mrg   /* handle infinities and NaNs */
   3183       1.1  mrg   if (SPECIALARG) {
   3184       1.1  mrg     if (decNumberIsInfinite(rhs)) decNumberCopy(res, rhs); /* an Infinity */
   3185       1.1  mrg      else decNaNs(res, rhs, NULL, set, &status); /* a NaN */
   3186       1.1  mrg     }
   3187       1.1  mrg    else { /* finite */
   3188       1.1  mrg     /* have a finite number; no error possible (res must be big enough) */
   3189       1.1  mrg     if (rhs->exponent>=0) return decNumberCopy(res, rhs);
   3190       1.1  mrg     /* that was easy, but if negative exponent there is work to do... */
   3191       1.1  mrg     workset=*set;		   /* clone rounding, etc. */
   3192       1.1  mrg     workset.digits=rhs->digits;    /* no length rounding */
   3193       1.1  mrg     workset.traps=0;		   /* no traps */
   3194       1.1  mrg     decNumberZero(&dn); 	   /* make a number with exponent 0 */
   3195       1.1  mrg     decNumberQuantize(res, rhs, &dn, &workset);
   3196       1.1  mrg     status|=workset.status;
   3197       1.1  mrg     }
   3198       1.1  mrg   if (status!=0) decStatus(res, status, set);
   3199       1.1  mrg   return res;
   3200       1.1  mrg   } /* decNumberToIntegralExact */
   3201       1.1  mrg 
   3202       1.1  mrg decNumber * decNumberToIntegralValue(decNumber *res, const decNumber *rhs,
   3203       1.1  mrg 				     decContext *set) {
   3204       1.1  mrg   decContext workset=*set;	   /* working context */
   3205       1.1  mrg   workset.traps=0;		   /* no traps */
   3206       1.1  mrg   decNumberToIntegralExact(res, rhs, &workset);
   3207       1.1  mrg   /* this never affects set, except for sNaNs; NaN will have been set */
   3208       1.1  mrg   /* or propagated already, so no need to call decStatus */
   3209       1.1  mrg   set->status|=workset.status&DEC_Invalid_operation;
   3210       1.1  mrg   return res;
   3211       1.1  mrg   } /* decNumberToIntegralValue */
   3212       1.1  mrg 
   3213       1.1  mrg /* ------------------------------------------------------------------ */
   3214       1.1  mrg /* decNumberXor -- XOR two Numbers, digitwise			      */
   3215       1.1  mrg /*								      */
   3216       1.1  mrg /*   This computes C = A ^ B					      */
   3217       1.1  mrg /*								      */
   3218       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X^X)	      */
   3219       1.1  mrg /*   lhs is A							      */
   3220       1.1  mrg /*   rhs is B							      */
   3221       1.1  mrg /*   set is the context (used for result length and error report)     */
   3222       1.1  mrg /*								      */
   3223       1.1  mrg /* C must have space for set->digits digits.			      */
   3224       1.1  mrg /*								      */
   3225       1.1  mrg /* Logical function restrictions apply (see above); a NaN is	      */
   3226       1.1  mrg /* returned with Invalid_operation if a restriction is violated.      */
   3227       1.1  mrg /* ------------------------------------------------------------------ */
   3228       1.1  mrg decNumber * decNumberXor(decNumber *res, const decNumber *lhs,
   3229       1.1  mrg 			 const decNumber *rhs, decContext *set) {
   3230       1.1  mrg   const Unit *ua, *ub;			/* -> operands */
   3231       1.1  mrg   const Unit *msua, *msub;		/* -> operand msus */
   3232       1.1  mrg   Unit	*uc, *msuc;			/* -> result and its msu */
   3233       1.1  mrg   Int	msudigs;			/* digits in res msu */
   3234       1.1  mrg   #if DECCHECK
   3235       1.1  mrg   if (decCheckOperands(res, lhs, rhs, set)) return res;
   3236       1.1  mrg   #endif
   3237       1.1  mrg 
   3238       1.1  mrg   if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
   3239       1.1  mrg    || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
   3240       1.1  mrg     decStatus(res, DEC_Invalid_operation, set);
   3241       1.1  mrg     return res;
   3242       1.1  mrg     }
   3243       1.1  mrg   /* operands are valid */
   3244       1.1  mrg   ua=lhs->lsu;				/* bottom-up */
   3245       1.1  mrg   ub=rhs->lsu;				/* .. */
   3246       1.1  mrg   uc=res->lsu;				/* .. */
   3247       1.1  mrg   msua=ua+D2U(lhs->digits)-1;		/* -> msu of lhs */
   3248       1.1  mrg   msub=ub+D2U(rhs->digits)-1;		/* -> msu of rhs */
   3249       1.1  mrg   msuc=uc+D2U(set->digits)-1;		/* -> msu of result */
   3250       1.1  mrg   msudigs=MSUDIGITS(set->digits);	/* [faster than remainder] */
   3251       1.1  mrg   for (; uc<=msuc; ua++, ub++, uc++) {	/* Unit loop */
   3252       1.1  mrg     Unit a, b;				/* extract units */
   3253       1.1  mrg     if (ua>msua) a=0;
   3254       1.1  mrg      else a=*ua;
   3255       1.1  mrg     if (ub>msub) b=0;
   3256       1.1  mrg      else b=*ub;
   3257       1.1  mrg     *uc=0;				/* can now write back */
   3258       1.1  mrg     if (a|b) {				/* maybe 1 bits to examine */
   3259       1.1  mrg       Int i, j;
   3260       1.1  mrg       /* This loop could be unrolled and/or use BIN2BCD tables */
   3261       1.1  mrg       for (i=0; i<DECDPUN; i++) {
   3262       1.1  mrg 	if ((a^b)&1) *uc=*uc+(Unit)powers[i];	  /* effect XOR */
   3263       1.1  mrg 	j=a%10;
   3264       1.1  mrg 	a=a/10;
   3265       1.1  mrg 	j|=b%10;
   3266       1.1  mrg 	b=b/10;
   3267       1.1  mrg 	if (j>1) {
   3268       1.1  mrg 	  decStatus(res, DEC_Invalid_operation, set);
   3269       1.1  mrg 	  return res;
   3270       1.1  mrg 	  }
   3271       1.1  mrg 	if (uc==msuc && i==msudigs-1) break;	  /* just did final digit */
   3272       1.1  mrg 	} /* each digit */
   3273       1.1  mrg       } /* non-zero */
   3274       1.1  mrg     } /* each unit */
   3275       1.1  mrg   /* [here uc-1 is the msu of the result] */
   3276       1.1  mrg   res->digits=decGetDigits(res->lsu, uc-res->lsu);
   3277       1.1  mrg   res->exponent=0;			/* integer */
   3278       1.1  mrg   res->bits=0;				/* sign=0 */
   3279       1.1  mrg   return res;  /* [no status to set] */
   3280       1.1  mrg   } /* decNumberXor */
   3281       1.1  mrg 
   3282       1.1  mrg 
   3283       1.1  mrg /* ================================================================== */
   3284       1.1  mrg /* Utility routines						      */
   3285       1.1  mrg /* ================================================================== */
   3286       1.1  mrg 
   3287       1.1  mrg /* ------------------------------------------------------------------ */
   3288       1.1  mrg /* decNumberClass -- return the decClass of a decNumber 	      */
   3289       1.1  mrg /*   dn -- the decNumber to test				      */
   3290       1.1  mrg /*   set -- the context to use for Emin 			      */
   3291       1.1  mrg /*   returns the decClass enum					      */
   3292       1.1  mrg /* ------------------------------------------------------------------ */
   3293       1.1  mrg enum decClass decNumberClass(const decNumber *dn, decContext *set) {
   3294       1.1  mrg   if (decNumberIsSpecial(dn)) {
   3295       1.1  mrg     if (decNumberIsQNaN(dn)) return DEC_CLASS_QNAN;
   3296       1.1  mrg     if (decNumberIsSNaN(dn)) return DEC_CLASS_SNAN;
   3297       1.1  mrg     /* must be an infinity */
   3298       1.1  mrg     if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_INF;
   3299       1.1  mrg     return DEC_CLASS_POS_INF;
   3300       1.1  mrg     }
   3301       1.1  mrg   /* is finite */
   3302       1.1  mrg   if (decNumberIsNormal(dn, set)) { /* most common */
   3303       1.1  mrg     if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_NORMAL;
   3304       1.1  mrg     return DEC_CLASS_POS_NORMAL;
   3305       1.1  mrg     }
   3306       1.1  mrg   /* is subnormal or zero */
   3307       1.1  mrg   if (decNumberIsZero(dn)) {	/* most common */
   3308       1.1  mrg     if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_ZERO;
   3309       1.1  mrg     return DEC_CLASS_POS_ZERO;
   3310       1.1  mrg     }
   3311       1.1  mrg   if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_SUBNORMAL;
   3312       1.1  mrg   return DEC_CLASS_POS_SUBNORMAL;
   3313       1.1  mrg   } /* decNumberClass */
   3314       1.1  mrg 
   3315       1.1  mrg /* ------------------------------------------------------------------ */
   3316       1.1  mrg /* decNumberClassToString -- convert decClass to a string	      */
   3317       1.1  mrg /*								      */
   3318       1.1  mrg /*  eclass is a valid decClass					      */
   3319       1.1  mrg /*  returns a constant string describing the class (max 13+1 chars)   */
   3320       1.1  mrg /* ------------------------------------------------------------------ */
   3321       1.1  mrg const char *decNumberClassToString(enum decClass eclass) {
   3322       1.1  mrg   if (eclass==DEC_CLASS_POS_NORMAL)    return DEC_ClassString_PN;
   3323       1.1  mrg   if (eclass==DEC_CLASS_NEG_NORMAL)    return DEC_ClassString_NN;
   3324       1.1  mrg   if (eclass==DEC_CLASS_POS_ZERO)      return DEC_ClassString_PZ;
   3325       1.1  mrg   if (eclass==DEC_CLASS_NEG_ZERO)      return DEC_ClassString_NZ;
   3326       1.1  mrg   if (eclass==DEC_CLASS_POS_SUBNORMAL) return DEC_ClassString_PS;
   3327       1.1  mrg   if (eclass==DEC_CLASS_NEG_SUBNORMAL) return DEC_ClassString_NS;
   3328       1.1  mrg   if (eclass==DEC_CLASS_POS_INF)       return DEC_ClassString_PI;
   3329       1.1  mrg   if (eclass==DEC_CLASS_NEG_INF)       return DEC_ClassString_NI;
   3330       1.1  mrg   if (eclass==DEC_CLASS_QNAN)	       return DEC_ClassString_QN;
   3331       1.1  mrg   if (eclass==DEC_CLASS_SNAN)	       return DEC_ClassString_SN;
   3332       1.1  mrg   return DEC_ClassString_UN;	       /* Unknown */
   3333       1.1  mrg   } /* decNumberClassToString */
   3334       1.1  mrg 
   3335       1.1  mrg /* ------------------------------------------------------------------ */
   3336       1.1  mrg /* decNumberCopy -- copy a number				      */
   3337       1.1  mrg /*								      */
   3338       1.1  mrg /*   dest is the target decNumber				      */
   3339       1.1  mrg /*   src  is the source decNumber				      */
   3340       1.1  mrg /*   returns dest						      */
   3341       1.1  mrg /*								      */
   3342       1.1  mrg /* (dest==src is allowed and is a no-op)			      */
   3343       1.1  mrg /* All fields are updated as required.	This is a utility operation,  */
   3344       1.1  mrg /* so special values are unchanged and no error is possible.	      */
   3345       1.1  mrg /* ------------------------------------------------------------------ */
   3346       1.1  mrg decNumber * decNumberCopy(decNumber *dest, const decNumber *src) {
   3347       1.1  mrg 
   3348       1.1  mrg   #if DECCHECK
   3349       1.1  mrg   if (src==NULL) return decNumberZero(dest);
   3350       1.1  mrg   #endif
   3351       1.1  mrg 
   3352       1.1  mrg   if (dest==src) return dest;		     /* no copy required */
   3353       1.1  mrg 
   3354       1.1  mrg   /* Use explicit assignments here as structure assignment could copy */
   3355       1.1  mrg   /* more than just the lsu (for small DECDPUN).  This would not affect */
   3356       1.1  mrg   /* the value of the results, but could disturb test harness spill */
   3357       1.1  mrg   /* checking. */
   3358       1.1  mrg   dest->bits=src->bits;
   3359       1.1  mrg   dest->exponent=src->exponent;
   3360       1.1  mrg   dest->digits=src->digits;
   3361       1.1  mrg   dest->lsu[0]=src->lsu[0];
   3362       1.1  mrg   if (src->digits>DECDPUN) {		     /* more Units to come */
   3363       1.1  mrg     const Unit *smsup, *s;		     /* work */
   3364       1.1  mrg     Unit  *d;				     /* .. */
   3365       1.1  mrg     /* memcpy for the remaining Units would be safe as they cannot */
   3366       1.1  mrg     /* overlap.  However, this explicit loop is faster in short cases. */
   3367       1.1  mrg     d=dest->lsu+1;			     /* -> first destination */
   3368       1.1  mrg     smsup=src->lsu+D2U(src->digits);	     /* -> source msu+1 */
   3369       1.1  mrg     for (s=src->lsu+1; s<smsup; s++, d++) *d=*s;
   3370       1.1  mrg     }
   3371       1.1  mrg   return dest;
   3372       1.1  mrg   } /* decNumberCopy */
   3373       1.1  mrg 
   3374       1.1  mrg /* ------------------------------------------------------------------ */
   3375       1.1  mrg /* decNumberCopyAbs -- quiet absolute value operator		      */
   3376       1.1  mrg /*								      */
   3377       1.1  mrg /*   This sets C = abs(A)					      */
   3378       1.1  mrg /*								      */
   3379       1.1  mrg /*   res is C, the result.  C may be A				      */
   3380       1.1  mrg /*   rhs is A							      */
   3381       1.1  mrg /*								      */
   3382       1.1  mrg /* C must have space for set->digits digits.			      */
   3383       1.1  mrg /* No exception or error can occur; this is a quiet bitwise operation.*/
   3384       1.1  mrg /* See also decNumberAbs for a checking version of this.	      */
   3385       1.1  mrg /* ------------------------------------------------------------------ */
   3386       1.1  mrg decNumber * decNumberCopyAbs(decNumber *res, const decNumber *rhs) {
   3387       1.1  mrg   #if DECCHECK
   3388       1.1  mrg   if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
   3389       1.1  mrg   #endif
   3390       1.1  mrg   decNumberCopy(res, rhs);
   3391       1.1  mrg   res->bits&=~DECNEG;			/* turn off sign */
   3392       1.1  mrg   return res;
   3393       1.1  mrg   } /* decNumberCopyAbs */
   3394       1.1  mrg 
   3395       1.1  mrg /* ------------------------------------------------------------------ */
   3396       1.1  mrg /* decNumberCopyNegate -- quiet negate value operator		      */
   3397       1.1  mrg /*								      */
   3398       1.1  mrg /*   This sets C = negate(A)					      */
   3399       1.1  mrg /*								      */
   3400       1.1  mrg /*   res is C, the result.  C may be A				      */
   3401       1.1  mrg /*   rhs is A							      */
   3402       1.1  mrg /*								      */
   3403       1.1  mrg /* C must have space for set->digits digits.			      */
   3404       1.1  mrg /* No exception or error can occur; this is a quiet bitwise operation.*/
   3405       1.1  mrg /* See also decNumberMinus for a checking version of this.	      */
   3406       1.1  mrg /* ------------------------------------------------------------------ */
   3407       1.1  mrg decNumber * decNumberCopyNegate(decNumber *res, const decNumber *rhs) {
   3408       1.1  mrg   #if DECCHECK
   3409       1.1  mrg   if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
   3410       1.1  mrg   #endif
   3411       1.1  mrg   decNumberCopy(res, rhs);
   3412       1.1  mrg   res->bits^=DECNEG;			/* invert the sign */
   3413       1.1  mrg   return res;
   3414       1.1  mrg   } /* decNumberCopyNegate */
   3415       1.1  mrg 
   3416       1.1  mrg /* ------------------------------------------------------------------ */
   3417       1.1  mrg /* decNumberCopySign -- quiet copy and set sign operator	      */
   3418       1.1  mrg /*								      */
   3419       1.1  mrg /*   This sets C = A with the sign of B 			      */
   3420       1.1  mrg /*								      */
   3421       1.1  mrg /*   res is C, the result.  C may be A				      */
   3422       1.1  mrg /*   lhs is A							      */
   3423       1.1  mrg /*   rhs is B							      */
   3424       1.1  mrg /*								      */
   3425       1.1  mrg /* C must have space for set->digits digits.			      */
   3426       1.1  mrg /* No exception or error can occur; this is a quiet bitwise operation.*/
   3427       1.1  mrg /* ------------------------------------------------------------------ */
   3428       1.1  mrg decNumber * decNumberCopySign(decNumber *res, const decNumber *lhs,
   3429       1.1  mrg 			      const decNumber *rhs) {
   3430       1.1  mrg   uByte sign;				/* rhs sign */
   3431       1.1  mrg   #if DECCHECK
   3432       1.1  mrg   if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
   3433       1.1  mrg   #endif
   3434       1.1  mrg   sign=rhs->bits & DECNEG;		/* save sign bit */
   3435       1.1  mrg   decNumberCopy(res, lhs);
   3436       1.1  mrg   res->bits&=~DECNEG;			/* clear the sign */
   3437       1.1  mrg   res->bits|=sign;			/* set from rhs */
   3438       1.1  mrg   return res;
   3439       1.1  mrg   } /* decNumberCopySign */
   3440       1.1  mrg 
   3441       1.1  mrg /* ------------------------------------------------------------------ */
   3442       1.1  mrg /* decNumberGetBCD -- get the coefficient in BCD8		      */
   3443       1.1  mrg /*   dn is the source decNumber 				      */
   3444       1.1  mrg /*   bcd is the uInt array that will receive dn->digits BCD bytes,    */
   3445       1.1  mrg /*     most-significant at offset 0				      */
   3446       1.1  mrg /*   returns bcd						      */
   3447       1.1  mrg /*								      */
   3448       1.1  mrg /* bcd must have at least dn->digits bytes.  No error is possible; if */
   3449       1.1  mrg /* dn is a NaN or Infinite, digits must be 1 and the coefficient 0.   */
   3450       1.1  mrg /* ------------------------------------------------------------------ */
   3451       1.1  mrg uByte * decNumberGetBCD(const decNumber *dn, uByte *bcd) {
   3452       1.1  mrg   uByte *ub=bcd+dn->digits-1;	   /* -> lsd */
   3453       1.1  mrg   const Unit *up=dn->lsu;	   /* Unit pointer, -> lsu */
   3454       1.1  mrg 
   3455       1.1  mrg   #if DECDPUN==1		   /* trivial simple copy */
   3456       1.1  mrg     for (; ub>=bcd; ub--, up++) *ub=*up;
   3457       1.1  mrg   #else 			   /* chopping needed */
   3458       1.1  mrg     uInt u=*up; 		   /* work */
   3459       1.1  mrg     uInt cut=DECDPUN;		   /* downcounter through unit */
   3460       1.1  mrg     for (; ub>=bcd; ub--) {
   3461       1.1  mrg       *ub=(uByte)(u%10);	   /* [*6554 trick inhibits, here] */
   3462       1.1  mrg       u=u/10;
   3463       1.1  mrg       cut--;
   3464       1.1  mrg       if (cut>0) continue;	   /* more in this unit */
   3465       1.1  mrg       up++;
   3466       1.1  mrg       u=*up;
   3467       1.1  mrg       cut=DECDPUN;
   3468       1.1  mrg       }
   3469       1.1  mrg   #endif
   3470       1.1  mrg   return bcd;
   3471       1.1  mrg   } /* decNumberGetBCD */
   3472       1.1  mrg 
   3473       1.1  mrg /* ------------------------------------------------------------------ */
   3474       1.1  mrg /* decNumberSetBCD -- set (replace) the coefficient from BCD8	      */
   3475       1.1  mrg /*   dn is the target decNumber 				      */
   3476       1.1  mrg /*   bcd is the uInt array that will source n BCD bytes, most-	      */
   3477       1.1  mrg /*     significant at offset 0					      */
   3478       1.1  mrg /*   n is the number of digits in the source BCD array (bcd)	      */
   3479       1.1  mrg /*   returns dn 						      */
   3480       1.1  mrg /*								      */
   3481       1.1  mrg /* dn must have space for at least n digits.  No error is possible;   */
   3482       1.1  mrg /* if dn is a NaN, or Infinite, or is to become a zero, n must be 1   */
   3483       1.1  mrg /* and bcd[0] zero.						      */
   3484       1.1  mrg /* ------------------------------------------------------------------ */
   3485       1.1  mrg decNumber * decNumberSetBCD(decNumber *dn, const uByte *bcd, uInt n) {
   3486       1.1  mrg   Unit *up=dn->lsu+D2U(dn->digits)-1;	/* -> msu [target pointer] */
   3487       1.1  mrg   const uByte *ub=bcd;			/* -> source msd */
   3488       1.1  mrg 
   3489       1.1  mrg   #if DECDPUN==1			/* trivial simple copy */
   3490       1.1  mrg     for (; ub<bcd+n; ub++, up--) *up=*ub;
   3491       1.1  mrg   #else 				/* some assembly needed */
   3492       1.1  mrg     /* calculate how many digits in msu, and hence first cut */
   3493       1.1  mrg     Int cut=MSUDIGITS(n);		/* [faster than remainder] */
   3494       1.1  mrg     for (;up>=dn->lsu; up--) {		/* each Unit from msu */
   3495       1.1  mrg       *up=0;				/* will take <=DECDPUN digits */
   3496       1.1  mrg       for (; cut>0; ub++, cut--) *up=X10(*up)+*ub;
   3497       1.1  mrg       cut=DECDPUN;			/* next Unit has all digits */
   3498       1.1  mrg       }
   3499       1.1  mrg   #endif
   3500       1.1  mrg   dn->digits=n; 			/* set digit count */
   3501       1.1  mrg   return dn;
   3502       1.1  mrg   } /* decNumberSetBCD */
   3503       1.1  mrg 
   3504       1.1  mrg /* ------------------------------------------------------------------ */
   3505       1.1  mrg /* decNumberIsNormal -- test normality of a decNumber		      */
   3506       1.1  mrg /*   dn is the decNumber to test				      */
   3507       1.1  mrg /*   set is the context to use for Emin 			      */
   3508       1.1  mrg /*   returns 1 if |dn| is finite and >=Nmin, 0 otherwise	      */
   3509       1.1  mrg /* ------------------------------------------------------------------ */
   3510       1.1  mrg Int decNumberIsNormal(const decNumber *dn, decContext *set) {
   3511       1.1  mrg   Int ae;				/* adjusted exponent */
   3512       1.1  mrg   #if DECCHECK
   3513       1.1  mrg   if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
   3514       1.1  mrg   #endif
   3515       1.1  mrg 
   3516       1.1  mrg   if (decNumberIsSpecial(dn)) return 0; /* not finite */
   3517       1.1  mrg   if (decNumberIsZero(dn)) return 0;	/* not non-zero */
   3518       1.1  mrg 
   3519       1.1  mrg   ae=dn->exponent+dn->digits-1; 	/* adjusted exponent */
   3520       1.1  mrg   if (ae<set->emin) return 0;		/* is subnormal */
   3521       1.1  mrg   return 1;
   3522       1.1  mrg   } /* decNumberIsNormal */
   3523       1.1  mrg 
   3524       1.1  mrg /* ------------------------------------------------------------------ */
   3525       1.1  mrg /* decNumberIsSubnormal -- test subnormality of a decNumber	      */
   3526       1.1  mrg /*   dn is the decNumber to test				      */
   3527       1.1  mrg /*   set is the context to use for Emin 			      */
   3528       1.1  mrg /*   returns 1 if |dn| is finite, non-zero, and <Nmin, 0 otherwise    */
   3529       1.1  mrg /* ------------------------------------------------------------------ */
   3530       1.1  mrg Int decNumberIsSubnormal(const decNumber *dn, decContext *set) {
   3531       1.1  mrg   Int ae;				/* adjusted exponent */
   3532       1.1  mrg   #if DECCHECK
   3533       1.1  mrg   if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
   3534       1.1  mrg   #endif
   3535       1.1  mrg 
   3536       1.1  mrg   if (decNumberIsSpecial(dn)) return 0; /* not finite */
   3537       1.1  mrg   if (decNumberIsZero(dn)) return 0;	/* not non-zero */
   3538       1.1  mrg 
   3539       1.1  mrg   ae=dn->exponent+dn->digits-1; 	/* adjusted exponent */
   3540       1.1  mrg   if (ae<set->emin) return 1;		/* is subnormal */
   3541       1.1  mrg   return 0;
   3542       1.1  mrg   } /* decNumberIsSubnormal */
   3543       1.1  mrg 
   3544       1.1  mrg /* ------------------------------------------------------------------ */
   3545       1.1  mrg /* decNumberTrim -- remove insignificant zeros			      */
   3546       1.1  mrg /*								      */
   3547       1.1  mrg /*   dn is the number to trim					      */
   3548       1.1  mrg /*   returns dn 						      */
   3549       1.1  mrg /*								      */
   3550       1.1  mrg /* All fields are updated as required.	This is a utility operation,  */
   3551       1.1  mrg /* so special values are unchanged and no error is possible.  The     */
   3552       1.1  mrg /* zeros are removed unconditionally.				      */
   3553       1.1  mrg /* ------------------------------------------------------------------ */
   3554       1.1  mrg decNumber * decNumberTrim(decNumber *dn) {
   3555       1.1  mrg   Int  dropped; 		   /* work */
   3556       1.1  mrg   decContext set;		   /* .. */
   3557       1.1  mrg   #if DECCHECK
   3558       1.1  mrg   if (decCheckOperands(DECUNRESU, DECUNUSED, dn, DECUNCONT)) return dn;
   3559       1.1  mrg   #endif
   3560       1.1  mrg   decContextDefault(&set, DEC_INIT_BASE);    /* clamp=0 */
   3561       1.1  mrg   return decTrim(dn, &set, 0, 1, &dropped);
   3562       1.1  mrg   } /* decNumberTrim */
   3563       1.1  mrg 
   3564       1.1  mrg /* ------------------------------------------------------------------ */
   3565       1.1  mrg /* decNumberVersion -- return the name and version of this module     */
   3566       1.1  mrg /*								      */
   3567       1.1  mrg /* No error is possible.					      */
   3568       1.1  mrg /* ------------------------------------------------------------------ */
   3569       1.1  mrg const char * decNumberVersion(void) {
   3570       1.1  mrg   return DECVERSION;
   3571       1.1  mrg   } /* decNumberVersion */
   3572       1.1  mrg 
   3573       1.1  mrg /* ------------------------------------------------------------------ */
   3574       1.1  mrg /* decNumberZero -- set a number to 0				      */
   3575       1.1  mrg /*								      */
   3576       1.1  mrg /*   dn is the number to set, with space for one digit		      */
   3577       1.1  mrg /*   returns dn 						      */
   3578       1.1  mrg /*								      */
   3579       1.1  mrg /* No error is possible.					      */
   3580       1.1  mrg /* ------------------------------------------------------------------ */
   3581       1.1  mrg /* Memset is not used as it is much slower in some environments. */
   3582       1.1  mrg decNumber * decNumberZero(decNumber *dn) {
   3583       1.1  mrg 
   3584       1.1  mrg   #if DECCHECK
   3585       1.1  mrg   if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
   3586       1.1  mrg   #endif
   3587       1.1  mrg 
   3588       1.1  mrg   dn->bits=0;
   3589       1.1  mrg   dn->exponent=0;
   3590       1.1  mrg   dn->digits=1;
   3591       1.1  mrg   dn->lsu[0]=0;
   3592       1.1  mrg   return dn;
   3593       1.1  mrg   } /* decNumberZero */
   3594       1.1  mrg 
   3595       1.1  mrg /* ================================================================== */
   3596       1.1  mrg /* Local routines						      */
   3597       1.1  mrg /* ================================================================== */
   3598       1.1  mrg 
   3599       1.1  mrg /* ------------------------------------------------------------------ */
   3600       1.1  mrg /* decToString -- lay out a number into a string		      */
   3601       1.1  mrg /*								      */
   3602       1.1  mrg /*   dn     is the number to lay out				      */
   3603       1.1  mrg /*   string is where to lay out the number			      */
   3604       1.1  mrg /*   eng    is 1 if Engineering, 0 if Scientific		      */
   3605       1.1  mrg /*								      */
   3606       1.1  mrg /* string must be at least dn->digits+14 characters long	      */
   3607       1.1  mrg /* No error is possible.					      */
   3608       1.1  mrg /*								      */
   3609       1.1  mrg /* Note that this routine can generate a -0 or 0.000.  These are      */
   3610       1.1  mrg /* never generated in subset to-number or arithmetic, but can occur   */
   3611       1.1  mrg /* in non-subset arithmetic (e.g., -1*0 or 1.234-1.234).	      */
   3612       1.1  mrg /* ------------------------------------------------------------------ */
   3613       1.1  mrg /* If DECCHECK is enabled the string "?" is returned if a number is */
   3614       1.1  mrg /* invalid. */
   3615       1.1  mrg static void decToString(const decNumber *dn, char *string, Flag eng) {
   3616       1.1  mrg   Int exp=dn->exponent;       /* local copy */
   3617       1.1  mrg   Int e;		      /* E-part value */
   3618       1.1  mrg   Int pre;		      /* digits before the '.' */
   3619       1.1  mrg   Int cut;		      /* for counting digits in a Unit */
   3620       1.1  mrg   char *c=string;	      /* work [output pointer] */
   3621       1.1  mrg   const Unit *up=dn->lsu+D2U(dn->digits)-1; /* -> msu [input pointer] */
   3622       1.1  mrg   uInt u, pow;		      /* work */
   3623       1.1  mrg 
   3624       1.1  mrg   #if DECCHECK
   3625       1.1  mrg   if (decCheckOperands(DECUNRESU, dn, DECUNUSED, DECUNCONT)) {
   3626       1.1  mrg     strcpy(string, "?");
   3627       1.1  mrg     return;}
   3628       1.1  mrg   #endif
   3629       1.1  mrg 
   3630       1.1  mrg   if (decNumberIsNegative(dn)) {   /* Negatives get a minus */
   3631       1.1  mrg     *c='-';
   3632       1.1  mrg     c++;
   3633       1.1  mrg     }
   3634       1.1  mrg   if (dn->bits&DECSPECIAL) {	   /* Is a special value */
   3635       1.1  mrg     if (decNumberIsInfinite(dn)) {
   3636       1.1  mrg       strcpy(c,   "Inf");
   3637       1.1  mrg       strcpy(c+3, "inity");
   3638       1.1  mrg       return;}
   3639       1.1  mrg     /* a NaN */
   3640       1.1  mrg     if (dn->bits&DECSNAN) {	   /* signalling NaN */
   3641       1.1  mrg       *c='s';
   3642       1.1  mrg       c++;
   3643       1.1  mrg       }
   3644       1.1  mrg     strcpy(c, "NaN");
   3645       1.1  mrg     c+=3;			   /* step past */
   3646       1.1  mrg     /* if not a clean non-zero coefficient, that's all there is in a */
   3647       1.1  mrg     /* NaN string */
   3648       1.1  mrg     if (exp!=0 || (*dn->lsu==0 && dn->digits==1)) return;
   3649       1.1  mrg     /* [drop through to add integer] */
   3650       1.1  mrg     }
   3651       1.1  mrg 
   3652       1.1  mrg   /* calculate how many digits in msu, and hence first cut */
   3653       1.1  mrg   cut=MSUDIGITS(dn->digits);	   /* [faster than remainder] */
   3654       1.1  mrg   cut--;			   /* power of ten for digit */
   3655       1.1  mrg 
   3656       1.1  mrg   if (exp==0) { 		   /* simple integer [common fastpath] */
   3657       1.1  mrg     for (;up>=dn->lsu; up--) {	   /* each Unit from msu */
   3658       1.1  mrg       u=*up;			   /* contains DECDPUN digits to lay out */
   3659       1.1  mrg       for (; cut>=0; c++, cut--) TODIGIT(u, cut, c, pow);
   3660       1.1  mrg       cut=DECDPUN-1;		   /* next Unit has all digits */
   3661       1.1  mrg       }
   3662       1.1  mrg     *c='\0';			   /* terminate the string */
   3663       1.1  mrg     return;}
   3664       1.1  mrg 
   3665       1.1  mrg   /* non-0 exponent -- assume plain form */
   3666       1.1  mrg   pre=dn->digits+exp;		   /* digits before '.' */
   3667       1.1  mrg   e=0;				   /* no E */
   3668       1.1  mrg   if ((exp>0) || (pre<-5)) {	   /* need exponential form */
   3669       1.1  mrg     e=exp+dn->digits-1; 	   /* calculate E value */
   3670       1.1  mrg     pre=1;			   /* assume one digit before '.' */
   3671       1.1  mrg     if (eng && (e!=0)) {	   /* engineering: may need to adjust */
   3672       1.1  mrg       Int adj;			   /* adjustment */
   3673       1.1  mrg       /* The C remainder operator is undefined for negative numbers, so */
   3674       1.1  mrg       /* a positive remainder calculation must be used here */
   3675       1.1  mrg       if (e<0) {
   3676       1.1  mrg 	adj=(-e)%3;
   3677       1.1  mrg 	if (adj!=0) adj=3-adj;
   3678       1.1  mrg 	}
   3679       1.1  mrg        else { /* e>0 */
   3680       1.1  mrg 	adj=e%3;
   3681       1.1  mrg 	}
   3682       1.1  mrg       e=e-adj;
   3683       1.1  mrg       /* if dealing with zero still produce an exponent which is a */
   3684       1.1  mrg       /* multiple of three, as expected, but there will only be the */
   3685       1.1  mrg       /* one zero before the E, still.	Otherwise note the padding. */
   3686       1.1  mrg       if (!ISZERO(dn)) pre+=adj;
   3687       1.1  mrg        else {  /* is zero */
   3688       1.1  mrg 	if (adj!=0) {		   /* 0.00Esnn needed */
   3689       1.1  mrg 	  e=e+3;
   3690       1.1  mrg 	  pre=-(2-adj);
   3691       1.1  mrg 	  }
   3692       1.1  mrg 	} /* zero */
   3693       1.1  mrg       } /* eng */
   3694       1.1  mrg     } /* need exponent */
   3695       1.1  mrg 
   3696       1.1  mrg   /* lay out the digits of the coefficient, adding 0s and . as needed */
   3697       1.1  mrg   u=*up;
   3698       1.1  mrg   if (pre>0) {			   /* xxx.xxx or xx00 (engineering) form */
   3699       1.1  mrg     Int n=pre;
   3700       1.1  mrg     for (; pre>0; pre--, c++, cut--) {
   3701       1.1  mrg       if (cut<0) {		   /* need new Unit */
   3702       1.1  mrg 	if (up==dn->lsu) break;    /* out of input digits (pre>digits) */
   3703       1.1  mrg 	up--;
   3704       1.1  mrg 	cut=DECDPUN-1;
   3705       1.1  mrg 	u=*up;
   3706       1.1  mrg 	}
   3707       1.1  mrg       TODIGIT(u, cut, c, pow);
   3708       1.1  mrg       }
   3709       1.1  mrg     if (n<dn->digits) { 	   /* more to come, after '.' */
   3710       1.1  mrg       *c='.'; c++;
   3711       1.1  mrg       for (;; c++, cut--) {
   3712       1.1  mrg 	if (cut<0) {		   /* need new Unit */
   3713       1.1  mrg 	  if (up==dn->lsu) break;  /* out of input digits */
   3714       1.1  mrg 	  up--;
   3715       1.1  mrg 	  cut=DECDPUN-1;
   3716       1.1  mrg 	  u=*up;
   3717       1.1  mrg 	  }
   3718       1.1  mrg 	TODIGIT(u, cut, c, pow);
   3719       1.1  mrg 	}
   3720       1.1  mrg       }
   3721       1.1  mrg      else for (; pre>0; pre--, c++) *c='0'; /* 0 padding (for engineering) needed */
   3722       1.1  mrg     }
   3723       1.1  mrg    else {			   /* 0.xxx or 0.000xxx form */
   3724       1.1  mrg     *c='0'; c++;
   3725       1.1  mrg     *c='.'; c++;
   3726       1.1  mrg     for (; pre<0; pre++, c++) *c='0';	/* add any 0's after '.' */
   3727       1.1  mrg     for (; ; c++, cut--) {
   3728       1.1  mrg       if (cut<0) {		   /* need new Unit */
   3729       1.1  mrg 	if (up==dn->lsu) break;    /* out of input digits */
   3730       1.1  mrg 	up--;
   3731       1.1  mrg 	cut=DECDPUN-1;
   3732       1.1  mrg 	u=*up;
   3733       1.1  mrg 	}
   3734       1.1  mrg       TODIGIT(u, cut, c, pow);
   3735       1.1  mrg       }
   3736       1.1  mrg     }
   3737       1.1  mrg 
   3738       1.1  mrg   /* Finally add the E-part, if needed.  It will never be 0, has a
   3739       1.1  mrg      base maximum and minimum of +999999999 through -999999999, but
   3740       1.1  mrg      could range down to -1999999998 for anormal numbers */
   3741       1.1  mrg   if (e!=0) {
   3742       1.1  mrg     Flag had=0; 	      /* 1=had non-zero */
   3743       1.1  mrg     *c='E'; c++;
   3744       1.1  mrg     *c='+'; c++;	      /* assume positive */
   3745       1.1  mrg     u=e;		      /* .. */
   3746       1.1  mrg     if (e<0) {
   3747       1.1  mrg       *(c-1)='-';	      /* oops, need - */
   3748       1.1  mrg       u=-e;		      /* uInt, please */
   3749       1.1  mrg       }
   3750       1.1  mrg     /* lay out the exponent [_itoa or equivalent is not ANSI C] */
   3751       1.1  mrg     for (cut=9; cut>=0; cut--) {
   3752       1.1  mrg       TODIGIT(u, cut, c, pow);
   3753       1.1  mrg       if (*c=='0' && !had) continue;	/* skip leading zeros */
   3754       1.1  mrg       had=1;				/* had non-0 */
   3755       1.1  mrg       c++;				/* step for next */
   3756       1.1  mrg       } /* cut */
   3757       1.1  mrg     }
   3758       1.1  mrg   *c='\0';	    /* terminate the string (all paths) */
   3759       1.1  mrg   return;
   3760       1.1  mrg   } /* decToString */
   3761       1.1  mrg 
   3762       1.1  mrg /* ------------------------------------------------------------------ */
   3763       1.1  mrg /* decAddOp -- add/subtract operation				      */
   3764       1.1  mrg /*								      */
   3765       1.1  mrg /*   This computes C = A + B					      */
   3766       1.1  mrg /*								      */
   3767       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X+X)	      */
   3768       1.1  mrg /*   lhs is A							      */
   3769       1.1  mrg /*   rhs is B							      */
   3770       1.1  mrg /*   set is the context 					      */
   3771       1.1  mrg /*   negate is DECNEG if rhs should be negated, or 0 otherwise	      */
   3772       1.1  mrg /*   status accumulates status for the caller			      */
   3773       1.1  mrg /*								      */
   3774       1.1  mrg /* C must have space for set->digits digits.			      */
   3775       1.1  mrg /* Inexact in status must be 0 for correct Exact zero sign in result  */
   3776       1.1  mrg /* ------------------------------------------------------------------ */
   3777       1.1  mrg /* If possible, the coefficient is calculated directly into C.	      */
   3778       1.1  mrg /* However, if: 						      */
   3779       1.1  mrg /*   -- a digits+1 calculation is needed because the numbers are      */
   3780       1.1  mrg /*	unaligned and span more than set->digits digits 	      */
   3781       1.1  mrg /*   -- a carry to digits+1 digits looks possible		      */
   3782       1.1  mrg /*   -- C is the same as A or B, and the result would destructively   */
   3783       1.1  mrg /*	overlap the A or B coefficient				      */
   3784       1.1  mrg /* then the result must be calculated into a temporary buffer.	In    */
   3785       1.1  mrg /* this case a local (stack) buffer is used if possible, and only if  */
   3786       1.1  mrg /* too long for that does malloc become the final resort.	      */
   3787       1.1  mrg /*								      */
   3788       1.1  mrg /* Misalignment is handled as follows:				      */
   3789       1.1  mrg /*   Apad: (AExp>BExp) Swap operands and proceed as for BExp>AExp.    */
   3790       1.1  mrg /*   BPad: Apply the padding by a combination of shifting (whole      */
   3791       1.1  mrg /*	   units) and multiplication (part units).		      */
   3792       1.1  mrg /*								      */
   3793       1.1  mrg /* Addition, especially x=x+1, is speed-critical.		      */
   3794       1.1  mrg /* The static buffer is larger than might be expected to allow for    */
   3795       1.1  mrg /* calls from higher-level funtions (notable exp).		      */
   3796       1.1  mrg /* ------------------------------------------------------------------ */
   3797       1.1  mrg static decNumber * decAddOp(decNumber *res, const decNumber *lhs,
   3798       1.1  mrg 			    const decNumber *rhs, decContext *set,
   3799       1.1  mrg 			    uByte negate, uInt *status) {
   3800       1.1  mrg   #if DECSUBSET
   3801       1.1  mrg   decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
   3802       1.1  mrg   decNumber *allocrhs=NULL;	   /* .., rhs */
   3803       1.1  mrg   #endif
   3804       1.1  mrg   Int	rhsshift;		   /* working shift (in Units) */
   3805       1.1  mrg   Int	maxdigits;		   /* longest logical length */
   3806       1.1  mrg   Int	mult;			   /* multiplier */
   3807       1.1  mrg   Int	residue;		   /* rounding accumulator */
   3808       1.1  mrg   uByte bits;			   /* result bits */
   3809       1.1  mrg   Flag	diffsign;		   /* non-0 if arguments have different sign */
   3810       1.1  mrg   Unit	*acc;			   /* accumulator for result */
   3811       1.1  mrg   Unit	accbuff[SD2U(DECBUFFER*2+20)]; /* local buffer [*2+20 reduces many */
   3812       1.1  mrg 				   /* allocations when called from */
   3813       1.1  mrg 				   /* other operations, notable exp] */
   3814       1.1  mrg   Unit	*allocacc=NULL; 	   /* -> allocated acc buffer, iff allocated */
   3815       1.1  mrg   Int	reqdigits=set->digits;	   /* local copy; requested DIGITS */
   3816       1.1  mrg   Int	padding;		   /* work */
   3817       1.1  mrg 
   3818       1.1  mrg   #if DECCHECK
   3819       1.1  mrg   if (decCheckOperands(res, lhs, rhs, set)) return res;
   3820       1.1  mrg   #endif
   3821       1.1  mrg 
   3822       1.1  mrg   do {				   /* protect allocated storage */
   3823       1.1  mrg     #if DECSUBSET
   3824       1.1  mrg     if (!set->extended) {
   3825       1.1  mrg       /* reduce operands and set lostDigits status, as needed */
   3826       1.1  mrg       if (lhs->digits>reqdigits) {
   3827       1.1  mrg 	alloclhs=decRoundOperand(lhs, set, status);
   3828       1.1  mrg 	if (alloclhs==NULL) break;
   3829       1.1  mrg 	lhs=alloclhs;
   3830       1.1  mrg 	}
   3831       1.1  mrg       if (rhs->digits>reqdigits) {
   3832       1.1  mrg 	allocrhs=decRoundOperand(rhs, set, status);
   3833       1.1  mrg 	if (allocrhs==NULL) break;
   3834       1.1  mrg 	rhs=allocrhs;
   3835       1.1  mrg 	}
   3836       1.1  mrg       }
   3837       1.1  mrg     #endif
   3838       1.1  mrg     /* [following code does not require input rounding] */
   3839       1.1  mrg 
   3840       1.1  mrg     /* note whether signs differ [used all paths] */
   3841       1.1  mrg     diffsign=(Flag)((lhs->bits^rhs->bits^negate)&DECNEG);
   3842       1.1  mrg 
   3843       1.1  mrg     /* handle infinities and NaNs */
   3844       1.1  mrg     if (SPECIALARGS) {			/* a special bit set */
   3845       1.1  mrg       if (SPECIALARGS & (DECSNAN | DECNAN))  /* a NaN */
   3846       1.1  mrg 	decNaNs(res, lhs, rhs, set, status);
   3847       1.1  mrg        else { /* one or two infinities */
   3848       1.1  mrg 	if (decNumberIsInfinite(lhs)) { /* LHS is infinity */
   3849       1.1  mrg 	  /* two infinities with different signs is invalid */
   3850       1.1  mrg 	  if (decNumberIsInfinite(rhs) && diffsign) {
   3851       1.1  mrg 	    *status|=DEC_Invalid_operation;
   3852       1.1  mrg 	    break;
   3853       1.1  mrg 	    }
   3854       1.1  mrg 	  bits=lhs->bits & DECNEG;	/* get sign from LHS */
   3855       1.1  mrg 	  }
   3856       1.1  mrg 	 else bits=(rhs->bits^negate) & DECNEG;/* RHS must be Infinity */
   3857       1.1  mrg 	bits|=DECINF;
   3858       1.1  mrg 	decNumberZero(res);
   3859       1.1  mrg 	res->bits=bits; 		/* set +/- infinity */
   3860       1.1  mrg 	} /* an infinity */
   3861       1.1  mrg       break;
   3862       1.1  mrg       }
   3863       1.1  mrg 
   3864       1.1  mrg     /* Quick exit for add 0s; return the non-0, modified as need be */
   3865       1.1  mrg     if (ISZERO(lhs)) {
   3866       1.1  mrg       Int adjust;			/* work */
   3867       1.1  mrg       Int lexp=lhs->exponent;		/* save in case LHS==RES */
   3868       1.1  mrg       bits=lhs->bits;			/* .. */
   3869       1.1  mrg       residue=0;			/* clear accumulator */
   3870       1.1  mrg       decCopyFit(res, rhs, set, &residue, status); /* copy (as needed) */
   3871       1.1  mrg       res->bits^=negate;		/* flip if rhs was negated */
   3872       1.1  mrg       #if DECSUBSET
   3873       1.1  mrg       if (set->extended) {		/* exponents on zeros count */
   3874       1.1  mrg       #endif
   3875       1.1  mrg 	/* exponent will be the lower of the two */
   3876       1.1  mrg 	adjust=lexp-res->exponent;	/* adjustment needed [if -ve] */
   3877       1.1  mrg 	if (ISZERO(res)) {		/* both 0: special IEEE 754 rules */
   3878       1.1  mrg 	  if (adjust<0) res->exponent=lexp;  /* set exponent */
   3879       1.1  mrg 	  /* 0-0 gives +0 unless rounding to -infinity, and -0-0 gives -0 */
   3880       1.1  mrg 	  if (diffsign) {
   3881       1.1  mrg 	    if (set->round!=DEC_ROUND_FLOOR) res->bits=0;
   3882       1.1  mrg 	     else res->bits=DECNEG;	/* preserve 0 sign */
   3883       1.1  mrg 	    }
   3884       1.1  mrg 	  }
   3885       1.1  mrg 	 else { /* non-0 res */
   3886       1.1  mrg 	  if (adjust<0) {     /* 0-padding needed */
   3887       1.1  mrg 	    if ((res->digits-adjust)>set->digits) {
   3888       1.1  mrg 	      adjust=res->digits-set->digits;	  /* to fit exactly */
   3889       1.1  mrg 	      *status|=DEC_Rounded;		  /* [but exact] */
   3890       1.1  mrg 	      }
   3891       1.1  mrg 	    res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
   3892       1.1  mrg 	    res->exponent+=adjust;		  /* set the exponent. */
   3893       1.1  mrg 	    }
   3894       1.1  mrg 	  } /* non-0 res */
   3895       1.1  mrg       #if DECSUBSET
   3896       1.1  mrg 	} /* extended */
   3897       1.1  mrg       #endif
   3898       1.1  mrg       decFinish(res, set, &residue, status);	  /* clean and finalize */
   3899       1.1  mrg       break;}
   3900       1.1  mrg 
   3901       1.1  mrg     if (ISZERO(rhs)) {			/* [lhs is non-zero] */
   3902       1.1  mrg       Int adjust;			/* work */
   3903       1.1  mrg       Int rexp=rhs->exponent;		/* save in case RHS==RES */
   3904       1.1  mrg       bits=rhs->bits;			/* be clean */
   3905       1.1  mrg       residue=0;			/* clear accumulator */
   3906       1.1  mrg       decCopyFit(res, lhs, set, &residue, status); /* copy (as needed) */
   3907       1.1  mrg       #if DECSUBSET
   3908       1.1  mrg       if (set->extended) {		/* exponents on zeros count */
   3909       1.1  mrg       #endif
   3910       1.1  mrg 	/* exponent will be the lower of the two */
   3911       1.1  mrg 	/* [0-0 case handled above] */
   3912       1.1  mrg 	adjust=rexp-res->exponent;	/* adjustment needed [if -ve] */
   3913       1.1  mrg 	if (adjust<0) {     /* 0-padding needed */
   3914       1.1  mrg 	  if ((res->digits-adjust)>set->digits) {
   3915       1.1  mrg 	    adjust=res->digits-set->digits;	/* to fit exactly */
   3916       1.1  mrg 	    *status|=DEC_Rounded;		/* [but exact] */
   3917       1.1  mrg 	    }
   3918       1.1  mrg 	  res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
   3919       1.1  mrg 	  res->exponent+=adjust;		/* set the exponent. */
   3920       1.1  mrg 	  }
   3921       1.1  mrg       #if DECSUBSET
   3922       1.1  mrg 	} /* extended */
   3923       1.1  mrg       #endif
   3924       1.1  mrg       decFinish(res, set, &residue, status);	  /* clean and finalize */
   3925       1.1  mrg       break;}
   3926       1.1  mrg 
   3927       1.1  mrg     /* [NB: both fastpath and mainpath code below assume these cases */
   3928       1.1  mrg     /* (notably 0-0) have already been handled] */
   3929       1.1  mrg 
   3930       1.1  mrg     /* calculate the padding needed to align the operands */
   3931       1.1  mrg     padding=rhs->exponent-lhs->exponent;
   3932       1.1  mrg 
   3933       1.1  mrg     /* Fastpath cases where the numbers are aligned and normal, the RHS */
   3934       1.1  mrg     /* is all in one unit, no operand rounding is needed, and no carry, */
   3935       1.1  mrg     /* lengthening, or borrow is needed */
   3936       1.1  mrg     if (padding==0
   3937       1.1  mrg 	&& rhs->digits<=DECDPUN
   3938       1.1  mrg 	&& rhs->exponent>=set->emin	/* [some normals drop through] */
   3939       1.1  mrg 	&& rhs->exponent<=set->emax-set->digits+1 /* [could clamp] */
   3940       1.1  mrg 	&& rhs->digits<=reqdigits
   3941       1.1  mrg 	&& lhs->digits<=reqdigits) {
   3942       1.1  mrg       Int partial=*lhs->lsu;
   3943       1.1  mrg       if (!diffsign) {			/* adding */
   3944       1.1  mrg 	partial+=*rhs->lsu;
   3945       1.1  mrg 	if ((partial<=DECDPUNMAX)	/* result fits in unit */
   3946       1.1  mrg 	 && (lhs->digits>=DECDPUN ||	/* .. and no digits-count change */
   3947       1.1  mrg 	     partial<(Int)powers[lhs->digits])) { /* .. */
   3948       1.1  mrg 	  if (res!=lhs) decNumberCopy(res, lhs);  /* not in place */
   3949       1.1  mrg 	  *res->lsu=(Unit)partial;	/* [copy could have overwritten RHS] */
   3950       1.1  mrg 	  break;
   3951       1.1  mrg 	  }
   3952       1.1  mrg 	/* else drop out for careful add */
   3953       1.1  mrg 	}
   3954       1.1  mrg        else {				/* signs differ */
   3955       1.1  mrg 	partial-=*rhs->lsu;
   3956       1.1  mrg 	if (partial>0) { /* no borrow needed, and non-0 result */
   3957       1.1  mrg 	  if (res!=lhs) decNumberCopy(res, lhs);  /* not in place */
   3958       1.1  mrg 	  *res->lsu=(Unit)partial;
   3959       1.1  mrg 	  /* this could have reduced digits [but result>0] */
   3960       1.1  mrg 	  res->digits=decGetDigits(res->lsu, D2U(res->digits));
   3961       1.1  mrg 	  break;
   3962       1.1  mrg 	  }
   3963       1.1  mrg 	/* else drop out for careful subtract */
   3964       1.1  mrg 	}
   3965       1.1  mrg       }
   3966       1.1  mrg 
   3967       1.1  mrg     /* Now align (pad) the lhs or rhs so they can be added or */
   3968       1.1  mrg     /* subtracted, as necessary.  If one number is much larger than */
   3969       1.1  mrg     /* the other (that is, if in plain form there is a least one */
   3970       1.1  mrg     /* digit between the lowest digit of one and the highest of the */
   3971       1.1  mrg     /* other) padding with up to DIGITS-1 trailing zeros may be */
   3972       1.1  mrg     /* needed; then apply rounding (as exotic rounding modes may be */
   3973       1.1  mrg     /* affected by the residue). */
   3974       1.1  mrg     rhsshift=0; 	      /* rhs shift to left (padding) in Units */
   3975       1.1  mrg     bits=lhs->bits;	      /* assume sign is that of LHS */
   3976       1.1  mrg     mult=1;		      /* likely multiplier */
   3977       1.1  mrg 
   3978       1.1  mrg     /* [if padding==0 the operands are aligned; no padding is needed] */
   3979       1.1  mrg     if (padding!=0) {
   3980       1.1  mrg       /* some padding needed; always pad the RHS, as any required */
   3981       1.1  mrg       /* padding can then be effected by a simple combination of */
   3982       1.1  mrg       /* shifts and a multiply */
   3983       1.1  mrg       Flag swapped=0;
   3984       1.1  mrg       if (padding<0) {			/* LHS needs the padding */
   3985       1.1  mrg 	const decNumber *t;
   3986       1.1  mrg 	padding=-padding;		/* will be +ve */
   3987       1.1  mrg 	bits=(uByte)(rhs->bits^negate); /* assumed sign is now that of RHS */
   3988       1.1  mrg 	t=lhs; lhs=rhs; rhs=t;
   3989       1.1  mrg 	swapped=1;
   3990       1.1  mrg 	}
   3991       1.1  mrg 
   3992       1.1  mrg       /* If, after pad, rhs would be longer than lhs by digits+1 or */
   3993       1.1  mrg       /* more then lhs cannot affect the answer, except as a residue, */
   3994       1.1  mrg       /* so only need to pad up to a length of DIGITS+1. */
   3995       1.1  mrg       if (rhs->digits+padding > lhs->digits+reqdigits+1) {
   3996       1.1  mrg 	/* The RHS is sufficient */
   3997       1.1  mrg 	/* for residue use the relative sign indication... */
   3998       1.1  mrg 	Int shift=reqdigits-rhs->digits;     /* left shift needed */
   3999       1.1  mrg 	residue=1;			     /* residue for rounding */
   4000       1.1  mrg 	if (diffsign) residue=-residue;      /* signs differ */
   4001       1.1  mrg 	/* copy, shortening if necessary */
   4002       1.1  mrg 	decCopyFit(res, rhs, set, &residue, status);
   4003       1.1  mrg 	/* if it was already shorter, then need to pad with zeros */
   4004       1.1  mrg 	if (shift>0) {
   4005       1.1  mrg 	  res->digits=decShiftToMost(res->lsu, res->digits, shift);
   4006       1.1  mrg 	  res->exponent-=shift; 	     /* adjust the exponent. */
   4007       1.1  mrg 	  }
   4008       1.1  mrg 	/* flip the result sign if unswapped and rhs was negated */
   4009       1.1  mrg 	if (!swapped) res->bits^=negate;
   4010       1.1  mrg 	decFinish(res, set, &residue, status);	  /* done */
   4011       1.1  mrg 	break;}
   4012       1.1  mrg 
   4013       1.1  mrg       /* LHS digits may affect result */
   4014       1.1  mrg       rhsshift=D2U(padding+1)-1;	/* this much by Unit shift .. */
   4015       1.1  mrg       mult=powers[padding-(rhsshift*DECDPUN)]; /* .. this by multiplication */
   4016       1.1  mrg       } /* padding needed */
   4017       1.1  mrg 
   4018       1.1  mrg     if (diffsign) mult=-mult;		/* signs differ */
   4019       1.1  mrg 
   4020       1.1  mrg     /* determine the longer operand */
   4021       1.1  mrg     maxdigits=rhs->digits+padding;	/* virtual length of RHS */
   4022       1.1  mrg     if (lhs->digits>maxdigits) maxdigits=lhs->digits;
   4023       1.1  mrg 
   4024       1.1  mrg     /* Decide on the result buffer to use; if possible place directly */
   4025       1.1  mrg     /* into result. */
   4026       1.1  mrg     acc=res->lsu;			/* assume add direct to result */
   4027       1.1  mrg     /* If destructive overlap, or the number is too long, or a carry or */
   4028       1.1  mrg     /* borrow to DIGITS+1 might be possible, a buffer must be used. */
   4029       1.1  mrg     /* [Might be worth more sophisticated tests when maxdigits==reqdigits] */
   4030       1.1  mrg     if ((maxdigits>=reqdigits)		/* is, or could be, too large */
   4031       1.1  mrg      || (res==rhs && rhsshift>0)) {	/* destructive overlap */
   4032       1.1  mrg       /* buffer needed, choose it; units for maxdigits digits will be */
   4033       1.1  mrg       /* needed, +1 Unit for carry or borrow */
   4034       1.1  mrg       Int need=D2U(maxdigits)+1;
   4035       1.1  mrg       acc=accbuff;			/* assume use local buffer */
   4036       1.1  mrg       if (need*sizeof(Unit)>sizeof(accbuff)) {
   4037       1.1  mrg 	/* printf("malloc add %ld %ld\n", need, sizeof(accbuff)); */
   4038       1.1  mrg 	allocacc=(Unit *)malloc(need*sizeof(Unit));
   4039       1.1  mrg 	if (allocacc==NULL) {		/* hopeless -- abandon */
   4040       1.1  mrg 	  *status|=DEC_Insufficient_storage;
   4041       1.1  mrg 	  break;}
   4042       1.1  mrg 	acc=allocacc;
   4043       1.1  mrg 	}
   4044       1.1  mrg       }
   4045       1.1  mrg 
   4046       1.1  mrg     res->bits=(uByte)(bits&DECNEG);	/* it's now safe to overwrite.. */
   4047       1.1  mrg     res->exponent=lhs->exponent;	/* .. operands (even if aliased) */
   4048       1.1  mrg 
   4049       1.1  mrg     #if DECTRACE
   4050       1.1  mrg       decDumpAr('A', lhs->lsu, D2U(lhs->digits));
   4051       1.1  mrg       decDumpAr('B', rhs->lsu, D2U(rhs->digits));
   4052       1.1  mrg       printf("	:h: %ld %ld\n", rhsshift, mult);
   4053       1.1  mrg     #endif
   4054       1.1  mrg 
   4055       1.1  mrg     /* add [A+B*m] or subtract [A+B*(-m)] */
   4056       1.1  mrg     res->digits=decUnitAddSub(lhs->lsu, D2U(lhs->digits),
   4057       1.1  mrg 			      rhs->lsu, D2U(rhs->digits),
   4058       1.1  mrg 			      rhsshift, acc, mult)
   4059       1.1  mrg 	       *DECDPUN;	   /* [units -> digits] */
   4060       1.1  mrg     if (res->digits<0) {	   /* borrowed... */
   4061       1.1  mrg       res->digits=-res->digits;
   4062       1.1  mrg       res->bits^=DECNEG;	   /* flip the sign */
   4063       1.1  mrg       }
   4064       1.1  mrg     #if DECTRACE
   4065       1.1  mrg       decDumpAr('+', acc, D2U(res->digits));
   4066       1.1  mrg     #endif
   4067       1.1  mrg 
   4068       1.1  mrg     /* If a buffer was used the result must be copied back, possibly */
   4069       1.1  mrg     /* shortening.  (If no buffer was used then the result must have */
   4070       1.1  mrg     /* fit, so can't need rounding and residue must be 0.) */
   4071       1.1  mrg     residue=0;			   /* clear accumulator */
   4072       1.1  mrg     if (acc!=res->lsu) {
   4073       1.1  mrg       #if DECSUBSET
   4074       1.1  mrg       if (set->extended) {	   /* round from first significant digit */
   4075       1.1  mrg       #endif
   4076       1.1  mrg 	/* remove leading zeros that were added due to rounding up to */
   4077       1.1  mrg 	/* integral Units -- before the test for rounding. */
   4078       1.1  mrg 	if (res->digits>reqdigits)
   4079       1.1  mrg 	  res->digits=decGetDigits(acc, D2U(res->digits));
   4080       1.1  mrg 	decSetCoeff(res, set, acc, res->digits, &residue, status);
   4081       1.1  mrg       #if DECSUBSET
   4082       1.1  mrg 	}
   4083       1.1  mrg        else { /* subset arithmetic rounds from original significant digit */
   4084       1.1  mrg 	/* May have an underestimate.  This only occurs when both */
   4085       1.1  mrg 	/* numbers fit in DECDPUN digits and are padding with a */
   4086       1.1  mrg 	/* negative multiple (-10, -100...) and the top digit(s) become */
   4087       1.1  mrg 	/* 0.  (This only matters when using X3.274 rules where the */
   4088       1.1  mrg 	/* leading zero could be included in the rounding.) */
   4089       1.1  mrg 	if (res->digits<maxdigits) {
   4090       1.1  mrg 	  *(acc+D2U(res->digits))=0; /* ensure leading 0 is there */
   4091       1.1  mrg 	  res->digits=maxdigits;
   4092       1.1  mrg 	  }
   4093       1.1  mrg 	 else {
   4094       1.1  mrg 	  /* remove leading zeros that added due to rounding up to */
   4095       1.1  mrg 	  /* integral Units (but only those in excess of the original */
   4096       1.1  mrg 	  /* maxdigits length, unless extended) before test for rounding. */
   4097       1.1  mrg 	  if (res->digits>reqdigits) {
   4098       1.1  mrg 	    res->digits=decGetDigits(acc, D2U(res->digits));
   4099       1.1  mrg 	    if (res->digits<maxdigits) res->digits=maxdigits;
   4100       1.1  mrg 	    }
   4101       1.1  mrg 	  }
   4102       1.1  mrg 	decSetCoeff(res, set, acc, res->digits, &residue, status);
   4103       1.1  mrg 	/* Now apply rounding if needed before removing leading zeros. */
   4104       1.1  mrg 	/* This is safe because subnormals are not a possibility */
   4105       1.1  mrg 	if (residue!=0) {
   4106       1.1  mrg 	  decApplyRound(res, set, residue, status);
   4107       1.1  mrg 	  residue=0;		     /* did what needed to be done */
   4108       1.1  mrg 	  }
   4109       1.1  mrg 	} /* subset */
   4110       1.1  mrg       #endif
   4111       1.1  mrg       } /* used buffer */
   4112       1.1  mrg 
   4113       1.1  mrg     /* strip leading zeros [these were left on in case of subset subtract] */
   4114       1.1  mrg     res->digits=decGetDigits(res->lsu, D2U(res->digits));
   4115       1.1  mrg 
   4116       1.1  mrg     /* apply checks and rounding */
   4117       1.1  mrg     decFinish(res, set, &residue, status);
   4118       1.1  mrg 
   4119       1.1  mrg     /* "When the sum of two operands with opposite signs is exactly */
   4120       1.1  mrg     /* zero, the sign of that sum shall be '+' in all rounding modes */
   4121       1.1  mrg     /* except round toward -Infinity, in which mode that sign shall be */
   4122       1.1  mrg     /* '-'."  [Subset zeros also never have '-', set by decFinish.] */
   4123       1.1  mrg     if (ISZERO(res) && diffsign
   4124       1.1  mrg      #if DECSUBSET
   4125       1.1  mrg      && set->extended
   4126       1.1  mrg      #endif
   4127       1.1  mrg      && (*status&DEC_Inexact)==0) {
   4128       1.1  mrg       if (set->round==DEC_ROUND_FLOOR) res->bits|=DECNEG;   /* sign - */
   4129       1.1  mrg 				  else res->bits&=~DECNEG;  /* sign + */
   4130       1.1  mrg       }
   4131       1.1  mrg     } while(0); 			     /* end protected */
   4132       1.1  mrg 
   4133   1.1.1.2  mrg   free(allocacc);	     /* drop any storage used */
   4134       1.1  mrg   #if DECSUBSET
   4135   1.1.1.2  mrg   free(allocrhs);	     /* .. */
   4136   1.1.1.2  mrg   free(alloclhs);	     /* .. */
   4137       1.1  mrg   #endif
   4138       1.1  mrg   return res;
   4139       1.1  mrg   } /* decAddOp */
   4140       1.1  mrg 
   4141       1.1  mrg /* ------------------------------------------------------------------ */
   4142       1.1  mrg /* decDivideOp -- division operation				      */
   4143       1.1  mrg /*								      */
   4144       1.1  mrg /*  This routine performs the calculations for all four division      */
   4145       1.1  mrg /*  operators (divide, divideInteger, remainder, remainderNear).      */
   4146       1.1  mrg /*								      */
   4147       1.1  mrg /*  C=A op B							      */
   4148       1.1  mrg /*								      */
   4149       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X/X)	      */
   4150       1.1  mrg /*   lhs is A							      */
   4151       1.1  mrg /*   rhs is B							      */
   4152       1.1  mrg /*   set is the context 					      */
   4153       1.1  mrg /*   op  is DIVIDE, DIVIDEINT, REMAINDER, or REMNEAR respectively.    */
   4154       1.1  mrg /*   status is the usual accumulator				      */
   4155       1.1  mrg /*								      */
   4156       1.1  mrg /* C must have space for set->digits digits.			      */
   4157       1.1  mrg /*								      */
   4158       1.1  mrg /* ------------------------------------------------------------------ */
   4159       1.1  mrg /*   The underlying algorithm of this routine is the same as in the   */
   4160       1.1  mrg /*   1981 S/370 implementation, that is, non-restoring long division  */
   4161       1.1  mrg /*   with bi-unit (rather than bi-digit) estimation for each unit     */
   4162       1.1  mrg /*   multiplier.  In this pseudocode overview, complications for the  */
   4163       1.1  mrg /*   Remainder operators and division residues for exact rounding are */
   4164       1.1  mrg /*   omitted for clarity.					      */
   4165       1.1  mrg /*								      */
   4166       1.1  mrg /*     Prepare operands and handle special values		      */
   4167       1.1  mrg /*     Test for x/0 and then 0/x				      */
   4168       1.1  mrg /*     Exp =Exp1 - Exp2 					      */
   4169       1.1  mrg /*     Exp =Exp +len(var1) -len(var2)				      */
   4170       1.1  mrg /*     Sign=Sign1 * Sign2					      */
   4171       1.1  mrg /*     Pad accumulator (Var1) to double-length with 0's (pad1)	      */
   4172       1.1  mrg /*     Pad Var2 to same length as Var1				      */
   4173       1.1  mrg /*     msu2pair/plus=1st 2 or 1 units of var2, +1 to allow for round  */
   4174       1.1  mrg /*     have=0							      */
   4175       1.1  mrg /*     Do until (have=digits+1 OR residue=0)			      */
   4176       1.1  mrg /*	 if exp<0 then if integer divide/residue then leave	      */
   4177       1.1  mrg /*	 this_unit=0						      */
   4178       1.1  mrg /*	 Do forever						      */
   4179       1.1  mrg /*	    compare numbers					      */
   4180       1.1  mrg /*	    if <0 then leave inner_loop 			      */
   4181       1.1  mrg /*	    if =0 then (* quick exit without subtract *) do	      */
   4182       1.1  mrg /*	       this_unit=this_unit+1; output this_unit		      */
   4183       1.1  mrg /*	       leave outer_loop; end				      */
   4184       1.1  mrg /*	    Compare lengths of numbers (mantissae):		      */
   4185       1.1  mrg /*	    If same then tops2=msu2pair -- {units 1&2 of var2}	      */
   4186       1.1  mrg /*		    else tops2=msu2plus -- {0, unit 1 of var2}	      */
   4187       1.1  mrg /*	    tops1=first_unit_of_Var1*10**DECDPUN +second_unit_of_var1 */
   4188       1.1  mrg /*	    mult=tops1/tops2  -- Good and safe guess at divisor       */
   4189       1.1  mrg /*	    if mult=0 then mult=1				      */
   4190       1.1  mrg /*	    this_unit=this_unit+mult				      */
   4191       1.1  mrg /*	    subtract						      */
   4192       1.1  mrg /*	    end inner_loop					      */
   4193       1.1  mrg /*	  if have\=0 | this_unit\=0 then do			      */
   4194       1.1  mrg /*	    output this_unit					      */
   4195       1.1  mrg /*	    have=have+1; end					      */
   4196       1.1  mrg /*	  var2=var2/10						      */
   4197       1.1  mrg /*	  exp=exp-1						      */
   4198       1.1  mrg /*	  end outer_loop					      */
   4199       1.1  mrg /*     exp=exp+1   -- set the proper exponent			      */
   4200       1.1  mrg /*     if have=0 then generate answer=0 			      */
   4201       1.1  mrg /*     Return (Result is defined by Var1)			      */
   4202       1.1  mrg /*								      */
   4203       1.1  mrg /* ------------------------------------------------------------------ */
   4204       1.1  mrg /* Two working buffers are needed during the division; one (digits+   */
   4205       1.1  mrg /* 1) to accumulate the result, and the other (up to 2*digits+1) for  */
   4206       1.1  mrg /* long subtractions.  These are acc and var1 respectively.	      */
   4207       1.1  mrg /* var1 is a copy of the lhs coefficient, var2 is the rhs coefficient.*/
   4208       1.1  mrg /* The static buffers may be larger than might be expected to allow   */
   4209       1.1  mrg /* for calls from higher-level funtions (notable exp).		      */
   4210       1.1  mrg /* ------------------------------------------------------------------ */
   4211       1.1  mrg static decNumber * decDivideOp(decNumber *res,
   4212       1.1  mrg 			       const decNumber *lhs, const decNumber *rhs,
   4213       1.1  mrg 			       decContext *set, Flag op, uInt *status) {
   4214       1.1  mrg   #if DECSUBSET
   4215       1.1  mrg   decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
   4216       1.1  mrg   decNumber *allocrhs=NULL;	   /* .., rhs */
   4217       1.1  mrg   #endif
   4218       1.1  mrg   Unit	accbuff[SD2U(DECBUFFER+DECDPUN+10)]; /* local buffer */
   4219       1.1  mrg   Unit	*acc=accbuff;		   /* -> accumulator array for result */
   4220       1.1  mrg   Unit	*allocacc=NULL; 	   /* -> allocated buffer, iff allocated */
   4221       1.1  mrg   Unit	*accnext;		   /* -> where next digit will go */
   4222       1.1  mrg   Int	acclength;		   /* length of acc needed [Units] */
   4223       1.1  mrg   Int	accunits;		   /* count of units accumulated */
   4224       1.1  mrg   Int	accdigits;		   /* count of digits accumulated */
   4225       1.1  mrg 
   4226       1.1  mrg   Unit	varbuff[SD2U(DECBUFFER*2+DECDPUN)];  /* buffer for var1 */
   4227       1.1  mrg   Unit	*var1=varbuff;		   /* -> var1 array for long subtraction */
   4228       1.1  mrg   Unit	*varalloc=NULL; 	   /* -> allocated buffer, iff used */
   4229       1.1  mrg   Unit	*msu1;			   /* -> msu of var1 */
   4230       1.1  mrg 
   4231       1.1  mrg   const Unit *var2;		   /* -> var2 array */
   4232       1.1  mrg   const Unit *msu2;		   /* -> msu of var2 */
   4233       1.1  mrg   Int	msu2plus;		   /* msu2 plus one [does not vary] */
   4234       1.1  mrg   eInt	msu2pair;		   /* msu2 pair plus one [does not vary] */
   4235       1.1  mrg 
   4236       1.1  mrg   Int	var1units, var2units;	   /* actual lengths */
   4237       1.1  mrg   Int	var2ulen;		   /* logical length (units) */
   4238       1.1  mrg   Int	var1initpad=0;		   /* var1 initial padding (digits) */
   4239       1.1  mrg   Int	maxdigits;		   /* longest LHS or required acc length */
   4240       1.1  mrg   Int	mult;			   /* multiplier for subtraction */
   4241       1.1  mrg   Unit	thisunit;		   /* current unit being accumulated */
   4242       1.1  mrg   Int	residue;		   /* for rounding */
   4243       1.1  mrg   Int	reqdigits=set->digits;	   /* requested DIGITS */
   4244       1.1  mrg   Int	exponent;		   /* working exponent */
   4245       1.1  mrg   Int	maxexponent=0;		   /* DIVIDE maximum exponent if unrounded */
   4246       1.1  mrg   uByte bits;			   /* working sign */
   4247       1.1  mrg   Unit	*target;		   /* work */
   4248       1.1  mrg   const Unit *source;		   /* .. */
   4249       1.1  mrg   uInt	const *pow;		   /* .. */
   4250       1.1  mrg   Int	shift, cut;		   /* .. */
   4251       1.1  mrg   #if DECSUBSET
   4252       1.1  mrg   Int	dropped;		   /* work */
   4253       1.1  mrg   #endif
   4254       1.1  mrg 
   4255       1.1  mrg   #if DECCHECK
   4256       1.1  mrg   if (decCheckOperands(res, lhs, rhs, set)) return res;
   4257       1.1  mrg   #endif
   4258       1.1  mrg 
   4259       1.1  mrg   do {				   /* protect allocated storage */
   4260       1.1  mrg     #if DECSUBSET
   4261       1.1  mrg     if (!set->extended) {
   4262       1.1  mrg       /* reduce operands and set lostDigits status, as needed */
   4263       1.1  mrg       if (lhs->digits>reqdigits) {
   4264       1.1  mrg 	alloclhs=decRoundOperand(lhs, set, status);
   4265       1.1  mrg 	if (alloclhs==NULL) break;
   4266       1.1  mrg 	lhs=alloclhs;
   4267       1.1  mrg 	}
   4268       1.1  mrg       if (rhs->digits>reqdigits) {
   4269       1.1  mrg 	allocrhs=decRoundOperand(rhs, set, status);
   4270       1.1  mrg 	if (allocrhs==NULL) break;
   4271       1.1  mrg 	rhs=allocrhs;
   4272       1.1  mrg 	}
   4273       1.1  mrg       }
   4274       1.1  mrg     #endif
   4275       1.1  mrg     /* [following code does not require input rounding] */
   4276       1.1  mrg 
   4277       1.1  mrg     bits=(lhs->bits^rhs->bits)&DECNEG;	/* assumed sign for divisions */
   4278       1.1  mrg 
   4279       1.1  mrg     /* handle infinities and NaNs */
   4280       1.1  mrg     if (SPECIALARGS) {			/* a special bit set */
   4281       1.1  mrg       if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs */
   4282       1.1  mrg 	decNaNs(res, lhs, rhs, set, status);
   4283       1.1  mrg 	break;
   4284       1.1  mrg 	}
   4285       1.1  mrg       /* one or two infinities */
   4286       1.1  mrg       if (decNumberIsInfinite(lhs)) {	/* LHS (dividend) is infinite */
   4287       1.1  mrg 	if (decNumberIsInfinite(rhs) || /* two infinities are invalid .. */
   4288       1.1  mrg 	    op & (REMAINDER | REMNEAR)) { /* as is remainder of infinity */
   4289       1.1  mrg 	  *status|=DEC_Invalid_operation;
   4290       1.1  mrg 	  break;
   4291       1.1  mrg 	  }
   4292       1.1  mrg 	/* [Note that infinity/0 raises no exceptions] */
   4293       1.1  mrg 	decNumberZero(res);
   4294       1.1  mrg 	res->bits=bits|DECINF;		/* set +/- infinity */
   4295       1.1  mrg 	break;
   4296       1.1  mrg 	}
   4297       1.1  mrg        else {				/* RHS (divisor) is infinite */
   4298       1.1  mrg 	residue=0;
   4299       1.1  mrg 	if (op&(REMAINDER|REMNEAR)) {
   4300       1.1  mrg 	  /* result is [finished clone of] lhs */
   4301       1.1  mrg 	  decCopyFit(res, lhs, set, &residue, status);
   4302       1.1  mrg 	  }
   4303       1.1  mrg 	 else {  /* a division */
   4304       1.1  mrg 	  decNumberZero(res);
   4305       1.1  mrg 	  res->bits=bits;		/* set +/- zero */
   4306       1.1  mrg 	  /* for DIVIDEINT the exponent is always 0.  For DIVIDE, result */
   4307       1.1  mrg 	  /* is a 0 with infinitely negative exponent, clamped to minimum */
   4308       1.1  mrg 	  if (op&DIVIDE) {
   4309       1.1  mrg 	    res->exponent=set->emin-set->digits+1;
   4310       1.1  mrg 	    *status|=DEC_Clamped;
   4311       1.1  mrg 	    }
   4312       1.1  mrg 	  }
   4313       1.1  mrg 	decFinish(res, set, &residue, status);
   4314       1.1  mrg 	break;
   4315       1.1  mrg 	}
   4316       1.1  mrg       }
   4317       1.1  mrg 
   4318       1.1  mrg     /* handle 0 rhs (x/0) */
   4319       1.1  mrg     if (ISZERO(rhs)) {			/* x/0 is always exceptional */
   4320       1.1  mrg       if (ISZERO(lhs)) {
   4321       1.1  mrg 	decNumberZero(res);		/* [after lhs test] */
   4322       1.1  mrg 	*status|=DEC_Division_undefined;/* 0/0 will become NaN */
   4323       1.1  mrg 	}
   4324       1.1  mrg        else {
   4325       1.1  mrg 	decNumberZero(res);
   4326       1.1  mrg 	if (op&(REMAINDER|REMNEAR)) *status|=DEC_Invalid_operation;
   4327       1.1  mrg 	 else {
   4328       1.1  mrg 	  *status|=DEC_Division_by_zero; /* x/0 */
   4329       1.1  mrg 	  res->bits=bits|DECINF;	 /* .. is +/- Infinity */
   4330       1.1  mrg 	  }
   4331       1.1  mrg 	}
   4332       1.1  mrg       break;}
   4333       1.1  mrg 
   4334       1.1  mrg     /* handle 0 lhs (0/x) */
   4335       1.1  mrg     if (ISZERO(lhs)) {			/* 0/x [x!=0] */
   4336       1.1  mrg       #if DECSUBSET
   4337       1.1  mrg       if (!set->extended) decNumberZero(res);
   4338       1.1  mrg        else {
   4339       1.1  mrg       #endif
   4340       1.1  mrg 	if (op&DIVIDE) {
   4341       1.1  mrg 	  residue=0;
   4342       1.1  mrg 	  exponent=lhs->exponent-rhs->exponent; /* ideal exponent */
   4343       1.1  mrg 	  decNumberCopy(res, lhs);	/* [zeros always fit] */
   4344       1.1  mrg 	  res->bits=bits;		/* sign as computed */
   4345       1.1  mrg 	  res->exponent=exponent;	/* exponent, too */
   4346       1.1  mrg 	  decFinalize(res, set, &residue, status);   /* check exponent */
   4347       1.1  mrg 	  }
   4348       1.1  mrg 	 else if (op&DIVIDEINT) {
   4349       1.1  mrg 	  decNumberZero(res);		/* integer 0 */
   4350       1.1  mrg 	  res->bits=bits;		/* sign as computed */
   4351       1.1  mrg 	  }
   4352       1.1  mrg 	 else { 			/* a remainder */
   4353       1.1  mrg 	  exponent=rhs->exponent;	/* [save in case overwrite] */
   4354       1.1  mrg 	  decNumberCopy(res, lhs);	/* [zeros always fit] */
   4355       1.1  mrg 	  if (exponent<res->exponent) res->exponent=exponent; /* use lower */
   4356       1.1  mrg 	  }
   4357       1.1  mrg       #if DECSUBSET
   4358       1.1  mrg 	}
   4359       1.1  mrg       #endif
   4360       1.1  mrg       break;}
   4361       1.1  mrg 
   4362       1.1  mrg     /* Precalculate exponent.  This starts off adjusted (and hence fits */
   4363       1.1  mrg     /* in 31 bits) and becomes the usual unadjusted exponent as the */
   4364       1.1  mrg     /* division proceeds.  The order of evaluation is important, here, */
   4365       1.1  mrg     /* to avoid wrap. */
   4366       1.1  mrg     exponent=(lhs->exponent+lhs->digits)-(rhs->exponent+rhs->digits);
   4367       1.1  mrg 
   4368       1.1  mrg     /* If the working exponent is -ve, then some quick exits are */
   4369       1.1  mrg     /* possible because the quotient is known to be <1 */
   4370       1.1  mrg     /* [for REMNEAR, it needs to be < -1, as -0.5 could need work] */
   4371       1.1  mrg     if (exponent<0 && !(op==DIVIDE)) {
   4372       1.1  mrg       if (op&DIVIDEINT) {
   4373       1.1  mrg 	decNumberZero(res);		     /* integer part is 0 */
   4374       1.1  mrg 	#if DECSUBSET
   4375       1.1  mrg 	if (set->extended)
   4376       1.1  mrg 	#endif
   4377       1.1  mrg 	  res->bits=bits;		     /* set +/- zero */
   4378       1.1  mrg 	break;}
   4379       1.1  mrg       /* fastpath remainders so long as the lhs has the smaller */
   4380       1.1  mrg       /* (or equal) exponent */
   4381       1.1  mrg       if (lhs->exponent<=rhs->exponent) {
   4382       1.1  mrg 	if (op&REMAINDER || exponent<-1) {
   4383       1.1  mrg 	  /* It is REMAINDER or safe REMNEAR; result is [finished */
   4384       1.1  mrg 	  /* clone of] lhs  (r = x - 0*y) */
   4385       1.1  mrg 	  residue=0;
   4386       1.1  mrg 	  decCopyFit(res, lhs, set, &residue, status);
   4387       1.1  mrg 	  decFinish(res, set, &residue, status);
   4388       1.1  mrg 	  break;
   4389       1.1  mrg 	  }
   4390       1.1  mrg 	/* [unsafe REMNEAR drops through] */
   4391       1.1  mrg 	}
   4392       1.1  mrg       } /* fastpaths */
   4393       1.1  mrg 
   4394       1.1  mrg     /* Long (slow) division is needed; roll up the sleeves... */
   4395       1.1  mrg 
   4396       1.1  mrg     /* The accumulator will hold the quotient of the division. */
   4397       1.1  mrg     /* If it needs to be too long for stack storage, then allocate. */
   4398       1.1  mrg     acclength=D2U(reqdigits+DECDPUN);	/* in Units */
   4399       1.1  mrg     if (acclength*sizeof(Unit)>sizeof(accbuff)) {
   4400       1.1  mrg       /* printf("malloc dvacc %ld units\n", acclength); */
   4401       1.1  mrg       allocacc=(Unit *)malloc(acclength*sizeof(Unit));
   4402       1.1  mrg       if (allocacc==NULL) {		/* hopeless -- abandon */
   4403       1.1  mrg 	*status|=DEC_Insufficient_storage;
   4404       1.1  mrg 	break;}
   4405       1.1  mrg       acc=allocacc;			/* use the allocated space */
   4406       1.1  mrg       }
   4407       1.1  mrg 
   4408       1.1  mrg     /* var1 is the padded LHS ready for subtractions. */
   4409       1.1  mrg     /* If it needs to be too long for stack storage, then allocate. */
   4410       1.1  mrg     /* The maximum units needed for var1 (long subtraction) is: */
   4411       1.1  mrg     /* Enough for */
   4412       1.1  mrg     /*	   (rhs->digits+reqdigits-1) -- to allow full slide to right */
   4413       1.1  mrg     /* or  (lhs->digits)	     -- to allow for long lhs */
   4414       1.1  mrg     /* whichever is larger */
   4415       1.1  mrg     /*	 +1		   -- for rounding of slide to right */
   4416       1.1  mrg     /*	 +1		   -- for leading 0s */
   4417       1.1  mrg     /*	 +1		   -- for pre-adjust if a remainder or DIVIDEINT */
   4418       1.1  mrg     /* [Note: unused units do not participate in decUnitAddSub data] */
   4419       1.1  mrg     maxdigits=rhs->digits+reqdigits-1;
   4420       1.1  mrg     if (lhs->digits>maxdigits) maxdigits=lhs->digits;
   4421       1.1  mrg     var1units=D2U(maxdigits)+2;
   4422       1.1  mrg     /* allocate a guard unit above msu1 for REMAINDERNEAR */
   4423       1.1  mrg     if (!(op&DIVIDE)) var1units++;
   4424       1.1  mrg     if ((var1units+1)*sizeof(Unit)>sizeof(varbuff)) {
   4425       1.1  mrg       /* printf("malloc dvvar %ld units\n", var1units+1); */
   4426       1.1  mrg       varalloc=(Unit *)malloc((var1units+1)*sizeof(Unit));
   4427       1.1  mrg       if (varalloc==NULL) {		/* hopeless -- abandon */
   4428       1.1  mrg 	*status|=DEC_Insufficient_storage;
   4429       1.1  mrg 	break;}
   4430       1.1  mrg       var1=varalloc;			/* use the allocated space */
   4431       1.1  mrg       }
   4432       1.1  mrg 
   4433       1.1  mrg     /* Extend the lhs and rhs to full long subtraction length.	The lhs */
   4434       1.1  mrg     /* is truly extended into the var1 buffer, with 0 padding, so a */
   4435       1.1  mrg     /* subtract in place is always possible.  The rhs (var2) has */
   4436       1.1  mrg     /* virtual padding (implemented by decUnitAddSub). */
   4437       1.1  mrg     /* One guard unit was allocated above msu1 for rem=rem+rem in */
   4438       1.1  mrg     /* REMAINDERNEAR. */
   4439       1.1  mrg     msu1=var1+var1units-1;		/* msu of var1 */
   4440       1.1  mrg     source=lhs->lsu+D2U(lhs->digits)-1; /* msu of input array */
   4441       1.1  mrg     for (target=msu1; source>=lhs->lsu; source--, target--) *target=*source;
   4442       1.1  mrg     for (; target>=var1; target--) *target=0;
   4443       1.1  mrg 
   4444       1.1  mrg     /* rhs (var2) is left-aligned with var1 at the start */
   4445       1.1  mrg     var2ulen=var1units; 		/* rhs logical length (units) */
   4446       1.1  mrg     var2units=D2U(rhs->digits); 	/* rhs actual length (units) */
   4447       1.1  mrg     var2=rhs->lsu;			/* -> rhs array */
   4448       1.1  mrg     msu2=var2+var2units-1;		/* -> msu of var2 [never changes] */
   4449       1.1  mrg     /* now set up the variables which will be used for estimating the */
   4450       1.1  mrg     /* multiplication factor.  If these variables are not exact, add */
   4451       1.1  mrg     /* 1 to make sure that the multiplier is never overestimated. */
   4452       1.1  mrg     msu2plus=*msu2;			/* it's value .. */
   4453       1.1  mrg     if (var2units>1) msu2plus++;	/* .. +1 if any more */
   4454       1.1  mrg     msu2pair=(eInt)*msu2*(DECDPUNMAX+1);/* top two pair .. */
   4455       1.1  mrg     if (var2units>1) {			/* .. [else treat 2nd as 0] */
   4456       1.1  mrg       msu2pair+=*(msu2-1);		/* .. */
   4457       1.1  mrg       if (var2units>2) msu2pair++;	/* .. +1 if any more */
   4458       1.1  mrg       }
   4459       1.1  mrg 
   4460       1.1  mrg     /* The calculation is working in units, which may have leading zeros, */
   4461       1.1  mrg     /* but the exponent was calculated on the assumption that they are */
   4462       1.1  mrg     /* both left-aligned.  Adjust the exponent to compensate: add the */
   4463       1.1  mrg     /* number of leading zeros in var1 msu and subtract those in var2 msu. */
   4464       1.1  mrg     /* [This is actually done by counting the digits and negating, as */
   4465       1.1  mrg     /* lead1=DECDPUN-digits1, and similarly for lead2.] */
   4466       1.1  mrg     for (pow=&powers[1]; *msu1>=*pow; pow++) exponent--;
   4467       1.1  mrg     for (pow=&powers[1]; *msu2>=*pow; pow++) exponent++;
   4468       1.1  mrg 
   4469       1.1  mrg     /* Now, if doing an integer divide or remainder, ensure that */
   4470       1.1  mrg     /* the result will be Unit-aligned.  To do this, shift the var1 */
   4471       1.1  mrg     /* accumulator towards least if need be.  (It's much easier to */
   4472       1.1  mrg     /* do this now than to reassemble the residue afterwards, if */
   4473       1.1  mrg     /* doing a remainder.)  Also ensure the exponent is not negative. */
   4474       1.1  mrg     if (!(op&DIVIDE)) {
   4475       1.1  mrg       Unit *u;				/* work */
   4476       1.1  mrg       /* save the initial 'false' padding of var1, in digits */
   4477       1.1  mrg       var1initpad=(var1units-D2U(lhs->digits))*DECDPUN;
   4478       1.1  mrg       /* Determine the shift to do. */
   4479       1.1  mrg       if (exponent<0) cut=-exponent;
   4480       1.1  mrg        else cut=DECDPUN-exponent%DECDPUN;
   4481       1.1  mrg       decShiftToLeast(var1, var1units, cut);
   4482       1.1  mrg       exponent+=cut;			/* maintain numerical value */
   4483       1.1  mrg       var1initpad-=cut; 		/* .. and reduce padding */
   4484       1.1  mrg       /* clean any most-significant units which were just emptied */
   4485       1.1  mrg       for (u=msu1; cut>=DECDPUN; cut-=DECDPUN, u--) *u=0;
   4486       1.1  mrg       } /* align */
   4487       1.1  mrg      else { /* is DIVIDE */
   4488       1.1  mrg       maxexponent=lhs->exponent-rhs->exponent;	  /* save */
   4489       1.1  mrg       /* optimization: if the first iteration will just produce 0, */
   4490       1.1  mrg       /* preadjust to skip it [valid for DIVIDE only] */
   4491       1.1  mrg       if (*msu1<*msu2) {
   4492       1.1  mrg 	var2ulen--;			/* shift down */
   4493       1.1  mrg 	exponent-=DECDPUN;		/* update the exponent */
   4494       1.1  mrg 	}
   4495       1.1  mrg       }
   4496       1.1  mrg 
   4497       1.1  mrg     /* ---- start the long-division loops ------------------------------ */
   4498       1.1  mrg     accunits=0; 			/* no units accumulated yet */
   4499       1.1  mrg     accdigits=0;			/* .. or digits */
   4500       1.1  mrg     accnext=acc+acclength-1;		/* -> msu of acc [NB: allows digits+1] */
   4501       1.1  mrg     for (;;) {				/* outer forever loop */
   4502       1.1  mrg       thisunit=0;			/* current unit assumed 0 */
   4503       1.1  mrg       /* find the next unit */
   4504       1.1  mrg       for (;;) {			/* inner forever loop */
   4505       1.1  mrg 	/* strip leading zero units [from either pre-adjust or from */
   4506       1.1  mrg 	/* subtract last time around].	Leave at least one unit. */
   4507       1.1  mrg 	for (; *msu1==0 && msu1>var1; msu1--) var1units--;
   4508       1.1  mrg 
   4509       1.1  mrg 	if (var1units<var2ulen) break;	     /* var1 too low for subtract */
   4510       1.1  mrg 	if (var1units==var2ulen) {	     /* unit-by-unit compare needed */
   4511       1.1  mrg 	  /* compare the two numbers, from msu */
   4512       1.1  mrg 	  const Unit *pv1, *pv2;
   4513       1.1  mrg 	  Unit v2;			     /* units to compare */
   4514       1.1  mrg 	  pv2=msu2;			     /* -> msu */
   4515       1.1  mrg 	  for (pv1=msu1; ; pv1--, pv2--) {
   4516       1.1  mrg 	    /* v1=*pv1 -- always OK */
   4517       1.1  mrg 	    v2=0;			     /* assume in padding */
   4518       1.1  mrg 	    if (pv2>=var2) v2=*pv2;	     /* in range */
   4519       1.1  mrg 	    if (*pv1!=v2) break;	     /* no longer the same */
   4520       1.1  mrg 	    if (pv1==var1) break;	     /* done; leave pv1 as is */
   4521       1.1  mrg 	    }
   4522       1.1  mrg 	  /* here when all inspected or a difference seen */
   4523       1.1  mrg 	  if (*pv1<v2) break;		     /* var1 too low to subtract */
   4524       1.1  mrg 	  if (*pv1==v2) {		     /* var1 == var2 */
   4525       1.1  mrg 	    /* reach here if var1 and var2 are identical; subtraction */
   4526       1.1  mrg 	    /* would increase digit by one, and the residue will be 0 so */
   4527       1.1  mrg 	    /* the calculation is done; leave the loop with residue=0. */
   4528       1.1  mrg 	    thisunit++; 		     /* as though subtracted */
   4529       1.1  mrg 	    *var1=0;			     /* set var1 to 0 */
   4530       1.1  mrg 	    var1units=1;		     /* .. */
   4531       1.1  mrg 	    break;  /* from inner */
   4532       1.1  mrg 	    } /* var1 == var2 */
   4533       1.1  mrg 	  /* *pv1>v2.  Prepare for real subtraction; the lengths are equal */
   4534       1.1  mrg 	  /* Estimate the multiplier (there's always a msu1-1)... */
   4535       1.1  mrg 	  /* Bring in two units of var2 to provide a good estimate. */
   4536       1.1  mrg 	  mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2pair);
   4537       1.1  mrg 	  } /* lengths the same */
   4538       1.1  mrg 	 else { /* var1units > var2ulen, so subtraction is safe */
   4539       1.1  mrg 	  /* The var2 msu is one unit towards the lsu of the var1 msu, */
   4540       1.1  mrg 	  /* so only one unit for var2 can be used. */
   4541       1.1  mrg 	  mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2plus);
   4542       1.1  mrg 	  }
   4543       1.1  mrg 	if (mult==0) mult=1;		     /* must always be at least 1 */
   4544       1.1  mrg 	/* subtraction needed; var1 is > var2 */
   4545       1.1  mrg 	thisunit=(Unit)(thisunit+mult);      /* accumulate */
   4546       1.1  mrg 	/* subtract var1-var2, into var1; only the overlap needs */
   4547       1.1  mrg 	/* processing, as this is an in-place calculation */
   4548       1.1  mrg 	shift=var2ulen-var2units;
   4549       1.1  mrg 	#if DECTRACE
   4550       1.1  mrg 	  decDumpAr('1', &var1[shift], var1units-shift);
   4551       1.1  mrg 	  decDumpAr('2', var2, var2units);
   4552       1.1  mrg 	  printf("m=%ld\n", -mult);
   4553       1.1  mrg 	#endif
   4554       1.1  mrg 	decUnitAddSub(&var1[shift], var1units-shift,
   4555       1.1  mrg 		      var2, var2units, 0,
   4556       1.1  mrg 		      &var1[shift], -mult);
   4557       1.1  mrg 	#if DECTRACE
   4558       1.1  mrg 	  decDumpAr('#', &var1[shift], var1units-shift);
   4559       1.1  mrg 	#endif
   4560       1.1  mrg 	/* var1 now probably has leading zeros; these are removed at the */
   4561       1.1  mrg 	/* top of the inner loop. */
   4562       1.1  mrg 	} /* inner loop */
   4563       1.1  mrg 
   4564       1.1  mrg       /* The next unit has been calculated in full; unless it's a */
   4565       1.1  mrg       /* leading zero, add to acc */
   4566       1.1  mrg       if (accunits!=0 || thisunit!=0) {      /* is first or non-zero */
   4567       1.1  mrg 	*accnext=thisunit;		     /* store in accumulator */
   4568       1.1  mrg 	/* account exactly for the new digits */
   4569       1.1  mrg 	if (accunits==0) {
   4570       1.1  mrg 	  accdigits++;			     /* at least one */
   4571       1.1  mrg 	  for (pow=&powers[1]; thisunit>=*pow; pow++) accdigits++;
   4572       1.1  mrg 	  }
   4573       1.1  mrg 	 else accdigits+=DECDPUN;
   4574       1.1  mrg 	accunits++;			     /* update count */
   4575       1.1  mrg 	accnext--;			     /* ready for next */
   4576       1.1  mrg 	if (accdigits>reqdigits) break;      /* have enough digits */
   4577       1.1  mrg 	}
   4578       1.1  mrg 
   4579       1.1  mrg       /* if the residue is zero, the operation is done (unless divide */
   4580       1.1  mrg       /* or divideInteger and still not enough digits yet) */
   4581       1.1  mrg       if (*var1==0 && var1units==1) {	     /* residue is 0 */
   4582       1.1  mrg 	if (op&(REMAINDER|REMNEAR)) break;
   4583       1.1  mrg 	if ((op&DIVIDE) && (exponent<=maxexponent)) break;
   4584       1.1  mrg 	/* [drop through if divideInteger] */
   4585       1.1  mrg 	}
   4586       1.1  mrg       /* also done enough if calculating remainder or integer */
   4587       1.1  mrg       /* divide and just did the last ('units') unit */
   4588       1.1  mrg       if (exponent==0 && !(op&DIVIDE)) break;
   4589       1.1  mrg 
   4590       1.1  mrg       /* to get here, var1 is less than var2, so divide var2 by the per- */
   4591       1.1  mrg       /* Unit power of ten and go for the next digit */
   4592       1.1  mrg       var2ulen--;			     /* shift down */
   4593       1.1  mrg       exponent-=DECDPUN;		     /* update the exponent */
   4594       1.1  mrg       } /* outer loop */
   4595       1.1  mrg 
   4596       1.1  mrg     /* ---- division is complete --------------------------------------- */
   4597       1.1  mrg     /* here: acc      has at least reqdigits+1 of good results (or fewer */
   4598       1.1  mrg     /*		      if early stop), starting at accnext+1 (its lsu) */
   4599       1.1  mrg     /*	     var1     has any residue at the stopping point */
   4600       1.1  mrg     /*	     accunits is the number of digits collected in acc */
   4601       1.1  mrg     if (accunits==0) {		   /* acc is 0 */
   4602       1.1  mrg       accunits=1;		   /* show have a unit .. */
   4603       1.1  mrg       accdigits=1;		   /* .. */
   4604       1.1  mrg       *accnext=0;		   /* .. whose value is 0 */
   4605       1.1  mrg       }
   4606       1.1  mrg      else accnext++;		   /* back to last placed */
   4607       1.1  mrg     /* accnext now -> lowest unit of result */
   4608       1.1  mrg 
   4609       1.1  mrg     residue=0;			   /* assume no residue */
   4610       1.1  mrg     if (op&DIVIDE) {
   4611       1.1  mrg       /* record the presence of any residue, for rounding */
   4612       1.1  mrg       if (*var1!=0 || var1units>1) residue=1;
   4613       1.1  mrg        else { /* no residue */
   4614       1.1  mrg 	/* Had an exact division; clean up spurious trailing 0s. */
   4615       1.1  mrg 	/* There will be at most DECDPUN-1, from the final multiply, */
   4616       1.1  mrg 	/* and then only if the result is non-0 (and even) and the */
   4617       1.1  mrg 	/* exponent is 'loose'. */
   4618       1.1  mrg 	#if DECDPUN>1
   4619       1.1  mrg 	Unit lsu=*accnext;
   4620       1.1  mrg 	if (!(lsu&0x01) && (lsu!=0)) {
   4621       1.1  mrg 	  /* count the trailing zeros */
   4622       1.1  mrg 	  Int drop=0;
   4623       1.1  mrg 	  for (;; drop++) {    /* [will terminate because lsu!=0] */
   4624       1.1  mrg 	    if (exponent>=maxexponent) break;	  /* don't chop real 0s */
   4625       1.1  mrg 	    #if DECDPUN<=4
   4626       1.1  mrg 	      if ((lsu-QUOT10(lsu, drop+1)
   4627       1.1  mrg 		  *powers[drop+1])!=0) break;	  /* found non-0 digit */
   4628       1.1  mrg 	    #else
   4629       1.1  mrg 	      if (lsu%powers[drop+1]!=0) break;   /* found non-0 digit */
   4630       1.1  mrg 	    #endif
   4631       1.1  mrg 	    exponent++;
   4632       1.1  mrg 	    }
   4633       1.1  mrg 	  if (drop>0) {
   4634       1.1  mrg 	    accunits=decShiftToLeast(accnext, accunits, drop);
   4635       1.1  mrg 	    accdigits=decGetDigits(accnext, accunits);
   4636       1.1  mrg 	    accunits=D2U(accdigits);
   4637       1.1  mrg 	    /* [exponent was adjusted in the loop] */
   4638       1.1  mrg 	    }
   4639       1.1  mrg 	  } /* neither odd nor 0 */
   4640       1.1  mrg 	#endif
   4641       1.1  mrg 	} /* exact divide */
   4642       1.1  mrg       } /* divide */
   4643       1.1  mrg      else /* op!=DIVIDE */ {
   4644       1.1  mrg       /* check for coefficient overflow */
   4645       1.1  mrg       if (accdigits+exponent>reqdigits) {
   4646       1.1  mrg 	*status|=DEC_Division_impossible;
   4647       1.1  mrg 	break;
   4648       1.1  mrg 	}
   4649       1.1  mrg       if (op & (REMAINDER|REMNEAR)) {
   4650       1.1  mrg 	/* [Here, the exponent will be 0, because var1 was adjusted */
   4651       1.1  mrg 	/* appropriately.] */
   4652       1.1  mrg 	Int postshift;			     /* work */
   4653       1.1  mrg 	Flag wasodd=0;			     /* integer was odd */
   4654       1.1  mrg 	Unit *quotlsu;			     /* for save */
   4655       1.1  mrg 	Int  quotdigits;		     /* .. */
   4656       1.1  mrg 
   4657       1.1  mrg 	bits=lhs->bits; 		     /* remainder sign is always as lhs */
   4658       1.1  mrg 
   4659       1.1  mrg 	/* Fastpath when residue is truly 0 is worthwhile [and */
   4660       1.1  mrg 	/* simplifies the code below] */
   4661       1.1  mrg 	if (*var1==0 && var1units==1) {      /* residue is 0 */
   4662       1.1  mrg 	  Int exp=lhs->exponent;	     /* save min(exponents) */
   4663       1.1  mrg 	  if (rhs->exponent<exp) exp=rhs->exponent;
   4664       1.1  mrg 	  decNumberZero(res);		     /* 0 coefficient */
   4665       1.1  mrg 	  #if DECSUBSET
   4666       1.1  mrg 	  if (set->extended)
   4667       1.1  mrg 	  #endif
   4668       1.1  mrg 	  res->exponent=exp;		     /* .. with proper exponent */
   4669       1.1  mrg 	  res->bits=(uByte)(bits&DECNEG);	   /* [cleaned] */
   4670       1.1  mrg 	  decFinish(res, set, &residue, status);   /* might clamp */
   4671       1.1  mrg 	  break;
   4672       1.1  mrg 	  }
   4673       1.1  mrg 	/* note if the quotient was odd */
   4674       1.1  mrg 	if (*accnext & 0x01) wasodd=1;	     /* acc is odd */
   4675       1.1  mrg 	quotlsu=accnext;		     /* save in case need to reinspect */
   4676       1.1  mrg 	quotdigits=accdigits;		     /* .. */
   4677       1.1  mrg 
   4678       1.1  mrg 	/* treat the residue, in var1, as the value to return, via acc */
   4679       1.1  mrg 	/* calculate the unused zero digits.  This is the smaller of: */
   4680       1.1  mrg 	/*   var1 initial padding (saved above) */
   4681       1.1  mrg 	/*   var2 residual padding, which happens to be given by: */
   4682       1.1  mrg 	postshift=var1initpad+exponent-lhs->exponent+rhs->exponent;
   4683       1.1  mrg 	/* [the 'exponent' term accounts for the shifts during divide] */
   4684       1.1  mrg 	if (var1initpad<postshift) postshift=var1initpad;
   4685       1.1  mrg 
   4686       1.1  mrg 	/* shift var1 the requested amount, and adjust its digits */
   4687       1.1  mrg 	var1units=decShiftToLeast(var1, var1units, postshift);
   4688       1.1  mrg 	accnext=var1;
   4689       1.1  mrg 	accdigits=decGetDigits(var1, var1units);
   4690       1.1  mrg 	accunits=D2U(accdigits);
   4691       1.1  mrg 
   4692       1.1  mrg 	exponent=lhs->exponent; 	/* exponent is smaller of lhs & rhs */
   4693       1.1  mrg 	if (rhs->exponent<exponent) exponent=rhs->exponent;
   4694       1.1  mrg 
   4695       1.1  mrg 	/* Now correct the result if doing remainderNear; if it */
   4696       1.1  mrg 	/* (looking just at coefficients) is > rhs/2, or == rhs/2 and */
   4697       1.1  mrg 	/* the integer was odd then the result should be rem-rhs. */
   4698       1.1  mrg 	if (op&REMNEAR) {
   4699       1.1  mrg 	  Int compare, tarunits;	/* work */
   4700       1.1  mrg 	  Unit *up;			/* .. */
   4701       1.1  mrg 	  /* calculate remainder*2 into the var1 buffer (which has */
   4702       1.1  mrg 	  /* 'headroom' of an extra unit and hence enough space) */
   4703       1.1  mrg 	  /* [a dedicated 'double' loop would be faster, here] */
   4704       1.1  mrg 	  tarunits=decUnitAddSub(accnext, accunits, accnext, accunits,
   4705       1.1  mrg 				 0, accnext, 1);
   4706       1.1  mrg 	  /* decDumpAr('r', accnext, tarunits); */
   4707       1.1  mrg 
   4708       1.1  mrg 	  /* Here, accnext (var1) holds tarunits Units with twice the */
   4709       1.1  mrg 	  /* remainder's coefficient, which must now be compared to the */
   4710       1.1  mrg 	  /* RHS.  The remainder's exponent may be smaller than the RHS's. */
   4711       1.1  mrg 	  compare=decUnitCompare(accnext, tarunits, rhs->lsu, D2U(rhs->digits),
   4712       1.1  mrg 				 rhs->exponent-exponent);
   4713       1.1  mrg 	  if (compare==BADINT) {	     /* deep trouble */
   4714       1.1  mrg 	    *status|=DEC_Insufficient_storage;
   4715       1.1  mrg 	    break;}
   4716       1.1  mrg 
   4717       1.1  mrg 	  /* now restore the remainder by dividing by two; the lsu */
   4718       1.1  mrg 	  /* is known to be even. */
   4719       1.1  mrg 	  for (up=accnext; up<accnext+tarunits; up++) {
   4720       1.1  mrg 	    Int half;		   /* half to add to lower unit */
   4721       1.1  mrg 	    half=*up & 0x01;
   4722       1.1  mrg 	    *up/=2;		   /* [shift] */
   4723       1.1  mrg 	    if (!half) continue;
   4724       1.1  mrg 	    *(up-1)+=(DECDPUNMAX+1)/2;
   4725       1.1  mrg 	    }
   4726       1.1  mrg 	  /* [accunits still describes the original remainder length] */
   4727       1.1  mrg 
   4728       1.1  mrg 	  if (compare>0 || (compare==0 && wasodd)) { /* adjustment needed */
   4729       1.1  mrg 	    Int exp, expunits, exprem;	     /* work */
   4730       1.1  mrg 	    /* This is effectively causing round-up of the quotient, */
   4731       1.1  mrg 	    /* so if it was the rare case where it was full and all */
   4732       1.1  mrg 	    /* nines, it would overflow and hence division-impossible */
   4733       1.1  mrg 	    /* should be raised */
   4734       1.1  mrg 	    Flag allnines=0;		     /* 1 if quotient all nines */
   4735       1.1  mrg 	    if (quotdigits==reqdigits) {     /* could be borderline */
   4736       1.1  mrg 	      for (up=quotlsu; ; up++) {
   4737       1.1  mrg 		if (quotdigits>DECDPUN) {
   4738       1.1  mrg 		  if (*up!=DECDPUNMAX) break;/* non-nines */
   4739       1.1  mrg 		  }
   4740       1.1  mrg 		 else { 		     /* this is the last Unit */
   4741       1.1  mrg 		  if (*up==powers[quotdigits]-1) allnines=1;
   4742       1.1  mrg 		  break;
   4743       1.1  mrg 		  }
   4744       1.1  mrg 		quotdigits-=DECDPUN;	     /* checked those digits */
   4745       1.1  mrg 		} /* up */
   4746       1.1  mrg 	      } /* borderline check */
   4747       1.1  mrg 	    if (allnines) {
   4748       1.1  mrg 	      *status|=DEC_Division_impossible;
   4749       1.1  mrg 	      break;}
   4750       1.1  mrg 
   4751       1.1  mrg 	    /* rem-rhs is needed; the sign will invert.  Again, var1 */
   4752       1.1  mrg 	    /* can safely be used for the working Units array. */
   4753       1.1  mrg 	    exp=rhs->exponent-exponent;      /* RHS padding needed */
   4754       1.1  mrg 	    /* Calculate units and remainder from exponent. */
   4755       1.1  mrg 	    expunits=exp/DECDPUN;
   4756       1.1  mrg 	    exprem=exp%DECDPUN;
   4757       1.1  mrg 	    /* subtract [A+B*(-m)]; the result will always be negative */
   4758       1.1  mrg 	    accunits=-decUnitAddSub(accnext, accunits,
   4759       1.1  mrg 				    rhs->lsu, D2U(rhs->digits),
   4760       1.1  mrg 				    expunits, accnext, -(Int)powers[exprem]);
   4761       1.1  mrg 	    accdigits=decGetDigits(accnext, accunits); /* count digits exactly */
   4762       1.1  mrg 	    accunits=D2U(accdigits);	/* and recalculate the units for copy */
   4763       1.1  mrg 	    /* [exponent is as for original remainder] */
   4764       1.1  mrg 	    bits^=DECNEG;		/* flip the sign */
   4765       1.1  mrg 	    }
   4766       1.1  mrg 	  } /* REMNEAR */
   4767       1.1  mrg 	} /* REMAINDER or REMNEAR */
   4768       1.1  mrg       } /* not DIVIDE */
   4769       1.1  mrg 
   4770       1.1  mrg     /* Set exponent and bits */
   4771       1.1  mrg     res->exponent=exponent;
   4772       1.1  mrg     res->bits=(uByte)(bits&DECNEG);	     /* [cleaned] */
   4773       1.1  mrg 
   4774       1.1  mrg     /* Now the coefficient. */
   4775       1.1  mrg     decSetCoeff(res, set, accnext, accdigits, &residue, status);
   4776       1.1  mrg 
   4777       1.1  mrg     decFinish(res, set, &residue, status);   /* final cleanup */
   4778       1.1  mrg 
   4779       1.1  mrg     #if DECSUBSET
   4780       1.1  mrg     /* If a divide then strip trailing zeros if subset [after round] */
   4781       1.1  mrg     if (!set->extended && (op==DIVIDE)) decTrim(res, set, 0, 1, &dropped);
   4782       1.1  mrg     #endif
   4783       1.1  mrg     } while(0); 			     /* end protected */
   4784       1.1  mrg 
   4785   1.1.1.2  mrg   free(varalloc);	/* drop any storage used */
   4786   1.1.1.2  mrg   free(allocacc);	/* .. */
   4787       1.1  mrg   #if DECSUBSET
   4788   1.1.1.2  mrg   free(allocrhs);	/* .. */
   4789   1.1.1.2  mrg   free(alloclhs);	/* .. */
   4790       1.1  mrg   #endif
   4791       1.1  mrg   return res;
   4792       1.1  mrg   } /* decDivideOp */
   4793       1.1  mrg 
   4794       1.1  mrg /* ------------------------------------------------------------------ */
   4795       1.1  mrg /* decMultiplyOp -- multiplication operation			      */
   4796       1.1  mrg /*								      */
   4797       1.1  mrg /*  This routine performs the multiplication C=A x B.		      */
   4798       1.1  mrg /*								      */
   4799       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X*X)	      */
   4800       1.1  mrg /*   lhs is A							      */
   4801       1.1  mrg /*   rhs is B							      */
   4802       1.1  mrg /*   set is the context 					      */
   4803       1.1  mrg /*   status is the usual accumulator				      */
   4804       1.1  mrg /*								      */
   4805       1.1  mrg /* C must have space for set->digits digits.			      */
   4806       1.1  mrg /*								      */
   4807       1.1  mrg /* ------------------------------------------------------------------ */
   4808       1.1  mrg /* 'Classic' multiplication is used rather than Karatsuba, as the     */
   4809       1.1  mrg /* latter would give only a minor improvement for the short numbers   */
   4810       1.1  mrg /* expected to be handled most (and uses much more memory).	      */
   4811       1.1  mrg /*								      */
   4812       1.1  mrg /* There are two major paths here: the general-purpose ('old code')   */
   4813       1.1  mrg /* path which handles all DECDPUN values, and a fastpath version      */
   4814       1.1  mrg /* which is used if 64-bit ints are available, DECDPUN<=4, and more   */
   4815       1.1  mrg /* than two calls to decUnitAddSub would be made.		      */
   4816       1.1  mrg /*								      */
   4817       1.1  mrg /* The fastpath version lumps units together into 8-digit or 9-digit  */
   4818       1.1  mrg /* chunks, and also uses a lazy carry strategy to minimise expensive  */
   4819       1.1  mrg /* 64-bit divisions.  The chunks are then broken apart again into     */
   4820       1.1  mrg /* units for continuing processing.  Despite this overhead, the       */
   4821       1.1  mrg /* fastpath can speed up some 16-digit operations by 10x (and much    */
   4822       1.1  mrg /* more for higher-precision calculations).			      */
   4823       1.1  mrg /*								      */
   4824       1.1  mrg /* A buffer always has to be used for the accumulator; in the	      */
   4825       1.1  mrg /* fastpath, buffers are also always needed for the chunked copies of */
   4826       1.1  mrg /* of the operand coefficients. 				      */
   4827       1.1  mrg /* Static buffers are larger than needed just for multiply, to allow  */
   4828       1.1  mrg /* for calls from other operations (notably exp).		      */
   4829       1.1  mrg /* ------------------------------------------------------------------ */
   4830       1.1  mrg #define FASTMUL (DECUSE64 && DECDPUN<5)
   4831       1.1  mrg static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs,
   4832       1.1  mrg 				 const decNumber *rhs, decContext *set,
   4833       1.1  mrg 				 uInt *status) {
   4834       1.1  mrg   Int	 accunits;		   /* Units of accumulator in use */
   4835       1.1  mrg   Int	 exponent;		   /* work */
   4836       1.1  mrg   Int	 residue=0;		   /* rounding residue */
   4837       1.1  mrg   uByte  bits;			   /* result sign */
   4838       1.1  mrg   Unit	*acc;			   /* -> accumulator Unit array */
   4839       1.1  mrg   Int	 needbytes;		   /* size calculator */
   4840       1.1  mrg   void	*allocacc=NULL; 	   /* -> allocated accumulator, iff allocated */
   4841       1.1  mrg   Unit	accbuff[SD2U(DECBUFFER*4+1)]; /* buffer (+1 for DECBUFFER==0, */
   4842       1.1  mrg 				   /* *4 for calls from other operations) */
   4843       1.1  mrg   const Unit *mer, *mermsup;	   /* work */
   4844       1.1  mrg   Int	madlength;		   /* Units in multiplicand */
   4845       1.1  mrg   Int	shift;			   /* Units to shift multiplicand by */
   4846       1.1  mrg 
   4847       1.1  mrg   #if FASTMUL
   4848       1.1  mrg     /* if DECDPUN is 1 or 3 work in base 10**9, otherwise */
   4849       1.1  mrg     /* (DECDPUN is 2 or 4) then work in base 10**8 */
   4850       1.1  mrg     #if DECDPUN & 1		   /* odd */
   4851       1.1  mrg       #define FASTBASE 1000000000  /* base */
   4852       1.1  mrg       #define FASTDIGS		9  /* digits in base */
   4853       1.1  mrg       #define FASTLAZY	       18  /* carry resolution point [1->18] */
   4854       1.1  mrg     #else
   4855       1.1  mrg       #define FASTBASE	100000000
   4856       1.1  mrg       #define FASTDIGS		8
   4857       1.1  mrg       #define FASTLAZY	     1844  /* carry resolution point [1->1844] */
   4858       1.1  mrg     #endif
   4859       1.1  mrg     /* three buffers are used, two for chunked copies of the operands */
   4860       1.1  mrg     /* (base 10**8 or base 10**9) and one base 2**64 accumulator with */
   4861       1.1  mrg     /* lazy carry evaluation */
   4862       1.1  mrg     uInt   zlhibuff[(DECBUFFER*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0) */
   4863       1.1  mrg     uInt  *zlhi=zlhibuff;		  /* -> lhs array */
   4864       1.1  mrg     uInt  *alloclhi=NULL;		  /* -> allocated buffer, iff allocated */
   4865       1.1  mrg     uInt   zrhibuff[(DECBUFFER*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0) */
   4866       1.1  mrg     uInt  *zrhi=zrhibuff;		  /* -> rhs array */
   4867       1.1  mrg     uInt  *allocrhi=NULL;		  /* -> allocated buffer, iff allocated */
   4868       1.1  mrg     uLong  zaccbuff[(DECBUFFER*2+1)/4+2]; /* buffer (+1 for DECBUFFER==0) */
   4869       1.1  mrg     /* [allocacc is shared for both paths, as only one will run] */
   4870       1.1  mrg     uLong *zacc=zaccbuff;	   /* -> accumulator array for exact result */
   4871       1.1  mrg     #if DECDPUN==1
   4872       1.1  mrg     Int    zoff;		   /* accumulator offset */
   4873       1.1  mrg     #endif
   4874       1.1  mrg     uInt  *lip, *rip;		   /* item pointers */
   4875       1.1  mrg     uInt  *lmsi, *rmsi; 	   /* most significant items */
   4876       1.1  mrg     Int    ilhs, irhs, iacc;	   /* item counts in the arrays */
   4877       1.1  mrg     Int    lazy;		   /* lazy carry counter */
   4878       1.1  mrg     uLong  lcarry;		   /* uLong carry */
   4879       1.1  mrg     uInt   carry;		   /* carry (NB not uLong) */
   4880       1.1  mrg     Int    count;		   /* work */
   4881       1.1  mrg     const  Unit *cup;		   /* .. */
   4882       1.1  mrg     Unit  *up;			   /* .. */
   4883       1.1  mrg     uLong *lp;			   /* .. */
   4884       1.1  mrg     Int    p;			   /* .. */
   4885       1.1  mrg   #endif
   4886       1.1  mrg 
   4887       1.1  mrg   #if DECSUBSET
   4888       1.1  mrg     decNumber *alloclhs=NULL;	   /* -> allocated buffer, iff allocated */
   4889       1.1  mrg     decNumber *allocrhs=NULL;	   /* -> allocated buffer, iff allocated */
   4890       1.1  mrg   #endif
   4891       1.1  mrg 
   4892       1.1  mrg   #if DECCHECK
   4893       1.1  mrg   if (decCheckOperands(res, lhs, rhs, set)) return res;
   4894       1.1  mrg   #endif
   4895       1.1  mrg 
   4896       1.1  mrg   /* precalculate result sign */
   4897       1.1  mrg   bits=(uByte)((lhs->bits^rhs->bits)&DECNEG);
   4898       1.1  mrg 
   4899       1.1  mrg   /* handle infinities and NaNs */
   4900       1.1  mrg   if (SPECIALARGS) {		   /* a special bit set */
   4901       1.1  mrg     if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs */
   4902       1.1  mrg       decNaNs(res, lhs, rhs, set, status);
   4903       1.1  mrg       return res;}
   4904       1.1  mrg     /* one or two infinities; Infinity * 0 is invalid */
   4905       1.1  mrg     if (((lhs->bits & DECINF)==0 && ISZERO(lhs))
   4906       1.1  mrg       ||((rhs->bits & DECINF)==0 && ISZERO(rhs))) {
   4907       1.1  mrg       *status|=DEC_Invalid_operation;
   4908       1.1  mrg       return res;}
   4909       1.1  mrg     decNumberZero(res);
   4910       1.1  mrg     res->bits=bits|DECINF;	   /* infinity */
   4911       1.1  mrg     return res;}
   4912       1.1  mrg 
   4913       1.1  mrg   /* For best speed, as in DMSRCN [the original Rexx numerics */
   4914       1.1  mrg   /* module], use the shorter number as the multiplier (rhs) and */
   4915       1.1  mrg   /* the longer as the multiplicand (lhs) to minimise the number of */
   4916       1.1  mrg   /* adds (partial products) */
   4917       1.1  mrg   if (lhs->digits<rhs->digits) {   /* swap... */
   4918       1.1  mrg     const decNumber *hold=lhs;
   4919       1.1  mrg     lhs=rhs;
   4920       1.1  mrg     rhs=hold;
   4921       1.1  mrg     }
   4922       1.1  mrg 
   4923       1.1  mrg   do {				   /* protect allocated storage */
   4924       1.1  mrg     #if DECSUBSET
   4925       1.1  mrg     if (!set->extended) {
   4926       1.1  mrg       /* reduce operands and set lostDigits status, as needed */
   4927       1.1  mrg       if (lhs->digits>set->digits) {
   4928       1.1  mrg 	alloclhs=decRoundOperand(lhs, set, status);
   4929       1.1  mrg 	if (alloclhs==NULL) break;
   4930       1.1  mrg 	lhs=alloclhs;
   4931       1.1  mrg 	}
   4932       1.1  mrg       if (rhs->digits>set->digits) {
   4933       1.1  mrg 	allocrhs=decRoundOperand(rhs, set, status);
   4934       1.1  mrg 	if (allocrhs==NULL) break;
   4935       1.1  mrg 	rhs=allocrhs;
   4936       1.1  mrg 	}
   4937       1.1  mrg       }
   4938       1.1  mrg     #endif
   4939       1.1  mrg     /* [following code does not require input rounding] */
   4940       1.1  mrg 
   4941       1.1  mrg     #if FASTMUL 		   /* fastpath can be used */
   4942       1.1  mrg     /* use the fast path if there are enough digits in the shorter */
   4943       1.1  mrg     /* operand to make the setup and takedown worthwhile */
   4944       1.1  mrg     #define NEEDTWO (DECDPUN*2)    /* within two decUnitAddSub calls */
   4945       1.1  mrg     if (rhs->digits>NEEDTWO) {	   /* use fastpath... */
   4946       1.1  mrg       /* calculate the number of elements in each array */
   4947       1.1  mrg       ilhs=(lhs->digits+FASTDIGS-1)/FASTDIGS; /* [ceiling] */
   4948       1.1  mrg       irhs=(rhs->digits+FASTDIGS-1)/FASTDIGS; /* .. */
   4949       1.1  mrg       iacc=ilhs+irhs;
   4950       1.1  mrg 
   4951       1.1  mrg       /* allocate buffers if required, as usual */
   4952       1.1  mrg       needbytes=ilhs*sizeof(uInt);
   4953       1.1  mrg       if (needbytes>(Int)sizeof(zlhibuff)) {
   4954       1.1  mrg 	alloclhi=(uInt *)malloc(needbytes);
   4955       1.1  mrg 	zlhi=alloclhi;}
   4956       1.1  mrg       needbytes=irhs*sizeof(uInt);
   4957       1.1  mrg       if (needbytes>(Int)sizeof(zrhibuff)) {
   4958       1.1  mrg 	allocrhi=(uInt *)malloc(needbytes);
   4959       1.1  mrg 	zrhi=allocrhi;}
   4960       1.1  mrg 
   4961       1.1  mrg       /* Allocating the accumulator space needs a special case when */
   4962       1.1  mrg       /* DECDPUN=1 because when converting the accumulator to Units */
   4963       1.1  mrg       /* after the multiplication each 8-byte item becomes 9 1-byte */
   4964       1.1  mrg       /* units.  Therefore iacc extra bytes are needed at the front */
   4965       1.1  mrg       /* (rounded up to a multiple of 8 bytes), and the uLong */
   4966       1.1  mrg       /* accumulator starts offset the appropriate number of units */
   4967       1.1  mrg       /* to the right to avoid overwrite during the unchunking. */
   4968       1.1  mrg       needbytes=iacc*sizeof(uLong);
   4969       1.1  mrg       #if DECDPUN==1
   4970       1.1  mrg       zoff=(iacc+7)/8;	      /* items to offset by */
   4971       1.1  mrg       needbytes+=zoff*8;
   4972       1.1  mrg       #endif
   4973       1.1  mrg       if (needbytes>(Int)sizeof(zaccbuff)) {
   4974       1.1  mrg 	allocacc=(uLong *)malloc(needbytes);
   4975       1.1  mrg 	zacc=(uLong *)allocacc;}
   4976       1.1  mrg       if (zlhi==NULL||zrhi==NULL||zacc==NULL) {
   4977       1.1  mrg 	*status|=DEC_Insufficient_storage;
   4978       1.1  mrg 	break;}
   4979       1.1  mrg 
   4980       1.1  mrg       acc=(Unit *)zacc;       /* -> target Unit array */
   4981       1.1  mrg       #if DECDPUN==1
   4982       1.1  mrg       zacc+=zoff;	      /* start uLong accumulator to right */
   4983       1.1  mrg       #endif
   4984       1.1  mrg 
   4985       1.1  mrg       /* assemble the chunked copies of the left and right sides */
   4986       1.1  mrg       for (count=lhs->digits, cup=lhs->lsu, lip=zlhi; count>0; lip++)
   4987       1.1  mrg 	for (p=0, *lip=0; p<FASTDIGS && count>0;
   4988       1.1  mrg 	     p+=DECDPUN, cup++, count-=DECDPUN)
   4989       1.1  mrg 	  *lip+=*cup*powers[p];
   4990       1.1  mrg       lmsi=lip-1;     /* save -> msi */
   4991       1.1  mrg       for (count=rhs->digits, cup=rhs->lsu, rip=zrhi; count>0; rip++)
   4992       1.1  mrg 	for (p=0, *rip=0; p<FASTDIGS && count>0;
   4993       1.1  mrg 	     p+=DECDPUN, cup++, count-=DECDPUN)
   4994       1.1  mrg 	  *rip+=*cup*powers[p];
   4995       1.1  mrg       rmsi=rip-1;     /* save -> msi */
   4996       1.1  mrg 
   4997       1.1  mrg       /* zero the accumulator */
   4998       1.1  mrg       for (lp=zacc; lp<zacc+iacc; lp++) *lp=0;
   4999       1.1  mrg 
   5000       1.1  mrg       /* Start the multiplication */
   5001       1.1  mrg       /* Resolving carries can dominate the cost of accumulating the */
   5002       1.1  mrg       /* partial products, so this is only done when necessary. */
   5003       1.1  mrg       /* Each uLong item in the accumulator can hold values up to */
   5004       1.1  mrg       /* 2**64-1, and each partial product can be as large as */
   5005       1.1  mrg       /* (10**FASTDIGS-1)**2.  When FASTDIGS=9, this can be added to */
   5006       1.1  mrg       /* itself 18.4 times in a uLong without overflowing, so during */
   5007       1.1  mrg       /* the main calculation resolution is carried out every 18th */
   5008       1.1  mrg       /* add -- every 162 digits.  Similarly, when FASTDIGS=8, the */
   5009       1.1  mrg       /* partial products can be added to themselves 1844.6 times in */
   5010       1.1  mrg       /* a uLong without overflowing, so intermediate carry */
   5011       1.1  mrg       /* resolution occurs only every 14752 digits.  Hence for common */
   5012       1.1  mrg       /* short numbers usually only the one final carry resolution */
   5013       1.1  mrg       /* occurs. */
   5014       1.1  mrg       /* (The count is set via FASTLAZY to simplify experiments to */
   5015       1.1  mrg       /* measure the value of this approach: a 35% improvement on a */
   5016       1.1  mrg       /* [34x34] multiply.) */
   5017       1.1  mrg       lazy=FASTLAZY;			     /* carry delay count */
   5018       1.1  mrg       for (rip=zrhi; rip<=rmsi; rip++) {     /* over each item in rhs */
   5019       1.1  mrg 	lp=zacc+(rip-zrhi);		     /* where to add the lhs */
   5020       1.1  mrg 	for (lip=zlhi; lip<=lmsi; lip++, lp++) { /* over each item in lhs */
   5021       1.1  mrg 	  *lp+=(uLong)(*lip)*(*rip);	     /* [this should in-line] */
   5022       1.1  mrg 	  } /* lip loop */
   5023       1.1  mrg 	lazy--;
   5024       1.1  mrg 	if (lazy>0 && rip!=rmsi) continue;
   5025       1.1  mrg 	lazy=FASTLAZY;			     /* reset delay count */
   5026       1.1  mrg 	/* spin up the accumulator resolving overflows */
   5027       1.1  mrg 	for (lp=zacc; lp<zacc+iacc; lp++) {
   5028       1.1  mrg 	  if (*lp<FASTBASE) continue;	     /* it fits */
   5029       1.1  mrg 	  lcarry=*lp/FASTBASE;		     /* top part [slow divide] */
   5030       1.1  mrg 	  /* lcarry can exceed 2**32-1, so check again; this check */
   5031       1.1  mrg 	  /* and occasional extra divide (slow) is well worth it, as */
   5032       1.1  mrg 	  /* it allows FASTLAZY to be increased to 18 rather than 4 */
   5033       1.1  mrg 	  /* in the FASTDIGS=9 case */
   5034       1.1  mrg 	  if (lcarry<FASTBASE) carry=(uInt)lcarry;  /* [usual] */
   5035       1.1  mrg 	   else { /* two-place carry [fairly rare] */
   5036       1.1  mrg 	    uInt carry2=(uInt)(lcarry/FASTBASE);    /* top top part */
   5037       1.1  mrg 	    *(lp+2)+=carry2;			    /* add to item+2 */
   5038       1.1  mrg 	    *lp-=((uLong)FASTBASE*FASTBASE*carry2); /* [slow] */
   5039       1.1  mrg 	    carry=(uInt)(lcarry-((uLong)FASTBASE*carry2)); /* [inline] */
   5040       1.1  mrg 	    }
   5041       1.1  mrg 	  *(lp+1)+=carry;		     /* add to item above [inline] */
   5042       1.1  mrg 	  *lp-=((uLong)FASTBASE*carry);      /* [inline] */
   5043       1.1  mrg 	  } /* carry resolution */
   5044       1.1  mrg 	} /* rip loop */
   5045       1.1  mrg 
   5046       1.1  mrg       /* The multiplication is complete; time to convert back into */
   5047       1.1  mrg       /* units.  This can be done in-place in the accumulator and in */
   5048       1.1  mrg       /* 32-bit operations, because carries were resolved after the */
   5049       1.1  mrg       /* final add.  This needs N-1 divides and multiplies for */
   5050       1.1  mrg       /* each item in the accumulator (which will become up to N */
   5051       1.1  mrg       /* units, where 2<=N<=9). */
   5052       1.1  mrg       for (lp=zacc, up=acc; lp<zacc+iacc; lp++) {
   5053       1.1  mrg 	uInt item=(uInt)*lp;		     /* decapitate to uInt */
   5054       1.1  mrg 	for (p=0; p<FASTDIGS-DECDPUN; p+=DECDPUN, up++) {
   5055       1.1  mrg 	  uInt part=item/(DECDPUNMAX+1);
   5056       1.1  mrg 	  *up=(Unit)(item-(part*(DECDPUNMAX+1)));
   5057       1.1  mrg 	  item=part;
   5058       1.1  mrg 	  } /* p */
   5059       1.1  mrg 	*up=(Unit)item; up++;		     /* [final needs no division] */
   5060       1.1  mrg 	} /* lp */
   5061       1.1  mrg       accunits=up-acc;			     /* count of units */
   5062       1.1  mrg       }
   5063       1.1  mrg      else { /* here to use units directly, without chunking ['old code'] */
   5064       1.1  mrg     #endif
   5065       1.1  mrg 
   5066       1.1  mrg       /* if accumulator will be too long for local storage, then allocate */
   5067       1.1  mrg       acc=accbuff;		   /* -> assume buffer for accumulator */
   5068       1.1  mrg       needbytes=(D2U(lhs->digits)+D2U(rhs->digits))*sizeof(Unit);
   5069       1.1  mrg       if (needbytes>(Int)sizeof(accbuff)) {
   5070       1.1  mrg 	allocacc=(Unit *)malloc(needbytes);
   5071       1.1  mrg 	if (allocacc==NULL) {*status|=DEC_Insufficient_storage; break;}
   5072       1.1  mrg 	acc=(Unit *)allocacc;		     /* use the allocated space */
   5073       1.1  mrg 	}
   5074       1.1  mrg 
   5075       1.1  mrg       /* Now the main long multiplication loop */
   5076       1.1  mrg       /* Unlike the equivalent in the IBM Java implementation, there */
   5077       1.1  mrg       /* is no advantage in calculating from msu to lsu.  So, do it */
   5078       1.1  mrg       /* by the book, as it were. */
   5079       1.1  mrg       /* Each iteration calculates ACC=ACC+MULTAND*MULT */
   5080       1.1  mrg       accunits=1;		   /* accumulator starts at '0' */
   5081       1.1  mrg       *acc=0;			   /* .. (lsu=0) */
   5082       1.1  mrg       shift=0;			   /* no multiplicand shift at first */
   5083       1.1  mrg       madlength=D2U(lhs->digits);  /* this won't change */
   5084       1.1  mrg       mermsup=rhs->lsu+D2U(rhs->digits); /* -> msu+1 of multiplier */
   5085       1.1  mrg 
   5086       1.1  mrg       for (mer=rhs->lsu; mer<mermsup; mer++) {
   5087       1.1  mrg 	/* Here, *mer is the next Unit in the multiplier to use */
   5088       1.1  mrg 	/* If non-zero [optimization] add it... */
   5089       1.1  mrg 	if (*mer!=0) accunits=decUnitAddSub(&acc[shift], accunits-shift,
   5090       1.1  mrg 					    lhs->lsu, madlength, 0,
   5091       1.1  mrg 					    &acc[shift], *mer)
   5092       1.1  mrg 					    + shift;
   5093       1.1  mrg 	 else { /* extend acc with a 0; it will be used shortly */
   5094       1.1  mrg 	  *(acc+accunits)=0;	   /* [this avoids length of <=0 later] */
   5095       1.1  mrg 	  accunits++;
   5096       1.1  mrg 	  }
   5097       1.1  mrg 	/* multiply multiplicand by 10**DECDPUN for next Unit to left */
   5098       1.1  mrg 	shift++;		   /* add this for 'logical length' */
   5099       1.1  mrg 	} /* n */
   5100       1.1  mrg     #if FASTMUL
   5101       1.1  mrg       } /* unchunked units */
   5102       1.1  mrg     #endif
   5103       1.1  mrg     /* common end-path */
   5104       1.1  mrg     #if DECTRACE
   5105       1.1  mrg       decDumpAr('*', acc, accunits);	     /* Show exact result */
   5106       1.1  mrg     #endif
   5107       1.1  mrg 
   5108       1.1  mrg     /* acc now contains the exact result of the multiplication, */
   5109       1.1  mrg     /* possibly with a leading zero unit; build the decNumber from */
   5110       1.1  mrg     /* it, noting if any residue */
   5111       1.1  mrg     res->bits=bits;			     /* set sign */
   5112       1.1  mrg     res->digits=decGetDigits(acc, accunits); /* count digits exactly */
   5113       1.1  mrg 
   5114       1.1  mrg     /* There can be a 31-bit wrap in calculating the exponent. */
   5115       1.1  mrg     /* This can only happen if both input exponents are negative and */
   5116       1.1  mrg     /* both their magnitudes are large.  If there was a wrap, set a */
   5117       1.1  mrg     /* safe very negative exponent, from which decFinalize() will */
   5118       1.1  mrg     /* raise a hard underflow shortly. */
   5119       1.1  mrg     exponent=lhs->exponent+rhs->exponent;    /* calculate exponent */
   5120       1.1  mrg     if (lhs->exponent<0 && rhs->exponent<0 && exponent>0)
   5121       1.1  mrg       exponent=-2*DECNUMMAXE;		     /* force underflow */
   5122       1.1  mrg     res->exponent=exponent;		     /* OK to overwrite now */
   5123       1.1  mrg 
   5124       1.1  mrg 
   5125       1.1  mrg     /* Set the coefficient.  If any rounding, residue records */
   5126       1.1  mrg     decSetCoeff(res, set, acc, res->digits, &residue, status);
   5127       1.1  mrg     decFinish(res, set, &residue, status);   /* final cleanup */
   5128       1.1  mrg     } while(0); 			/* end protected */
   5129       1.1  mrg 
   5130   1.1.1.2  mrg   free(allocacc);	/* drop any storage used */
   5131       1.1  mrg   #if DECSUBSET
   5132   1.1.1.2  mrg   free(allocrhs);	/* .. */
   5133   1.1.1.2  mrg   free(alloclhs);	/* .. */
   5134       1.1  mrg   #endif
   5135       1.1  mrg   #if FASTMUL
   5136   1.1.1.2  mrg   free(allocrhi);	/* .. */
   5137   1.1.1.2  mrg   free(alloclhi);	/* .. */
   5138       1.1  mrg   #endif
   5139       1.1  mrg   return res;
   5140       1.1  mrg   } /* decMultiplyOp */
   5141       1.1  mrg 
   5142       1.1  mrg /* ------------------------------------------------------------------ */
   5143       1.1  mrg /* decExpOp -- effect exponentiation				      */
   5144       1.1  mrg /*								      */
   5145       1.1  mrg /*   This computes C = exp(A)					      */
   5146       1.1  mrg /*								      */
   5147       1.1  mrg /*   res is C, the result.  C may be A				      */
   5148       1.1  mrg /*   rhs is A							      */
   5149       1.1  mrg /*   set is the context; note that rounding mode has no effect	      */
   5150       1.1  mrg /*								      */
   5151       1.1  mrg /* C must have space for set->digits digits. status is updated but    */
   5152       1.1  mrg /* not set.							      */
   5153       1.1  mrg /*								      */
   5154       1.1  mrg /* Restrictions:						      */
   5155       1.1  mrg /*								      */
   5156       1.1  mrg /*   digits, emax, and -emin in the context must be less than	      */
   5157       1.1  mrg /*   2*DEC_MAX_MATH (1999998), and the rhs must be within these       */
   5158       1.1  mrg /*   bounds or a zero.	This is an internal routine, so these	      */
   5159       1.1  mrg /*   restrictions are contractual and not enforced.		      */
   5160       1.1  mrg /*								      */
   5161       1.1  mrg /* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will      */
   5162       1.1  mrg /* almost always be correctly rounded, but may be up to 1 ulp in      */
   5163       1.1  mrg /* error in rare cases. 					      */
   5164       1.1  mrg /*								      */
   5165       1.1  mrg /* Finite results will always be full precision and Inexact, except   */
   5166       1.1  mrg /* when A is a zero or -Infinity (giving 1 or 0 respectively).	      */
   5167       1.1  mrg /* ------------------------------------------------------------------ */
   5168       1.1  mrg /* This approach used here is similar to the algorithm described in   */
   5169       1.1  mrg /*								      */
   5170       1.1  mrg /*   Variable Precision Exponential Function, T. E. Hull and	      */
   5171       1.1  mrg /*   A. Abrham, ACM Transactions on Mathematical Software, Vol 12 #2, */
   5172       1.1  mrg /*   pp79-91, ACM, June 1986.					      */
   5173       1.1  mrg /*								      */
   5174       1.1  mrg /* with the main difference being that the iterations in the series   */
   5175       1.1  mrg /* evaluation are terminated dynamically (which does not require the  */
   5176       1.1  mrg /* extra variable-precision variables which are expensive in this     */
   5177       1.1  mrg /* context).							      */
   5178       1.1  mrg /*								      */
   5179       1.1  mrg /* The error analysis in Hull & Abrham's paper applies except for the */
   5180       1.1  mrg /* round-off error accumulation during the series evaluation.  This   */
   5181       1.1  mrg /* code does not precalculate the number of iterations and so cannot  */
   5182       1.1  mrg /* use Horner's scheme.  Instead, the accumulation is done at double- */
   5183       1.1  mrg /* precision, which ensures that the additions of the terms are exact */
   5184       1.1  mrg /* and do not accumulate round-off (and any round-off errors in the   */
   5185       1.1  mrg /* terms themselves move 'to the right' faster than they can	      */
   5186       1.1  mrg /* accumulate).  This code also extends the calculation by allowing,  */
   5187       1.1  mrg /* in the spirit of other decNumber operators, the input to be more   */
   5188       1.1  mrg /* precise than the result (the precision used is based on the more   */
   5189       1.1  mrg /* precise of the input or requested result).			      */
   5190       1.1  mrg /*								      */
   5191       1.1  mrg /* Implementation notes:					      */
   5192       1.1  mrg /*								      */
   5193       1.1  mrg /* 1. This is separated out as decExpOp so it can be called from      */
   5194       1.1  mrg /*    other Mathematical functions (notably Ln) with a wider range    */
   5195       1.1  mrg /*    than normal.  In particular, it can handle the slightly wider   */
   5196       1.1  mrg /*    (double) range needed by Ln (which has to be able to calculate  */
   5197       1.1  mrg /*    exp(-x) where x can be the tiniest number (Ntiny).	      */
   5198       1.1  mrg /*								      */
   5199       1.1  mrg /* 2. Normalizing x to be <=0.1 (instead of <=1) reduces loop	      */
   5200   1.1.1.5  mrg /*    iterations by approximately a third with additional (although    */
   5201       1.1  mrg /*    diminishing) returns as the range is reduced to even smaller    */
   5202       1.1  mrg /*    fractions.  However, h (the power of 10 used to correct the     */
   5203       1.1  mrg /*    result at the end, see below) must be kept <=8 as otherwise     */
   5204       1.1  mrg /*    the final result cannot be computed.  Hence the leverage is a   */
   5205       1.1  mrg /*    sliding value (8-h), where potentially the range is reduced     */
   5206       1.1  mrg /*    more for smaller values.					      */
   5207       1.1  mrg /*								      */
   5208       1.1  mrg /*    The leverage that can be applied in this way is severely	      */
   5209       1.1  mrg /*    limited by the cost of the raise-to-the power at the end,       */
   5210       1.1  mrg /*    which dominates when the number of iterations is small (less    */
   5211       1.1  mrg /*    than ten) or when rhs is short.  As an example, the adjustment  */
   5212       1.1  mrg /*    x**10,000,000 needs 31 multiplications, all but one full-width. */
   5213       1.1  mrg /*								      */
   5214       1.1  mrg /* 3. The restrictions (especially precision) could be raised with    */
   5215       1.1  mrg /*    care, but the full decNumber range seems very hard within the   */
   5216       1.1  mrg /*    32-bit limits.						      */
   5217       1.1  mrg /*								      */
   5218       1.1  mrg /* 4. The working precisions for the static buffers are twice the     */
   5219       1.1  mrg /*    obvious size to allow for calls from decNumberPower.	      */
   5220       1.1  mrg /* ------------------------------------------------------------------ */
   5221       1.1  mrg decNumber * decExpOp(decNumber *res, const decNumber *rhs,
   5222       1.1  mrg 			 decContext *set, uInt *status) {
   5223       1.1  mrg   uInt ignore=0;		   /* working status */
   5224       1.1  mrg   Int h;			   /* adjusted exponent for 0.xxxx */
   5225       1.1  mrg   Int p;			   /* working precision */
   5226       1.1  mrg   Int residue;			   /* rounding residue */
   5227       1.1  mrg   uInt needbytes;		   /* for space calculations */
   5228       1.1  mrg   const decNumber *x=rhs;	   /* (may point to safe copy later) */
   5229       1.1  mrg   decContext aset, tset, dset;	   /* working contexts */
   5230       1.1  mrg   Int comp;			   /* work */
   5231       1.1  mrg 
   5232       1.1  mrg   /* the argument is often copied to normalize it, so (unusually) it */
   5233       1.1  mrg   /* is treated like other buffers, using DECBUFFER, +1 in case */
   5234       1.1  mrg   /* DECBUFFER is 0 */
   5235       1.1  mrg   decNumber bufr[D2N(DECBUFFER*2+1)];
   5236       1.1  mrg   decNumber *allocrhs=NULL;	   /* non-NULL if rhs buffer allocated */
   5237       1.1  mrg 
   5238       1.1  mrg   /* the working precision will be no more than set->digits+8+1 */
   5239       1.1  mrg   /* so for on-stack buffers DECBUFFER+9 is used, +1 in case DECBUFFER */
   5240       1.1  mrg   /* is 0 (and twice that for the accumulator) */
   5241       1.1  mrg 
   5242       1.1  mrg   /* buffer for t, term (working precision plus) */
   5243       1.1  mrg   decNumber buft[D2N(DECBUFFER*2+9+1)];
   5244       1.1  mrg   decNumber *allocbuft=NULL;	   /* -> allocated buft, iff allocated */
   5245       1.1  mrg   decNumber *t=buft;		   /* term */
   5246       1.1  mrg   /* buffer for a, accumulator (working precision * 2), at least 9 */
   5247       1.1  mrg   decNumber bufa[D2N(DECBUFFER*4+18+1)];
   5248       1.1  mrg   decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
   5249       1.1  mrg   decNumber *a=bufa;		   /* accumulator */
   5250       1.1  mrg   /* decNumber for the divisor term; this needs at most 9 digits */
   5251       1.1  mrg   /* and so can be fixed size [16 so can use standard context] */
   5252       1.1  mrg   decNumber bufd[D2N(16)];
   5253       1.1  mrg   decNumber *d=bufd;		   /* divisor */
   5254       1.1  mrg   decNumber numone;		   /* constant 1 */
   5255       1.1  mrg 
   5256       1.1  mrg   #if DECCHECK
   5257       1.1  mrg   Int iterations=0;		   /* for later sanity check */
   5258       1.1  mrg   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   5259       1.1  mrg   #endif
   5260       1.1  mrg 
   5261       1.1  mrg   do {					/* protect allocated storage */
   5262       1.1  mrg     if (SPECIALARG) {			/* handle infinities and NaNs */
   5263       1.1  mrg       if (decNumberIsInfinite(rhs)) {	/* an infinity */
   5264       1.1  mrg 	if (decNumberIsNegative(rhs))	/* -Infinity -> +0 */
   5265       1.1  mrg 	  decNumberZero(res);
   5266       1.1  mrg 	 else decNumberCopy(res, rhs);	/* +Infinity -> self */
   5267       1.1  mrg 	}
   5268       1.1  mrg        else decNaNs(res, rhs, NULL, set, status); /* a NaN */
   5269       1.1  mrg       break;}
   5270       1.1  mrg 
   5271       1.1  mrg     if (ISZERO(rhs)) {			/* zeros -> exact 1 */
   5272       1.1  mrg       decNumberZero(res);		/* make clean 1 */
   5273       1.1  mrg       *res->lsu=1;			/* .. */
   5274       1.1  mrg       break;}				/* [no status to set] */
   5275       1.1  mrg 
   5276       1.1  mrg     /* e**x when 0 < x < 0.66 is < 1+3x/2, hence can fast-path */
   5277       1.1  mrg     /* positive and negative tiny cases which will result in inexact */
   5278       1.1  mrg     /* 1.  This also allows the later add-accumulate to always be */
   5279       1.1  mrg     /* exact (because its length will never be more than twice the */
   5280       1.1  mrg     /* working precision). */
   5281       1.1  mrg     /* The comparator (tiny) needs just one digit, so use the */
   5282       1.1  mrg     /* decNumber d for it (reused as the divisor, etc., below); its */
   5283       1.1  mrg     /* exponent is such that if x is positive it will have */
   5284       1.1  mrg     /* set->digits-1 zeros between the decimal point and the digit, */
   5285       1.1  mrg     /* which is 4, and if x is negative one more zero there as the */
   5286       1.1  mrg     /* more precise result will be of the form 0.9999999 rather than */
   5287       1.1  mrg     /* 1.0000001.  Hence, tiny will be 0.0000004  if digits=7 and x>0 */
   5288       1.1  mrg     /* or 0.00000004 if digits=7 and x<0.  If RHS not larger than */
   5289       1.1  mrg     /* this then the result will be 1.000000 */
   5290       1.1  mrg     decNumberZero(d);			/* clean */
   5291       1.1  mrg     *d->lsu=4;				/* set 4 .. */
   5292       1.1  mrg     d->exponent=-set->digits;		/* * 10**(-d) */
   5293       1.1  mrg     if (decNumberIsNegative(rhs)) d->exponent--;  /* negative case */
   5294       1.1  mrg     comp=decCompare(d, rhs, 1); 	/* signless compare */
   5295       1.1  mrg     if (comp==BADINT) {
   5296       1.1  mrg       *status|=DEC_Insufficient_storage;
   5297       1.1  mrg       break;}
   5298       1.1  mrg     if (comp>=0) {			/* rhs < d */
   5299       1.1  mrg       Int shift=set->digits-1;
   5300       1.1  mrg       decNumberZero(res);		/* set 1 */
   5301       1.1  mrg       *res->lsu=1;			/* .. */
   5302       1.1  mrg       res->digits=decShiftToMost(res->lsu, 1, shift);
   5303       1.1  mrg       res->exponent=-shift;		     /* make 1.0000... */
   5304       1.1  mrg       *status|=DEC_Inexact | DEC_Rounded;    /* .. inexactly */
   5305       1.1  mrg       break;} /* tiny */
   5306       1.1  mrg 
   5307       1.1  mrg     /* set up the context to be used for calculating a, as this is */
   5308       1.1  mrg     /* used on both paths below */
   5309       1.1  mrg     decContextDefault(&aset, DEC_INIT_DECIMAL64);
   5310       1.1  mrg     /* accumulator bounds are as requested (could underflow) */
   5311       1.1  mrg     aset.emax=set->emax;		/* usual bounds */
   5312       1.1  mrg     aset.emin=set->emin;		/* .. */
   5313       1.1  mrg     aset.clamp=0;			/* and no concrete format */
   5314       1.1  mrg 
   5315       1.1  mrg     /* calculate the adjusted (Hull & Abrham) exponent (where the */
   5316       1.1  mrg     /* decimal point is just to the left of the coefficient msd) */
   5317       1.1  mrg     h=rhs->exponent+rhs->digits;
   5318       1.1  mrg     /* if h>8 then 10**h cannot be calculated safely; however, when */
   5319       1.1  mrg     /* h=8 then exp(|rhs|) will be at least exp(1E+7) which is at */
   5320       1.1  mrg     /* least 6.59E+4342944, so (due to the restriction on Emax/Emin) */
   5321       1.1  mrg     /* overflow (or underflow to 0) is guaranteed -- so this case can */
   5322       1.1  mrg     /* be handled by simply forcing the appropriate excess */
   5323       1.1  mrg     if (h>8) {				/* overflow/underflow */
   5324       1.1  mrg       /* set up here so Power call below will over or underflow to */
   5325       1.1  mrg       /* zero; set accumulator to either 2 or 0.02 */
   5326       1.1  mrg       /* [stack buffer for a is always big enough for this] */
   5327       1.1  mrg       decNumberZero(a);
   5328       1.1  mrg       *a->lsu=2;			/* not 1 but < exp(1) */
   5329       1.1  mrg       if (decNumberIsNegative(rhs)) a->exponent=-2; /* make 0.02 */
   5330       1.1  mrg       h=8;				/* clamp so 10**h computable */
   5331       1.1  mrg       p=9;				/* set a working precision */
   5332       1.1  mrg       }
   5333       1.1  mrg      else {				/* h<=8 */
   5334       1.1  mrg       Int maxlever=(rhs->digits>8?1:0);
   5335       1.1  mrg       /* [could/should increase this for precisions >40 or so, too] */
   5336       1.1  mrg 
   5337       1.1  mrg       /* if h is 8, cannot normalize to a lower upper limit because */
   5338       1.1  mrg       /* the final result will not be computable (see notes above), */
   5339       1.1  mrg       /* but leverage can be applied whenever h is less than 8. */
   5340       1.1  mrg       /* Apply as much as possible, up to a MAXLEVER digits, which */
   5341       1.1  mrg       /* sets the tradeoff against the cost of the later a**(10**h). */
   5342       1.1  mrg       /* As h is increased, the working precision below also */
   5343       1.1  mrg       /* increases to compensate for the "constant digits at the */
   5344       1.1  mrg       /* front" effect. */
   5345       1.1  mrg       Int lever=MINI(8-h, maxlever);	/* leverage attainable */
   5346       1.1  mrg       Int use=-rhs->digits-lever;	/* exponent to use for RHS */
   5347       1.1  mrg       h+=lever; 			/* apply leverage selected */
   5348       1.1  mrg       if (h<0) {			/* clamp */
   5349       1.1  mrg 	use+=h; 			/* [may end up subnormal] */
   5350       1.1  mrg 	h=0;
   5351       1.1  mrg 	}
   5352       1.1  mrg       /* Take a copy of RHS if it needs normalization (true whenever x>=1) */
   5353       1.1  mrg       if (rhs->exponent!=use) {
   5354       1.1  mrg 	decNumber *newrhs=bufr; 	/* assume will fit on stack */
   5355       1.1  mrg 	needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
   5356       1.1  mrg 	if (needbytes>sizeof(bufr)) {	/* need malloc space */
   5357       1.1  mrg 	  allocrhs=(decNumber *)malloc(needbytes);
   5358       1.1  mrg 	  if (allocrhs==NULL) { 	/* hopeless -- abandon */
   5359       1.1  mrg 	    *status|=DEC_Insufficient_storage;
   5360       1.1  mrg 	    break;}
   5361       1.1  mrg 	  newrhs=allocrhs;		/* use the allocated space */
   5362       1.1  mrg 	  }
   5363       1.1  mrg 	decNumberCopy(newrhs, rhs);	/* copy to safe space */
   5364       1.1  mrg 	newrhs->exponent=use;		/* normalize; now <1 */
   5365       1.1  mrg 	x=newrhs;			/* ready for use */
   5366       1.1  mrg 	/* decNumberShow(x); */
   5367       1.1  mrg 	}
   5368       1.1  mrg 
   5369       1.1  mrg       /* Now use the usual power series to evaluate exp(x).  The */
   5370       1.1  mrg       /* series starts as 1 + x + x^2/2 ... so prime ready for the */
   5371       1.1  mrg       /* third term by setting the term variable t=x, the accumulator */
   5372       1.1  mrg       /* a=1, and the divisor d=2. */
   5373       1.1  mrg 
   5374       1.1  mrg       /* First determine the working precision.  From Hull & Abrham */
   5375       1.1  mrg       /* this is set->digits+h+2.  However, if x is 'over-precise' we */
   5376       1.1  mrg       /* need to allow for all its digits to potentially participate */
   5377       1.1  mrg       /* (consider an x where all the excess digits are 9s) so in */
   5378       1.1  mrg       /* this case use x->digits+h+2 */
   5379       1.1  mrg       p=MAXI(x->digits, set->digits)+h+2;    /* [h<=8] */
   5380       1.1  mrg 
   5381       1.1  mrg       /* a and t are variable precision, and depend on p, so space */
   5382       1.1  mrg       /* must be allocated for them if necessary */
   5383       1.1  mrg 
   5384       1.1  mrg       /* the accumulator needs to be able to hold 2p digits so that */
   5385       1.1  mrg       /* the additions on the second and subsequent iterations are */
   5386       1.1  mrg       /* sufficiently exact. */
   5387       1.1  mrg       needbytes=sizeof(decNumber)+(D2U(p*2)-1)*sizeof(Unit);
   5388       1.1  mrg       if (needbytes>sizeof(bufa)) {	/* need malloc space */
   5389       1.1  mrg 	allocbufa=(decNumber *)malloc(needbytes);
   5390       1.1  mrg 	if (allocbufa==NULL) {		/* hopeless -- abandon */
   5391       1.1  mrg 	  *status|=DEC_Insufficient_storage;
   5392       1.1  mrg 	  break;}
   5393       1.1  mrg 	a=allocbufa;			/* use the allocated space */
   5394       1.1  mrg 	}
   5395       1.1  mrg       /* the term needs to be able to hold p digits (which is */
   5396       1.1  mrg       /* guaranteed to be larger than x->digits, so the initial copy */
   5397       1.1  mrg       /* is safe); it may also be used for the raise-to-power */
   5398       1.1  mrg       /* calculation below, which needs an extra two digits */
   5399       1.1  mrg       needbytes=sizeof(decNumber)+(D2U(p+2)-1)*sizeof(Unit);
   5400       1.1  mrg       if (needbytes>sizeof(buft)) {	/* need malloc space */
   5401       1.1  mrg 	allocbuft=(decNumber *)malloc(needbytes);
   5402       1.1  mrg 	if (allocbuft==NULL) {		/* hopeless -- abandon */
   5403       1.1  mrg 	  *status|=DEC_Insufficient_storage;
   5404       1.1  mrg 	  break;}
   5405       1.1  mrg 	t=allocbuft;			/* use the allocated space */
   5406       1.1  mrg 	}
   5407       1.1  mrg 
   5408       1.1  mrg       decNumberCopy(t, x);		/* term=x */
   5409       1.1  mrg       decNumberZero(a); *a->lsu=1;	/* accumulator=1 */
   5410       1.1  mrg       decNumberZero(d); *d->lsu=2;	/* divisor=2 */
   5411       1.1  mrg       decNumberZero(&numone); *numone.lsu=1; /* constant 1 for increment */
   5412       1.1  mrg 
   5413       1.1  mrg       /* set up the contexts for calculating a, t, and d */
   5414       1.1  mrg       decContextDefault(&tset, DEC_INIT_DECIMAL64);
   5415       1.1  mrg       dset=tset;
   5416       1.1  mrg       /* accumulator bounds are set above, set precision now */
   5417       1.1  mrg       aset.digits=p*2;			/* double */
   5418       1.1  mrg       /* term bounds avoid any underflow or overflow */
   5419       1.1  mrg       tset.digits=p;
   5420       1.1  mrg       tset.emin=DEC_MIN_EMIN;		/* [emax is plenty] */
   5421       1.1  mrg       /* [dset.digits=16, etc., are sufficient] */
   5422       1.1  mrg 
   5423       1.1  mrg       /* finally ready to roll */
   5424       1.1  mrg       for (;;) {
   5425       1.1  mrg 	#if DECCHECK
   5426       1.1  mrg 	iterations++;
   5427       1.1  mrg 	#endif
   5428       1.1  mrg 	/* only the status from the accumulation is interesting */
   5429       1.1  mrg 	/* [but it should remain unchanged after first add] */
   5430       1.1  mrg 	decAddOp(a, a, t, &aset, 0, status);	       /* a=a+t */
   5431       1.1  mrg 	decMultiplyOp(t, t, x, &tset, &ignore);        /* t=t*x */
   5432       1.1  mrg 	decDivideOp(t, t, d, &tset, DIVIDE, &ignore);  /* t=t/d */
   5433       1.1  mrg 	/* the iteration ends when the term cannot affect the result, */
   5434       1.1  mrg 	/* if rounded to p digits, which is when its value is smaller */
   5435       1.1  mrg 	/* than the accumulator by p+1 digits.	There must also be */
   5436       1.1  mrg 	/* full precision in a. */
   5437       1.1  mrg 	if (((a->digits+a->exponent)>=(t->digits+t->exponent+p+1))
   5438       1.1  mrg 	    && (a->digits>=p)) break;
   5439       1.1  mrg 	decAddOp(d, d, &numone, &dset, 0, &ignore);    /* d=d+1 */
   5440       1.1  mrg 	} /* iterate */
   5441       1.1  mrg 
   5442       1.1  mrg       #if DECCHECK
   5443       1.1  mrg       /* just a sanity check; comment out test to show always */
   5444       1.1  mrg       if (iterations>p+3)
   5445       1.1  mrg 	printf("Exp iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
   5446       1.1  mrg 	       (LI)iterations, (LI)*status, (LI)p, (LI)x->digits);
   5447       1.1  mrg       #endif
   5448       1.1  mrg       } /* h<=8 */
   5449       1.1  mrg 
   5450       1.1  mrg     /* apply postconditioning: a=a**(10**h) -- this is calculated */
   5451       1.1  mrg     /* at a slightly higher precision than Hull & Abrham suggest */
   5452       1.1  mrg     if (h>0) {
   5453       1.1  mrg       Int seenbit=0;		   /* set once a 1-bit is seen */
   5454       1.1  mrg       Int i;			   /* counter */
   5455       1.1  mrg       Int n=powers[h];		   /* always positive */
   5456       1.1  mrg       aset.digits=p+2;		   /* sufficient precision */
   5457       1.1  mrg       /* avoid the overhead and many extra digits of decNumberPower */
   5458       1.1  mrg       /* as all that is needed is the short 'multipliers' loop; here */
   5459       1.1  mrg       /* accumulate the answer into t */
   5460       1.1  mrg       decNumberZero(t); *t->lsu=1; /* acc=1 */
   5461       1.1  mrg       for (i=1;;i++){		   /* for each bit [top bit ignored] */
   5462       1.1  mrg 	/* abandon if have had overflow or terminal underflow */
   5463       1.1  mrg 	if (*status & (DEC_Overflow|DEC_Underflow)) { /* interesting? */
   5464       1.1  mrg 	  if (*status&DEC_Overflow || ISZERO(t)) break;}
   5465       1.1  mrg 	n=n<<1; 		   /* move next bit to testable position */
   5466       1.1  mrg 	if (n<0) {		   /* top bit is set */
   5467       1.1  mrg 	  seenbit=1;		   /* OK, have a significant bit */
   5468       1.1  mrg 	  decMultiplyOp(t, t, a, &aset, status); /* acc=acc*x */
   5469       1.1  mrg 	  }
   5470       1.1  mrg 	if (i==31) break;	   /* that was the last bit */
   5471       1.1  mrg 	if (!seenbit) continue;    /* no need to square 1 */
   5472       1.1  mrg 	decMultiplyOp(t, t, t, &aset, status); /* acc=acc*acc [square] */
   5473       1.1  mrg 	} /*i*/ /* 32 bits */
   5474       1.1  mrg       /* decNumberShow(t); */
   5475       1.1  mrg       a=t;			   /* and carry on using t instead of a */
   5476       1.1  mrg       }
   5477       1.1  mrg 
   5478       1.1  mrg     /* Copy and round the result to res */
   5479       1.1  mrg     residue=1;				/* indicate dirt to right .. */
   5480       1.1  mrg     if (ISZERO(a)) residue=0;		/* .. unless underflowed to 0 */
   5481       1.1  mrg     aset.digits=set->digits;		/* [use default rounding] */
   5482       1.1  mrg     decCopyFit(res, a, &aset, &residue, status); /* copy & shorten */
   5483       1.1  mrg     decFinish(res, set, &residue, status);	 /* cleanup/set flags */
   5484       1.1  mrg     } while(0); 			/* end protected */
   5485       1.1  mrg 
   5486   1.1.1.2  mrg   free(allocrhs);	/* drop any storage used */
   5487   1.1.1.2  mrg   free(allocbufa); /* .. */
   5488   1.1.1.2  mrg   free(allocbuft); /* .. */
   5489       1.1  mrg   /* [status is handled by caller] */
   5490       1.1  mrg   return res;
   5491       1.1  mrg   } /* decExpOp */
   5492       1.1  mrg 
   5493       1.1  mrg /* ------------------------------------------------------------------ */
   5494       1.1  mrg /* Initial-estimate natural logarithm table			      */
   5495       1.1  mrg /*								      */
   5496       1.1  mrg /*   LNnn -- 90-entry 16-bit table for values from .10 through .99.   */
   5497       1.1  mrg /*	     The result is a 4-digit encode of the coefficient (c=the */
   5498       1.1  mrg /*	     top 14 bits encoding 0-9999) and a 2-digit encode of the */
   5499       1.1  mrg /*	     exponent (e=the bottom 2 bits encoding 0-3)	      */
   5500       1.1  mrg /*								      */
   5501       1.1  mrg /*	     The resulting value is given by:			      */
   5502       1.1  mrg /*								      */
   5503       1.1  mrg /*	       v = -c * 10**(-e-3)				      */
   5504       1.1  mrg /*								      */
   5505       1.1  mrg /*	     where e and c are extracted from entry k = LNnn[x-10]    */
   5506       1.1  mrg /*	     where x is truncated (NB) into the range 10 through 99,  */
   5507       1.1  mrg /*	     and then c = k>>2 and e = k&3.			      */
   5508       1.1  mrg /* ------------------------------------------------------------------ */
   5509       1.1  mrg const uShort LNnn[90]={9016,  8652,  8316,  8008,  7724,  7456,  7208,
   5510       1.1  mrg   6972,  6748,	6540,  6340,  6148,  5968,  5792,  5628,  5464,  5312,
   5511       1.1  mrg   5164,  5020,	4884,  4748,  4620,  4496,  4376,  4256,  4144,  4032,
   5512       1.1  mrg  39233, 38181, 37157, 36157, 35181, 34229, 33297, 32389, 31501, 30629,
   5513       1.1  mrg  29777, 28945, 28129, 27329, 26545, 25777, 25021, 24281, 23553, 22837,
   5514       1.1  mrg  22137, 21445, 20769, 20101, 19445, 18801, 18165, 17541, 16925, 16321,
   5515       1.1  mrg  15721, 15133, 14553, 13985, 13421, 12865, 12317, 11777, 11241, 10717,
   5516       1.1  mrg  10197,  9685,	9177,  8677,  8185,  7697,  7213,  6737,  6269,  5801,
   5517       1.1  mrg   5341,  4889,	4437, 39930, 35534, 31186, 26886, 22630, 18418, 14254,
   5518       1.1  mrg  10130,  6046, 20055};
   5519       1.1  mrg 
   5520       1.1  mrg /* ------------------------------------------------------------------ */
   5521       1.1  mrg /* decLnOp -- effect natural logarithm				      */
   5522       1.1  mrg /*								      */
   5523       1.1  mrg /*   This computes C = ln(A)					      */
   5524       1.1  mrg /*								      */
   5525       1.1  mrg /*   res is C, the result.  C may be A				      */
   5526       1.1  mrg /*   rhs is A							      */
   5527       1.1  mrg /*   set is the context; note that rounding mode has no effect	      */
   5528       1.1  mrg /*								      */
   5529       1.1  mrg /* C must have space for set->digits digits.			      */
   5530       1.1  mrg /*								      */
   5531       1.1  mrg /* Notable cases:						      */
   5532       1.1  mrg /*   A<0 -> Invalid						      */
   5533       1.1  mrg /*   A=0 -> -Infinity (Exact)					      */
   5534       1.1  mrg /*   A=+Infinity -> +Infinity (Exact)				      */
   5535       1.1  mrg /*   A=1 exactly -> 0 (Exact)					      */
   5536       1.1  mrg /*								      */
   5537       1.1  mrg /* Restrictions (as for Exp):					      */
   5538       1.1  mrg /*								      */
   5539       1.1  mrg /*   digits, emax, and -emin in the context must be less than	      */
   5540       1.1  mrg /*   DEC_MAX_MATH+11 (1000010), and the rhs must be within these      */
   5541       1.1  mrg /*   bounds or a zero.	This is an internal routine, so these	      */
   5542       1.1  mrg /*   restrictions are contractual and not enforced.		      */
   5543       1.1  mrg /*								      */
   5544       1.1  mrg /* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will      */
   5545       1.1  mrg /* almost always be correctly rounded, but may be up to 1 ulp in      */
   5546       1.1  mrg /* error in rare cases. 					      */
   5547       1.1  mrg /* ------------------------------------------------------------------ */
   5548       1.1  mrg /* The result is calculated using Newton's method, with each	      */
   5549       1.1  mrg /* iteration calculating a' = a + x * exp(-a) - 1.  See, for example, */
   5550       1.1  mrg /* Epperson 1989.						      */
   5551       1.1  mrg /*								      */
   5552       1.1  mrg /* The iteration ends when the adjustment x*exp(-a)-1 is tiny enough. */
   5553       1.1  mrg /* This has to be calculated at the sum of the precision of x and the */
   5554       1.1  mrg /* working precision.						      */
   5555       1.1  mrg /*								      */
   5556       1.1  mrg /* Implementation notes:					      */
   5557       1.1  mrg /*								      */
   5558       1.1  mrg /* 1. This is separated out as decLnOp so it can be called from       */
   5559       1.1  mrg /*    other Mathematical functions (e.g., Log 10) with a wider range  */
   5560       1.1  mrg /*    than normal.  In particular, it can handle the slightly wider   */
   5561       1.1  mrg /*    (+9+2) range needed by a power function.			      */
   5562       1.1  mrg /*								      */
   5563       1.1  mrg /* 2. The speed of this function is about 10x slower than exp, as     */
   5564       1.1  mrg /*    it typically needs 4-6 iterations for short numbers, and the    */
   5565       1.1  mrg /*    extra precision needed adds a squaring effect, twice.	      */
   5566       1.1  mrg /*								      */
   5567       1.1  mrg /* 3. Fastpaths are included for ln(10) and ln(2), up to length 40,   */
   5568       1.1  mrg /*    as these are common requests.  ln(10) is used by log10(x).      */
   5569       1.1  mrg /*								      */
   5570       1.1  mrg /* 4. An iteration might be saved by widening the LNnn table, and     */
   5571       1.1  mrg /*    would certainly save at least one if it were made ten times     */
   5572       1.1  mrg /*    bigger, too (for truncated fractions 0.100 through 0.999).      */
   5573       1.1  mrg /*    However, for most practical evaluations, at least four or five  */
   5574       1.1  mrg /*    iterations will be neede -- so this would only speed up by      */
   5575       1.1  mrg /*    20-25% and that probably does not justify increasing the table  */
   5576       1.1  mrg /*    size.							      */
   5577       1.1  mrg /*								      */
   5578       1.1  mrg /* 5. The static buffers are larger than might be expected to allow   */
   5579       1.1  mrg /*    for calls from decNumberPower.				      */
   5580       1.1  mrg /* ------------------------------------------------------------------ */
   5581       1.1  mrg decNumber * decLnOp(decNumber *res, const decNumber *rhs,
   5582       1.1  mrg 		    decContext *set, uInt *status) {
   5583       1.1  mrg   uInt ignore=0;		   /* working status accumulator */
   5584       1.1  mrg   uInt needbytes;		   /* for space calculations */
   5585       1.1  mrg   Int residue;			   /* rounding residue */
   5586       1.1  mrg   Int r;			   /* rhs=f*10**r [see below] */
   5587       1.1  mrg   Int p;			   /* working precision */
   5588       1.1  mrg   Int pp;			   /* precision for iteration */
   5589       1.1  mrg   Int t;			   /* work */
   5590       1.1  mrg 
   5591       1.1  mrg   /* buffers for a (accumulator, typically precision+2) and b */
   5592       1.1  mrg   /* (adjustment calculator, same size) */
   5593       1.1  mrg   decNumber bufa[D2N(DECBUFFER+12)];
   5594       1.1  mrg   decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
   5595       1.1  mrg   decNumber *a=bufa;		   /* accumulator/work */
   5596       1.1  mrg   decNumber bufb[D2N(DECBUFFER*2+2)];
   5597       1.1  mrg   decNumber *allocbufb=NULL;	   /* -> allocated bufa, iff allocated */
   5598       1.1  mrg   decNumber *b=bufb;		   /* adjustment/work */
   5599       1.1  mrg 
   5600       1.1  mrg   decNumber  numone;		   /* constant 1 */
   5601       1.1  mrg   decNumber  cmp;		   /* work */
   5602       1.1  mrg   decContext aset, bset;	   /* working contexts */
   5603       1.1  mrg 
   5604       1.1  mrg   #if DECCHECK
   5605       1.1  mrg   Int iterations=0;		   /* for later sanity check */
   5606       1.1  mrg   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   5607       1.1  mrg   #endif
   5608       1.1  mrg 
   5609       1.1  mrg   do {					/* protect allocated storage */
   5610       1.1  mrg     if (SPECIALARG) {			/* handle infinities and NaNs */
   5611       1.1  mrg       if (decNumberIsInfinite(rhs)) {	/* an infinity */
   5612       1.1  mrg 	if (decNumberIsNegative(rhs))	/* -Infinity -> error */
   5613       1.1  mrg 	  *status|=DEC_Invalid_operation;
   5614       1.1  mrg 	 else decNumberCopy(res, rhs);	/* +Infinity -> self */
   5615       1.1  mrg 	}
   5616       1.1  mrg        else decNaNs(res, rhs, NULL, set, status); /* a NaN */
   5617       1.1  mrg       break;}
   5618       1.1  mrg 
   5619       1.1  mrg     if (ISZERO(rhs)) {			/* +/- zeros -> -Infinity */
   5620       1.1  mrg       decNumberZero(res);		/* make clean */
   5621       1.1  mrg       res->bits=DECINF|DECNEG;		/* set - infinity */
   5622       1.1  mrg       break;}				/* [no status to set] */
   5623       1.1  mrg 
   5624       1.1  mrg     /* Non-zero negatives are bad... */
   5625       1.1  mrg     if (decNumberIsNegative(rhs)) {	/* -x -> error */
   5626       1.1  mrg       *status|=DEC_Invalid_operation;
   5627       1.1  mrg       break;}
   5628       1.1  mrg 
   5629       1.1  mrg     /* Here, rhs is positive, finite, and in range */
   5630       1.1  mrg 
   5631       1.1  mrg     /* lookaside fastpath code for ln(2) and ln(10) at common lengths */
   5632       1.1  mrg     if (rhs->exponent==0 && set->digits<=40) {
   5633       1.1  mrg       #if DECDPUN==1
   5634       1.1  mrg       if (rhs->lsu[0]==0 && rhs->lsu[1]==1 && rhs->digits==2) { /* ln(10) */
   5635       1.1  mrg       #else
   5636       1.1  mrg       if (rhs->lsu[0]==10 && rhs->digits==2) {			/* ln(10) */
   5637       1.1  mrg       #endif
   5638       1.1  mrg 	aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
   5639       1.1  mrg 	#define LN10 "2.302585092994045684017991454684364207601"
   5640       1.1  mrg 	decNumberFromString(res, LN10, &aset);
   5641       1.1  mrg 	*status|=(DEC_Inexact | DEC_Rounded); /* is inexact */
   5642       1.1  mrg 	break;}
   5643       1.1  mrg       if (rhs->lsu[0]==2 && rhs->digits==1) { /* ln(2) */
   5644       1.1  mrg 	aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
   5645       1.1  mrg 	#define LN2 "0.6931471805599453094172321214581765680755"
   5646       1.1  mrg 	decNumberFromString(res, LN2, &aset);
   5647       1.1  mrg 	*status|=(DEC_Inexact | DEC_Rounded);
   5648       1.1  mrg 	break;}
   5649       1.1  mrg       } /* integer and short */
   5650       1.1  mrg 
   5651       1.1  mrg     /* Determine the working precision.  This is normally the */
   5652       1.1  mrg     /* requested precision + 2, with a minimum of 9.  However, if */
   5653       1.1  mrg     /* the rhs is 'over-precise' then allow for all its digits to */
   5654       1.1  mrg     /* potentially participate (consider an rhs where all the excess */
   5655       1.1  mrg     /* digits are 9s) so in this case use rhs->digits+2. */
   5656       1.1  mrg     p=MAXI(rhs->digits, MAXI(set->digits, 7))+2;
   5657       1.1  mrg 
   5658       1.1  mrg     /* Allocate space for the accumulator and the high-precision */
   5659       1.1  mrg     /* adjustment calculator, if necessary.  The accumulator must */
   5660       1.1  mrg     /* be able to hold p digits, and the adjustment up to */
   5661       1.1  mrg     /* rhs->digits+p digits.  They are also made big enough for 16 */
   5662       1.1  mrg     /* digits so that they can be used for calculating the initial */
   5663       1.1  mrg     /* estimate. */
   5664       1.1  mrg     needbytes=sizeof(decNumber)+(D2U(MAXI(p,16))-1)*sizeof(Unit);
   5665       1.1  mrg     if (needbytes>sizeof(bufa)) {     /* need malloc space */
   5666       1.1  mrg       allocbufa=(decNumber *)malloc(needbytes);
   5667       1.1  mrg       if (allocbufa==NULL) {	      /* hopeless -- abandon */
   5668       1.1  mrg 	*status|=DEC_Insufficient_storage;
   5669       1.1  mrg 	break;}
   5670       1.1  mrg       a=allocbufa;		      /* use the allocated space */
   5671       1.1  mrg       }
   5672       1.1  mrg     pp=p+rhs->digits;
   5673       1.1  mrg     needbytes=sizeof(decNumber)+(D2U(MAXI(pp,16))-1)*sizeof(Unit);
   5674       1.1  mrg     if (needbytes>sizeof(bufb)) {     /* need malloc space */
   5675       1.1  mrg       allocbufb=(decNumber *)malloc(needbytes);
   5676       1.1  mrg       if (allocbufb==NULL) {	      /* hopeless -- abandon */
   5677       1.1  mrg 	*status|=DEC_Insufficient_storage;
   5678       1.1  mrg 	break;}
   5679       1.1  mrg       b=allocbufb;		      /* use the allocated space */
   5680       1.1  mrg       }
   5681       1.1  mrg 
   5682       1.1  mrg     /* Prepare an initial estimate in acc. Calculate this by */
   5683       1.1  mrg     /* considering the coefficient of x to be a normalized fraction, */
   5684       1.1  mrg     /* f, with the decimal point at far left and multiplied by */
   5685       1.1  mrg     /* 10**r.  Then, rhs=f*10**r and 0.1<=f<1, and */
   5686       1.1  mrg     /*	 ln(x) = ln(f) + ln(10)*r */
   5687       1.1  mrg     /* Get the initial estimate for ln(f) from a small lookup */
   5688       1.1  mrg     /* table (see above) indexed by the first two digits of f, */
   5689       1.1  mrg     /* truncated. */
   5690       1.1  mrg 
   5691       1.1  mrg     decContextDefault(&aset, DEC_INIT_DECIMAL64); /* 16-digit extended */
   5692       1.1  mrg     r=rhs->exponent+rhs->digits;	/* 'normalised' exponent */
   5693       1.1  mrg     decNumberFromInt32(a, r);		/* a=r */
   5694       1.1  mrg     decNumberFromInt32(b, 2302585);	/* b=ln(10) (2.302585) */
   5695       1.1  mrg     b->exponent=-6;			/*  .. */
   5696       1.1  mrg     decMultiplyOp(a, a, b, &aset, &ignore);  /* a=a*b */
   5697       1.1  mrg     /* now get top two digits of rhs into b by simple truncate and */
   5698       1.1  mrg     /* force to integer */
   5699       1.1  mrg     residue=0;				/* (no residue) */
   5700       1.1  mrg     aset.digits=2; aset.round=DEC_ROUND_DOWN;
   5701       1.1  mrg     decCopyFit(b, rhs, &aset, &residue, &ignore); /* copy & shorten */
   5702       1.1  mrg     b->exponent=0;			/* make integer */
   5703       1.1  mrg     t=decGetInt(b);			/* [cannot fail] */
   5704       1.1  mrg     if (t<10) t=X10(t); 		/* adjust single-digit b */
   5705       1.1  mrg     t=LNnn[t-10];			/* look up ln(b) */
   5706       1.1  mrg     decNumberFromInt32(b, t>>2);	/* b=ln(b) coefficient */
   5707       1.1  mrg     b->exponent=-(t&3)-3;		/* set exponent */
   5708       1.1  mrg     b->bits=DECNEG;			/* ln(0.10)->ln(0.99) always -ve */
   5709       1.1  mrg     aset.digits=16; aset.round=DEC_ROUND_HALF_EVEN; /* restore */
   5710       1.1  mrg     decAddOp(a, a, b, &aset, 0, &ignore); /* acc=a+b */
   5711       1.1  mrg     /* the initial estimate is now in a, with up to 4 digits correct. */
   5712       1.1  mrg     /* When rhs is at or near Nmax the estimate will be low, so we */
   5713       1.1  mrg     /* will approach it from below, avoiding overflow when calling exp. */
   5714       1.1  mrg 
   5715       1.1  mrg     decNumberZero(&numone); *numone.lsu=1;   /* constant 1 for adjustment */
   5716       1.1  mrg 
   5717       1.1  mrg     /* accumulator bounds are as requested (could underflow, but */
   5718       1.1  mrg     /* cannot overflow) */
   5719       1.1  mrg     aset.emax=set->emax;
   5720       1.1  mrg     aset.emin=set->emin;
   5721       1.1  mrg     aset.clamp=0;			/* no concrete format */
   5722       1.1  mrg     /* set up a context to be used for the multiply and subtract */
   5723       1.1  mrg     bset=aset;
   5724       1.1  mrg     bset.emax=DEC_MAX_MATH*2;		/* use double bounds for the */
   5725       1.1  mrg     bset.emin=-DEC_MAX_MATH*2;		/* adjustment calculation */
   5726       1.1  mrg 					/* [see decExpOp call below] */
   5727       1.1  mrg     /* for each iteration double the number of digits to calculate, */
   5728       1.1  mrg     /* up to a maximum of p */
   5729       1.1  mrg     pp=9;				/* initial precision */
   5730       1.1  mrg     /* [initially 9 as then the sequence starts 7+2, 16+2, and */
   5731       1.1  mrg     /* 34+2, which is ideal for standard-sized numbers] */
   5732       1.1  mrg     aset.digits=pp;			/* working context */
   5733       1.1  mrg     bset.digits=pp+rhs->digits; 	/* wider context */
   5734       1.1  mrg     for (;;) {				/* iterate */
   5735       1.1  mrg       #if DECCHECK
   5736       1.1  mrg       iterations++;
   5737       1.1  mrg       if (iterations>24) break; 	/* consider 9 * 2**24 */
   5738       1.1  mrg       #endif
   5739       1.1  mrg       /* calculate the adjustment (exp(-a)*x-1) into b.  This is a */
   5740       1.1  mrg       /* catastrophic subtraction but it really is the difference */
   5741       1.1  mrg       /* from 1 that is of interest. */
   5742       1.1  mrg       /* Use the internal entry point to Exp as it allows the double */
   5743       1.1  mrg       /* range for calculating exp(-a) when a is the tiniest subnormal. */
   5744       1.1  mrg       a->bits^=DECNEG;			/* make -a */
   5745       1.1  mrg       decExpOp(b, a, &bset, &ignore);	/* b=exp(-a) */
   5746       1.1  mrg       a->bits^=DECNEG;			/* restore sign of a */
   5747       1.1  mrg       /* now multiply by rhs and subtract 1, at the wider precision */
   5748       1.1  mrg       decMultiplyOp(b, b, rhs, &bset, &ignore);        /* b=b*rhs */
   5749       1.1  mrg       decAddOp(b, b, &numone, &bset, DECNEG, &ignore); /* b=b-1 */
   5750       1.1  mrg 
   5751       1.1  mrg       /* the iteration ends when the adjustment cannot affect the */
   5752       1.1  mrg       /* result by >=0.5 ulp (at the requested digits), which */
   5753       1.1  mrg       /* is when its value is smaller than the accumulator by */
   5754       1.1  mrg       /* set->digits+1 digits (or it is zero) -- this is a looser */
   5755       1.1  mrg       /* requirement than for Exp because all that happens to the */
   5756       1.1  mrg       /* accumulator after this is the final rounding (but note that */
   5757       1.1  mrg       /* there must also be full precision in a, or a=0). */
   5758       1.1  mrg 
   5759       1.1  mrg       if (decNumberIsZero(b) ||
   5760       1.1  mrg 	  (a->digits+a->exponent)>=(b->digits+b->exponent+set->digits+1)) {
   5761       1.1  mrg 	if (a->digits==p) break;
   5762       1.1  mrg 	if (decNumberIsZero(a)) {
   5763       1.1  mrg 	  decCompareOp(&cmp, rhs, &numone, &aset, COMPARE, &ignore); /* rhs=1 ? */
   5764       1.1  mrg 	  if (cmp.lsu[0]==0) a->exponent=0;	       /* yes, exact 0 */
   5765       1.1  mrg 	   else *status|=(DEC_Inexact | DEC_Rounded);  /* no, inexact */
   5766       1.1  mrg 	  break;
   5767       1.1  mrg 	  }
   5768       1.1  mrg 	/* force padding if adjustment has gone to 0 before full length */
   5769       1.1  mrg 	if (decNumberIsZero(b)) b->exponent=a->exponent-p;
   5770       1.1  mrg 	}
   5771       1.1  mrg 
   5772       1.1  mrg       /* not done yet ... */
   5773       1.1  mrg       decAddOp(a, a, b, &aset, 0, &ignore);  /* a=a+b for next estimate */
   5774       1.1  mrg       if (pp==p) continue;		     /* precision is at maximum */
   5775       1.1  mrg       /* lengthen the next calculation */
   5776       1.1  mrg       pp=pp*2;				     /* double precision */
   5777       1.1  mrg       if (pp>p) pp=p;			     /* clamp to maximum */
   5778       1.1  mrg       aset.digits=pp;			     /* working context */
   5779       1.1  mrg       bset.digits=pp+rhs->digits;	     /* wider context */
   5780       1.1  mrg       } /* Newton's iteration */
   5781       1.1  mrg 
   5782       1.1  mrg     #if DECCHECK
   5783       1.1  mrg     /* just a sanity check; remove the test to show always */
   5784       1.1  mrg     if (iterations>24)
   5785       1.1  mrg       printf("Ln iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
   5786       1.1  mrg 	    (LI)iterations, (LI)*status, (LI)p, (LI)rhs->digits);
   5787       1.1  mrg     #endif
   5788       1.1  mrg 
   5789       1.1  mrg     /* Copy and round the result to res */
   5790       1.1  mrg     residue=1;				/* indicate dirt to right */
   5791       1.1  mrg     if (ISZERO(a)) residue=0;		/* .. unless underflowed to 0 */
   5792       1.1  mrg     aset.digits=set->digits;		/* [use default rounding] */
   5793       1.1  mrg     decCopyFit(res, a, &aset, &residue, status); /* copy & shorten */
   5794       1.1  mrg     decFinish(res, set, &residue, status);	 /* cleanup/set flags */
   5795       1.1  mrg     } while(0); 			/* end protected */
   5796       1.1  mrg 
   5797   1.1.1.2  mrg   free(allocbufa); /* drop any storage used */
   5798   1.1.1.2  mrg   free(allocbufb); /* .. */
   5799       1.1  mrg   /* [status is handled by caller] */
   5800       1.1  mrg   return res;
   5801       1.1  mrg   } /* decLnOp */
   5802       1.1  mrg 
   5803       1.1  mrg /* ------------------------------------------------------------------ */
   5804       1.1  mrg /* decQuantizeOp  -- force exponent to requested value		      */
   5805       1.1  mrg /*								      */
   5806       1.1  mrg /*   This computes C = op(A, B), where op adjusts the coefficient     */
   5807       1.1  mrg /*   of C (by rounding or shifting) such that the exponent (-scale)   */
   5808       1.1  mrg /*   of C has the value B or matches the exponent of B. 	      */
   5809       1.1  mrg /*   The numerical value of C will equal A, except for the effects of */
   5810       1.1  mrg /*   any rounding that occurred.				      */
   5811       1.1  mrg /*								      */
   5812       1.1  mrg /*   res is C, the result.  C may be A or B			      */
   5813       1.1  mrg /*   lhs is A, the number to adjust				      */
   5814       1.1  mrg /*   rhs is B, the requested exponent				      */
   5815       1.1  mrg /*   set is the context 					      */
   5816       1.1  mrg /*   quant is 1 for quantize or 0 for rescale			      */
   5817       1.1  mrg /*   status is the status accumulator (this can be called without     */
   5818       1.1  mrg /*	    risk of control loss)				      */
   5819       1.1  mrg /*								      */
   5820       1.1  mrg /* C must have space for set->digits digits.			      */
   5821       1.1  mrg /*								      */
   5822       1.1  mrg /* Unless there is an error or the result is infinite, the exponent   */
   5823       1.1  mrg /* after the operation is guaranteed to be that requested.	      */
   5824       1.1  mrg /* ------------------------------------------------------------------ */
   5825       1.1  mrg static decNumber * decQuantizeOp(decNumber *res, const decNumber *lhs,
   5826       1.1  mrg 				 const decNumber *rhs, decContext *set,
   5827       1.1  mrg 				 Flag quant, uInt *status) {
   5828       1.1  mrg   #if DECSUBSET
   5829       1.1  mrg   decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
   5830       1.1  mrg   decNumber *allocrhs=NULL;	   /* .., rhs */
   5831       1.1  mrg   #endif
   5832       1.1  mrg   const decNumber *inrhs=rhs;	   /* save original rhs */
   5833       1.1  mrg   Int	reqdigits=set->digits;	   /* requested DIGITS */
   5834       1.1  mrg   Int	reqexp; 		   /* requested exponent [-scale] */
   5835       1.1  mrg   Int	residue=0;		   /* rounding residue */
   5836       1.1  mrg   Int	etiny=set->emin-(reqdigits-1);
   5837       1.1  mrg 
   5838       1.1  mrg   #if DECCHECK
   5839       1.1  mrg   if (decCheckOperands(res, lhs, rhs, set)) return res;
   5840       1.1  mrg   #endif
   5841       1.1  mrg 
   5842       1.1  mrg   do {				   /* protect allocated storage */
   5843       1.1  mrg     #if DECSUBSET
   5844       1.1  mrg     if (!set->extended) {
   5845       1.1  mrg       /* reduce operands and set lostDigits status, as needed */
   5846       1.1  mrg       if (lhs->digits>reqdigits) {
   5847       1.1  mrg 	alloclhs=decRoundOperand(lhs, set, status);
   5848       1.1  mrg 	if (alloclhs==NULL) break;
   5849       1.1  mrg 	lhs=alloclhs;
   5850       1.1  mrg 	}
   5851       1.1  mrg       if (rhs->digits>reqdigits) { /* [this only checks lostDigits] */
   5852       1.1  mrg 	allocrhs=decRoundOperand(rhs, set, status);
   5853       1.1  mrg 	if (allocrhs==NULL) break;
   5854       1.1  mrg 	rhs=allocrhs;
   5855       1.1  mrg 	}
   5856       1.1  mrg       }
   5857       1.1  mrg     #endif
   5858       1.1  mrg     /* [following code does not require input rounding] */
   5859       1.1  mrg 
   5860       1.1  mrg     /* Handle special values */
   5861       1.1  mrg     if (SPECIALARGS) {
   5862       1.1  mrg       /* NaNs get usual processing */
   5863       1.1  mrg       if (SPECIALARGS & (DECSNAN | DECNAN))
   5864       1.1  mrg 	decNaNs(res, lhs, rhs, set, status);
   5865       1.1  mrg       /* one infinity but not both is bad */
   5866       1.1  mrg       else if ((lhs->bits ^ rhs->bits) & DECINF)
   5867       1.1  mrg 	*status|=DEC_Invalid_operation;
   5868       1.1  mrg       /* both infinity: return lhs */
   5869       1.1  mrg       else decNumberCopy(res, lhs);	     /* [nop if in place] */
   5870       1.1  mrg       break;
   5871       1.1  mrg       }
   5872       1.1  mrg 
   5873       1.1  mrg     /* set requested exponent */
   5874       1.1  mrg     if (quant) reqexp=inrhs->exponent;	/* quantize -- match exponents */
   5875       1.1  mrg      else {				/* rescale -- use value of rhs */
   5876       1.1  mrg       /* Original rhs must be an integer that fits and is in range, */
   5877       1.1  mrg       /* which could be from -1999999997 to +999999999, thanks to */
   5878       1.1  mrg       /* subnormals */
   5879       1.1  mrg       reqexp=decGetInt(inrhs);		     /* [cannot fail] */
   5880       1.1  mrg       }
   5881       1.1  mrg 
   5882       1.1  mrg     #if DECSUBSET
   5883       1.1  mrg     if (!set->extended) etiny=set->emin;     /* no subnormals */
   5884       1.1  mrg     #endif
   5885       1.1  mrg 
   5886       1.1  mrg     if (reqexp==BADINT			     /* bad (rescale only) or .. */
   5887       1.1  mrg      || reqexp==BIGODD || reqexp==BIGEVEN    /* very big (ditto) or .. */
   5888       1.1  mrg      || (reqexp<etiny)			     /* < lowest */
   5889       1.1  mrg      || (reqexp>set->emax)) {		     /* > emax */
   5890       1.1  mrg       *status|=DEC_Invalid_operation;
   5891       1.1  mrg       break;}
   5892       1.1  mrg 
   5893       1.1  mrg     /* the RHS has been processed, so it can be overwritten now if necessary */
   5894       1.1  mrg     if (ISZERO(lhs)) {			     /* zero coefficient unchanged */
   5895       1.1  mrg       decNumberCopy(res, lhs);		     /* [nop if in place] */
   5896       1.1  mrg       res->exponent=reqexp;		     /* .. just set exponent */
   5897       1.1  mrg       #if DECSUBSET
   5898       1.1  mrg       if (!set->extended) res->bits=0;	     /* subset specification; no -0 */
   5899       1.1  mrg       #endif
   5900       1.1  mrg       }
   5901       1.1  mrg      else {				     /* non-zero lhs */
   5902       1.1  mrg       Int adjust=reqexp-lhs->exponent;	     /* digit adjustment needed */
   5903       1.1  mrg       /* if adjusted coefficient will definitely not fit, give up now */
   5904       1.1  mrg       if ((lhs->digits-adjust)>reqdigits) {
   5905       1.1  mrg 	*status|=DEC_Invalid_operation;
   5906       1.1  mrg 	break;
   5907       1.1  mrg 	}
   5908       1.1  mrg 
   5909       1.1  mrg       if (adjust>0) {			     /* increasing exponent */
   5910       1.1  mrg 	/* this will decrease the length of the coefficient by adjust */
   5911       1.1  mrg 	/* digits, and must round as it does so */
   5912       1.1  mrg 	decContext workset;		     /* work */
   5913       1.1  mrg 	workset=*set;			     /* clone rounding, etc. */
   5914       1.1  mrg 	workset.digits=lhs->digits-adjust;   /* set requested length */
   5915       1.1  mrg 	/* [note that the latter can be <1, here] */
   5916       1.1  mrg 	decCopyFit(res, lhs, &workset, &residue, status); /* fit to result */
   5917       1.1  mrg 	decApplyRound(res, &workset, residue, status);	  /* .. and round */
   5918       1.1  mrg 	residue=0;					  /* [used] */
   5919       1.1  mrg 	/* If just rounded a 999s case, exponent will be off by one; */
   5920       1.1  mrg 	/* adjust back (after checking space), if so. */
   5921       1.1  mrg 	if (res->exponent>reqexp) {
   5922       1.1  mrg 	  /* re-check needed, e.g., for quantize(0.9999, 0.001) under */
   5923       1.1  mrg 	  /* set->digits==3 */
   5924       1.1  mrg 	  if (res->digits==reqdigits) {      /* cannot shift by 1 */
   5925       1.1  mrg 	    *status&=~(DEC_Inexact | DEC_Rounded); /* [clean these] */
   5926       1.1  mrg 	    *status|=DEC_Invalid_operation;
   5927       1.1  mrg 	    break;
   5928       1.1  mrg 	    }
   5929       1.1  mrg 	  res->digits=decShiftToMost(res->lsu, res->digits, 1); /* shift */
   5930       1.1  mrg 	  res->exponent--;		     /* (re)adjust the exponent. */
   5931       1.1  mrg 	  }
   5932       1.1  mrg 	#if DECSUBSET
   5933       1.1  mrg 	if (ISZERO(res) && !set->extended) res->bits=0; /* subset; no -0 */
   5934       1.1  mrg 	#endif
   5935       1.1  mrg 	} /* increase */
   5936       1.1  mrg        else /* adjust<=0 */ {		     /* decreasing or = exponent */
   5937       1.1  mrg 	/* this will increase the length of the coefficient by -adjust */
   5938       1.1  mrg 	/* digits, by adding zero or more trailing zeros; this is */
   5939       1.1  mrg 	/* already checked for fit, above */
   5940       1.1  mrg 	decNumberCopy(res, lhs);	     /* [it will fit] */
   5941       1.1  mrg 	/* if padding needed (adjust<0), add it now... */
   5942       1.1  mrg 	if (adjust<0) {
   5943       1.1  mrg 	  res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
   5944       1.1  mrg 	  res->exponent+=adjust;	     /* adjust the exponent */
   5945       1.1  mrg 	  }
   5946       1.1  mrg 	} /* decrease */
   5947       1.1  mrg       } /* non-zero */
   5948       1.1  mrg 
   5949       1.1  mrg     /* Check for overflow [do not use Finalize in this case, as an */
   5950       1.1  mrg     /* overflow here is a "don't fit" situation] */
   5951       1.1  mrg     if (res->exponent>set->emax-res->digits+1) {  /* too big */
   5952       1.1  mrg       *status|=DEC_Invalid_operation;
   5953       1.1  mrg       break;
   5954       1.1  mrg       }
   5955       1.1  mrg      else {
   5956       1.1  mrg       decFinalize(res, set, &residue, status);	  /* set subnormal flags */
   5957       1.1  mrg       *status&=~DEC_Underflow;		/* suppress Underflow [as per 754] */
   5958       1.1  mrg       }
   5959       1.1  mrg     } while(0); 			/* end protected */
   5960       1.1  mrg 
   5961       1.1  mrg   #if DECSUBSET
   5962   1.1.1.2  mrg   free(allocrhs);	/* drop any storage used */
   5963   1.1.1.2  mrg   free(alloclhs);	/* .. */
   5964       1.1  mrg   #endif
   5965       1.1  mrg   return res;
   5966       1.1  mrg   } /* decQuantizeOp */
   5967       1.1  mrg 
   5968       1.1  mrg /* ------------------------------------------------------------------ */
   5969       1.1  mrg /* decCompareOp -- compare, min, or max two Numbers		      */
   5970       1.1  mrg /*								      */
   5971       1.1  mrg /*   This computes C = A ? B and carries out one of four operations:  */
   5972       1.1  mrg /*     COMPARE	  -- returns the signum (as a number) giving the      */
   5973       1.1  mrg /*		     result of a comparison unless one or both	      */
   5974       1.1  mrg /*		     operands is a NaN (in which case a NaN results)  */
   5975       1.1  mrg /*     COMPSIG	  -- as COMPARE except that a quiet NaN raises	      */
   5976       1.1  mrg /*		     Invalid operation. 			      */
   5977       1.1  mrg /*     COMPMAX	  -- returns the larger of the operands, using the    */
   5978       1.1  mrg /*		     754 maxnum operation			      */
   5979       1.1  mrg /*     COMPMAXMAG -- ditto, comparing absolute values		      */
   5980       1.1  mrg /*     COMPMIN	  -- the 754 minnum operation			      */
   5981       1.1  mrg /*     COMPMINMAG -- ditto, comparing absolute values		      */
   5982       1.1  mrg /*     COMTOTAL   -- returns the signum (as a number) giving the      */
   5983       1.1  mrg /*		     result of a comparison using 754 total ordering  */
   5984       1.1  mrg /*								      */
   5985       1.1  mrg /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
   5986       1.1  mrg /*   lhs is A							      */
   5987       1.1  mrg /*   rhs is B							      */
   5988       1.1  mrg /*   set is the context 					      */
   5989       1.1  mrg /*   op  is the operation flag					      */
   5990       1.1  mrg /*   status is the usual accumulator				      */
   5991       1.1  mrg /*								      */
   5992       1.1  mrg /* C must have space for one digit for COMPARE or set->digits for     */
   5993       1.1  mrg /* COMPMAX, COMPMIN, COMPMAXMAG, or COMPMINMAG. 		      */
   5994       1.1  mrg /* ------------------------------------------------------------------ */
   5995       1.1  mrg /* The emphasis here is on speed for common cases, and avoiding       */
   5996       1.1  mrg /* coefficient comparison if possible.				      */
   5997       1.1  mrg /* ------------------------------------------------------------------ */
   5998       1.1  mrg decNumber * decCompareOp(decNumber *res, const decNumber *lhs,
   5999       1.1  mrg 			 const decNumber *rhs, decContext *set,
   6000       1.1  mrg 			 Flag op, uInt *status) {
   6001       1.1  mrg   #if DECSUBSET
   6002       1.1  mrg   decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
   6003       1.1  mrg   decNumber *allocrhs=NULL;	   /* .., rhs */
   6004       1.1  mrg   #endif
   6005       1.1  mrg   Int	result=0;		   /* default result value */
   6006       1.1  mrg   uByte merged; 		   /* work */
   6007       1.1  mrg 
   6008       1.1  mrg   #if DECCHECK
   6009       1.1  mrg   if (decCheckOperands(res, lhs, rhs, set)) return res;
   6010       1.1  mrg   #endif
   6011       1.1  mrg 
   6012       1.1  mrg   do {				   /* protect allocated storage */
   6013       1.1  mrg     #if DECSUBSET
   6014       1.1  mrg     if (!set->extended) {
   6015       1.1  mrg       /* reduce operands and set lostDigits status, as needed */
   6016       1.1  mrg       if (lhs->digits>set->digits) {
   6017       1.1  mrg 	alloclhs=decRoundOperand(lhs, set, status);
   6018       1.1  mrg 	if (alloclhs==NULL) {result=BADINT; break;}
   6019       1.1  mrg 	lhs=alloclhs;
   6020       1.1  mrg 	}
   6021       1.1  mrg       if (rhs->digits>set->digits) {
   6022       1.1  mrg 	allocrhs=decRoundOperand(rhs, set, status);
   6023       1.1  mrg 	if (allocrhs==NULL) {result=BADINT; break;}
   6024       1.1  mrg 	rhs=allocrhs;
   6025       1.1  mrg 	}
   6026       1.1  mrg       }
   6027       1.1  mrg     #endif
   6028       1.1  mrg     /* [following code does not require input rounding] */
   6029       1.1  mrg 
   6030       1.1  mrg     /* If total ordering then handle differing signs 'up front' */
   6031       1.1  mrg     if (op==COMPTOTAL) {		/* total ordering */
   6032   1.1.1.8  mrg       if (decNumberIsNegative(lhs) && !decNumberIsNegative(rhs)) {
   6033       1.1  mrg 	result=-1;
   6034       1.1  mrg 	break;
   6035       1.1  mrg 	}
   6036   1.1.1.8  mrg       if (!decNumberIsNegative(lhs) && decNumberIsNegative(rhs)) {
   6037       1.1  mrg 	result=+1;
   6038       1.1  mrg 	break;
   6039       1.1  mrg 	}
   6040       1.1  mrg       }
   6041       1.1  mrg 
   6042       1.1  mrg     /* handle NaNs specially; let infinities drop through */
   6043       1.1  mrg     /* This assumes sNaN (even just one) leads to NaN. */
   6044       1.1  mrg     merged=(lhs->bits | rhs->bits) & (DECSNAN | DECNAN);
   6045       1.1  mrg     if (merged) {			/* a NaN bit set */
   6046       1.1  mrg       if (op==COMPARE); 		/* result will be NaN */
   6047       1.1  mrg        else if (op==COMPSIG)		/* treat qNaN as sNaN */
   6048       1.1  mrg 	*status|=DEC_Invalid_operation | DEC_sNaN;
   6049       1.1  mrg        else if (op==COMPTOTAL) {	/* total ordering, always finite */
   6050       1.1  mrg 	/* signs are known to be the same; compute the ordering here */
   6051       1.1  mrg 	/* as if the signs are both positive, then invert for negatives */
   6052       1.1  mrg 	if (!decNumberIsNaN(lhs)) result=-1;
   6053       1.1  mrg 	 else if (!decNumberIsNaN(rhs)) result=+1;
   6054       1.1  mrg 	 /* here if both NaNs */
   6055       1.1  mrg 	 else if (decNumberIsSNaN(lhs) && decNumberIsQNaN(rhs)) result=-1;
   6056       1.1  mrg 	 else if (decNumberIsQNaN(lhs) && decNumberIsSNaN(rhs)) result=+1;
   6057       1.1  mrg 	 else { /* both NaN or both sNaN */
   6058       1.1  mrg 	  /* now it just depends on the payload */
   6059       1.1  mrg 	  result=decUnitCompare(lhs->lsu, D2U(lhs->digits),
   6060       1.1  mrg 				rhs->lsu, D2U(rhs->digits), 0);
   6061       1.1  mrg 	  /* [Error not possible, as these are 'aligned'] */
   6062       1.1  mrg 	  } /* both same NaNs */
   6063       1.1  mrg 	if (decNumberIsNegative(lhs)) result=-result;
   6064       1.1  mrg 	break;
   6065       1.1  mrg 	} /* total order */
   6066       1.1  mrg 
   6067       1.1  mrg        else if (merged & DECSNAN);	     /* sNaN -> qNaN */
   6068       1.1  mrg        else { /* here if MIN or MAX and one or two quiet NaNs */
   6069       1.1  mrg 	/* min or max -- 754 rules ignore single NaN */
   6070       1.1  mrg 	if (!decNumberIsNaN(lhs) || !decNumberIsNaN(rhs)) {
   6071       1.1  mrg 	  /* just one NaN; force choice to be the non-NaN operand */
   6072       1.1  mrg 	  op=COMPMAX;
   6073       1.1  mrg 	  if (lhs->bits & DECNAN) result=-1; /* pick rhs */
   6074       1.1  mrg 			     else result=+1; /* pick lhs */
   6075       1.1  mrg 	  break;
   6076       1.1  mrg 	  }
   6077       1.1  mrg 	} /* max or min */
   6078       1.1  mrg       op=COMPNAN;			     /* use special path */
   6079       1.1  mrg       decNaNs(res, lhs, rhs, set, status);   /* propagate NaN */
   6080       1.1  mrg       break;
   6081       1.1  mrg       }
   6082       1.1  mrg     /* have numbers */
   6083       1.1  mrg     if (op==COMPMAXMAG || op==COMPMINMAG) result=decCompare(lhs, rhs, 1);
   6084       1.1  mrg      else result=decCompare(lhs, rhs, 0);    /* sign matters */
   6085       1.1  mrg     } while(0); 			     /* end protected */
   6086       1.1  mrg 
   6087       1.1  mrg   if (result==BADINT) *status|=DEC_Insufficient_storage; /* rare */
   6088       1.1  mrg    else {
   6089       1.1  mrg     if (op==COMPARE || op==COMPSIG ||op==COMPTOTAL) { /* returning signum */
   6090       1.1  mrg       if (op==COMPTOTAL && result==0) {
   6091       1.1  mrg 	/* operands are numerically equal or same NaN (and same sign, */
   6092       1.1  mrg 	/* tested first); if identical, leave result 0 */
   6093       1.1  mrg 	if (lhs->exponent!=rhs->exponent) {
   6094       1.1  mrg 	  if (lhs->exponent<rhs->exponent) result=-1;
   6095       1.1  mrg 	   else result=+1;
   6096       1.1  mrg 	  if (decNumberIsNegative(lhs)) result=-result;
   6097       1.1  mrg 	  } /* lexp!=rexp */
   6098       1.1  mrg 	} /* total-order by exponent */
   6099       1.1  mrg       decNumberZero(res);		/* [always a valid result] */
   6100       1.1  mrg       if (result!=0) {			/* must be -1 or +1 */
   6101       1.1  mrg 	*res->lsu=1;
   6102       1.1  mrg 	if (result<0) res->bits=DECNEG;
   6103       1.1  mrg 	}
   6104       1.1  mrg       }
   6105       1.1  mrg      else if (op==COMPNAN);		/* special, drop through */
   6106       1.1  mrg      else {				/* MAX or MIN, non-NaN result */
   6107       1.1  mrg       Int residue=0;			/* rounding accumulator */
   6108       1.1  mrg       /* choose the operand for the result */
   6109       1.1  mrg       const decNumber *choice;
   6110       1.1  mrg       if (result==0) { /* operands are numerically equal */
   6111       1.1  mrg 	/* choose according to sign then exponent (see 754) */
   6112       1.1  mrg 	uByte slhs=(lhs->bits & DECNEG);
   6113       1.1  mrg 	uByte srhs=(rhs->bits & DECNEG);
   6114       1.1  mrg 	#if DECSUBSET
   6115       1.1  mrg 	if (!set->extended) {		/* subset: force left-hand */
   6116       1.1  mrg 	  op=COMPMAX;
   6117       1.1  mrg 	  result=+1;
   6118       1.1  mrg 	  }
   6119       1.1  mrg 	else
   6120       1.1  mrg 	#endif
   6121       1.1  mrg 	if (slhs!=srhs) {	   /* signs differ */
   6122       1.1  mrg 	  if (slhs) result=-1;	   /* rhs is max */
   6123       1.1  mrg 	       else result=+1;	   /* lhs is max */
   6124       1.1  mrg 	  }
   6125       1.1  mrg 	 else if (slhs && srhs) {  /* both negative */
   6126       1.1  mrg 	  if (lhs->exponent<rhs->exponent) result=+1;
   6127       1.1  mrg 				      else result=-1;
   6128       1.1  mrg 	  /* [if equal, use lhs, technically identical] */
   6129       1.1  mrg 	  }
   6130       1.1  mrg 	 else { 		   /* both positive */
   6131       1.1  mrg 	  if (lhs->exponent>rhs->exponent) result=+1;
   6132       1.1  mrg 				      else result=-1;
   6133       1.1  mrg 	  /* [ditto] */
   6134       1.1  mrg 	  }
   6135       1.1  mrg 	} /* numerically equal */
   6136       1.1  mrg       /* here result will be non-0; reverse if looking for MIN */
   6137       1.1  mrg       if (op==COMPMIN || op==COMPMINMAG) result=-result;
   6138       1.1  mrg       choice=(result>0 ? lhs : rhs);	/* choose */
   6139       1.1  mrg       /* copy chosen to result, rounding if need be */
   6140       1.1  mrg       decCopyFit(res, choice, set, &residue, status);
   6141       1.1  mrg       decFinish(res, set, &residue, status);
   6142       1.1  mrg       }
   6143       1.1  mrg     }
   6144       1.1  mrg   #if DECSUBSET
   6145   1.1.1.2  mrg   free(allocrhs);	/* free any storage used */
   6146   1.1.1.2  mrg   free(alloclhs);	/* .. */
   6147       1.1  mrg   #endif
   6148       1.1  mrg   return res;
   6149       1.1  mrg   } /* decCompareOp */
   6150       1.1  mrg 
   6151       1.1  mrg /* ------------------------------------------------------------------ */
   6152       1.1  mrg /* decCompare -- compare two decNumbers by numerical value	      */
   6153       1.1  mrg /*								      */
   6154       1.1  mrg /*  This routine compares A ? B without altering them.		      */
   6155       1.1  mrg /*								      */
   6156       1.1  mrg /*  Arg1 is A, a decNumber which is not a NaN			      */
   6157       1.1  mrg /*  Arg2 is B, a decNumber which is not a NaN			      */
   6158       1.1  mrg /*  Arg3 is 1 for a sign-independent compare, 0 otherwise	      */
   6159       1.1  mrg /*								      */
   6160       1.1  mrg /*  returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure   */
   6161       1.1  mrg /*  (the only possible failure is an allocation error)		      */
   6162       1.1  mrg /* ------------------------------------------------------------------ */
   6163       1.1  mrg static Int decCompare(const decNumber *lhs, const decNumber *rhs,
   6164       1.1  mrg 		      Flag abs) {
   6165       1.1  mrg   Int	result; 		   /* result value */
   6166       1.1  mrg   Int	sigr;			   /* rhs signum */
   6167       1.1  mrg   Int	compare;		   /* work */
   6168       1.1  mrg 
   6169       1.1  mrg   result=1;				     /* assume signum(lhs) */
   6170       1.1  mrg   if (ISZERO(lhs)) result=0;
   6171       1.1  mrg   if (abs) {
   6172       1.1  mrg     if (ISZERO(rhs)) return result;	     /* LHS wins or both 0 */
   6173       1.1  mrg     /* RHS is non-zero */
   6174       1.1  mrg     if (result==0) return -1;		     /* LHS is 0; RHS wins */
   6175       1.1  mrg     /* [here, both non-zero, result=1] */
   6176       1.1  mrg     }
   6177       1.1  mrg    else {				     /* signs matter */
   6178       1.1  mrg     if (result && decNumberIsNegative(lhs)) result=-1;
   6179       1.1  mrg     sigr=1;				     /* compute signum(rhs) */
   6180       1.1  mrg     if (ISZERO(rhs)) sigr=0;
   6181       1.1  mrg      else if (decNumberIsNegative(rhs)) sigr=-1;
   6182       1.1  mrg     if (result > sigr) return +1;	     /* L > R, return 1 */
   6183       1.1  mrg     if (result < sigr) return -1;	     /* L < R, return -1 */
   6184       1.1  mrg     if (result==0) return 0;		       /* both 0 */
   6185       1.1  mrg     }
   6186       1.1  mrg 
   6187       1.1  mrg   /* signums are the same; both are non-zero */
   6188       1.1  mrg   if ((lhs->bits | rhs->bits) & DECINF) {    /* one or more infinities */
   6189       1.1  mrg     if (decNumberIsInfinite(rhs)) {
   6190       1.1  mrg       if (decNumberIsInfinite(lhs)) result=0;/* both infinite */
   6191       1.1  mrg        else result=-result;		     /* only rhs infinite */
   6192       1.1  mrg       }
   6193       1.1  mrg     return result;
   6194       1.1  mrg     }
   6195       1.1  mrg   /* must compare the coefficients, allowing for exponents */
   6196       1.1  mrg   if (lhs->exponent>rhs->exponent) {	     /* LHS exponent larger */
   6197       1.1  mrg     /* swap sides, and sign */
   6198       1.1  mrg     const decNumber *temp=lhs;
   6199       1.1  mrg     lhs=rhs;
   6200       1.1  mrg     rhs=temp;
   6201       1.1  mrg     result=-result;
   6202       1.1  mrg     }
   6203       1.1  mrg   compare=decUnitCompare(lhs->lsu, D2U(lhs->digits),
   6204       1.1  mrg 			 rhs->lsu, D2U(rhs->digits),
   6205       1.1  mrg 			 rhs->exponent-lhs->exponent);
   6206       1.1  mrg   if (compare!=BADINT) compare*=result;      /* comparison succeeded */
   6207       1.1  mrg   return compare;
   6208       1.1  mrg   } /* decCompare */
   6209       1.1  mrg 
   6210       1.1  mrg /* ------------------------------------------------------------------ */
   6211       1.1  mrg /* decUnitCompare -- compare two >=0 integers in Unit arrays	      */
   6212       1.1  mrg /*								      */
   6213       1.1  mrg /*  This routine compares A ? B*10**E where A and B are unit arrays   */
   6214       1.1  mrg /*  A is a plain integer					      */
   6215       1.1  mrg /*  B has an exponent of E (which must be non-negative) 	      */
   6216       1.1  mrg /*								      */
   6217       1.1  mrg /*  Arg1 is A first Unit (lsu)					      */
   6218       1.1  mrg /*  Arg2 is A length in Units					      */
   6219       1.1  mrg /*  Arg3 is B first Unit (lsu)					      */
   6220       1.1  mrg /*  Arg4 is B length in Units					      */
   6221       1.1  mrg /*  Arg5 is E (0 if the units are aligned)			      */
   6222       1.1  mrg /*								      */
   6223       1.1  mrg /*  returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure   */
   6224       1.1  mrg /*  (the only possible failure is an allocation error, which can      */
   6225       1.1  mrg /*  only occur if E!=0) 					      */
   6226       1.1  mrg /* ------------------------------------------------------------------ */
   6227       1.1  mrg static Int decUnitCompare(const Unit *a, Int alength,
   6228       1.1  mrg 			  const Unit *b, Int blength, Int exp) {
   6229       1.1  mrg   Unit	*acc;			   /* accumulator for result */
   6230       1.1  mrg   Unit	accbuff[SD2U(DECBUFFER*2+1)]; /* local buffer */
   6231       1.1  mrg   Unit	*allocacc=NULL; 	   /* -> allocated acc buffer, iff allocated */
   6232       1.1  mrg   Int	accunits, need; 	   /* units in use or needed for acc */
   6233       1.1  mrg   const Unit *l, *r, *u;	   /* work */
   6234       1.1  mrg   Int	expunits, exprem, result;  /* .. */
   6235       1.1  mrg 
   6236       1.1  mrg   if (exp==0) { 		   /* aligned; fastpath */
   6237       1.1  mrg     if (alength>blength) return 1;
   6238       1.1  mrg     if (alength<blength) return -1;
   6239       1.1  mrg     /* same number of units in both -- need unit-by-unit compare */
   6240       1.1  mrg     l=a+alength-1;
   6241       1.1  mrg     r=b+alength-1;
   6242       1.1  mrg     for (;l>=a; l--, r--) {
   6243       1.1  mrg       if (*l>*r) return 1;
   6244       1.1  mrg       if (*l<*r) return -1;
   6245       1.1  mrg       }
   6246       1.1  mrg     return 0;			   /* all units match */
   6247       1.1  mrg     } /* aligned */
   6248       1.1  mrg 
   6249       1.1  mrg   /* Unaligned.  If one is >1 unit longer than the other, padded */
   6250       1.1  mrg   /* approximately, then can return easily */
   6251       1.1  mrg   if (alength>blength+(Int)D2U(exp)) return 1;
   6252       1.1  mrg   if (alength+1<blength+(Int)D2U(exp)) return -1;
   6253       1.1  mrg 
   6254       1.1  mrg   /* Need to do a real subtract.  For this, a result buffer is needed */
   6255       1.1  mrg   /* even though only the sign is of interest.	Its length needs */
   6256       1.1  mrg   /* to be the larger of alength and padded blength, +2 */
   6257       1.1  mrg   need=blength+D2U(exp);		/* maximum real length of B */
   6258       1.1  mrg   if (need<alength) need=alength;
   6259       1.1  mrg   need+=2;
   6260       1.1  mrg   acc=accbuff;				/* assume use local buffer */
   6261       1.1  mrg   if (need*sizeof(Unit)>sizeof(accbuff)) {
   6262       1.1  mrg     allocacc=(Unit *)malloc(need*sizeof(Unit));
   6263       1.1  mrg     if (allocacc==NULL) return BADINT;	/* hopeless -- abandon */
   6264       1.1  mrg     acc=allocacc;
   6265       1.1  mrg     }
   6266       1.1  mrg   /* Calculate units and remainder from exponent. */
   6267       1.1  mrg   expunits=exp/DECDPUN;
   6268       1.1  mrg   exprem=exp%DECDPUN;
   6269       1.1  mrg   /* subtract [A+B*(-m)] */
   6270       1.1  mrg   accunits=decUnitAddSub(a, alength, b, blength, expunits, acc,
   6271       1.1  mrg 			 -(Int)powers[exprem]);
   6272       1.1  mrg   /* [UnitAddSub result may have leading zeros, even on zero] */
   6273       1.1  mrg   if (accunits<0) result=-1;		/* negative result */
   6274       1.1  mrg    else {				/* non-negative result */
   6275       1.1  mrg     /* check units of the result before freeing any storage */
   6276       1.1  mrg     for (u=acc; u<acc+accunits-1 && *u==0;) u++;
   6277       1.1  mrg     result=(*u==0 ? 0 : +1);
   6278       1.1  mrg     }
   6279       1.1  mrg   /* clean up and return the result */
   6280   1.1.1.2  mrg   free(allocacc);	/* drop any storage used */
   6281       1.1  mrg   return result;
   6282       1.1  mrg   } /* decUnitCompare */
   6283       1.1  mrg 
   6284       1.1  mrg /* ------------------------------------------------------------------ */
   6285       1.1  mrg /* decUnitAddSub -- add or subtract two >=0 integers in Unit arrays   */
   6286       1.1  mrg /*								      */
   6287       1.1  mrg /*  This routine performs the calculation:			      */
   6288       1.1  mrg /*								      */
   6289       1.1  mrg /*  C=A+(B*M)							      */
   6290       1.1  mrg /*								      */
   6291       1.1  mrg /*  Where M is in the range -DECDPUNMAX through +DECDPUNMAX.	      */
   6292       1.1  mrg /*								      */
   6293       1.1  mrg /*  A may be shorter or longer than B.				      */
   6294       1.1  mrg /*								      */
   6295       1.1  mrg /*  Leading zeros are not removed after a calculation.	The result is */
   6296       1.1  mrg /*  either the same length as the longer of A and B (adding any       */
   6297       1.1  mrg /*  shift), or one Unit longer than that (if a Unit carry occurred).  */
   6298       1.1  mrg /*								      */
   6299       1.1  mrg /*  A and B content are not altered unless C is also A or B.	      */
   6300       1.1  mrg /*  C may be the same array as A or B, but only if no zero padding is */
   6301       1.1  mrg /*  requested (that is, C may be B only if bshift==0).		      */
   6302       1.1  mrg /*  C is filled from the lsu; only those units necessary to complete  */
   6303       1.1  mrg /*  the calculation are referenced.				      */
   6304       1.1  mrg /*								      */
   6305       1.1  mrg /*  Arg1 is A first Unit (lsu)					      */
   6306       1.1  mrg /*  Arg2 is A length in Units					      */
   6307       1.1  mrg /*  Arg3 is B first Unit (lsu)					      */
   6308       1.1  mrg /*  Arg4 is B length in Units					      */
   6309       1.1  mrg /*  Arg5 is B shift in Units  (>=0; pads with 0 units if positive)    */
   6310       1.1  mrg /*  Arg6 is C first Unit (lsu)					      */
   6311       1.1  mrg /*  Arg7 is M, the multiplier					      */
   6312       1.1  mrg /*								      */
   6313       1.1  mrg /*  returns the count of Units written to C, which will be non-zero   */
   6314       1.1  mrg /*  and negated if the result is negative.  That is, the sign of the  */
   6315       1.1  mrg /*  returned Int is the sign of the result (positive for zero) and    */
   6316       1.1  mrg /*  the absolute value of the Int is the count of Units.	      */
   6317       1.1  mrg /*								      */
   6318       1.1  mrg /*  It is the caller's responsibility to make sure that C size is     */
   6319       1.1  mrg /*  safe, allowing space if necessary for a one-Unit carry.	      */
   6320       1.1  mrg /*								      */
   6321       1.1  mrg /*  This routine is severely performance-critical; *any* change here  */
   6322       1.1  mrg /*  must be measured (timed) to assure no performance degradation.    */
   6323       1.1  mrg /*  In particular, trickery here tends to be counter-productive, as   */
   6324       1.1  mrg /*  increased complexity of code hurts register optimizations on      */
   6325       1.1  mrg /*  register-poor architectures.  Avoiding divisions is nearly	      */
   6326       1.1  mrg /*  always a Good Idea, however.				      */
   6327       1.1  mrg /*								      */
   6328       1.1  mrg /* Special thanks to Rick McGuire (IBM Cambridge, MA) and Dave Clark  */
   6329       1.1  mrg /* (IBM Warwick, UK) for some of the ideas used in this routine.      */
   6330       1.1  mrg /* ------------------------------------------------------------------ */
   6331       1.1  mrg static Int decUnitAddSub(const Unit *a, Int alength,
   6332       1.1  mrg 			 const Unit *b, Int blength, Int bshift,
   6333       1.1  mrg 			 Unit *c, Int m) {
   6334       1.1  mrg   const Unit *alsu=a;		   /* A lsu [need to remember it] */
   6335       1.1  mrg   Unit *clsu=c; 		   /* C ditto */
   6336       1.1  mrg   Unit *minC;			   /* low water mark for C */
   6337       1.1  mrg   Unit *maxC;			   /* high water mark for C */
   6338       1.1  mrg   eInt carry=0; 		   /* carry integer (could be Long) */
   6339       1.1  mrg   Int  add;			   /* work */
   6340       1.1  mrg   #if DECDPUN<=4		   /* myriadal, millenary, etc. */
   6341       1.1  mrg   Int  est;			   /* estimated quotient */
   6342       1.1  mrg   #endif
   6343       1.1  mrg 
   6344       1.1  mrg   #if DECTRACE
   6345       1.1  mrg   if (alength<1 || blength<1)
   6346       1.1  mrg     printf("decUnitAddSub: alen blen m %ld %ld [%ld]\n", alength, blength, m);
   6347       1.1  mrg   #endif
   6348       1.1  mrg 
   6349       1.1  mrg   maxC=c+alength;		   /* A is usually the longer */
   6350       1.1  mrg   minC=c+blength;		   /* .. and B the shorter */
   6351       1.1  mrg   if (bshift!=0) {		   /* B is shifted; low As copy across */
   6352       1.1  mrg     minC+=bshift;
   6353       1.1  mrg     /* if in place [common], skip copy unless there's a gap [rare] */
   6354       1.1  mrg     if (a==c && bshift<=alength) {
   6355       1.1  mrg       c+=bshift;
   6356       1.1  mrg       a+=bshift;
   6357       1.1  mrg       }
   6358       1.1  mrg      else for (; c<clsu+bshift; a++, c++) {  /* copy needed */
   6359       1.1  mrg       if (a<alsu+alength) *c=*a;
   6360       1.1  mrg        else *c=0;
   6361       1.1  mrg       }
   6362       1.1  mrg     }
   6363       1.1  mrg   if (minC>maxC) { /* swap */
   6364       1.1  mrg     Unit *hold=minC;
   6365       1.1  mrg     minC=maxC;
   6366       1.1  mrg     maxC=hold;
   6367       1.1  mrg     }
   6368       1.1  mrg 
   6369       1.1  mrg   /* For speed, do the addition as two loops; the first where both A */
   6370       1.1  mrg   /* and B contribute, and the second (if necessary) where only one or */
   6371       1.1  mrg   /* other of the numbers contribute. */
   6372       1.1  mrg   /* Carry handling is the same (i.e., duplicated) in each case. */
   6373       1.1  mrg   for (; c<minC; c++) {
   6374       1.1  mrg     carry+=*a;
   6375       1.1  mrg     a++;
   6376       1.1  mrg     carry+=((eInt)*b)*m;		/* [special-casing m=1/-1 */
   6377       1.1  mrg     b++;				/* here is not a win] */
   6378       1.1  mrg     /* here carry is new Unit of digits; it could be +ve or -ve */
   6379       1.1  mrg     if ((ueInt)carry<=DECDPUNMAX) {	/* fastpath 0-DECDPUNMAX */
   6380       1.1  mrg       *c=(Unit)carry;
   6381       1.1  mrg       carry=0;
   6382       1.1  mrg       continue;
   6383       1.1  mrg       }
   6384       1.1  mrg     #if DECDPUN==4			     /* use divide-by-multiply */
   6385       1.1  mrg       if (carry>=0) {
   6386       1.1  mrg 	est=(((ueInt)carry>>11)*53687)>>18;
   6387       1.1  mrg 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
   6388       1.1  mrg 	carry=est;			     /* likely quotient [89%] */
   6389       1.1  mrg 	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
   6390       1.1  mrg 	carry++;
   6391       1.1  mrg 	*c-=DECDPUNMAX+1;
   6392       1.1  mrg 	continue;
   6393       1.1  mrg 	}
   6394       1.1  mrg       /* negative case */
   6395       1.1  mrg       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
   6396       1.1  mrg       est=(((ueInt)carry>>11)*53687)>>18;
   6397       1.1  mrg       *c=(Unit)(carry-est*(DECDPUNMAX+1));
   6398       1.1  mrg       carry=est-(DECDPUNMAX+1); 	     /* correctly negative */
   6399       1.1  mrg       if (*c<DECDPUNMAX+1) continue;	     /* was OK */
   6400       1.1  mrg       carry++;
   6401       1.1  mrg       *c-=DECDPUNMAX+1;
   6402       1.1  mrg     #elif DECDPUN==3
   6403       1.1  mrg       if (carry>=0) {
   6404       1.1  mrg 	est=(((ueInt)carry>>3)*16777)>>21;
   6405       1.1  mrg 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
   6406       1.1  mrg 	carry=est;			     /* likely quotient [99%] */
   6407       1.1  mrg 	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
   6408       1.1  mrg 	carry++;
   6409       1.1  mrg 	*c-=DECDPUNMAX+1;
   6410       1.1  mrg 	continue;
   6411       1.1  mrg 	}
   6412       1.1  mrg       /* negative case */
   6413       1.1  mrg       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
   6414       1.1  mrg       est=(((ueInt)carry>>3)*16777)>>21;
   6415       1.1  mrg       *c=(Unit)(carry-est*(DECDPUNMAX+1));
   6416       1.1  mrg       carry=est-(DECDPUNMAX+1); 	     /* correctly negative */
   6417       1.1  mrg       if (*c<DECDPUNMAX+1) continue;	     /* was OK */
   6418       1.1  mrg       carry++;
   6419       1.1  mrg       *c-=DECDPUNMAX+1;
   6420       1.1  mrg     #elif DECDPUN<=2
   6421       1.1  mrg       /* Can use QUOT10 as carry <= 4 digits */
   6422       1.1  mrg       if (carry>=0) {
   6423       1.1  mrg 	est=QUOT10(carry, DECDPUN);
   6424       1.1  mrg 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
   6425       1.1  mrg 	carry=est;			     /* quotient */
   6426       1.1  mrg 	continue;
   6427       1.1  mrg 	}
   6428       1.1  mrg       /* negative case */
   6429       1.1  mrg       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
   6430       1.1  mrg       est=QUOT10(carry, DECDPUN);
   6431       1.1  mrg       *c=(Unit)(carry-est*(DECDPUNMAX+1));
   6432       1.1  mrg       carry=est-(DECDPUNMAX+1); 	     /* correctly negative */
   6433       1.1  mrg     #else
   6434       1.1  mrg       /* remainder operator is undefined if negative, so must test */
   6435       1.1  mrg       if ((ueInt)carry<(DECDPUNMAX+1)*2) {   /* fastpath carry +1 */
   6436       1.1  mrg 	*c=(Unit)(carry-(DECDPUNMAX+1));     /* [helps additions] */
   6437       1.1  mrg 	carry=1;
   6438       1.1  mrg 	continue;
   6439       1.1  mrg 	}
   6440       1.1  mrg       if (carry>=0) {
   6441       1.1  mrg 	*c=(Unit)(carry%(DECDPUNMAX+1));
   6442       1.1  mrg 	carry=carry/(DECDPUNMAX+1);
   6443       1.1  mrg 	continue;
   6444       1.1  mrg 	}
   6445       1.1  mrg       /* negative case */
   6446       1.1  mrg       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
   6447       1.1  mrg       *c=(Unit)(carry%(DECDPUNMAX+1));
   6448       1.1  mrg       carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
   6449       1.1  mrg     #endif
   6450       1.1  mrg     } /* c */
   6451       1.1  mrg 
   6452       1.1  mrg   /* now may have one or other to complete */
   6453       1.1  mrg   /* [pretest to avoid loop setup/shutdown] */
   6454       1.1  mrg   if (c<maxC) for (; c<maxC; c++) {
   6455       1.1  mrg     if (a<alsu+alength) {		/* still in A */
   6456       1.1  mrg       carry+=*a;
   6457       1.1  mrg       a++;
   6458       1.1  mrg       }
   6459       1.1  mrg      else {				/* inside B */
   6460       1.1  mrg       carry+=((eInt)*b)*m;
   6461       1.1  mrg       b++;
   6462       1.1  mrg       }
   6463       1.1  mrg     /* here carry is new Unit of digits; it could be +ve or -ve and */
   6464       1.1  mrg     /* magnitude up to DECDPUNMAX squared */
   6465       1.1  mrg     if ((ueInt)carry<=DECDPUNMAX) {	/* fastpath 0-DECDPUNMAX */
   6466       1.1  mrg       *c=(Unit)carry;
   6467       1.1  mrg       carry=0;
   6468       1.1  mrg       continue;
   6469       1.1  mrg       }
   6470       1.1  mrg     /* result for this unit is negative or >DECDPUNMAX */
   6471       1.1  mrg     #if DECDPUN==4			     /* use divide-by-multiply */
   6472       1.1  mrg       if (carry>=0) {
   6473       1.1  mrg 	est=(((ueInt)carry>>11)*53687)>>18;
   6474       1.1  mrg 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
   6475       1.1  mrg 	carry=est;			     /* likely quotient [79.7%] */
   6476       1.1  mrg 	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
   6477       1.1  mrg 	carry++;
   6478       1.1  mrg 	*c-=DECDPUNMAX+1;
   6479       1.1  mrg 	continue;
   6480       1.1  mrg 	}
   6481       1.1  mrg       /* negative case */
   6482       1.1  mrg       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
   6483       1.1  mrg       est=(((ueInt)carry>>11)*53687)>>18;
   6484       1.1  mrg       *c=(Unit)(carry-est*(DECDPUNMAX+1));
   6485       1.1  mrg       carry=est-(DECDPUNMAX+1); 	     /* correctly negative */
   6486       1.1  mrg       if (*c<DECDPUNMAX+1) continue;	     /* was OK */
   6487       1.1  mrg       carry++;
   6488       1.1  mrg       *c-=DECDPUNMAX+1;
   6489       1.1  mrg     #elif DECDPUN==3
   6490       1.1  mrg       if (carry>=0) {
   6491       1.1  mrg 	est=(((ueInt)carry>>3)*16777)>>21;
   6492       1.1  mrg 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
   6493       1.1  mrg 	carry=est;			     /* likely quotient [99%] */
   6494       1.1  mrg 	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
   6495       1.1  mrg 	carry++;
   6496       1.1  mrg 	*c-=DECDPUNMAX+1;
   6497       1.1  mrg 	continue;
   6498       1.1  mrg 	}
   6499       1.1  mrg       /* negative case */
   6500       1.1  mrg       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
   6501       1.1  mrg       est=(((ueInt)carry>>3)*16777)>>21;
   6502       1.1  mrg       *c=(Unit)(carry-est*(DECDPUNMAX+1));
   6503       1.1  mrg       carry=est-(DECDPUNMAX+1); 	     /* correctly negative */
   6504       1.1  mrg       if (*c<DECDPUNMAX+1) continue;	     /* was OK */
   6505       1.1  mrg       carry++;
   6506       1.1  mrg       *c-=DECDPUNMAX+1;
   6507       1.1  mrg     #elif DECDPUN<=2
   6508       1.1  mrg       if (carry>=0) {
   6509       1.1  mrg 	est=QUOT10(carry, DECDPUN);
   6510       1.1  mrg 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
   6511       1.1  mrg 	carry=est;			     /* quotient */
   6512       1.1  mrg 	continue;
   6513       1.1  mrg 	}
   6514       1.1  mrg       /* negative case */
   6515       1.1  mrg       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
   6516       1.1  mrg       est=QUOT10(carry, DECDPUN);
   6517       1.1  mrg       *c=(Unit)(carry-est*(DECDPUNMAX+1));
   6518       1.1  mrg       carry=est-(DECDPUNMAX+1); 	     /* correctly negative */
   6519       1.1  mrg     #else
   6520       1.1  mrg       if ((ueInt)carry<(DECDPUNMAX+1)*2){    /* fastpath carry 1 */
   6521       1.1  mrg 	*c=(Unit)(carry-(DECDPUNMAX+1));
   6522       1.1  mrg 	carry=1;
   6523       1.1  mrg 	continue;
   6524       1.1  mrg 	}
   6525       1.1  mrg       /* remainder operator is undefined if negative, so must test */
   6526       1.1  mrg       if (carry>=0) {
   6527       1.1  mrg 	*c=(Unit)(carry%(DECDPUNMAX+1));
   6528       1.1  mrg 	carry=carry/(DECDPUNMAX+1);
   6529       1.1  mrg 	continue;
   6530       1.1  mrg 	}
   6531       1.1  mrg       /* negative case */
   6532       1.1  mrg       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
   6533       1.1  mrg       *c=(Unit)(carry%(DECDPUNMAX+1));
   6534       1.1  mrg       carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
   6535       1.1  mrg     #endif
   6536       1.1  mrg     } /* c */
   6537       1.1  mrg 
   6538       1.1  mrg   /* OK, all A and B processed; might still have carry or borrow */
   6539       1.1  mrg   /* return number of Units in the result, negated if a borrow */
   6540       1.1  mrg   if (carry==0) return c-clsu;	   /* no carry, so no more to do */
   6541       1.1  mrg   if (carry>0) {		   /* positive carry */
   6542       1.1  mrg     *c=(Unit)carry;		   /* place as new unit */
   6543       1.1  mrg     c++;			   /* .. */
   6544       1.1  mrg     return c-clsu;
   6545       1.1  mrg     }
   6546       1.1  mrg   /* -ve carry: it's a borrow; complement needed */
   6547       1.1  mrg   add=1;			   /* temporary carry... */
   6548       1.1  mrg   for (c=clsu; c<maxC; c++) {
   6549       1.1  mrg     add=DECDPUNMAX+add-*c;
   6550       1.1  mrg     if (add<=DECDPUNMAX) {
   6551       1.1  mrg       *c=(Unit)add;
   6552       1.1  mrg       add=0;
   6553       1.1  mrg       }
   6554       1.1  mrg      else {
   6555       1.1  mrg       *c=0;
   6556       1.1  mrg       add=1;
   6557       1.1  mrg       }
   6558       1.1  mrg     }
   6559       1.1  mrg   /* add an extra unit iff it would be non-zero */
   6560       1.1  mrg   #if DECTRACE
   6561       1.1  mrg     printf("UAS borrow: add %ld, carry %ld\n", add, carry);
   6562       1.1  mrg   #endif
   6563       1.1  mrg   if ((add-carry-1)!=0) {
   6564       1.1  mrg     *c=(Unit)(add-carry-1);
   6565       1.1  mrg     c++;		      /* interesting, include it */
   6566       1.1  mrg     }
   6567       1.1  mrg   return clsu-c;	      /* -ve result indicates borrowed */
   6568       1.1  mrg   } /* decUnitAddSub */
   6569       1.1  mrg 
   6570       1.1  mrg /* ------------------------------------------------------------------ */
   6571       1.1  mrg /* decTrim -- trim trailing zeros or normalize			      */
   6572       1.1  mrg /*								      */
   6573       1.1  mrg /*   dn is the number to trim or normalize			      */
   6574       1.1  mrg /*   set is the context to use to check for clamp		      */
   6575       1.1  mrg /*   all is 1 to remove all trailing zeros, 0 for just fraction ones  */
   6576       1.1  mrg /*   noclamp is 1 to unconditional (unclamped) trim		      */
   6577       1.1  mrg /*   dropped returns the number of discarded trailing zeros	      */
   6578       1.1  mrg /*   returns dn 						      */
   6579       1.1  mrg /*								      */
   6580       1.1  mrg /* If clamp is set in the context then the number of zeros trimmed    */
   6581       1.1  mrg /* may be limited if the exponent is high.			      */
   6582       1.1  mrg /* All fields are updated as required.	This is a utility operation,  */
   6583       1.1  mrg /* so special values are unchanged and no error is possible.	      */
   6584       1.1  mrg /* ------------------------------------------------------------------ */
   6585       1.1  mrg static decNumber * decTrim(decNumber *dn, decContext *set, Flag all,
   6586       1.1  mrg 			   Flag noclamp, Int *dropped) {
   6587       1.1  mrg   Int	d, exp; 		   /* work */
   6588       1.1  mrg   uInt	cut;			   /* .. */
   6589       1.1  mrg   Unit	*up;			   /* -> current Unit */
   6590       1.1  mrg 
   6591       1.1  mrg   #if DECCHECK
   6592       1.1  mrg   if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
   6593       1.1  mrg   #endif
   6594       1.1  mrg 
   6595       1.1  mrg   *dropped=0;				/* assume no zeros dropped */
   6596       1.1  mrg   if ((dn->bits & DECSPECIAL)		/* fast exit if special .. */
   6597       1.1  mrg     || (*dn->lsu & 0x01)) return dn;	/* .. or odd */
   6598       1.1  mrg   if (ISZERO(dn)) {			/* .. or 0 */
   6599       1.1  mrg     dn->exponent=0;			/* (sign is preserved) */
   6600       1.1  mrg     return dn;
   6601       1.1  mrg     }
   6602       1.1  mrg 
   6603       1.1  mrg   /* have a finite number which is even */
   6604       1.1  mrg   exp=dn->exponent;
   6605       1.1  mrg   cut=1;			   /* digit (1-DECDPUN) in Unit */
   6606       1.1  mrg   up=dn->lsu;			   /* -> current Unit */
   6607       1.1  mrg   for (d=0; d<dn->digits-1; d++) { /* [don't strip the final digit] */
   6608       1.1  mrg     /* slice by powers */
   6609       1.1  mrg     #if DECDPUN<=4
   6610       1.1  mrg       uInt quot=QUOT10(*up, cut);
   6611       1.1  mrg       if ((*up-quot*powers[cut])!=0) break;  /* found non-0 digit */
   6612       1.1  mrg     #else
   6613       1.1  mrg       if (*up%powers[cut]!=0) break;	     /* found non-0 digit */
   6614       1.1  mrg     #endif
   6615       1.1  mrg     /* have a trailing 0 */
   6616       1.1  mrg     if (!all) { 		   /* trimming */
   6617       1.1  mrg       /* [if exp>0 then all trailing 0s are significant for trim] */
   6618       1.1  mrg       if (exp<=0) {		   /* if digit might be significant */
   6619       1.1  mrg 	if (exp==0) break;	   /* then quit */
   6620       1.1  mrg 	exp++;			   /* next digit might be significant */
   6621       1.1  mrg 	}
   6622       1.1  mrg       }
   6623       1.1  mrg     cut++;			   /* next power */
   6624       1.1  mrg     if (cut>DECDPUN) {		   /* need new Unit */
   6625       1.1  mrg       up++;
   6626       1.1  mrg       cut=1;
   6627       1.1  mrg       }
   6628       1.1  mrg     } /* d */
   6629       1.1  mrg   if (d==0) return dn;		   /* none to drop */
   6630       1.1  mrg 
   6631       1.1  mrg   /* may need to limit drop if clamping */
   6632       1.1  mrg   if (set->clamp && !noclamp) {
   6633       1.1  mrg     Int maxd=set->emax-set->digits+1-dn->exponent;
   6634       1.1  mrg     if (maxd<=0) return dn;	   /* nothing possible */
   6635       1.1  mrg     if (d>maxd) d=maxd;
   6636       1.1  mrg     }
   6637       1.1  mrg 
   6638       1.1  mrg   /* effect the drop */
   6639       1.1  mrg   decShiftToLeast(dn->lsu, D2U(dn->digits), d);
   6640       1.1  mrg   dn->exponent+=d;		   /* maintain numerical value */
   6641       1.1  mrg   dn->digits-=d;		   /* new length */
   6642       1.1  mrg   *dropped=d;			   /* report the count */
   6643       1.1  mrg   return dn;
   6644       1.1  mrg   } /* decTrim */
   6645       1.1  mrg 
   6646       1.1  mrg /* ------------------------------------------------------------------ */
   6647       1.1  mrg /* decReverse -- reverse a Unit array in place			      */
   6648       1.1  mrg /*								      */
   6649       1.1  mrg /*   ulo    is the start of the array				      */
   6650       1.1  mrg /*   uhi    is the end of the array (highest Unit to include)	      */
   6651       1.1  mrg /*								      */
   6652       1.1  mrg /* The units ulo through uhi are reversed in place (if the number     */
   6653       1.1  mrg /* of units is odd, the middle one is untouched).  Note that the      */
   6654       1.1  mrg /* digit(s) in each unit are unaffected.			      */
   6655       1.1  mrg /* ------------------------------------------------------------------ */
   6656       1.1  mrg static void decReverse(Unit *ulo, Unit *uhi) {
   6657       1.1  mrg   Unit temp;
   6658       1.1  mrg   for (; ulo<uhi; ulo++, uhi--) {
   6659       1.1  mrg     temp=*ulo;
   6660       1.1  mrg     *ulo=*uhi;
   6661       1.1  mrg     *uhi=temp;
   6662       1.1  mrg     }
   6663       1.1  mrg   return;
   6664       1.1  mrg   } /* decReverse */
   6665       1.1  mrg 
   6666       1.1  mrg /* ------------------------------------------------------------------ */
   6667       1.1  mrg /* decShiftToMost -- shift digits in array towards most significant   */
   6668       1.1  mrg /*								      */
   6669       1.1  mrg /*   uar    is the array					      */
   6670       1.1  mrg /*   digits is the count of digits in use in the array		      */
   6671       1.1  mrg /*   shift  is the number of zeros to pad with (least significant);   */
   6672       1.1  mrg /*     it must be zero or positive				      */
   6673       1.1  mrg /*								      */
   6674       1.1  mrg /*   returns the new length of the integer in the array, in digits    */
   6675       1.1  mrg /*								      */
   6676       1.1  mrg /* No overflow is permitted (that is, the uar array must be known to  */
   6677       1.1  mrg /* be large enough to hold the result, after shifting). 	      */
   6678       1.1  mrg /* ------------------------------------------------------------------ */
   6679       1.1  mrg static Int decShiftToMost(Unit *uar, Int digits, Int shift) {
   6680       1.1  mrg   Unit	*target, *source, *first;  /* work */
   6681       1.1  mrg   Int	cut;			   /* odd 0's to add */
   6682       1.1  mrg   uInt	next;			   /* work */
   6683       1.1  mrg 
   6684       1.1  mrg   if (shift==0) return digits;	   /* [fastpath] nothing to do */
   6685       1.1  mrg   if ((digits+shift)<=DECDPUN) {   /* [fastpath] single-unit case */
   6686       1.1  mrg     *uar=(Unit)(*uar*powers[shift]);
   6687       1.1  mrg     return digits+shift;
   6688       1.1  mrg     }
   6689       1.1  mrg 
   6690       1.1  mrg   next=0;			   /* all paths */
   6691       1.1  mrg   source=uar+D2U(digits)-1;	   /* where msu comes from */
   6692       1.1  mrg   target=source+D2U(shift);	   /* where upper part of first cut goes */
   6693       1.1  mrg   cut=DECDPUN-MSUDIGITS(shift);    /* where to slice */
   6694       1.1  mrg   if (cut==0) { 		   /* unit-boundary case */
   6695       1.1  mrg     for (; source>=uar; source--, target--) *target=*source;
   6696       1.1  mrg     }
   6697       1.1  mrg    else {
   6698       1.1  mrg     first=uar+D2U(digits+shift)-1; /* where msu of source will end up */
   6699       1.1  mrg     for (; source>=uar; source--, target--) {
   6700       1.1  mrg       /* split the source Unit and accumulate remainder for next */
   6701       1.1  mrg       #if DECDPUN<=4
   6702       1.1  mrg 	uInt quot=QUOT10(*source, cut);
   6703       1.1  mrg 	uInt rem=*source-quot*powers[cut];
   6704       1.1  mrg 	next+=quot;
   6705       1.1  mrg       #else
   6706       1.1  mrg 	uInt rem=*source%powers[cut];
   6707       1.1  mrg 	next+=*source/powers[cut];
   6708       1.1  mrg       #endif
   6709       1.1  mrg       if (target<=first) *target=(Unit)next;   /* write to target iff valid */
   6710       1.1  mrg       next=rem*powers[DECDPUN-cut];	       /* save remainder for next Unit */
   6711       1.1  mrg       }
   6712       1.1  mrg     } /* shift-move */
   6713       1.1  mrg 
   6714       1.1  mrg   /* propagate any partial unit to one below and clear the rest */
   6715       1.1  mrg   for (; target>=uar; target--) {
   6716       1.1  mrg     *target=(Unit)next;
   6717       1.1  mrg     next=0;
   6718       1.1  mrg     }
   6719       1.1  mrg   return digits+shift;
   6720       1.1  mrg   } /* decShiftToMost */
   6721       1.1  mrg 
   6722       1.1  mrg /* ------------------------------------------------------------------ */
   6723       1.1  mrg /* decShiftToLeast -- shift digits in array towards least significant */
   6724       1.1  mrg /*								      */
   6725       1.1  mrg /*   uar   is the array 					      */
   6726       1.1  mrg /*   units is length of the array, in units			      */
   6727       1.1  mrg /*   shift is the number of digits to remove from the lsu end; it     */
   6728       1.1  mrg /*     must be zero or positive and <= than units*DECDPUN.	      */
   6729       1.1  mrg /*								      */
   6730       1.1  mrg /*   returns the new length of the integer in the array, in units     */
   6731       1.1  mrg /*								      */
   6732       1.1  mrg /* Removed digits are discarded (lost).  Units not required to hold   */
   6733       1.1  mrg /* the final result are unchanged.				      */
   6734       1.1  mrg /* ------------------------------------------------------------------ */
   6735       1.1  mrg static Int decShiftToLeast(Unit *uar, Int units, Int shift) {
   6736       1.1  mrg   Unit	*target, *up;		   /* work */
   6737       1.1  mrg   Int	cut, count;		   /* work */
   6738       1.1  mrg   Int	quot, rem;		   /* for division */
   6739       1.1  mrg 
   6740       1.1  mrg   if (shift==0) return units;	   /* [fastpath] nothing to do */
   6741       1.1  mrg   if (shift==units*DECDPUN) {	   /* [fastpath] little to do */
   6742       1.1  mrg     *uar=0;			   /* all digits cleared gives zero */
   6743       1.1  mrg     return 1;			   /* leaves just the one */
   6744       1.1  mrg     }
   6745       1.1  mrg 
   6746       1.1  mrg   target=uar;			   /* both paths */
   6747       1.1  mrg   cut=MSUDIGITS(shift);
   6748       1.1  mrg   if (cut==DECDPUN) {		   /* unit-boundary case; easy */
   6749       1.1  mrg     up=uar+D2U(shift);
   6750       1.1  mrg     for (; up<uar+units; target++, up++) *target=*up;
   6751       1.1  mrg     return target-uar;
   6752       1.1  mrg     }
   6753       1.1  mrg 
   6754       1.1  mrg   /* messier */
   6755       1.1  mrg   up=uar+D2U(shift-cut);	   /* source; correct to whole Units */
   6756       1.1  mrg   count=units*DECDPUN-shift;	   /* the maximum new length */
   6757       1.1  mrg   #if DECDPUN<=4
   6758       1.1  mrg     quot=QUOT10(*up, cut);
   6759       1.1  mrg   #else
   6760       1.1  mrg     quot=*up/powers[cut];
   6761       1.1  mrg   #endif
   6762       1.1  mrg   for (; ; target++) {
   6763       1.1  mrg     *target=(Unit)quot;
   6764       1.1  mrg     count-=(DECDPUN-cut);
   6765       1.1  mrg     if (count<=0) break;
   6766       1.1  mrg     up++;
   6767       1.1  mrg     quot=*up;
   6768       1.1  mrg     #if DECDPUN<=4
   6769       1.1  mrg       quot=QUOT10(quot, cut);
   6770       1.1  mrg       rem=*up-quot*powers[cut];
   6771       1.1  mrg     #else
   6772       1.1  mrg       rem=quot%powers[cut];
   6773       1.1  mrg       quot=quot/powers[cut];
   6774       1.1  mrg     #endif
   6775       1.1  mrg     *target=(Unit)(*target+rem*powers[DECDPUN-cut]);
   6776       1.1  mrg     count-=cut;
   6777       1.1  mrg     if (count<=0) break;
   6778       1.1  mrg     }
   6779       1.1  mrg   return target-uar+1;
   6780       1.1  mrg   } /* decShiftToLeast */
   6781       1.1  mrg 
   6782       1.1  mrg #if DECSUBSET
   6783       1.1  mrg /* ------------------------------------------------------------------ */
   6784       1.1  mrg /* decRoundOperand -- round an operand	[used for subset only]	      */
   6785       1.1  mrg /*								      */
   6786       1.1  mrg /*   dn is the number to round (dn->digits is > set->digits)	      */
   6787       1.1  mrg /*   set is the relevant context				      */
   6788       1.1  mrg /*   status is the status accumulator				      */
   6789       1.1  mrg /*								      */
   6790       1.1  mrg /*   returns an allocated decNumber with the rounded result.	      */
   6791       1.1  mrg /*								      */
   6792       1.1  mrg /* lostDigits and other status may be set by this.		      */
   6793       1.1  mrg /*								      */
   6794       1.1  mrg /* Since the input is an operand, it must not be modified.	      */
   6795       1.1  mrg /* Instead, return an allocated decNumber, rounded as required.       */
   6796       1.1  mrg /* It is the caller's responsibility to free the allocated storage.   */
   6797       1.1  mrg /*								      */
   6798       1.1  mrg /* If no storage is available then the result cannot be used, so NULL */
   6799       1.1  mrg /* is returned. 						      */
   6800       1.1  mrg /* ------------------------------------------------------------------ */
   6801       1.1  mrg static decNumber *decRoundOperand(const decNumber *dn, decContext *set,
   6802       1.1  mrg 				  uInt *status) {
   6803       1.1  mrg   decNumber *res;			/* result structure */
   6804       1.1  mrg   uInt newstatus=0;			/* status from round */
   6805       1.1  mrg   Int  residue=0;			/* rounding accumulator */
   6806       1.1  mrg 
   6807       1.1  mrg   /* Allocate storage for the returned decNumber, big enough for the */
   6808       1.1  mrg   /* length specified by the context */
   6809       1.1  mrg   res=(decNumber *)malloc(sizeof(decNumber)
   6810       1.1  mrg 			  +(D2U(set->digits)-1)*sizeof(Unit));
   6811       1.1  mrg   if (res==NULL) {
   6812       1.1  mrg     *status|=DEC_Insufficient_storage;
   6813       1.1  mrg     return NULL;
   6814       1.1  mrg     }
   6815       1.1  mrg   decCopyFit(res, dn, set, &residue, &newstatus);
   6816       1.1  mrg   decApplyRound(res, set, residue, &newstatus);
   6817       1.1  mrg 
   6818       1.1  mrg   /* If that set Inexact then "lost digits" is raised... */
   6819       1.1  mrg   if (newstatus & DEC_Inexact) newstatus|=DEC_Lost_digits;
   6820       1.1  mrg   *status|=newstatus;
   6821       1.1  mrg   return res;
   6822       1.1  mrg   } /* decRoundOperand */
   6823       1.1  mrg #endif
   6824       1.1  mrg 
   6825       1.1  mrg /* ------------------------------------------------------------------ */
   6826       1.1  mrg /* decCopyFit -- copy a number, truncating the coefficient if needed  */
   6827       1.1  mrg /*								      */
   6828       1.1  mrg /*   dest is the target decNumber				      */
   6829       1.1  mrg /*   src  is the source decNumber				      */
   6830       1.1  mrg /*   set is the context [used for length (digits) and rounding mode]  */
   6831       1.1  mrg /*   residue is the residue accumulator 			      */
   6832       1.1  mrg /*   status contains the current status to be updated		      */
   6833       1.1  mrg /*								      */
   6834       1.1  mrg /* (dest==src is allowed and will be a no-op if fits)		      */
   6835       1.1  mrg /* All fields are updated as required.				      */
   6836       1.1  mrg /* ------------------------------------------------------------------ */
   6837       1.1  mrg static void decCopyFit(decNumber *dest, const decNumber *src,
   6838       1.1  mrg 		       decContext *set, Int *residue, uInt *status) {
   6839       1.1  mrg   dest->bits=src->bits;
   6840       1.1  mrg   dest->exponent=src->exponent;
   6841       1.1  mrg   decSetCoeff(dest, set, src->lsu, src->digits, residue, status);
   6842       1.1  mrg   } /* decCopyFit */
   6843       1.1  mrg 
   6844       1.1  mrg /* ------------------------------------------------------------------ */
   6845       1.1  mrg /* decSetCoeff -- set the coefficient of a number		      */
   6846       1.1  mrg /*								      */
   6847       1.1  mrg /*   dn    is the number whose coefficient array is to be set.	      */
   6848       1.1  mrg /*	   It must have space for set->digits digits		      */
   6849       1.1  mrg /*   set   is the context [for size]				      */
   6850       1.1  mrg /*   lsu   -> lsu of the source coefficient [may be dn->lsu]	      */
   6851       1.1  mrg /*   len   is digits in the source coefficient [may be dn->digits]    */
   6852       1.1  mrg /*   residue is the residue accumulator.  This has values as in       */
   6853       1.1  mrg /*	   decApplyRound, and will be unchanged unless the	      */
   6854       1.1  mrg /*	   target size is less than len.  In this case, the	      */
   6855       1.1  mrg /*	   coefficient is truncated and the residue is updated to     */
   6856       1.1  mrg /*	   reflect the previous residue and the dropped digits.       */
   6857       1.1  mrg /*   status is the status accumulator, as usual 		      */
   6858       1.1  mrg /*								      */
   6859       1.1  mrg /* The coefficient may already be in the number, or it can be an      */
   6860       1.1  mrg /* external intermediate array.  If it is in the number, lsu must ==  */
   6861       1.1  mrg /* dn->lsu and len must == dn->digits.				      */
   6862       1.1  mrg /*								      */
   6863       1.1  mrg /* Note that the coefficient length (len) may be < set->digits, and   */
   6864       1.1  mrg /* in this case this merely copies the coefficient (or is a no-op     */
   6865       1.1  mrg /* if dn->lsu==lsu).						      */
   6866       1.1  mrg /*								      */
   6867       1.1  mrg /* Note also that (only internally, from decQuantizeOp and	      */
   6868       1.1  mrg /* decSetSubnormal) the value of set->digits may be less than one,    */
   6869       1.1  mrg /* indicating a round to left.	This routine handles that case	      */
   6870       1.1  mrg /* correctly; caller ensures space.				      */
   6871       1.1  mrg /*								      */
   6872       1.1  mrg /* dn->digits, dn->lsu (and as required), and dn->exponent are	      */
   6873       1.1  mrg /* updated as necessary.   dn->bits (sign) is unchanged.	      */
   6874       1.1  mrg /*								      */
   6875       1.1  mrg /* DEC_Rounded status is set if any digits are discarded.	      */
   6876       1.1  mrg /* DEC_Inexact status is set if any non-zero digits are discarded, or */
   6877       1.1  mrg /*			 incoming residue was non-0 (implies rounded) */
   6878       1.1  mrg /* ------------------------------------------------------------------ */
   6879       1.1  mrg /* mapping array: maps 0-9 to canonical residues, so that a residue */
   6880       1.1  mrg /* can be adjusted in the range [-1, +1] and achieve correct rounding */
   6881       1.1  mrg /*			       0  1  2	3  4  5  6  7  8  9 */
   6882       1.1  mrg static const uByte resmap[10]={0, 3, 3, 3, 3, 5, 7, 7, 7, 7};
   6883       1.1  mrg static void decSetCoeff(decNumber *dn, decContext *set, const Unit *lsu,
   6884       1.1  mrg 			Int len, Int *residue, uInt *status) {
   6885       1.1  mrg   Int	discard;	      /* number of digits to discard */
   6886       1.1  mrg   uInt	cut;		      /* cut point in Unit */
   6887       1.1  mrg   const Unit *up;	      /* work */
   6888       1.1  mrg   Unit	*target;	      /* .. */
   6889       1.1  mrg   Int	count;		      /* .. */
   6890       1.1  mrg   #if DECDPUN<=4
   6891       1.1  mrg   uInt	temp;		      /* .. */
   6892       1.1  mrg   #endif
   6893       1.1  mrg 
   6894       1.1  mrg   discard=len-set->digits;    /* digits to discard */
   6895       1.1  mrg   if (discard<=0) {	      /* no digits are being discarded */
   6896       1.1  mrg     if (dn->lsu!=lsu) {       /* copy needed */
   6897       1.1  mrg       /* copy the coefficient array to the result number; no shift needed */
   6898       1.1  mrg       count=len;	      /* avoids D2U */
   6899       1.1  mrg       up=lsu;
   6900       1.1  mrg       for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
   6901       1.1  mrg 	*target=*up;
   6902       1.1  mrg       dn->digits=len;	      /* set the new length */
   6903       1.1  mrg       }
   6904       1.1  mrg     /* dn->exponent and residue are unchanged, record any inexactitude */
   6905       1.1  mrg     if (*residue!=0) *status|=(DEC_Inexact | DEC_Rounded);
   6906       1.1  mrg     return;
   6907       1.1  mrg     }
   6908       1.1  mrg 
   6909       1.1  mrg   /* some digits must be discarded ... */
   6910       1.1  mrg   dn->exponent+=discard;      /* maintain numerical value */
   6911       1.1  mrg   *status|=DEC_Rounded;       /* accumulate Rounded status */
   6912       1.1  mrg   if (*residue>1) *residue=1; /* previous residue now to right, so reduce */
   6913       1.1  mrg 
   6914       1.1  mrg   if (discard>len) {	      /* everything, +1, is being discarded */
   6915       1.1  mrg     /* guard digit is 0 */
   6916       1.1  mrg     /* residue is all the number [NB could be all 0s] */
   6917       1.1  mrg     if (*residue<=0) {	      /* not already positive */
   6918       1.1  mrg       count=len;	      /* avoids D2U */
   6919       1.1  mrg       for (up=lsu; count>0; up++, count-=DECDPUN) if (*up!=0) { /* found non-0 */
   6920       1.1  mrg 	*residue=1;
   6921       1.1  mrg 	break;		      /* no need to check any others */
   6922       1.1  mrg 	}
   6923       1.1  mrg       }
   6924       1.1  mrg     if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude */
   6925       1.1  mrg     *dn->lsu=0; 	      /* coefficient will now be 0 */
   6926       1.1  mrg     dn->digits=1;	      /* .. */
   6927       1.1  mrg     return;
   6928       1.1  mrg     } /* total discard */
   6929       1.1  mrg 
   6930       1.1  mrg   /* partial discard [most common case] */
   6931       1.1  mrg   /* here, at least the first (most significant) discarded digit exists */
   6932       1.1  mrg 
   6933       1.1  mrg   /* spin up the number, noting residue during the spin, until get to */
   6934       1.1  mrg   /* the Unit with the first discarded digit.  When reach it, extract */
   6935       1.1  mrg   /* it and remember its position */
   6936       1.1  mrg   count=0;
   6937       1.1  mrg   for (up=lsu;; up++) {
   6938       1.1  mrg     count+=DECDPUN;
   6939       1.1  mrg     if (count>=discard) break; /* full ones all checked */
   6940       1.1  mrg     if (*up!=0) *residue=1;
   6941       1.1  mrg     } /* up */
   6942       1.1  mrg 
   6943       1.1  mrg   /* here up -> Unit with first discarded digit */
   6944       1.1  mrg   cut=discard-(count-DECDPUN)-1;
   6945       1.1  mrg   if (cut==DECDPUN-1) {       /* unit-boundary case (fast) */
   6946       1.1  mrg     Unit half=(Unit)powers[DECDPUN]>>1;
   6947       1.1  mrg     /* set residue directly */
   6948       1.1  mrg     if (*up>=half) {
   6949       1.1  mrg       if (*up>half) *residue=7;
   6950       1.1  mrg       else *residue+=5;       /* add sticky bit */
   6951       1.1  mrg       }
   6952       1.1  mrg      else { /* <half */
   6953       1.1  mrg       if (*up!=0) *residue=3; /* [else is 0, leave as sticky bit] */
   6954       1.1  mrg       }
   6955       1.1  mrg     if (set->digits<=0) {     /* special for Quantize/Subnormal :-( */
   6956       1.1  mrg       *dn->lsu=0;	      /* .. result is 0 */
   6957       1.1  mrg       dn->digits=1;	      /* .. */
   6958       1.1  mrg       }
   6959       1.1  mrg      else {		      /* shift to least */
   6960       1.1  mrg       count=set->digits;      /* now digits to end up with */
   6961       1.1  mrg       dn->digits=count;       /* set the new length */
   6962       1.1  mrg       up++;		      /* move to next */
   6963       1.1  mrg       /* on unit boundary, so shift-down copy loop is simple */
   6964       1.1  mrg       for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
   6965       1.1  mrg 	*target=*up;
   6966       1.1  mrg       }
   6967       1.1  mrg     } /* unit-boundary case */
   6968       1.1  mrg 
   6969       1.1  mrg    else { /* discard digit is in low digit(s), and not top digit */
   6970       1.1  mrg     uInt  discard1;		   /* first discarded digit */
   6971       1.1  mrg     uInt  quot, rem;		   /* for divisions */
   6972       1.1  mrg     if (cut==0) quot=*up;	   /* is at bottom of unit */
   6973       1.1  mrg      else /* cut>0 */ { 	   /* it's not at bottom of unit */
   6974       1.1  mrg       #if DECDPUN<=4
   6975       1.1  mrg 	quot=QUOT10(*up, cut);
   6976       1.1  mrg 	rem=*up-quot*powers[cut];
   6977       1.1  mrg       #else
   6978       1.1  mrg 	rem=*up%powers[cut];
   6979       1.1  mrg 	quot=*up/powers[cut];
   6980       1.1  mrg       #endif
   6981       1.1  mrg       if (rem!=0) *residue=1;
   6982       1.1  mrg       }
   6983       1.1  mrg     /* discard digit is now at bottom of quot */
   6984       1.1  mrg     #if DECDPUN<=4
   6985       1.1  mrg       temp=(quot*6554)>>16;	   /* fast /10 */
   6986       1.1  mrg       /* Vowels algorithm here not a win (9 instructions) */
   6987       1.1  mrg       discard1=quot-X10(temp);
   6988       1.1  mrg       quot=temp;
   6989       1.1  mrg     #else
   6990       1.1  mrg       discard1=quot%10;
   6991       1.1  mrg       quot=quot/10;
   6992       1.1  mrg     #endif
   6993       1.1  mrg     /* here, discard1 is the guard digit, and residue is everything */
   6994       1.1  mrg     /* else [use mapping array to accumulate residue safely] */
   6995       1.1  mrg     *residue+=resmap[discard1];
   6996       1.1  mrg     cut++;			   /* update cut */
   6997       1.1  mrg     /* here: up -> Unit of the array with bottom digit */
   6998       1.1  mrg     /*	     cut is the division point for each Unit */
   6999       1.1  mrg     /*	     quot holds the uncut high-order digits for the current unit */
   7000       1.1  mrg     if (set->digits<=0) {	   /* special for Quantize/Subnormal :-( */
   7001       1.1  mrg       *dn->lsu=0;		   /* .. result is 0 */
   7002       1.1  mrg       dn->digits=1;		   /* .. */
   7003       1.1  mrg       }
   7004       1.1  mrg      else {			   /* shift to least needed */
   7005       1.1  mrg       count=set->digits;	   /* now digits to end up with */
   7006       1.1  mrg       dn->digits=count; 	   /* set the new length */
   7007       1.1  mrg       /* shift-copy the coefficient array to the result number */
   7008       1.1  mrg       for (target=dn->lsu; ; target++) {
   7009       1.1  mrg 	*target=(Unit)quot;
   7010       1.1  mrg 	count-=(DECDPUN-cut);
   7011       1.1  mrg 	if (count<=0) break;
   7012       1.1  mrg 	up++;
   7013       1.1  mrg 	quot=*up;
   7014       1.1  mrg 	#if DECDPUN<=4
   7015       1.1  mrg 	  quot=QUOT10(quot, cut);
   7016       1.1  mrg 	  rem=*up-quot*powers[cut];
   7017       1.1  mrg 	#else
   7018       1.1  mrg 	  rem=quot%powers[cut];
   7019       1.1  mrg 	  quot=quot/powers[cut];
   7020       1.1  mrg 	#endif
   7021       1.1  mrg 	*target=(Unit)(*target+rem*powers[DECDPUN-cut]);
   7022       1.1  mrg 	count-=cut;
   7023       1.1  mrg 	if (count<=0) break;
   7024       1.1  mrg 	} /* shift-copy loop */
   7025       1.1  mrg       } /* shift to least */
   7026       1.1  mrg     } /* not unit boundary */
   7027       1.1  mrg 
   7028       1.1  mrg   if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude */
   7029       1.1  mrg   return;
   7030       1.1  mrg   } /* decSetCoeff */
   7031       1.1  mrg 
   7032       1.1  mrg /* ------------------------------------------------------------------ */
   7033       1.1  mrg /* decApplyRound -- apply pending rounding to a number		      */
   7034       1.1  mrg /*								      */
   7035       1.1  mrg /*   dn    is the number, with space for set->digits digits	      */
   7036       1.1  mrg /*   set   is the context [for size and rounding mode]		      */
   7037       1.1  mrg /*   residue indicates pending rounding, being any accumulated	      */
   7038       1.1  mrg /*	   guard and sticky information.  It may be:		      */
   7039       1.1  mrg /*	   6-9: rounding digit is >5				      */
   7040       1.1  mrg /*	   5:	rounding digit is exactly half-way		      */
   7041       1.1  mrg /*	   1-4: rounding digit is <5 and >0			      */
   7042       1.1  mrg /*	   0:	the coefficient is exact			      */
   7043       1.1  mrg /*	  -1:	as 1, but the hidden digits are subtractive, that     */
   7044       1.1  mrg /*		is, of the opposite sign to dn.  In this case the     */
   7045       1.1  mrg /*		coefficient must be non-0.  This case occurs when     */
   7046       1.1  mrg /*		subtracting a small number (which can be reduced to   */
   7047       1.1  mrg /*		a sticky bit); see decAddOp.			      */
   7048       1.1  mrg /*   status is the status accumulator, as usual 		      */
   7049       1.1  mrg /*								      */
   7050       1.1  mrg /* This routine applies rounding while keeping the length of the      */
   7051       1.1  mrg /* coefficient constant.  The exponent and status are unchanged       */
   7052       1.1  mrg /* except if:							      */
   7053       1.1  mrg /*								      */
   7054       1.1  mrg /*   -- the coefficient was increased and is all nines (in which      */
   7055       1.1  mrg /*	case Overflow could occur, and is handled directly here so    */
   7056       1.1  mrg /*	the caller does not need to re-test for overflow)	      */
   7057       1.1  mrg /*								      */
   7058       1.1  mrg /*   -- the coefficient was decreased and becomes all nines (in which */
   7059       1.1  mrg /*	case Underflow could occur, and is also handled directly).    */
   7060       1.1  mrg /*								      */
   7061       1.1  mrg /* All fields in dn are updated as required.			      */
   7062       1.1  mrg /*								      */
   7063       1.1  mrg /* ------------------------------------------------------------------ */
   7064       1.1  mrg static void decApplyRound(decNumber *dn, decContext *set, Int residue,
   7065       1.1  mrg 			  uInt *status) {
   7066       1.1  mrg   Int  bump;		      /* 1 if coefficient needs to be incremented */
   7067       1.1  mrg 			      /* -1 if coefficient needs to be decremented */
   7068       1.1  mrg 
   7069       1.1  mrg   if (residue==0) return;     /* nothing to apply */
   7070       1.1  mrg 
   7071       1.1  mrg   bump=0;		      /* assume a smooth ride */
   7072       1.1  mrg 
   7073       1.1  mrg   /* now decide whether, and how, to round, depending on mode */
   7074       1.1  mrg   switch (set->round) {
   7075       1.1  mrg     case DEC_ROUND_05UP: {    /* round zero or five up (for reround) */
   7076       1.1  mrg       /* This is the same as DEC_ROUND_DOWN unless there is a */
   7077       1.1  mrg       /* positive residue and the lsd of dn is 0 or 5, in which case */
   7078       1.1  mrg       /* it is bumped; when residue is <0, the number is therefore */
   7079       1.1  mrg       /* bumped down unless the final digit was 1 or 6 (in which */
   7080       1.1  mrg       /* case it is bumped down and then up -- a no-op) */
   7081       1.1  mrg       Int lsd5=*dn->lsu%5;     /* get lsd and quintate */
   7082       1.1  mrg       if (residue<0 && lsd5!=1) bump=-1;
   7083       1.1  mrg        else if (residue>0 && lsd5==0) bump=1;
   7084       1.1  mrg       /* [bump==1 could be applied directly; use common path for clarity] */
   7085       1.1  mrg       break;} /* r-05 */
   7086       1.1  mrg 
   7087       1.1  mrg     case DEC_ROUND_DOWN: {
   7088       1.1  mrg       /* no change, except if negative residue */
   7089       1.1  mrg       if (residue<0) bump=-1;
   7090       1.1  mrg       break;} /* r-d */
   7091       1.1  mrg 
   7092       1.1  mrg     case DEC_ROUND_HALF_DOWN: {
   7093       1.1  mrg       if (residue>5) bump=1;
   7094       1.1  mrg       break;} /* r-h-d */
   7095       1.1  mrg 
   7096       1.1  mrg     case DEC_ROUND_HALF_EVEN: {
   7097       1.1  mrg       if (residue>5) bump=1;		/* >0.5 goes up */
   7098       1.1  mrg        else if (residue==5) {		/* exactly 0.5000... */
   7099       1.1  mrg 	/* 0.5 goes up iff [new] lsd is odd */
   7100       1.1  mrg 	if (*dn->lsu & 0x01) bump=1;
   7101       1.1  mrg 	}
   7102       1.1  mrg       break;} /* r-h-e */
   7103       1.1  mrg 
   7104       1.1  mrg     case DEC_ROUND_HALF_UP: {
   7105       1.1  mrg       if (residue>=5) bump=1;
   7106       1.1  mrg       break;} /* r-h-u */
   7107       1.1  mrg 
   7108       1.1  mrg     case DEC_ROUND_UP: {
   7109       1.1  mrg       if (residue>0) bump=1;
   7110       1.1  mrg       break;} /* r-u */
   7111       1.1  mrg 
   7112       1.1  mrg     case DEC_ROUND_CEILING: {
   7113       1.1  mrg       /* same as _UP for positive numbers, and as _DOWN for negatives */
   7114       1.1  mrg       /* [negative residue cannot occur on 0] */
   7115       1.1  mrg       if (decNumberIsNegative(dn)) {
   7116       1.1  mrg 	if (residue<0) bump=-1;
   7117       1.1  mrg 	}
   7118       1.1  mrg        else {
   7119       1.1  mrg 	if (residue>0) bump=1;
   7120       1.1  mrg 	}
   7121       1.1  mrg       break;} /* r-c */
   7122       1.1  mrg 
   7123       1.1  mrg     case DEC_ROUND_FLOOR: {
   7124       1.1  mrg       /* same as _UP for negative numbers, and as _DOWN for positive */
   7125       1.1  mrg       /* [negative residue cannot occur on 0] */
   7126       1.1  mrg       if (!decNumberIsNegative(dn)) {
   7127       1.1  mrg 	if (residue<0) bump=-1;
   7128       1.1  mrg 	}
   7129       1.1  mrg        else {
   7130       1.1  mrg 	if (residue>0) bump=1;
   7131       1.1  mrg 	}
   7132       1.1  mrg       break;} /* r-f */
   7133       1.1  mrg 
   7134       1.1  mrg     default: {	    /* e.g., DEC_ROUND_MAX */
   7135       1.1  mrg       *status|=DEC_Invalid_context;
   7136       1.1  mrg       #if DECTRACE || (DECCHECK && DECVERB)
   7137       1.1  mrg       printf("Unknown rounding mode: %d\n", set->round);
   7138       1.1  mrg       #endif
   7139       1.1  mrg       break;}
   7140       1.1  mrg     } /* switch */
   7141       1.1  mrg 
   7142       1.1  mrg   /* now bump the number, up or down, if need be */
   7143       1.1  mrg   if (bump==0) return;			     /* no action required */
   7144       1.1  mrg 
   7145       1.1  mrg   /* Simply use decUnitAddSub unless bumping up and the number is */
   7146       1.1  mrg   /* all nines.  In this special case set to 100... explicitly */
   7147       1.1  mrg   /* and adjust the exponent by one (as otherwise could overflow */
   7148       1.1  mrg   /* the array) */
   7149       1.1  mrg   /* Similarly handle all-nines result if bumping down. */
   7150       1.1  mrg   if (bump>0) {
   7151       1.1  mrg     Unit *up;				     /* work */
   7152       1.1  mrg     uInt count=dn->digits;		     /* digits to be checked */
   7153       1.1  mrg     for (up=dn->lsu; ; up++) {
   7154       1.1  mrg       if (count<=DECDPUN) {
   7155       1.1  mrg 	/* this is the last Unit (the msu) */
   7156       1.1  mrg 	if (*up!=powers[count]-1) break;     /* not still 9s */
   7157       1.1  mrg 	/* here if it, too, is all nines */
   7158       1.1  mrg 	*up=(Unit)powers[count-1];	     /* here 999 -> 100 etc. */
   7159       1.1  mrg 	for (up=up-1; up>=dn->lsu; up--) *up=0; /* others all to 0 */
   7160       1.1  mrg 	dn->exponent++; 		     /* and bump exponent */
   7161       1.1  mrg 	/* [which, very rarely, could cause Overflow...] */
   7162       1.1  mrg 	if ((dn->exponent+dn->digits)>set->emax+1) {
   7163       1.1  mrg 	  decSetOverflow(dn, set, status);
   7164       1.1  mrg 	  }
   7165       1.1  mrg 	return; 			     /* done */
   7166       1.1  mrg 	}
   7167       1.1  mrg       /* a full unit to check, with more to come */
   7168       1.1  mrg       if (*up!=DECDPUNMAX) break;	     /* not still 9s */
   7169       1.1  mrg       count-=DECDPUN;
   7170       1.1  mrg       } /* up */
   7171       1.1  mrg     } /* bump>0 */
   7172       1.1  mrg    else {				     /* -1 */
   7173       1.1  mrg     /* here checking for a pre-bump of 1000... (leading 1, all */
   7174       1.1  mrg     /* other digits zero) */
   7175       1.1  mrg     Unit *up, *sup;			     /* work */
   7176       1.1  mrg     uInt count=dn->digits;		     /* digits to be checked */
   7177       1.1  mrg     for (up=dn->lsu; ; up++) {
   7178       1.1  mrg       if (count<=DECDPUN) {
   7179       1.1  mrg 	/* this is the last Unit (the msu) */
   7180       1.1  mrg 	if (*up!=powers[count-1]) break;     /* not 100.. */
   7181       1.1  mrg 	/* here if have the 1000... case */
   7182       1.1  mrg 	sup=up; 			     /* save msu pointer */
   7183       1.1  mrg 	*up=(Unit)powers[count]-1;	     /* here 100 in msu -> 999 */
   7184       1.1  mrg 	/* others all to all-nines, too */
   7185       1.1  mrg 	for (up=up-1; up>=dn->lsu; up--) *up=(Unit)powers[DECDPUN]-1;
   7186       1.1  mrg 	dn->exponent--; 		     /* and bump exponent */
   7187       1.1  mrg 
   7188       1.1  mrg 	/* iff the number was at the subnormal boundary (exponent=etiny) */
   7189       1.1  mrg 	/* then the exponent is now out of range, so it will in fact get */
   7190       1.1  mrg 	/* clamped to etiny and the final 9 dropped. */
   7191       1.1  mrg 	/* printf(">> emin=%d exp=%d sdig=%d\n", set->emin, */
   7192       1.1  mrg 	/*	  dn->exponent, set->digits); */
   7193       1.1  mrg 	if (dn->exponent+1==set->emin-set->digits+1) {
   7194       1.1  mrg 	  if (count==1 && dn->digits==1) *sup=0;  /* here 9 -> 0[.9] */
   7195       1.1  mrg 	   else {
   7196       1.1  mrg 	    *sup=(Unit)powers[count-1]-1;    /* here 999.. in msu -> 99.. */
   7197       1.1  mrg 	    dn->digits--;
   7198       1.1  mrg 	    }
   7199       1.1  mrg 	  dn->exponent++;
   7200       1.1  mrg 	  *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
   7201       1.1  mrg 	  }
   7202       1.1  mrg 	return; 			     /* done */
   7203       1.1  mrg 	}
   7204       1.1  mrg 
   7205       1.1  mrg       /* a full unit to check, with more to come */
   7206       1.1  mrg       if (*up!=0) break;		     /* not still 0s */
   7207       1.1  mrg       count-=DECDPUN;
   7208       1.1  mrg       } /* up */
   7209       1.1  mrg 
   7210       1.1  mrg     } /* bump<0 */
   7211       1.1  mrg 
   7212       1.1  mrg   /* Actual bump needed.  Do it. */
   7213       1.1  mrg   decUnitAddSub(dn->lsu, D2U(dn->digits), uarrone, 1, 0, dn->lsu, bump);
   7214       1.1  mrg   } /* decApplyRound */
   7215       1.1  mrg 
   7216       1.1  mrg #if DECSUBSET
   7217       1.1  mrg /* ------------------------------------------------------------------ */
   7218       1.1  mrg /* decFinish -- finish processing a number			      */
   7219       1.1  mrg /*								      */
   7220       1.1  mrg /*   dn is the number						      */
   7221       1.1  mrg /*   set is the context 					      */
   7222       1.1  mrg /*   residue is the rounding accumulator (as in decApplyRound)	      */
   7223       1.1  mrg /*   status is the accumulator					      */
   7224       1.1  mrg /*								      */
   7225       1.1  mrg /* This finishes off the current number by:			      */
   7226       1.1  mrg /*    1. If not extended:					      */
   7227       1.1  mrg /*	 a. Converting a zero result to clean '0'		      */
   7228       1.1  mrg /*	 b. Reducing positive exponents to 0, if would fit in digits  */
   7229       1.1  mrg /*    2. Checking for overflow and subnormals (always)		      */
   7230       1.1  mrg /* Note this is just Finalize when no subset arithmetic.	      */
   7231       1.1  mrg /* All fields are updated as required.				      */
   7232       1.1  mrg /* ------------------------------------------------------------------ */
   7233       1.1  mrg static void decFinish(decNumber *dn, decContext *set, Int *residue,
   7234       1.1  mrg 		      uInt *status) {
   7235       1.1  mrg   if (!set->extended) {
   7236       1.1  mrg     if ISZERO(dn) {		   /* value is zero */
   7237       1.1  mrg       dn->exponent=0;		   /* clean exponent .. */
   7238       1.1  mrg       dn->bits=0;		   /* .. and sign */
   7239       1.1  mrg       return;			   /* no error possible */
   7240       1.1  mrg       }
   7241       1.1  mrg     if (dn->exponent>=0) {	   /* non-negative exponent */
   7242       1.1  mrg       /* >0; reduce to integer if possible */
   7243       1.1  mrg       if (set->digits >= (dn->exponent+dn->digits)) {
   7244       1.1  mrg 	dn->digits=decShiftToMost(dn->lsu, dn->digits, dn->exponent);
   7245       1.1  mrg 	dn->exponent=0;
   7246       1.1  mrg 	}
   7247       1.1  mrg       }
   7248       1.1  mrg     } /* !extended */
   7249       1.1  mrg 
   7250       1.1  mrg   decFinalize(dn, set, residue, status);
   7251       1.1  mrg   } /* decFinish */
   7252       1.1  mrg #endif
   7253       1.1  mrg 
   7254       1.1  mrg /* ------------------------------------------------------------------ */
   7255       1.1  mrg /* decFinalize -- final check, clamp, and round of a number	      */
   7256       1.1  mrg /*								      */
   7257       1.1  mrg /*   dn is the number						      */
   7258       1.1  mrg /*   set is the context 					      */
   7259       1.1  mrg /*   residue is the rounding accumulator (as in decApplyRound)	      */
   7260       1.1  mrg /*   status is the status accumulator				      */
   7261       1.1  mrg /*								      */
   7262       1.1  mrg /* This finishes off the current number by checking for subnormal     */
   7263       1.1  mrg /* results, applying any pending rounding, checking for overflow,     */
   7264       1.1  mrg /* and applying any clamping.					      */
   7265       1.1  mrg /* Underflow and overflow conditions are raised as appropriate.       */
   7266       1.1  mrg /* All fields are updated as required.				      */
   7267       1.1  mrg /* ------------------------------------------------------------------ */
   7268       1.1  mrg static void decFinalize(decNumber *dn, decContext *set, Int *residue,
   7269       1.1  mrg 			uInt *status) {
   7270       1.1  mrg   Int shift;				/* shift needed if clamping */
   7271       1.1  mrg   Int tinyexp=set->emin-dn->digits+1;	/* precalculate subnormal boundary */
   7272       1.1  mrg 
   7273       1.1  mrg   /* Must be careful, here, when checking the exponent as the */
   7274       1.1  mrg   /* adjusted exponent could overflow 31 bits [because it may already */
   7275       1.1  mrg   /* be up to twice the expected]. */
   7276       1.1  mrg 
   7277       1.1  mrg   /* First test for subnormal.	This must be done before any final */
   7278       1.1  mrg   /* round as the result could be rounded to Nmin or 0. */
   7279       1.1  mrg   if (dn->exponent<=tinyexp) {		/* prefilter */
   7280       1.1  mrg     Int comp;
   7281       1.1  mrg     decNumber nmin;
   7282       1.1  mrg     /* A very nasty case here is dn == Nmin and residue<0 */
   7283       1.1  mrg     if (dn->exponent<tinyexp) {
   7284       1.1  mrg       /* Go handle subnormals; this will apply round if needed. */
   7285       1.1  mrg       decSetSubnormal(dn, set, residue, status);
   7286       1.1  mrg       return;
   7287       1.1  mrg       }
   7288       1.1  mrg     /* Equals case: only subnormal if dn=Nmin and negative residue */
   7289       1.1  mrg     decNumberZero(&nmin);
   7290       1.1  mrg     nmin.lsu[0]=1;
   7291       1.1  mrg     nmin.exponent=set->emin;
   7292       1.1  mrg     comp=decCompare(dn, &nmin, 1);		  /* (signless compare) */
   7293       1.1  mrg     if (comp==BADINT) { 			  /* oops */
   7294       1.1  mrg       *status|=DEC_Insufficient_storage;	  /* abandon... */
   7295       1.1  mrg       return;
   7296       1.1  mrg       }
   7297       1.1  mrg     if (*residue<0 && comp==0) {		  /* neg residue and dn==Nmin */
   7298       1.1  mrg       decApplyRound(dn, set, *residue, status);   /* might force down */
   7299       1.1  mrg       decSetSubnormal(dn, set, residue, status);
   7300       1.1  mrg       return;
   7301       1.1  mrg       }
   7302       1.1  mrg     }
   7303       1.1  mrg 
   7304       1.1  mrg   /* now apply any pending round (this could raise overflow). */
   7305       1.1  mrg   if (*residue!=0) decApplyRound(dn, set, *residue, status);
   7306       1.1  mrg 
   7307       1.1  mrg   /* Check for overflow [redundant in the 'rare' case] or clamp */
   7308       1.1  mrg   if (dn->exponent<=set->emax-set->digits+1) return;   /* neither needed */
   7309       1.1  mrg 
   7310       1.1  mrg 
   7311       1.1  mrg   /* here when might have an overflow or clamp to do */
   7312       1.1  mrg   if (dn->exponent>set->emax-dn->digits+1) {	       /* too big */
   7313       1.1  mrg     decSetOverflow(dn, set, status);
   7314       1.1  mrg     return;
   7315       1.1  mrg     }
   7316       1.1  mrg   /* here when the result is normal but in clamp range */
   7317       1.1  mrg   if (!set->clamp) return;
   7318       1.1  mrg 
   7319       1.1  mrg   /* here when need to apply the IEEE exponent clamp (fold-down) */
   7320       1.1  mrg   shift=dn->exponent-(set->emax-set->digits+1);
   7321       1.1  mrg 
   7322       1.1  mrg   /* shift coefficient (if non-zero) */
   7323       1.1  mrg   if (!ISZERO(dn)) {
   7324       1.1  mrg     dn->digits=decShiftToMost(dn->lsu, dn->digits, shift);
   7325       1.1  mrg     }
   7326       1.1  mrg   dn->exponent-=shift;	 /* adjust the exponent to match */
   7327       1.1  mrg   *status|=DEC_Clamped;  /* and record the dirty deed */
   7328       1.1  mrg   return;
   7329       1.1  mrg   } /* decFinalize */
   7330       1.1  mrg 
   7331       1.1  mrg /* ------------------------------------------------------------------ */
   7332       1.1  mrg /* decSetOverflow -- set number to proper overflow value	      */
   7333       1.1  mrg /*								      */
   7334       1.1  mrg /*   dn is the number (used for sign [only] and result) 	      */
   7335       1.1  mrg /*   set is the context [used for the rounding mode, etc.]	      */
   7336       1.1  mrg /*   status contains the current status to be updated		      */
   7337       1.1  mrg /*								      */
   7338       1.1  mrg /* This sets the sign of a number and sets its value to either	      */
   7339       1.1  mrg /* Infinity or the maximum finite value, depending on the sign of     */
   7340       1.1  mrg /* dn and the rounding mode, following IEEE 754 rules.		      */
   7341       1.1  mrg /* ------------------------------------------------------------------ */
   7342       1.1  mrg static void decSetOverflow(decNumber *dn, decContext *set, uInt *status) {
   7343       1.1  mrg   Flag needmax=0;		   /* result is maximum finite value */
   7344       1.1  mrg   uByte sign=dn->bits&DECNEG;	   /* clean and save sign bit */
   7345       1.1  mrg 
   7346       1.1  mrg   if (ISZERO(dn)) {		   /* zero does not overflow magnitude */
   7347       1.1  mrg     Int emax=set->emax; 		     /* limit value */
   7348       1.1  mrg     if (set->clamp) emax-=set->digits-1;     /* lower if clamping */
   7349       1.1  mrg     if (dn->exponent>emax) {		     /* clamp required */
   7350       1.1  mrg       dn->exponent=emax;
   7351       1.1  mrg       *status|=DEC_Clamped;
   7352       1.1  mrg       }
   7353       1.1  mrg     return;
   7354       1.1  mrg     }
   7355       1.1  mrg 
   7356       1.1  mrg   decNumberZero(dn);
   7357       1.1  mrg   switch (set->round) {
   7358       1.1  mrg     case DEC_ROUND_DOWN: {
   7359       1.1  mrg       needmax=1;		   /* never Infinity */
   7360       1.1  mrg       break;} /* r-d */
   7361       1.1  mrg     case DEC_ROUND_05UP: {
   7362       1.1  mrg       needmax=1;		   /* never Infinity */
   7363       1.1  mrg       break;} /* r-05 */
   7364       1.1  mrg     case DEC_ROUND_CEILING: {
   7365       1.1  mrg       if (sign) needmax=1;	   /* Infinity if non-negative */
   7366       1.1  mrg       break;} /* r-c */
   7367       1.1  mrg     case DEC_ROUND_FLOOR: {
   7368       1.1  mrg       if (!sign) needmax=1;	   /* Infinity if negative */
   7369       1.1  mrg       break;} /* r-f */
   7370       1.1  mrg     default: break;		   /* Infinity in all other cases */
   7371       1.1  mrg     }
   7372       1.1  mrg   if (needmax) {
   7373       1.1  mrg     decSetMaxValue(dn, set);
   7374       1.1  mrg     dn->bits=sign;		   /* set sign */
   7375       1.1  mrg     }
   7376       1.1  mrg    else dn->bits=sign|DECINF;	   /* Value is +/-Infinity */
   7377       1.1  mrg   *status|=DEC_Overflow | DEC_Inexact | DEC_Rounded;
   7378       1.1  mrg   } /* decSetOverflow */
   7379       1.1  mrg 
   7380       1.1  mrg /* ------------------------------------------------------------------ */
   7381       1.1  mrg /* decSetMaxValue -- set number to +Nmax (maximum normal value)       */
   7382       1.1  mrg /*								      */
   7383       1.1  mrg /*   dn is the number to set					      */
   7384       1.1  mrg /*   set is the context [used for digits and emax]		      */
   7385       1.1  mrg /*								      */
   7386       1.1  mrg /* This sets the number to the maximum positive value.		      */
   7387       1.1  mrg /* ------------------------------------------------------------------ */
   7388       1.1  mrg static void decSetMaxValue(decNumber *dn, decContext *set) {
   7389       1.1  mrg   Unit *up;			   /* work */
   7390       1.1  mrg   Int count=set->digits;	   /* nines to add */
   7391       1.1  mrg   dn->digits=count;
   7392       1.1  mrg   /* fill in all nines to set maximum value */
   7393       1.1  mrg   for (up=dn->lsu; ; up++) {
   7394       1.1  mrg     if (count>DECDPUN) *up=DECDPUNMAX;	/* unit full o'nines */
   7395       1.1  mrg      else {				/* this is the msu */
   7396       1.1  mrg       *up=(Unit)(powers[count]-1);
   7397       1.1  mrg       break;
   7398       1.1  mrg       }
   7399       1.1  mrg     count-=DECDPUN;		   /* filled those digits */
   7400       1.1  mrg     } /* up */
   7401       1.1  mrg   dn->bits=0;			   /* + sign */
   7402       1.1  mrg   dn->exponent=set->emax-set->digits+1;
   7403       1.1  mrg   } /* decSetMaxValue */
   7404       1.1  mrg 
   7405       1.1  mrg /* ------------------------------------------------------------------ */
   7406       1.1  mrg /* decSetSubnormal -- process value whose exponent is <Emin	      */
   7407       1.1  mrg /*								      */
   7408       1.1  mrg /*   dn is the number (used as input as well as output; it may have   */
   7409       1.1  mrg /*	   an allowed subnormal value, which may need to be rounded)  */
   7410       1.1  mrg /*   set is the context [used for the rounding mode]		      */
   7411       1.1  mrg /*   residue is any pending residue				      */
   7412       1.1  mrg /*   status contains the current status to be updated		      */
   7413       1.1  mrg /*								      */
   7414       1.1  mrg /* If subset mode, set result to zero and set Underflow flags.	      */
   7415       1.1  mrg /*								      */
   7416       1.1  mrg /* Value may be zero with a low exponent; this does not set Subnormal */
   7417       1.1  mrg /* but the exponent will be clamped to Etiny.			      */
   7418       1.1  mrg /*								      */
   7419       1.1  mrg /* Otherwise ensure exponent is not out of range, and round as	      */
   7420       1.1  mrg /* necessary.  Underflow is set if the result is Inexact.	      */
   7421       1.1  mrg /* ------------------------------------------------------------------ */
   7422       1.1  mrg static void decSetSubnormal(decNumber *dn, decContext *set, Int *residue,
   7423       1.1  mrg 			    uInt *status) {
   7424       1.1  mrg   decContext workset;	      /* work */
   7425       1.1  mrg   Int	     etiny, adjust;   /* .. */
   7426       1.1  mrg 
   7427       1.1  mrg   #if DECSUBSET
   7428       1.1  mrg   /* simple set to zero and 'hard underflow' for subset */
   7429       1.1  mrg   if (!set->extended) {
   7430       1.1  mrg     decNumberZero(dn);
   7431       1.1  mrg     /* always full overflow */
   7432       1.1  mrg     *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
   7433       1.1  mrg     return;
   7434       1.1  mrg     }
   7435       1.1  mrg   #endif
   7436       1.1  mrg 
   7437       1.1  mrg   /* Full arithmetic -- allow subnormals, rounded to minimum exponent */
   7438       1.1  mrg   /* (Etiny) if needed */
   7439       1.1  mrg   etiny=set->emin-(set->digits-1);	/* smallest allowed exponent */
   7440       1.1  mrg 
   7441       1.1  mrg   if ISZERO(dn) {			/* value is zero */
   7442       1.1  mrg     /* residue can never be non-zero here */
   7443       1.1  mrg     #if DECCHECK
   7444       1.1  mrg       if (*residue!=0) {
   7445       1.1  mrg 	printf("++ Subnormal 0 residue %ld\n", (LI)*residue);
   7446       1.1  mrg 	*status|=DEC_Invalid_operation;
   7447       1.1  mrg 	}
   7448       1.1  mrg     #endif
   7449       1.1  mrg     if (dn->exponent<etiny) {		/* clamp required */
   7450       1.1  mrg       dn->exponent=etiny;
   7451       1.1  mrg       *status|=DEC_Clamped;
   7452       1.1  mrg       }
   7453       1.1  mrg     return;
   7454       1.1  mrg     }
   7455       1.1  mrg 
   7456       1.1  mrg   *status|=DEC_Subnormal;		/* have a non-zero subnormal */
   7457       1.1  mrg   adjust=etiny-dn->exponent;		/* calculate digits to remove */
   7458       1.1  mrg   if (adjust<=0) {			/* not out of range; unrounded */
   7459       1.1  mrg     /* residue can never be non-zero here, except in the Nmin-residue */
   7460       1.1  mrg     /* case (which is a subnormal result), so can take fast-path here */
   7461       1.1  mrg     /* it may already be inexact (from setting the coefficient) */
   7462       1.1  mrg     if (*status&DEC_Inexact) *status|=DEC_Underflow;
   7463       1.1  mrg     return;
   7464       1.1  mrg     }
   7465       1.1  mrg 
   7466       1.1  mrg   /* adjust>0, so need to rescale the result so exponent becomes Etiny */
   7467       1.1  mrg   /* [this code is similar to that in rescale] */
   7468       1.1  mrg   workset=*set; 			/* clone rounding, etc. */
   7469       1.1  mrg   workset.digits=dn->digits-adjust;	/* set requested length */
   7470       1.1  mrg   workset.emin-=adjust; 		/* and adjust emin to match */
   7471       1.1  mrg   /* [note that the latter can be <1, here, similar to Rescale case] */
   7472       1.1  mrg   decSetCoeff(dn, &workset, dn->lsu, dn->digits, residue, status);
   7473       1.1  mrg   decApplyRound(dn, &workset, *residue, status);
   7474       1.1  mrg 
   7475       1.1  mrg   /* Use 754 default rule: Underflow is set iff Inexact */
   7476       1.1  mrg   /* [independent of whether trapped] */
   7477       1.1  mrg   if (*status&DEC_Inexact) *status|=DEC_Underflow;
   7478       1.1  mrg 
   7479       1.1  mrg   /* if rounded up a 999s case, exponent will be off by one; adjust */
   7480       1.1  mrg   /* back if so [it will fit, because it was shortened earlier] */
   7481       1.1  mrg   if (dn->exponent>etiny) {
   7482       1.1  mrg     dn->digits=decShiftToMost(dn->lsu, dn->digits, 1);
   7483       1.1  mrg     dn->exponent--;			/* (re)adjust the exponent. */
   7484       1.1  mrg     }
   7485       1.1  mrg 
   7486       1.1  mrg   /* if rounded to zero, it is by definition clamped... */
   7487       1.1  mrg   if (ISZERO(dn)) *status|=DEC_Clamped;
   7488       1.1  mrg   } /* decSetSubnormal */
   7489       1.1  mrg 
   7490       1.1  mrg /* ------------------------------------------------------------------ */
   7491       1.1  mrg /* decCheckMath - check entry conditions for a math function	      */
   7492       1.1  mrg /*								      */
   7493       1.1  mrg /*   This checks the context and the operand			      */
   7494       1.1  mrg /*								      */
   7495       1.1  mrg /*   rhs is the operand to check				      */
   7496       1.1  mrg /*   set is the context to check				      */
   7497       1.1  mrg /*   status is unchanged if both are good			      */
   7498       1.1  mrg /*								      */
   7499       1.1  mrg /* returns non-zero if status is changed, 0 otherwise		      */
   7500       1.1  mrg /*								      */
   7501       1.1  mrg /* Restrictions enforced:					      */
   7502       1.1  mrg /*								      */
   7503       1.1  mrg /*   digits, emax, and -emin in the context must be less than	      */
   7504       1.1  mrg /*   DEC_MAX_MATH (999999), and A must be within these bounds if      */
   7505       1.1  mrg /*   non-zero.	Invalid_operation is set in the status if a	      */
   7506       1.1  mrg /*   restriction is violated.					      */
   7507       1.1  mrg /* ------------------------------------------------------------------ */
   7508       1.1  mrg static uInt decCheckMath(const decNumber *rhs, decContext *set,
   7509       1.1  mrg 			 uInt *status) {
   7510       1.1  mrg   uInt save=*status;			     /* record */
   7511       1.1  mrg   if (set->digits>DEC_MAX_MATH
   7512       1.1  mrg    || set->emax>DEC_MAX_MATH
   7513       1.1  mrg    || -set->emin>DEC_MAX_MATH) *status|=DEC_Invalid_context;
   7514       1.1  mrg    else if ((rhs->digits>DEC_MAX_MATH
   7515       1.1  mrg      || rhs->exponent+rhs->digits>DEC_MAX_MATH+1
   7516       1.1  mrg      || rhs->exponent+rhs->digits<2*(1-DEC_MAX_MATH))
   7517       1.1  mrg      && !ISZERO(rhs)) *status|=DEC_Invalid_operation;
   7518       1.1  mrg   return (*status!=save);
   7519       1.1  mrg   } /* decCheckMath */
   7520       1.1  mrg 
   7521       1.1  mrg /* ------------------------------------------------------------------ */
   7522       1.1  mrg /* decGetInt -- get integer from a number			      */
   7523       1.1  mrg /*								      */
   7524       1.1  mrg /*   dn is the number [which will not be altered]		      */
   7525       1.1  mrg /*								      */
   7526       1.1  mrg /*   returns one of:						      */
   7527       1.1  mrg /*     BADINT if there is a non-zero fraction			      */
   7528       1.1  mrg /*     the converted integer					      */
   7529       1.1  mrg /*     BIGEVEN if the integer is even and magnitude > 2*10**9	      */
   7530       1.1  mrg /*     BIGODD  if the integer is odd  and magnitude > 2*10**9	      */
   7531       1.1  mrg /*								      */
   7532       1.1  mrg /* This checks and gets a whole number from the input decNumber.      */
   7533       1.1  mrg /* The sign can be determined from dn by the caller when BIGEVEN or   */
   7534       1.1  mrg /* BIGODD is returned.						      */
   7535       1.1  mrg /* ------------------------------------------------------------------ */
   7536       1.1  mrg static Int decGetInt(const decNumber *dn) {
   7537       1.1  mrg   Int  theInt;				/* result accumulator */
   7538       1.1  mrg   const Unit *up;			/* work */
   7539       1.1  mrg   Int  got;				/* digits (real or not) processed */
   7540       1.1  mrg   Int  ilength=dn->digits+dn->exponent; /* integral length */
   7541       1.1  mrg   Flag neg=decNumberIsNegative(dn);	/* 1 if -ve */
   7542       1.1  mrg 
   7543       1.1  mrg   /* The number must be an integer that fits in 10 digits */
   7544       1.1  mrg   /* Assert, here, that 10 is enough for any rescale Etiny */
   7545       1.1  mrg   #if DEC_MAX_EMAX > 999999999
   7546       1.1  mrg     #error GetInt may need updating [for Emax]
   7547       1.1  mrg   #endif
   7548       1.1  mrg   #if DEC_MIN_EMIN < -999999999
   7549       1.1  mrg     #error GetInt may need updating [for Emin]
   7550       1.1  mrg   #endif
   7551       1.1  mrg   if (ISZERO(dn)) return 0;		/* zeros are OK, with any exponent */
   7552       1.1  mrg 
   7553       1.1  mrg   up=dn->lsu;				/* ready for lsu */
   7554       1.1  mrg   theInt=0;				/* ready to accumulate */
   7555       1.1  mrg   if (dn->exponent>=0) {		/* relatively easy */
   7556       1.1  mrg     /* no fractional part [usual]; allow for positive exponent */
   7557       1.1  mrg     got=dn->exponent;
   7558       1.1  mrg     }
   7559       1.1  mrg    else { /* -ve exponent; some fractional part to check and discard */
   7560       1.1  mrg     Int count=-dn->exponent;		/* digits to discard */
   7561       1.1  mrg     /* spin up whole units until reach the Unit with the unit digit */
   7562       1.1  mrg     for (; count>=DECDPUN; up++) {
   7563       1.1  mrg       if (*up!=0) return BADINT;	/* non-zero Unit to discard */
   7564       1.1  mrg       count-=DECDPUN;
   7565       1.1  mrg       }
   7566       1.1  mrg     if (count==0) got=0;		/* [a multiple of DECDPUN] */
   7567       1.1  mrg      else {				/* [not multiple of DECDPUN] */
   7568       1.1  mrg       Int rem;				/* work */
   7569       1.1  mrg       /* slice off fraction digits and check for non-zero */
   7570       1.1  mrg       #if DECDPUN<=4
   7571       1.1  mrg 	theInt=QUOT10(*up, count);
   7572       1.1  mrg 	rem=*up-theInt*powers[count];
   7573       1.1  mrg       #else
   7574       1.1  mrg 	rem=*up%powers[count];		/* slice off discards */
   7575       1.1  mrg 	theInt=*up/powers[count];
   7576       1.1  mrg       #endif
   7577       1.1  mrg       if (rem!=0) return BADINT;	/* non-zero fraction */
   7578       1.1  mrg       /* it looks good */
   7579       1.1  mrg       got=DECDPUN-count;		/* number of digits so far */
   7580       1.1  mrg       up++;				/* ready for next */
   7581       1.1  mrg       }
   7582       1.1  mrg     }
   7583       1.1  mrg   /* now it's known there's no fractional part */
   7584       1.1  mrg 
   7585       1.1  mrg   /* tricky code now, to accumulate up to 9.3 digits */
   7586       1.1  mrg   if (got==0) {theInt=*up; got+=DECDPUN; up++;} /* ensure lsu is there */
   7587       1.1  mrg 
   7588       1.1  mrg   if (ilength<11) {
   7589       1.1  mrg     Int save=theInt;
   7590       1.1  mrg     /* collect any remaining unit(s) */
   7591       1.1  mrg     for (; got<ilength; up++) {
   7592       1.1  mrg       theInt+=*up*powers[got];
   7593       1.1  mrg       got+=DECDPUN;
   7594       1.1  mrg       }
   7595       1.1  mrg     if (ilength==10) {			/* need to check for wrap */
   7596       1.1  mrg       if (theInt/(Int)powers[got-DECDPUN]!=(Int)*(up-1)) ilength=11;
   7597       1.1  mrg 	 /* [that test also disallows the BADINT result case] */
   7598       1.1  mrg        else if (neg && theInt>1999999997) ilength=11;
   7599       1.1  mrg        else if (!neg && theInt>999999999) ilength=11;
   7600       1.1  mrg       if (ilength==11) theInt=save;	/* restore correct low bit */
   7601       1.1  mrg       }
   7602       1.1  mrg     }
   7603       1.1  mrg 
   7604       1.1  mrg   if (ilength>10) {			/* too big */
   7605       1.1  mrg     if (theInt&1) return BIGODD;	/* bottom bit 1 */
   7606       1.1  mrg     return BIGEVEN;			/* bottom bit 0 */
   7607       1.1  mrg     }
   7608       1.1  mrg 
   7609       1.1  mrg   if (neg) theInt=-theInt;		/* apply sign */
   7610       1.1  mrg   return theInt;
   7611       1.1  mrg   } /* decGetInt */
   7612       1.1  mrg 
   7613       1.1  mrg /* ------------------------------------------------------------------ */
   7614       1.1  mrg /* decDecap -- decapitate the coefficient of a number		      */
   7615       1.1  mrg /*								      */
   7616       1.1  mrg /*   dn   is the number to be decapitated			      */
   7617       1.1  mrg /*   drop is the number of digits to be removed from the left of dn;  */
   7618       1.1  mrg /*     this must be <= dn->digits (if equal, the coefficient is       */
   7619       1.1  mrg /*     set to 0)						      */
   7620       1.1  mrg /*								      */
   7621       1.1  mrg /* Returns dn; dn->digits will be <= the initial digits less drop     */
   7622       1.1  mrg /* (after removing drop digits there may be leading zero digits       */
   7623       1.1  mrg /* which will also be removed).  Only dn->lsu and dn->digits change.  */
   7624       1.1  mrg /* ------------------------------------------------------------------ */
   7625       1.1  mrg static decNumber *decDecap(decNumber *dn, Int drop) {
   7626       1.1  mrg   Unit *msu;				/* -> target cut point */
   7627       1.1  mrg   Int cut;				/* work */
   7628       1.1  mrg   if (drop>=dn->digits) {		/* losing the whole thing */
   7629       1.1  mrg     #if DECCHECK
   7630       1.1  mrg     if (drop>dn->digits)
   7631       1.1  mrg       printf("decDecap called with drop>digits [%ld>%ld]\n",
   7632       1.1  mrg 	     (LI)drop, (LI)dn->digits);
   7633       1.1  mrg     #endif
   7634       1.1  mrg     dn->lsu[0]=0;
   7635       1.1  mrg     dn->digits=1;
   7636       1.1  mrg     return dn;
   7637       1.1  mrg     }
   7638       1.1  mrg   msu=dn->lsu+D2U(dn->digits-drop)-1;	/* -> likely msu */
   7639       1.1  mrg   cut=MSUDIGITS(dn->digits-drop);	/* digits to be in use in msu */
   7640       1.1  mrg   if (cut!=DECDPUN) *msu%=powers[cut];	/* clear left digits */
   7641       1.1  mrg   /* that may have left leading zero digits, so do a proper count... */
   7642       1.1  mrg   dn->digits=decGetDigits(dn->lsu, msu-dn->lsu+1);
   7643       1.1  mrg   return dn;
   7644       1.1  mrg   } /* decDecap */
   7645       1.1  mrg 
   7646       1.1  mrg /* ------------------------------------------------------------------ */
   7647       1.1  mrg /* decBiStr -- compare string with pairwise options		      */
   7648       1.1  mrg /*								      */
   7649       1.1  mrg /*   targ is the string to compare				      */
   7650       1.1  mrg /*   str1 is one of the strings to compare against (length may be 0)  */
   7651       1.1  mrg /*   str2 is the other; it must be the same length as str1	      */
   7652       1.1  mrg /*								      */
   7653       1.1  mrg /*   returns 1 if strings compare equal, (that is, it is the same     */
   7654       1.1  mrg /*   length as str1 and str2, and each character of targ is in either */
   7655       1.1  mrg /*   str1 or str2 in the corresponding position), or 0 otherwise      */
   7656       1.1  mrg /*								      */
   7657       1.1  mrg /* This is used for generic caseless compare, including the awkward   */
   7658       1.1  mrg /* case of the Turkish dotted and dotless Is.  Use as (for example):  */
   7659       1.1  mrg /*   if (decBiStr(test, "mike", "MIKE")) ...			      */
   7660       1.1  mrg /* ------------------------------------------------------------------ */
   7661       1.1  mrg static Flag decBiStr(const char *targ, const char *str1, const char *str2) {
   7662       1.1  mrg   for (;;targ++, str1++, str2++) {
   7663       1.1  mrg     if (*targ!=*str1 && *targ!=*str2) return 0;
   7664       1.1  mrg     /* *targ has a match in one (or both, if terminator) */
   7665       1.1  mrg     if (*targ=='\0') break;
   7666       1.1  mrg     } /* forever */
   7667       1.1  mrg   return 1;
   7668       1.1  mrg   } /* decBiStr */
   7669       1.1  mrg 
   7670       1.1  mrg /* ------------------------------------------------------------------ */
   7671       1.1  mrg /* decNaNs -- handle NaN operand or operands			      */
   7672       1.1  mrg /*								      */
   7673       1.1  mrg /*   res     is the result number				      */
   7674       1.1  mrg /*   lhs     is the first operand				      */
   7675       1.1  mrg /*   rhs     is the second operand, or NULL if none		      */
   7676       1.1  mrg /*   context is used to limit payload length			      */
   7677       1.1  mrg /*   status  contains the current status			      */
   7678       1.1  mrg /*   returns res in case convenient				      */
   7679       1.1  mrg /*								      */
   7680       1.1  mrg /* Called when one or both operands is a NaN, and propagates the      */
   7681       1.1  mrg /* appropriate result to res.  When an sNaN is found, it is changed   */
   7682       1.1  mrg /* to a qNaN and Invalid operation is set.			      */
   7683       1.1  mrg /* ------------------------------------------------------------------ */
   7684       1.1  mrg static decNumber * decNaNs(decNumber *res, const decNumber *lhs,
   7685       1.1  mrg 			   const decNumber *rhs, decContext *set,
   7686       1.1  mrg 			   uInt *status) {
   7687       1.1  mrg   /* This decision tree ends up with LHS being the source pointer, */
   7688       1.1  mrg   /* and status updated if need be */
   7689       1.1  mrg   if (lhs->bits & DECSNAN)
   7690       1.1  mrg     *status|=DEC_Invalid_operation | DEC_sNaN;
   7691       1.1  mrg    else if (rhs==NULL);
   7692       1.1  mrg    else if (rhs->bits & DECSNAN) {
   7693       1.1  mrg     lhs=rhs;
   7694       1.1  mrg     *status|=DEC_Invalid_operation | DEC_sNaN;
   7695       1.1  mrg     }
   7696       1.1  mrg    else if (lhs->bits & DECNAN);
   7697       1.1  mrg    else lhs=rhs;
   7698       1.1  mrg 
   7699       1.1  mrg   /* propagate the payload */
   7700       1.1  mrg   if (lhs->digits<=set->digits) decNumberCopy(res, lhs); /* easy */
   7701       1.1  mrg    else { /* too long */
   7702       1.1  mrg     const Unit *ul;
   7703       1.1  mrg     Unit *ur, *uresp1;
   7704       1.1  mrg     /* copy safe number of units, then decapitate */
   7705       1.1  mrg     res->bits=lhs->bits;		/* need sign etc. */
   7706       1.1  mrg     uresp1=res->lsu+D2U(set->digits);
   7707       1.1  mrg     for (ur=res->lsu, ul=lhs->lsu; ur<uresp1; ur++, ul++) *ur=*ul;
   7708       1.1  mrg     res->digits=D2U(set->digits)*DECDPUN;
   7709       1.1  mrg     /* maybe still too long */
   7710       1.1  mrg     if (res->digits>set->digits) decDecap(res, res->digits-set->digits);
   7711       1.1  mrg     }
   7712       1.1  mrg 
   7713       1.1  mrg   res->bits&=~DECSNAN;	      /* convert any sNaN to NaN, while */
   7714       1.1  mrg   res->bits|=DECNAN;	      /* .. preserving sign */
   7715       1.1  mrg   res->exponent=0;	      /* clean exponent */
   7716       1.1  mrg 			      /* [coefficient was copied/decapitated] */
   7717       1.1  mrg   return res;
   7718       1.1  mrg   } /* decNaNs */
   7719       1.1  mrg 
   7720       1.1  mrg /* ------------------------------------------------------------------ */
   7721       1.1  mrg /* decStatus -- apply non-zero status				      */
   7722       1.1  mrg /*								      */
   7723       1.1  mrg /*   dn     is the number to set if error			      */
   7724       1.1  mrg /*   status contains the current status (not yet in context)	      */
   7725       1.1  mrg /*   set    is the context					      */
   7726       1.1  mrg /*								      */
   7727       1.1  mrg /* If the status is an error status, the number is set to a NaN,      */
   7728       1.1  mrg /* unless the error was an overflow, divide-by-zero, or underflow,    */
   7729       1.1  mrg /* in which case the number will have already been set. 	      */
   7730       1.1  mrg /*								      */
   7731       1.1  mrg /* The context status is then updated with the new status.  Note that */
   7732       1.1  mrg /* this may raise a signal, so control may never return from this     */
   7733       1.1  mrg /* routine (hence resources must be recovered before it is called).   */
   7734       1.1  mrg /* ------------------------------------------------------------------ */
   7735       1.1  mrg static void decStatus(decNumber *dn, uInt status, decContext *set) {
   7736       1.1  mrg   if (status & DEC_NaNs) {		/* error status -> NaN */
   7737       1.1  mrg     /* if cause was an sNaN, clear and propagate [NaN is already set up] */
   7738       1.1  mrg     if (status & DEC_sNaN) status&=~DEC_sNaN;
   7739       1.1  mrg      else {
   7740       1.1  mrg       decNumberZero(dn);		/* other error: clean throughout */
   7741       1.1  mrg       dn->bits=DECNAN;			/* and make a quiet NaN */
   7742       1.1  mrg       }
   7743       1.1  mrg     }
   7744       1.1  mrg   decContextSetStatus(set, status);	/* [may not return] */
   7745       1.1  mrg   return;
   7746       1.1  mrg   } /* decStatus */
   7747       1.1  mrg 
   7748       1.1  mrg /* ------------------------------------------------------------------ */
   7749       1.1  mrg /* decGetDigits -- count digits in a Units array		      */
   7750       1.1  mrg /*								      */
   7751       1.1  mrg /*   uar is the Unit array holding the number (this is often an       */
   7752       1.1  mrg /*	    accumulator of some sort)				      */
   7753       1.1  mrg /*   len is the length of the array in units [>=1]		      */
   7754       1.1  mrg /*								      */
   7755       1.1  mrg /*   returns the number of (significant) digits in the array	      */
   7756       1.1  mrg /*								      */
   7757       1.1  mrg /* All leading zeros are excluded, except the last if the array has   */
   7758       1.1  mrg /* only zero Units.						      */
   7759       1.1  mrg /* ------------------------------------------------------------------ */
   7760       1.1  mrg /* This may be called twice during some operations. */
   7761       1.1  mrg static Int decGetDigits(Unit *uar, Int len) {
   7762       1.1  mrg   Unit *up=uar+(len-1); 	   /* -> msu */
   7763       1.1  mrg   Int  digits=(len-1)*DECDPUN+1;   /* possible digits excluding msu */
   7764       1.1  mrg   #if DECDPUN>4
   7765       1.1  mrg   uInt const *pow;		   /* work */
   7766       1.1  mrg   #endif
   7767       1.1  mrg 				   /* (at least 1 in final msu) */
   7768       1.1  mrg   #if DECCHECK
   7769       1.1  mrg   if (len<1) printf("decGetDigits called with len<1 [%ld]\n", (LI)len);
   7770       1.1  mrg   #endif
   7771       1.1  mrg 
   7772       1.1  mrg   for (; up>=uar; up--) {
   7773       1.1  mrg     if (*up==0) {		   /* unit is all 0s */
   7774       1.1  mrg       if (digits==1) break;	   /* a zero has one digit */
   7775       1.1  mrg       digits-=DECDPUN;		   /* adjust for 0 unit */
   7776       1.1  mrg       continue;}
   7777       1.1  mrg     /* found the first (most significant) non-zero Unit */
   7778       1.1  mrg     #if DECDPUN>1		   /* not done yet */
   7779       1.1  mrg     if (*up<10) break;		   /* is 1-9 */
   7780       1.1  mrg     digits++;
   7781       1.1  mrg     #if DECDPUN>2		   /* not done yet */
   7782       1.1  mrg     if (*up<100) break; 	   /* is 10-99 */
   7783       1.1  mrg     digits++;
   7784       1.1  mrg     #if DECDPUN>3		   /* not done yet */
   7785       1.1  mrg     if (*up<1000) break;	   /* is 100-999 */
   7786       1.1  mrg     digits++;
   7787       1.1  mrg     #if DECDPUN>4		   /* count the rest ... */
   7788       1.1  mrg     for (pow=&powers[4]; *up>=*pow; pow++) digits++;
   7789       1.1  mrg     #endif
   7790       1.1  mrg     #endif
   7791       1.1  mrg     #endif
   7792       1.1  mrg     #endif
   7793       1.1  mrg     break;
   7794       1.1  mrg     } /* up */
   7795       1.1  mrg   return digits;
   7796       1.1  mrg   } /* decGetDigits */
   7797       1.1  mrg 
   7798       1.1  mrg #if DECTRACE | DECCHECK
   7799       1.1  mrg /* ------------------------------------------------------------------ */
   7800       1.1  mrg /* decNumberShow -- display a number [debug aid]		      */
   7801       1.1  mrg /*   dn is the number to show					      */
   7802       1.1  mrg /*								      */
   7803       1.1  mrg /* Shows: sign, exponent, coefficient (msu first), digits	      */
   7804       1.1  mrg /*    or: sign, special-value					      */
   7805       1.1  mrg /* ------------------------------------------------------------------ */
   7806       1.1  mrg /* this is public so other modules can use it */
   7807       1.1  mrg void decNumberShow(const decNumber *dn) {
   7808       1.1  mrg   const Unit *up;		   /* work */
   7809       1.1  mrg   uInt u, d;			   /* .. */
   7810       1.1  mrg   Int cut;			   /* .. */
   7811       1.1  mrg   char isign='+';		   /* main sign */
   7812       1.1  mrg   if (dn==NULL) {
   7813       1.1  mrg     printf("NULL\n");
   7814       1.1  mrg     return;}
   7815       1.1  mrg   if (decNumberIsNegative(dn)) isign='-';
   7816       1.1  mrg   printf(" >> %c ", isign);
   7817       1.1  mrg   if (dn->bits&DECSPECIAL) {	   /* Is a special value */
   7818       1.1  mrg     if (decNumberIsInfinite(dn)) printf("Infinity");
   7819       1.1  mrg      else {				     /* a NaN */
   7820       1.1  mrg       if (dn->bits&DECSNAN) printf("sNaN");  /* signalling NaN */
   7821       1.1  mrg        else printf("NaN");
   7822       1.1  mrg       }
   7823       1.1  mrg     /* if coefficient and exponent are 0, no more to do */
   7824       1.1  mrg     if (dn->exponent==0 && dn->digits==1 && *dn->lsu==0) {
   7825       1.1  mrg       printf("\n");
   7826       1.1  mrg       return;}
   7827       1.1  mrg     /* drop through to report other information */
   7828       1.1  mrg     printf(" ");
   7829       1.1  mrg     }
   7830       1.1  mrg 
   7831       1.1  mrg   /* now carefully display the coefficient */
   7832       1.1  mrg   up=dn->lsu+D2U(dn->digits)-1; 	/* msu */
   7833       1.1  mrg   printf("%ld", (LI)*up);
   7834       1.1  mrg   for (up=up-1; up>=dn->lsu; up--) {
   7835       1.1  mrg     u=*up;
   7836       1.1  mrg     printf(":");
   7837       1.1  mrg     for (cut=DECDPUN-1; cut>=0; cut--) {
   7838       1.1  mrg       d=u/powers[cut];
   7839       1.1  mrg       u-=d*powers[cut];
   7840       1.1  mrg       printf("%ld", (LI)d);
   7841       1.1  mrg       } /* cut */
   7842       1.1  mrg     } /* up */
   7843       1.1  mrg   if (dn->exponent!=0) {
   7844       1.1  mrg     char esign='+';
   7845       1.1  mrg     if (dn->exponent<0) esign='-';
   7846       1.1  mrg     printf(" E%c%ld", esign, (LI)abs(dn->exponent));
   7847       1.1  mrg     }
   7848       1.1  mrg   printf(" [%ld]\n", (LI)dn->digits);
   7849       1.1  mrg   } /* decNumberShow */
   7850       1.1  mrg #endif
   7851       1.1  mrg 
   7852       1.1  mrg #if DECTRACE || DECCHECK
   7853       1.1  mrg /* ------------------------------------------------------------------ */
   7854       1.1  mrg /* decDumpAr -- display a unit array [debug/check aid]		      */
   7855       1.1  mrg /*   name is a single-character tag name			      */
   7856       1.1  mrg /*   ar   is the array to display				      */
   7857       1.1  mrg /*   len  is the length of the array in Units			      */
   7858       1.1  mrg /* ------------------------------------------------------------------ */
   7859       1.1  mrg static void decDumpAr(char name, const Unit *ar, Int len) {
   7860       1.1  mrg   Int i;
   7861       1.1  mrg   const char *spec;
   7862       1.1  mrg   #if DECDPUN==9
   7863       1.1  mrg     spec="%09d ";
   7864       1.1  mrg   #elif DECDPUN==8
   7865       1.1  mrg     spec="%08d ";
   7866       1.1  mrg   #elif DECDPUN==7
   7867       1.1  mrg     spec="%07d ";
   7868       1.1  mrg   #elif DECDPUN==6
   7869       1.1  mrg     spec="%06d ";
   7870       1.1  mrg   #elif DECDPUN==5
   7871       1.1  mrg     spec="%05d ";
   7872       1.1  mrg   #elif DECDPUN==4
   7873       1.1  mrg     spec="%04d ";
   7874       1.1  mrg   #elif DECDPUN==3
   7875       1.1  mrg     spec="%03d ";
   7876       1.1  mrg   #elif DECDPUN==2
   7877       1.1  mrg     spec="%02d ";
   7878       1.1  mrg   #else
   7879       1.1  mrg     spec="%d ";
   7880       1.1  mrg   #endif
   7881       1.1  mrg   printf("  :%c: ", name);
   7882       1.1  mrg   for (i=len-1; i>=0; i--) {
   7883       1.1  mrg     if (i==len-1) printf("%ld ", (LI)ar[i]);
   7884       1.1  mrg      else printf(spec, ar[i]);
   7885       1.1  mrg     }
   7886       1.1  mrg   printf("\n");
   7887       1.1  mrg   return;}
   7888       1.1  mrg #endif
   7889       1.1  mrg 
   7890       1.1  mrg #if DECCHECK
   7891       1.1  mrg /* ------------------------------------------------------------------ */
   7892       1.1  mrg /* decCheckOperands -- check operand(s) to a routine		      */
   7893       1.1  mrg /*   res is the result structure (not checked; it will be set to      */
   7894       1.1  mrg /*	    quiet NaN if error found (and it is not NULL))	      */
   7895       1.1  mrg /*   lhs is the first operand (may be DECUNRESU)		      */
   7896       1.1  mrg /*   rhs is the second (may be DECUNUSED)			      */
   7897       1.1  mrg /*   set is the context (may be DECUNCONT)			      */
   7898       1.1  mrg /*   returns 0 if both operands, and the context are clean, or 1      */
   7899       1.1  mrg /*     otherwise (in which case the context will show an error,       */
   7900       1.1  mrg /*     unless NULL).  Note that res is not cleaned; caller should     */
   7901       1.1  mrg /*     handle this so res=NULL case is safe.			      */
   7902       1.1  mrg /* The caller is expected to abandon immediately if 1 is returned.    */
   7903       1.1  mrg /* ------------------------------------------------------------------ */
   7904       1.1  mrg static Flag decCheckOperands(decNumber *res, const decNumber *lhs,
   7905       1.1  mrg 			     const decNumber *rhs, decContext *set) {
   7906       1.1  mrg   Flag bad=0;
   7907       1.1  mrg   if (set==NULL) {		   /* oops; hopeless */
   7908       1.1  mrg     #if DECTRACE || DECVERB
   7909       1.1  mrg     printf("Reference to context is NULL.\n");
   7910       1.1  mrg     #endif
   7911       1.1  mrg     bad=1;
   7912       1.1  mrg     return 1;}
   7913       1.1  mrg    else if (set!=DECUNCONT
   7914       1.1  mrg      && (set->digits<1 || set->round>=DEC_ROUND_MAX)) {
   7915       1.1  mrg     bad=1;
   7916       1.1  mrg     #if DECTRACE || DECVERB
   7917       1.1  mrg     printf("Bad context [digits=%ld round=%ld].\n",
   7918       1.1  mrg 	   (LI)set->digits, (LI)set->round);
   7919       1.1  mrg     #endif
   7920       1.1  mrg     }
   7921       1.1  mrg    else {
   7922       1.1  mrg     if (res==NULL) {
   7923       1.1  mrg       bad=1;
   7924       1.1  mrg       #if DECTRACE
   7925       1.1  mrg       /* this one not DECVERB as standard tests include NULL */
   7926       1.1  mrg       printf("Reference to result is NULL.\n");
   7927       1.1  mrg       #endif
   7928       1.1  mrg       }
   7929       1.1  mrg     if (!bad && lhs!=DECUNUSED) bad=(decCheckNumber(lhs));
   7930       1.1  mrg     if (!bad && rhs!=DECUNUSED) bad=(decCheckNumber(rhs));
   7931       1.1  mrg     }
   7932       1.1  mrg   if (bad) {
   7933       1.1  mrg     if (set!=DECUNCONT) decContextSetStatus(set, DEC_Invalid_operation);
   7934       1.1  mrg     if (res!=DECUNRESU && res!=NULL) {
   7935       1.1  mrg       decNumberZero(res);
   7936       1.1  mrg       res->bits=DECNAN;       /* qNaN */
   7937       1.1  mrg       }
   7938       1.1  mrg     }
   7939       1.1  mrg   return bad;
   7940       1.1  mrg   } /* decCheckOperands */
   7941       1.1  mrg 
   7942       1.1  mrg /* ------------------------------------------------------------------ */
   7943       1.1  mrg /* decCheckNumber -- check a number				      */
   7944       1.1  mrg /*   dn is the number to check					      */
   7945       1.1  mrg /*   returns 0 if the number is clean, or 1 otherwise		      */
   7946       1.1  mrg /*								      */
   7947       1.1  mrg /* The number is considered valid if it could be a result from some   */
   7948       1.1  mrg /* operation in some valid context.				      */
   7949       1.1  mrg /* ------------------------------------------------------------------ */
   7950       1.1  mrg static Flag decCheckNumber(const decNumber *dn) {
   7951       1.1  mrg   const Unit *up;	      /* work */
   7952       1.1  mrg   uInt maxuint; 	      /* .. */
   7953       1.1  mrg   Int ae, d, digits;	      /* .. */
   7954       1.1  mrg   Int emin, emax;	      /* .. */
   7955       1.1  mrg 
   7956       1.1  mrg   if (dn==NULL) {	      /* hopeless */
   7957       1.1  mrg     #if DECTRACE
   7958       1.1  mrg     /* this one not DECVERB as standard tests include NULL */
   7959       1.1  mrg     printf("Reference to decNumber is NULL.\n");
   7960       1.1  mrg     #endif
   7961       1.1  mrg     return 1;}
   7962       1.1  mrg 
   7963       1.1  mrg   /* check special values */
   7964       1.1  mrg   if (dn->bits & DECSPECIAL) {
   7965       1.1  mrg     if (dn->exponent!=0) {
   7966       1.1  mrg       #if DECTRACE || DECVERB
   7967       1.1  mrg       printf("Exponent %ld (not 0) for a special value [%02x].\n",
   7968       1.1  mrg 	     (LI)dn->exponent, dn->bits);
   7969       1.1  mrg       #endif
   7970       1.1  mrg       return 1;}
   7971       1.1  mrg 
   7972       1.1  mrg     /* 2003.09.08: NaNs may now have coefficients, so next tests Inf only */
   7973       1.1  mrg     if (decNumberIsInfinite(dn)) {
   7974       1.1  mrg       if (dn->digits!=1) {
   7975       1.1  mrg 	#if DECTRACE || DECVERB
   7976       1.1  mrg 	printf("Digits %ld (not 1) for an infinity.\n", (LI)dn->digits);
   7977       1.1  mrg 	#endif
   7978       1.1  mrg 	return 1;}
   7979       1.1  mrg       if (*dn->lsu!=0) {
   7980       1.1  mrg 	#if DECTRACE || DECVERB
   7981       1.1  mrg 	printf("LSU %ld (not 0) for an infinity.\n", (LI)*dn->lsu);
   7982       1.1  mrg 	#endif
   7983       1.1  mrg 	decDumpAr('I', dn->lsu, D2U(dn->digits));
   7984       1.1  mrg 	return 1;}
   7985       1.1  mrg       } /* Inf */
   7986       1.1  mrg     /* 2002.12.26: negative NaNs can now appear through proposed IEEE */
   7987       1.1  mrg     /*		   concrete formats (decimal64, etc.). */
   7988       1.1  mrg     return 0;
   7989       1.1  mrg     }
   7990       1.1  mrg 
   7991       1.1  mrg   /* check the coefficient */
   7992       1.1  mrg   if (dn->digits<1 || dn->digits>DECNUMMAXP) {
   7993       1.1  mrg     #if DECTRACE || DECVERB
   7994       1.1  mrg     printf("Digits %ld in number.\n", (LI)dn->digits);
   7995       1.1  mrg     #endif
   7996       1.1  mrg     return 1;}
   7997       1.1  mrg 
   7998       1.1  mrg   d=dn->digits;
   7999       1.1  mrg 
   8000       1.1  mrg   for (up=dn->lsu; d>0; up++) {
   8001       1.1  mrg     if (d>DECDPUN) maxuint=DECDPUNMAX;
   8002       1.1  mrg      else {		      /* reached the msu */
   8003       1.1  mrg       maxuint=powers[d]-1;
   8004       1.1  mrg       if (dn->digits>1 && *up<powers[d-1]) {
   8005       1.1  mrg 	#if DECTRACE || DECVERB
   8006       1.1  mrg 	printf("Leading 0 in number.\n");
   8007       1.1  mrg 	decNumberShow(dn);
   8008       1.1  mrg 	#endif
   8009       1.1  mrg 	return 1;}
   8010       1.1  mrg       }
   8011       1.1  mrg     if (*up>maxuint) {
   8012       1.1  mrg       #if DECTRACE || DECVERB
   8013       1.1  mrg       printf("Bad Unit [%08lx] in %ld-digit number at offset %ld [maxuint %ld].\n",
   8014       1.1  mrg 	      (LI)*up, (LI)dn->digits, (LI)(up-dn->lsu), (LI)maxuint);
   8015       1.1  mrg       #endif
   8016       1.1  mrg       return 1;}
   8017       1.1  mrg     d-=DECDPUN;
   8018       1.1  mrg     }
   8019       1.1  mrg 
   8020       1.1  mrg   /* check the exponent.  Note that input operands can have exponents */
   8021       1.1  mrg   /* which are out of the set->emin/set->emax and set->digits range */
   8022       1.1  mrg   /* (just as they can have more digits than set->digits). */
   8023       1.1  mrg   ae=dn->exponent+dn->digits-1;    /* adjusted exponent */
   8024       1.1  mrg   emax=DECNUMMAXE;
   8025       1.1  mrg   emin=DECNUMMINE;
   8026       1.1  mrg   digits=DECNUMMAXP;
   8027       1.1  mrg   if (ae<emin-(digits-1)) {
   8028       1.1  mrg     #if DECTRACE || DECVERB
   8029       1.1  mrg     printf("Adjusted exponent underflow [%ld].\n", (LI)ae);
   8030       1.1  mrg     decNumberShow(dn);
   8031       1.1  mrg     #endif
   8032       1.1  mrg     return 1;}
   8033       1.1  mrg   if (ae>+emax) {
   8034       1.1  mrg     #if DECTRACE || DECVERB
   8035       1.1  mrg     printf("Adjusted exponent overflow [%ld].\n", (LI)ae);
   8036       1.1  mrg     decNumberShow(dn);
   8037       1.1  mrg     #endif
   8038       1.1  mrg     return 1;}
   8039       1.1  mrg 
   8040       1.1  mrg   return 0;		 /* it's OK */
   8041       1.1  mrg   } /* decCheckNumber */
   8042       1.1  mrg 
   8043       1.1  mrg /* ------------------------------------------------------------------ */
   8044       1.1  mrg /* decCheckInexact -- check a normal finite inexact result has digits */
   8045       1.1  mrg /*   dn is the number to check					      */
   8046       1.1  mrg /*   set is the context (for status and precision)		      */
   8047       1.1  mrg /*   sets Invalid operation, etc., if some digits are missing	      */
   8048       1.1  mrg /* [this check is not made for DECSUBSET compilation or when	      */
   8049       1.1  mrg /* subnormal is not set]					      */
   8050       1.1  mrg /* ------------------------------------------------------------------ */
   8051       1.1  mrg static void decCheckInexact(const decNumber *dn, decContext *set) {
   8052       1.1  mrg   #if !DECSUBSET && DECEXTFLAG
   8053       1.1  mrg     if ((set->status & (DEC_Inexact|DEC_Subnormal))==DEC_Inexact
   8054       1.1  mrg      && (set->digits!=dn->digits) && !(dn->bits & DECSPECIAL)) {
   8055       1.1  mrg       #if DECTRACE || DECVERB
   8056       1.1  mrg       printf("Insufficient digits [%ld] on normal Inexact result.\n",
   8057       1.1  mrg 	     (LI)dn->digits);
   8058       1.1  mrg       decNumberShow(dn);
   8059       1.1  mrg       #endif
   8060       1.1  mrg       decContextSetStatus(set, DEC_Invalid_operation);
   8061       1.1  mrg       }
   8062       1.1  mrg   #else
   8063       1.1  mrg     /* next is a noop for quiet compiler */
   8064       1.1  mrg     if (dn!=NULL && dn->digits==0) set->status|=DEC_Invalid_operation;
   8065       1.1  mrg   #endif
   8066       1.1  mrg   return;
   8067       1.1  mrg   } /* decCheckInexact */
   8068       1.1  mrg #endif
   8069       1.1  mrg 
   8070       1.1  mrg #if DECALLOC
   8071       1.1  mrg #undef malloc
   8072       1.1  mrg #undef free
   8073       1.1  mrg /* ------------------------------------------------------------------ */
   8074       1.1  mrg /* decMalloc -- accountable allocation routine			      */
   8075       1.1  mrg /*   n is the number of bytes to allocate			      */
   8076       1.1  mrg /*								      */
   8077       1.1  mrg /* Semantics is the same as the stdlib malloc routine, but bytes      */
   8078       1.1  mrg /* allocated are accounted for globally, and corruption fences are    */
   8079       1.1  mrg /* added before and after the 'actual' storage. 		      */
   8080       1.1  mrg /* ------------------------------------------------------------------ */
   8081       1.1  mrg /* This routine allocates storage with an extra twelve bytes; 8 are   */
   8082       1.1  mrg /* at the start and hold:					      */
   8083       1.1  mrg /*   0-3 the original length requested				      */
   8084       1.1  mrg /*   4-7 buffer corruption detection fence (DECFENCE, x4)	      */
   8085       1.1  mrg /* The 4 bytes at the end also hold a corruption fence (DECFENCE, x4) */
   8086       1.1  mrg /* ------------------------------------------------------------------ */
   8087       1.1  mrg static void *decMalloc(size_t n) {
   8088       1.1  mrg   uInt	size=n+12;		   /* true size */
   8089       1.1  mrg   void	*alloc; 		   /* -> allocated storage */
   8090       1.1  mrg   uByte *b, *b0;		   /* work */
   8091       1.1  mrg   uInt	uiwork; 		   /* for macros */
   8092       1.1  mrg 
   8093       1.1  mrg   alloc=malloc(size);		   /* -> allocated storage */
   8094       1.1  mrg   if (alloc==NULL) return NULL;    /* out of strorage */
   8095       1.1  mrg   b0=(uByte *)alloc;		   /* as bytes */
   8096       1.1  mrg   decAllocBytes+=n;		   /* account for storage */
   8097       1.1  mrg   UBFROMUI(alloc, n);		   /* save n */
   8098       1.1  mrg   /* printf(" alloc ++ dAB: %ld (%ld)\n", (LI)decAllocBytes, (LI)n); */
   8099       1.1  mrg   for (b=b0+4; b<b0+8; b++) *b=DECFENCE;
   8100       1.1  mrg   for (b=b0+n+8; b<b0+n+12; b++) *b=DECFENCE;
   8101       1.1  mrg   return b0+8;			   /* -> play area */
   8102       1.1  mrg   } /* decMalloc */
   8103       1.1  mrg 
   8104       1.1  mrg /* ------------------------------------------------------------------ */
   8105       1.1  mrg /* decFree -- accountable free routine				      */
   8106       1.1  mrg /*   alloc is the storage to free				      */
   8107       1.1  mrg /*								      */
   8108       1.1  mrg /* Semantics is the same as the stdlib malloc routine, except that    */
   8109       1.1  mrg /* the global storage accounting is updated and the fences are	      */
   8110       1.1  mrg /* checked to ensure that no routine has written 'out of bounds'.     */
   8111       1.1  mrg /* ------------------------------------------------------------------ */
   8112       1.1  mrg /* This routine first checks that the fences have not been corrupted. */
   8113       1.1  mrg /* It then frees the storage using the 'truw' storage address (that   */
   8114       1.1  mrg /* is, offset by 8).						      */
   8115       1.1  mrg /* ------------------------------------------------------------------ */
   8116       1.1  mrg static void decFree(void *alloc) {
   8117       1.1  mrg   uInt	n;			   /* original length */
   8118       1.1  mrg   uByte *b, *b0;		   /* work */
   8119       1.1  mrg   uInt	uiwork; 		   /* for macros */
   8120       1.1  mrg 
   8121       1.1  mrg   if (alloc==NULL) return;	   /* allowed; it's a nop */
   8122       1.1  mrg   b0=(uByte *)alloc;		   /* as bytes */
   8123       1.1  mrg   b0-=8;			   /* -> true start of storage */
   8124       1.1  mrg   n=UBTOUI(b0); 		   /* lift length */
   8125       1.1  mrg   for (b=b0+4; b<b0+8; b++) if (*b!=DECFENCE)
   8126       1.1  mrg     printf("=== Corrupt byte [%02x] at offset %d from %ld ===\n", *b,
   8127       1.1  mrg 	   b-b0-8, (LI)b0);
   8128       1.1  mrg   for (b=b0+n+8; b<b0+n+12; b++) if (*b!=DECFENCE)
   8129       1.1  mrg     printf("=== Corrupt byte [%02x] at offset +%d from %ld, n=%ld ===\n", *b,
   8130       1.1  mrg 	   b-b0-8, (LI)b0, (LI)n);
   8131       1.1  mrg   free(b0);			   /* drop the storage */
   8132       1.1  mrg   decAllocBytes-=n;		   /* account for storage */
   8133       1.1  mrg   /* printf(" free -- dAB: %d (%d)\n", decAllocBytes, -n); */
   8134       1.1  mrg   } /* decFree */
   8135       1.1  mrg #define malloc(a) decMalloc(a)
   8136       1.1  mrg #define free(a) decFree(a)
   8137       1.1  mrg #endif
   8138