]>
git.saurik.com Git - apple/icu.git/blob - icuSources/i18n/decNumber.cpp
1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /* ------------------------------------------------------------------ */
4 /* Decimal Number arithmetic module */
5 /* ------------------------------------------------------------------ */
6 /* Copyright (c) IBM Corporation, 2000-2014. All rights reserved. */
8 /* This software is made available under the terms of the */
9 /* ICU License -- ICU 1.8.1 and later. */
11 /* The description and User's Guide ("The decNumber C Library") for */
12 /* this software is called decNumber.pdf. This document is */
13 /* available, together with arithmetic and format specifications, */
14 /* testcases, and Web links, on the General Decimal Arithmetic page. */
16 /* Please send comments, suggestions, and corrections to the author: */
18 /* Mike Cowlishaw, IBM Fellow */
19 /* IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK */
20 /* ------------------------------------------------------------------ */
22 /* Modified version, for use from within ICU.
23 * Renamed public functions, to avoid an unwanted export of the
24 * standard names from the ICU library.
26 * Use ICU's uprv_malloc() and uprv_free()
28 * Revert comment syntax to plain C
30 * Remove a few compiler warnings.
33 /* This module comprises the routines for arbitrary-precision General */
34 /* Decimal Arithmetic as defined in the specification which may be */
35 /* found on the General Decimal Arithmetic pages. It implements both */
36 /* the full ('extended') arithmetic and the simpler ('subset') */
41 /* 1. This code is ANSI C89 except: */
43 /* a) C99 line comments (double forward slash) are used. (Most C */
44 /* compilers accept these. If yours does not, a simple script */
45 /* can be used to convert them to ANSI C comments.) */
47 /* b) Types from C99 stdint.h are used. If you do not have this */
48 /* header file, see the User's Guide section of the decNumber */
49 /* documentation; this lists the necessary definitions. */
51 /* c) If DECDPUN>4 or DECUSE64=1, the C99 64-bit int64_t and */
52 /* uint64_t types may be used. To avoid these, set DECUSE64=0 */
53 /* and DECDPUN<=4 (see documentation). */
55 /* The code also conforms to C99 restrictions; in particular, */
56 /* strict aliasing rules are observed. */
58 /* 2. The decNumber format which this library uses is optimized for */
59 /* efficient processing of relatively short numbers; in particular */
60 /* it allows the use of fixed sized structures and minimizes copy */
61 /* and move operations. It does, however, support arbitrary */
62 /* precision (up to 999,999,999 digits) and arbitrary exponent */
63 /* range (Emax in the range 0 through 999,999,999 and Emin in the */
64 /* range -999,999,999 through 0). Mathematical functions (for */
65 /* example decNumberExp) as identified below are restricted more */
66 /* tightly: digits, emax, and -emin in the context must be <= */
67 /* DEC_MAX_MATH (999999), and their operand(s) must be within */
70 /* 3. Logical functions are further restricted; their operands must */
71 /* be finite, positive, have an exponent of zero, and all digits */
72 /* must be either 0 or 1. The result will only contain digits */
73 /* which are 0 or 1 (and will have exponent=0 and a sign of 0). */
75 /* 4. Operands to operator functions are never modified unless they */
76 /* are also specified to be the result number (which is always */
77 /* permitted). Other than that case, operands must not overlap. */
79 /* 5. Error handling: the type of the error is ORed into the status */
80 /* flags in the current context (decContext structure). The */
81 /* SIGFPE signal is then raised if the corresponding trap-enabler */
82 /* flag in the decContext is set (is 1). */
84 /* It is the responsibility of the caller to clear the status */
85 /* flags as required. */
87 /* The result of any routine which returns a number will always */
88 /* be a valid number (which may be a special value, such as an */
89 /* Infinity or NaN). */
91 /* 6. The decNumber format is not an exchangeable concrete */
92 /* representation as it comprises fields which may be machine- */
93 /* dependent (packed or unpacked, or special length, for example). */
94 /* Canonical conversions to and from strings are provided; other */
95 /* conversions are available in separate modules. */
97 /* 7. Normally, input operands are assumed to be valid. Set DECCHECK */
98 /* to 1 for extended operand checking (including NULL operands). */
99 /* Results are undefined if a badly-formed structure (or a NULL */
100 /* pointer to a structure) is provided, though with DECCHECK */
101 /* enabled the operator routines are protected against exceptions. */
102 /* (Except if the result pointer is NULL, which is unrecoverable.) */
104 /* However, the routines will never cause exceptions if they are */
105 /* given well-formed operands, even if the value of the operands */
106 /* is inappropriate for the operation and DECCHECK is not set. */
107 /* (Except for SIGFPE, as and where documented.) */
109 /* 8. Subset arithmetic is available only if DECSUBSET is set to 1. */
110 /* ------------------------------------------------------------------ */
111 /* Implementation notes for maintenance of this module: */
113 /* 1. Storage leak protection: Routines which use malloc are not */
114 /* permitted to use return for fastpath or error exits (i.e., */
115 /* they follow strict structured programming conventions). */
116 /* Instead they have a do{}while(0); construct surrounding the */
117 /* code which is protected -- break may be used to exit this. */
118 /* Other routines can safely use the return statement inline. */
120 /* Storage leak accounting can be enabled using DECALLOC. */
122 /* 2. All loops use the for(;;) construct. Any do construct does */
123 /* not loop; it is for allocation protection as just described. */
125 /* 3. Setting status in the context must always be the very last */
126 /* action in a routine, as non-0 status may raise a trap and hence */
127 /* the call to set status may not return (if the handler uses long */
128 /* jump). Therefore all cleanup must be done first. In general, */
129 /* to achieve this status is accumulated and is only applied just */
130 /* before return by calling decContextSetStatus (via decStatus). */
132 /* Routines which allocate storage cannot, in general, use the */
133 /* 'top level' routines which could cause a non-returning */
134 /* transfer of control. The decXxxxOp routines are safe (do not */
135 /* call decStatus even if traps are set in the context) and should */
136 /* be used instead (they are also a little faster). */
138 /* 4. Exponent checking is minimized by allowing the exponent to */
139 /* grow outside its limits during calculations, provided that */
140 /* the decFinalize function is called later. Multiplication and */
141 /* division, and intermediate calculations in exponentiation, */
142 /* require more careful checks because of the risk of 31-bit */
143 /* overflow (the most negative valid exponent is -1999999997, for */
144 /* a 999999999-digit number with adjusted exponent of -999999999). */
146 /* 5. Rounding is deferred until finalization of results, with any */
147 /* 'off to the right' data being represented as a single digit */
148 /* residue (in the range -1 through 9). This avoids any double- */
149 /* rounding when more than one shortening takes place (for */
150 /* example, when a result is subnormal). */
152 /* 6. The digits count is allowed to rise to a multiple of DECDPUN */
153 /* during many operations, so whole Units are handled and exact */
154 /* accounting of digits is not needed. The correct digits value */
155 /* is found by decGetDigits, which accounts for leading zeros. */
156 /* This must be called before any rounding if the number of digits */
157 /* is not known exactly. */
159 /* 7. The multiply-by-reciprocal 'trick' is used for partitioning */
160 /* numbers up to four digits, using appropriate constants. This */
161 /* is not useful for longer numbers because overflow of 32 bits */
162 /* would lead to 4 multiplies, which is almost as expensive as */
163 /* a divide (unless a floating-point or 64-bit multiply is */
164 /* assumed to be available). */
166 /* 8. Unusual abbreviations that may be used in the commentary: */
167 /* lhs -- left hand side (operand, of an operation) */
168 /* lsd -- least significant digit (of coefficient) */
169 /* lsu -- least significant Unit (of coefficient) */
170 /* msd -- most significant digit (of coefficient) */
171 /* msi -- most significant item (in an array) */
172 /* msu -- most significant Unit (of coefficient) */
173 /* rhs -- right hand side (operand, of an operation) */
174 /* +ve -- positive */
175 /* -ve -- negative */
176 /* ** -- raise to the power */
177 /* ------------------------------------------------------------------ */
179 #include <stdlib.h> /* for malloc, free, etc. */
180 /* #include <stdio.h> */ /* for printf [if needed] */
181 #include <string.h> /* for strcpy */
182 #include <ctype.h> /* for lower */
183 #include "cmemory.h" /* for uprv_malloc, etc., in ICU */
184 #include "decNumber.h" /* base number library */
185 #include "decNumberLocal.h" /* decNumber local types, etc. */
189 /* Public lookup table used by the D2U macro */
190 static const uByte d2utable
[DECMAXD2U
+1]=D2UTABLE
;
192 #define DECVERB 1 /* set to 1 for verbose DECCHECK */
193 #define powers DECPOWERS /* old internal name */
195 /* Local constants */
196 #define DIVIDE 0x80 /* Divide operators */
197 #define REMAINDER 0x40 /* .. */
198 #define DIVIDEINT 0x20 /* .. */
199 #define REMNEAR 0x10 /* .. */
200 #define COMPARE 0x01 /* Compare operators */
201 #define COMPMAX 0x02 /* .. */
202 #define COMPMIN 0x03 /* .. */
203 #define COMPTOTAL 0x04 /* .. */
204 #define COMPNAN 0x05 /* .. [NaN processing] */
205 #define COMPSIG 0x06 /* .. [signaling COMPARE] */
206 #define COMPMAXMAG 0x07 /* .. */
207 #define COMPMINMAG 0x08 /* .. */
209 #define DEC_sNaN 0x40000000 /* local status: sNaN signal */
210 #define BADINT (Int)0x80000000 /* most-negative Int; error indicator */
211 /* Next two indicate an integer >= 10**6, and its parity (bottom bit) */
212 #define BIGEVEN (Int)0x80000002
213 #define BIGODD (Int)0x80000003
215 static const Unit uarrone
[1]={1}; /* Unit array of 1, used for incrementing */
217 /* ------------------------------------------------------------------ */
218 /* round-for-reround digits */
219 /* ------------------------------------------------------------------ */
221 static const uByte DECSTICKYTAB
[10]={1,1,2,3,4,6,6,7,8,9}; /* used if sticky */
224 /* ------------------------------------------------------------------ */
225 /* Powers of ten (powers[n]==10**n, 0<=n<=9) */
226 /* ------------------------------------------------------------------ */
227 static const uInt DECPOWERS
[10]={1, 10, 100, 1000, 10000, 100000, 1000000,
228 10000000, 100000000, 1000000000};
231 /* Granularity-dependent code */
233 #define eInt Int /* extended integer */
234 #define ueInt uInt /* unsigned extended integer */
235 /* Constant multipliers for divide-by-power-of five using reciprocal */
236 /* multiply, after removing powers of 2 by shifting, and final shift */
237 /* of 17 [we only need up to **4] */
238 static const uInt multies
[]={131073, 26215, 5243, 1049, 210};
239 /* QUOT10 -- macro to return the quotient of unit u divided by 10**n */
240 #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
242 /* For DECDPUN>4 non-ANSI-89 64-bit types are needed. */
244 #error decNumber.c: DECUSE64 must be 1 when DECDPUN>4
246 #define eInt Long /* extended integer */
247 #define ueInt uLong /* unsigned extended integer */
251 static decNumber
* decAddOp(decNumber
*, const decNumber
*, const decNumber
*,
252 decContext
*, uByte
, uInt
*);
253 static Flag
decBiStr(const char *, const char *, const char *);
254 static uInt
decCheckMath(const decNumber
*, decContext
*, uInt
*);
255 static void decApplyRound(decNumber
*, decContext
*, Int
, uInt
*);
256 static Int
decCompare(const decNumber
*lhs
, const decNumber
*rhs
, Flag
);
257 static decNumber
* decCompareOp(decNumber
*, const decNumber
*,
258 const decNumber
*, decContext
*,
260 static void decCopyFit(decNumber
*, const decNumber
*, decContext
*,
262 static decNumber
* decDecap(decNumber
*, Int
);
263 static decNumber
* decDivideOp(decNumber
*, const decNumber
*,
264 const decNumber
*, decContext
*, Flag
, uInt
*);
265 static decNumber
* decExpOp(decNumber
*, const decNumber
*,
266 decContext
*, uInt
*);
267 static void decFinalize(decNumber
*, decContext
*, Int
*, uInt
*);
268 static Int
decGetDigits(Unit
*, Int
);
269 static Int
decGetInt(const decNumber
*);
270 static decNumber
* decLnOp(decNumber
*, const decNumber
*,
271 decContext
*, uInt
*);
272 static decNumber
* decMultiplyOp(decNumber
*, const decNumber
*,
273 const decNumber
*, decContext
*,
275 static decNumber
* decNaNs(decNumber
*, const decNumber
*,
276 const decNumber
*, decContext
*, uInt
*);
277 static decNumber
* decQuantizeOp(decNumber
*, const decNumber
*,
278 const decNumber
*, decContext
*, Flag
,
280 static void decReverse(Unit
*, Unit
*);
281 static void decSetCoeff(decNumber
*, decContext
*, const Unit
*,
283 static void decSetMaxValue(decNumber
*, decContext
*);
284 static void decSetOverflow(decNumber
*, decContext
*, uInt
*);
285 static void decSetSubnormal(decNumber
*, decContext
*, Int
*, uInt
*);
286 static Int
decShiftToLeast(Unit
*, Int
, Int
);
287 static Int
decShiftToMost(Unit
*, Int
, Int
);
288 static void decStatus(decNumber
*, uInt
, decContext
*);
289 static void decToString(const decNumber
*, char[], Flag
);
290 static decNumber
* decTrim(decNumber
*, decContext
*, Flag
, Flag
, Int
*);
291 static Int
decUnitAddSub(const Unit
*, Int
, const Unit
*, Int
, Int
,
293 static Int
decUnitCompare(const Unit
*, Int
, const Unit
*, Int
, Int
);
296 /* decFinish == decFinalize when no subset arithmetic needed */
297 #define decFinish(a,b,c,d) decFinalize(a,b,c,d)
299 static void decFinish(decNumber
*, decContext
*, Int
*, uInt
*);
300 static decNumber
* decRoundOperand(const decNumber
*, decContext
*, uInt
*);
304 /* masked special-values bits */
305 #define SPECIALARG (rhs->bits & DECSPECIAL)
306 #define SPECIALARGS ((lhs->bits | rhs->bits) & DECSPECIAL)
309 #define malloc(a) uprv_malloc(a)
310 #define free(a) uprv_free(a)
312 /* Diagnostic macros, etc. */
314 /* Handle malloc/free accounting. If enabled, our accountable routines */
315 /* are used; otherwise the code just goes straight to the system malloc */
316 /* and free routines. */
317 #define malloc(a) decMalloc(a)
318 #define free(a) decFree(a)
319 #define DECFENCE 0x5a /* corruption detector */
320 /* 'Our' malloc and free: */
321 static void *decMalloc(size_t);
322 static void decFree(void *);
323 uInt decAllocBytes
=0; /* count of bytes allocated */
324 /* Note that DECALLOC code only checks for storage buffer overflow. */
325 /* To check for memory leaks, the decAllocBytes variable must be */
326 /* checked to be 0 at appropriate times (e.g., after the test */
327 /* harness completes a set of tests). This checking may be unreliable */
328 /* if the testing is done in a multi-thread environment. */
332 /* Optional checking routines. Enabling these means that decNumber */
333 /* and decContext operands to operator routines are checked for */
334 /* correctness. This roughly doubles the execution time of the */
335 /* fastest routines (and adds 600+ bytes), so should not normally be */
336 /* used in 'production'. */
337 /* decCheckInexact is used to check that inexact results have a full */
338 /* complement of digits (where appropriate -- this is not the case */
339 /* for Quantize, for example) */
340 #define DECUNRESU ((decNumber *)(void *)0xffffffff)
341 #define DECUNUSED ((const decNumber *)(void *)0xffffffff)
342 #define DECUNCONT ((decContext *)(void *)(0xffffffff))
343 static Flag
decCheckOperands(decNumber
*, const decNumber
*,
344 const decNumber
*, decContext
*);
345 static Flag
decCheckNumber(const decNumber
*);
346 static void decCheckInexact(const decNumber
*, decContext
*);
349 #if DECTRACE || DECCHECK
350 /* Optional trace/debugging routines (may or may not be used) */
351 void decNumberShow(const decNumber
*); /* displays the components of a number */
352 static void decDumpAr(char, const Unit
*, Int
);
355 /* ================================================================== */
357 /* ================================================================== */
359 /* ------------------------------------------------------------------ */
360 /* from-int32 -- conversion from Int or uInt */
362 /* dn is the decNumber to receive the integer */
363 /* in or uin is the integer to be converted */
366 /* No error is possible. */
367 /* ------------------------------------------------------------------ */
368 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberFromInt32(decNumber
*dn
, Int in
) {
371 else { /* negative (possibly BADINT) */
372 if (in
==BADINT
) unsig
=(uInt
)1073741824*2; /* special case */
373 else unsig
=-in
; /* invert */
375 /* in is now positive */
376 uprv_decNumberFromUInt32(dn
, unsig
);
377 if (in
<0) dn
->bits
=DECNEG
; /* sign needed */
379 } /* decNumberFromInt32 */
381 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberFromUInt32(decNumber
*dn
, uInt uin
) {
382 Unit
*up
; /* work pointer */
383 uprv_decNumberZero(dn
); /* clean */
384 if (uin
==0) return dn
; /* [or decGetDigits bad call] */
385 for (up
=dn
->lsu
; uin
>0; up
++) {
386 *up
=(Unit
)(uin
%(DECDPUNMAX
+1));
387 uin
=uin
/(DECDPUNMAX
+1);
389 dn
->digits
=decGetDigits(dn
->lsu
, static_cast<int32_t>(up
- dn
->lsu
));
391 } /* decNumberFromUInt32 */
393 /* ------------------------------------------------------------------ */
394 /* to-int32 -- conversion to Int or uInt */
396 /* dn is the decNumber to convert */
397 /* set is the context for reporting errors */
398 /* returns the converted decNumber, or 0 if Invalid is set */
400 /* Invalid is set if the decNumber does not have exponent==0 or if */
401 /* it is a NaN, Infinite, or out-of-range. */
402 /* ------------------------------------------------------------------ */
403 U_CAPI Int U_EXPORT2
uprv_decNumberToInt32(const decNumber
*dn
, decContext
*set
) {
405 if (decCheckOperands(DECUNRESU
, DECUNUSED
, dn
, set
)) return 0;
408 /* special or too many digits, or bad exponent */
409 if (dn
->bits
&DECSPECIAL
|| dn
->digits
>10 || dn
->exponent
!=0) ; /* bad */
410 else { /* is a finite integer with 10 or fewer digits */
412 const Unit
*up
; /* .. */
413 uInt hi
=0, lo
; /* .. */
414 up
=dn
->lsu
; /* -> lsu */
415 lo
=*up
; /* get 1 to 9 digits */
416 #if DECDPUN>1 /* split to higher */
421 /* collect remaining Units, if any, into hi */
422 for (d
=DECDPUN
; d
<dn
->digits
; up
++, d
+=DECDPUN
) hi
+=*up
*powers
[d
-1];
423 /* now low has the lsd, hi the remainder */
424 if (hi
>214748364 || (hi
==214748364 && lo
>7)) { /* out of range? */
425 /* most-negative is a reprieve */
426 if (dn
->bits
&DECNEG
&& hi
==214748364 && lo
==8) return 0x80000000;
427 /* bad -- drop through */
429 else { /* in-range always */
431 if (dn
->bits
&DECNEG
) return -i
;
435 uprv_decContextSetStatus(set
, DEC_Invalid_operation
); /* [may not return] */
437 } /* decNumberToInt32 */
439 U_CAPI uInt U_EXPORT2
uprv_decNumberToUInt32(const decNumber
*dn
, decContext
*set
) {
441 if (decCheckOperands(DECUNRESU
, DECUNUSED
, dn
, set
)) return 0;
443 /* special or too many digits, or bad exponent, or negative (<0) */
444 if (dn
->bits
&DECSPECIAL
|| dn
->digits
>10 || dn
->exponent
!=0
445 || (dn
->bits
&DECNEG
&& !ISZERO(dn
))); /* bad */
446 else { /* is a finite integer with 10 or fewer digits */
448 const Unit
*up
; /* .. */
449 uInt hi
=0, lo
; /* .. */
450 up
=dn
->lsu
; /* -> lsu */
451 lo
=*up
; /* get 1 to 9 digits */
452 #if DECDPUN>1 /* split to higher */
457 /* collect remaining Units, if any, into hi */
458 for (d
=DECDPUN
; d
<dn
->digits
; up
++, d
+=DECDPUN
) hi
+=*up
*powers
[d
-1];
460 /* now low has the lsd, hi the remainder */
461 if (hi
>429496729 || (hi
==429496729 && lo
>5)) ; /* no reprieve possible */
462 else return X10(hi
)+lo
;
464 uprv_decContextSetStatus(set
, DEC_Invalid_operation
); /* [may not return] */
466 } /* decNumberToUInt32 */
468 /* ------------------------------------------------------------------ */
469 /* to-scientific-string -- conversion to numeric string */
470 /* to-engineering-string -- conversion to numeric string */
472 /* decNumberToString(dn, string); */
473 /* decNumberToEngString(dn, string); */
475 /* dn is the decNumber to convert */
476 /* string is the string where the result will be laid out */
478 /* string must be at least dn->digits+14 characters long */
480 /* No error is possible, and no status can be set. */
481 /* ------------------------------------------------------------------ */
482 U_CAPI
char * U_EXPORT2
uprv_decNumberToString(const decNumber
*dn
, char *string
){
483 decToString(dn
, string
, 0);
485 } /* DecNumberToString */
487 U_CAPI
char * U_EXPORT2
uprv_decNumberToEngString(const decNumber
*dn
, char *string
){
488 decToString(dn
, string
, 1);
490 } /* DecNumberToEngString */
492 /* ------------------------------------------------------------------ */
493 /* to-number -- conversion from numeric string */
495 /* decNumberFromString -- convert string to decNumber */
496 /* dn -- the number structure to fill */
497 /* chars[] -- the string to convert ('\0' terminated) */
498 /* set -- the context used for processing any error, */
499 /* determining the maximum precision available */
500 /* (set.digits), determining the maximum and minimum */
501 /* exponent (set.emax and set.emin), determining if */
502 /* extended values are allowed, and checking the */
503 /* rounding mode if overflow occurs or rounding is */
506 /* The length of the coefficient and the size of the exponent are */
507 /* checked by this routine, so the correct error (Underflow or */
508 /* Overflow) can be reported or rounding applied, as necessary. */
510 /* If bad syntax is detected, the result will be a quiet NaN. */
511 /* ------------------------------------------------------------------ */
512 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberFromString(decNumber
*dn
, const char chars
[],
514 Int exponent
=0; /* working exponent [assume 0] */
515 uByte bits
=0; /* working flags [assume +ve] */
516 Unit
*res
; /* where result will be built */
517 Unit resbuff
[SD2U(DECBUFFER
+9)];/* local buffer in case need temporary */
518 /* [+9 allows for ln() constants] */
519 Unit
*allocres
=NULL
; /* -> allocated result, iff allocated */
520 Int d
=0; /* count of digits found in decimal part */
521 const char *dotchar
=NULL
; /* where dot was found */
522 const char *cfirst
=chars
; /* -> first character of decimal part */
523 const char *last
=NULL
; /* -> last digit of decimal part */
524 const char *c
; /* work */
527 Int cut
, out
; /* .. */
529 Int residue
; /* rounding residue */
530 uInt status
=0; /* error code */
533 if (decCheckOperands(DECUNRESU
, DECUNUSED
, DECUNUSED
, set
))
534 return uprv_decNumberZero(dn
);
537 do { /* status & malloc protection */
538 for (c
=chars
;; c
++) { /* -> input character */
539 if (*c
>='0' && *c
<='9') { /* test for Arabic digit */
541 d
++; /* count of real digits */
542 continue; /* still in decimal part */
544 if (*c
=='.' && dotchar
==NULL
) { /* first '.' */
545 dotchar
=c
; /* record offset into decimal part */
546 if (c
==cfirst
) cfirst
++; /* first digit must follow */
548 if (c
==chars
) { /* first in string... */
549 if (*c
=='-') { /* valid - sign */
553 if (*c
=='+') { /* valid + sign */
557 /* *c is not a digit, or a valid +, -, or '.' */
561 if (last
==NULL
) { /* no digits yet */
562 status
=DEC_Conversion_syntax
;/* assume the worst */
563 if (*c
=='\0') break; /* and no more to come... */
565 /* if subset then infinities and NaNs are not allowed */
566 if (!set
->extended
) break; /* hopeless */
568 /* Infinities and NaNs are possible, here */
569 if (dotchar
!=NULL
) break; /* .. unless had a dot */
570 uprv_decNumberZero(dn
); /* be optimistic */
571 if (decBiStr(c
, "infinity", "INFINITY")
572 || decBiStr(c
, "inf", "INF")) {
573 dn
->bits
=bits
| DECINF
;
574 status
=0; /* is OK */
575 break; /* all done */
578 /* 2003.09.10 NaNs are now permitted to have a sign */
579 dn
->bits
=bits
| DECNAN
; /* assume simple NaN */
580 if (*c
=='s' || *c
=='S') { /* looks like an sNaN */
582 dn
->bits
=bits
| DECSNAN
;
584 if (*c
!='n' && *c
!='N') break; /* check caseless "NaN" */
586 if (*c
!='a' && *c
!='A') break; /* .. */
588 if (*c
!='n' && *c
!='N') break; /* .. */
590 /* now either nothing, or nnnn payload, expected */
591 /* -> start of integer and skip leading 0s [including plain 0] */
592 for (cfirst
=c
; *cfirst
=='0';) cfirst
++;
593 if (*cfirst
=='\0') { /* "NaN" or "sNaN", maybe with all 0s */
594 status
=0; /* it's good */
597 /* something other than 0s; setup last and d as usual [no dots] */
598 for (c
=cfirst
;; c
++, d
++) {
599 if (*c
<'0' || *c
>'9') break; /* test for Arabic digit */
602 if (*c
!='\0') break; /* not all digits */
603 if (d
>set
->digits
-1) {
604 /* [NB: payload in a decNumber can be full length unless */
605 /* clamped, in which case can only be digits-1] */
606 if (set
->clamp
) break;
607 if (d
>set
->digits
) break;
608 } /* too many digits? */
609 /* good; drop through to convert the integer to coefficient */
610 status
=0; /* syntax is OK */
611 bits
=dn
->bits
; /* for copy-back */
614 else if (*c
!='\0') { /* more to process... */
615 /* had some digits; exponent is only valid sequence now */
616 Flag nege
; /* 1=negative exponent */
617 const char *firstexp
; /* -> first significant exponent digit */
618 status
=DEC_Conversion_syntax
;/* assume the worst */
619 if (*c
!='e' && *c
!='E') break;
620 /* Found 'e' or 'E' -- now process explicit exponent */
621 /* 1998.07.11: sign no longer required */
623 c
++; /* to (possible) sign */
624 if (*c
=='-') {nege
=1; c
++;}
625 else if (*c
=='+') c
++;
628 for (; *c
=='0' && *(c
+1)!='\0';) c
++; /* strip insignificant zeros */
629 firstexp
=c
; /* save exponent digit place */
630 uInt uexponent
= 0; /* Avoid undefined behavior on signed int overflow */
632 if (*c
<'0' || *c
>'9') break; /* not a digit */
633 uexponent
=X10(uexponent
)+(uInt
)*c
-(uInt
)'0';
635 exponent
= (Int
)uexponent
;
636 /* if not now on a '\0', *c must not be a digit */
639 /* (this next test must be after the syntax checks) */
640 /* if it was too long the exponent may have wrapped, so check */
641 /* carefully and set it to a certain overflow if wrap possible */
642 if (c
>=firstexp
+9+1) {
643 if (c
>firstexp
+9+1 || *firstexp
>'1') exponent
=DECNUMMAXE
*2;
644 /* [up to 1999999999 is OK, for example 1E-1000000998] */
646 if (nege
) exponent
=-exponent
; /* was negative */
647 status
=0; /* is OK */
648 } /* stuff after digits */
650 /* Here when whole string has been inspected; syntax is good */
651 /* cfirst->first digit (never dot), last->last digit (ditto) */
653 /* strip leading zeros/dot [leave final 0 if all 0's] */
654 if (*cfirst
=='0') { /* [cfirst has stepped over .] */
655 for (c
=cfirst
; c
<last
; c
++, cfirst
++) {
656 if (*c
=='.') continue; /* ignore dots */
657 if (*c
!='0') break; /* non-zero found */
658 d
--; /* 0 stripped */
661 /* make a rapid exit for easy zeros if !extended */
662 if (*cfirst
=='0' && !set
->extended
) {
663 uprv_decNumberZero(dn
); /* clean result */
664 break; /* [could be return] */
667 } /* at least one leading 0 */
669 /* Handle decimal point... */
670 if (dotchar
!=NULL
&& dotchar
<last
) /* non-trailing '.' found? */
671 exponent
-= static_cast<int32_t>(last
-dotchar
); /* adjust exponent */
672 /* [we can now ignore the .] */
674 /* OK, the digits string is good. Assemble in the decNumber, or in */
675 /* a temporary units array if rounding is needed */
676 if (d
<=set
->digits
) res
=dn
->lsu
; /* fits into supplied decNumber */
677 else { /* rounding needed */
678 Int needbytes
=D2U(d
)*sizeof(Unit
);/* bytes needed */
679 res
=resbuff
; /* assume use local buffer */
680 if (needbytes
>(Int
)sizeof(resbuff
)) { /* too big for local */
681 allocres
=(Unit
*)malloc(needbytes
);
682 if (allocres
==NULL
) {status
|=DEC_Insufficient_storage
; break;}
686 /* res now -> number lsu, buffer, or allocated storage for Unit array */
688 /* Place the coefficient into the selected Unit array */
689 /* [this is often 70% of the cost of this function when DECDPUN>1] */
691 out
=0; /* accumulator */
692 up
=res
+D2U(d
)-1; /* -> msu */
693 cut
=d
-(up
-res
)*DECDPUN
; /* digits in top unit */
694 for (c
=cfirst
;; c
++) { /* along the digits */
695 if (*c
=='.') continue; /* ignore '.' [don't decrement cut] */
696 out
=X10(out
)+(Int
)*c
-(Int
)'0';
697 if (c
==last
) break; /* done [never get to trailing '.'] */
699 if (cut
>0) continue; /* more for this unit */
700 *up
=(Unit
)out
; /* write unit */
701 up
--; /* prepare for unit below.. */
702 cut
=DECDPUN
; /* .. */
705 *up
=(Unit
)out
; /* write lsu */
710 for (c
=last
; c
>=cfirst
; c
--) { /* over each character, from least */
711 if (*c
=='.') continue; /* ignore . [don't step up] */
712 *up
=(Unit
)((Int
)*c
-(Int
)'0');
718 dn
->exponent
=exponent
;
721 /* if not in number (too long) shorten into the number */
724 decSetCoeff(dn
, set
, res
, d
, &residue
, &status
);
725 /* always check for overflow or subnormal and round as needed */
726 decFinalize(dn
, set
, &residue
, &status
);
728 else { /* no rounding, but may still have overflow or subnormal */
729 /* [these tests are just for performance; finalize repeats them] */
730 if ((dn
->exponent
-1<set
->emin
-dn
->digits
)
731 || (dn
->exponent
-1>set
->emax
-set
->digits
)) {
733 decFinalize(dn
, set
, &residue
, &status
);
736 /* decNumberShow(dn); */
737 } while(0); /* [for break] */
739 if (allocres
!=NULL
) free(allocres
); /* drop any storage used */
740 if (status
!=0) decStatus(dn
, status
, set
);
742 } /* decNumberFromString */
744 /* ================================================================== */
746 /* ================================================================== */
748 /* ------------------------------------------------------------------ */
749 /* decNumberAbs -- absolute value operator */
751 /* This computes C = abs(A) */
753 /* res is C, the result. C may be A */
755 /* set is the context */
757 /* See also decNumberCopyAbs for a quiet bitwise version of this. */
758 /* C must have space for set->digits digits. */
759 /* ------------------------------------------------------------------ */
760 /* This has the same effect as decNumberPlus unless A is negative, */
761 /* in which case it has the same effect as decNumberMinus. */
762 /* ------------------------------------------------------------------ */
763 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberAbs(decNumber
*res
, const decNumber
*rhs
,
765 decNumber dzero
; /* for 0 */
766 uInt status
=0; /* accumulator */
769 if (decCheckOperands(res
, DECUNUSED
, rhs
, set
)) return res
;
772 uprv_decNumberZero(&dzero
); /* set 0 */
773 dzero
.exponent
=rhs
->exponent
; /* [no coefficient expansion] */
774 decAddOp(res
, &dzero
, rhs
, set
, (uByte
)(rhs
->bits
& DECNEG
), &status
);
775 if (status
!=0) decStatus(res
, status
, set
);
777 decCheckInexact(res
, set
);
782 /* ------------------------------------------------------------------ */
783 /* decNumberAdd -- add two Numbers */
785 /* This computes C = A + B */
787 /* res is C, the result. C may be A and/or B (e.g., X=X+X) */
790 /* set is the context */
792 /* C must have space for set->digits digits. */
793 /* ------------------------------------------------------------------ */
794 /* This just calls the routine shared with Subtract */
795 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberAdd(decNumber
*res
, const decNumber
*lhs
,
796 const decNumber
*rhs
, decContext
*set
) {
797 uInt status
=0; /* accumulator */
798 decAddOp(res
, lhs
, rhs
, set
, 0, &status
);
799 if (status
!=0) decStatus(res
, status
, set
);
801 decCheckInexact(res
, set
);
806 /* ------------------------------------------------------------------ */
807 /* decNumberAnd -- AND two Numbers, digitwise */
809 /* This computes C = A & B */
811 /* res is C, the result. C may be A and/or B (e.g., X=X&X) */
814 /* set is the context (used for result length and error report) */
816 /* C must have space for set->digits digits. */
818 /* Logical function restrictions apply (see above); a NaN is */
819 /* returned with Invalid_operation if a restriction is violated. */
820 /* ------------------------------------------------------------------ */
821 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberAnd(decNumber
*res
, const decNumber
*lhs
,
822 const decNumber
*rhs
, decContext
*set
) {
823 const Unit
*ua
, *ub
; /* -> operands */
824 const Unit
*msua
, *msub
; /* -> operand msus */
825 Unit
*uc
, *msuc
; /* -> result and its msu */
826 Int msudigs
; /* digits in res msu */
828 if (decCheckOperands(res
, lhs
, rhs
, set
)) return res
;
831 if (lhs
->exponent
!=0 || decNumberIsSpecial(lhs
) || decNumberIsNegative(lhs
)
832 || rhs
->exponent
!=0 || decNumberIsSpecial(rhs
) || decNumberIsNegative(rhs
)) {
833 decStatus(res
, DEC_Invalid_operation
, set
);
837 /* operands are valid */
838 ua
=lhs
->lsu
; /* bottom-up */
839 ub
=rhs
->lsu
; /* .. */
840 uc
=res
->lsu
; /* .. */
841 msua
=ua
+D2U(lhs
->digits
)-1; /* -> msu of lhs */
842 msub
=ub
+D2U(rhs
->digits
)-1; /* -> msu of rhs */
843 msuc
=uc
+D2U(set
->digits
)-1; /* -> msu of result */
844 msudigs
=MSUDIGITS(set
->digits
); /* [faster than remainder] */
845 for (; uc
<=msuc
; ua
++, ub
++, uc
++) { /* Unit loop */
846 Unit a
, b
; /* extract units */
851 *uc
=0; /* can now write back */
852 if (a
|b
) { /* maybe 1 bits to examine */
854 *uc
=0; /* can now write back */
855 /* This loop could be unrolled and/or use BIN2BCD tables */
856 for (i
=0; i
<DECDPUN
; i
++) {
857 if (a
&b
&1) *uc
=*uc
+(Unit
)powers
[i
]; /* effect AND */
863 decStatus(res
, DEC_Invalid_operation
, set
);
866 if (uc
==msuc
&& i
==msudigs
-1) break; /* just did final digit */
870 /* [here uc-1 is the msu of the result] */
871 res
->digits
=decGetDigits(res
->lsu
, static_cast<int32_t>(uc
- res
->lsu
));
872 res
->exponent
=0; /* integer */
873 res
->bits
=0; /* sign=0 */
874 return res
; /* [no status to set] */
877 /* ------------------------------------------------------------------ */
878 /* decNumberCompare -- compare two Numbers */
880 /* This computes C = A ? B */
882 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
885 /* set is the context */
887 /* C must have space for one digit (or NaN). */
888 /* ------------------------------------------------------------------ */
889 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberCompare(decNumber
*res
, const decNumber
*lhs
,
890 const decNumber
*rhs
, decContext
*set
) {
891 uInt status
=0; /* accumulator */
892 decCompareOp(res
, lhs
, rhs
, set
, COMPARE
, &status
);
893 if (status
!=0) decStatus(res
, status
, set
);
895 } /* decNumberCompare */
897 /* ------------------------------------------------------------------ */
898 /* decNumberCompareSignal -- compare, signalling on all NaNs */
900 /* This computes C = A ? B */
902 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
905 /* set is the context */
907 /* C must have space for one digit (or NaN). */
908 /* ------------------------------------------------------------------ */
909 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberCompareSignal(decNumber
*res
, const decNumber
*lhs
,
910 const decNumber
*rhs
, decContext
*set
) {
911 uInt status
=0; /* accumulator */
912 decCompareOp(res
, lhs
, rhs
, set
, COMPSIG
, &status
);
913 if (status
!=0) decStatus(res
, status
, set
);
915 } /* decNumberCompareSignal */
917 /* ------------------------------------------------------------------ */
918 /* decNumberCompareTotal -- compare two Numbers, using total ordering */
920 /* This computes C = A ? B, under total ordering */
922 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
925 /* set is the context */
927 /* C must have space for one digit; the result will always be one of */
929 /* ------------------------------------------------------------------ */
930 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberCompareTotal(decNumber
*res
, const decNumber
*lhs
,
931 const decNumber
*rhs
, decContext
*set
) {
932 uInt status
=0; /* accumulator */
933 decCompareOp(res
, lhs
, rhs
, set
, COMPTOTAL
, &status
);
934 if (status
!=0) decStatus(res
, status
, set
);
936 } /* decNumberCompareTotal */
938 /* ------------------------------------------------------------------ */
939 /* decNumberCompareTotalMag -- compare, total ordering of magnitudes */
941 /* This computes C = |A| ? |B|, under total ordering */
943 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
946 /* set is the context */
948 /* C must have space for one digit; the result will always be one of */
950 /* ------------------------------------------------------------------ */
951 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberCompareTotalMag(decNumber
*res
, const decNumber
*lhs
,
952 const decNumber
*rhs
, decContext
*set
) {
953 uInt status
=0; /* accumulator */
954 uInt needbytes
; /* for space calculations */
955 decNumber bufa
[D2N(DECBUFFER
+1)];/* +1 in case DECBUFFER=0 */
956 decNumber
*allocbufa
=NULL
; /* -> allocated bufa, iff allocated */
957 decNumber bufb
[D2N(DECBUFFER
+1)];
958 decNumber
*allocbufb
=NULL
; /* -> allocated bufb, iff allocated */
959 decNumber
*a
, *b
; /* temporary pointers */
962 if (decCheckOperands(res
, lhs
, rhs
, set
)) return res
;
965 do { /* protect allocated storage */
966 /* if either is negative, take a copy and absolute */
967 if (decNumberIsNegative(lhs
)) { /* lhs<0 */
969 needbytes
=sizeof(decNumber
)+(D2U(lhs
->digits
)-1)*sizeof(Unit
);
970 if (needbytes
>sizeof(bufa
)) { /* need malloc space */
971 allocbufa
=(decNumber
*)malloc(needbytes
);
972 if (allocbufa
==NULL
) { /* hopeless -- abandon */
973 status
|=DEC_Insufficient_storage
;
975 a
=allocbufa
; /* use the allocated space */
977 uprv_decNumberCopy(a
, lhs
); /* copy content */
978 a
->bits
&=~DECNEG
; /* .. and clear the sign */
979 lhs
=a
; /* use copy from here on */
981 if (decNumberIsNegative(rhs
)) { /* rhs<0 */
983 needbytes
=sizeof(decNumber
)+(D2U(rhs
->digits
)-1)*sizeof(Unit
);
984 if (needbytes
>sizeof(bufb
)) { /* need malloc space */
985 allocbufb
=(decNumber
*)malloc(needbytes
);
986 if (allocbufb
==NULL
) { /* hopeless -- abandon */
987 status
|=DEC_Insufficient_storage
;
989 b
=allocbufb
; /* use the allocated space */
991 uprv_decNumberCopy(b
, rhs
); /* copy content */
992 b
->bits
&=~DECNEG
; /* .. and clear the sign */
993 rhs
=b
; /* use copy from here on */
995 decCompareOp(res
, lhs
, rhs
, set
, COMPTOTAL
, &status
);
996 } while(0); /* end protected */
998 if (allocbufa
!=NULL
) free(allocbufa
); /* drop any storage used */
999 if (allocbufb
!=NULL
) free(allocbufb
); /* .. */
1000 if (status
!=0) decStatus(res
, status
, set
);
1002 } /* decNumberCompareTotalMag */
1004 /* ------------------------------------------------------------------ */
1005 /* decNumberDivide -- divide one number by another */
1007 /* This computes C = A / B */
1009 /* res is C, the result. C may be A and/or B (e.g., X=X/X) */
1012 /* set is the context */
1014 /* C must have space for set->digits digits. */
1015 /* ------------------------------------------------------------------ */
1016 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberDivide(decNumber
*res
, const decNumber
*lhs
,
1017 const decNumber
*rhs
, decContext
*set
) {
1018 uInt status
=0; /* accumulator */
1019 decDivideOp(res
, lhs
, rhs
, set
, DIVIDE
, &status
);
1020 if (status
!=0) decStatus(res
, status
, set
);
1022 decCheckInexact(res
, set
);
1025 } /* decNumberDivide */
1027 /* ------------------------------------------------------------------ */
1028 /* decNumberDivideInteger -- divide and return integer quotient */
1030 /* This computes C = A # B, where # is the integer divide operator */
1032 /* res is C, the result. C may be A and/or B (e.g., X=X#X) */
1035 /* set is the context */
1037 /* C must have space for set->digits digits. */
1038 /* ------------------------------------------------------------------ */
1039 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberDivideInteger(decNumber
*res
, const decNumber
*lhs
,
1040 const decNumber
*rhs
, decContext
*set
) {
1041 uInt status
=0; /* accumulator */
1042 decDivideOp(res
, lhs
, rhs
, set
, DIVIDEINT
, &status
);
1043 if (status
!=0) decStatus(res
, status
, set
);
1045 } /* decNumberDivideInteger */
1047 /* ------------------------------------------------------------------ */
1048 /* decNumberExp -- exponentiation */
1050 /* This computes C = exp(A) */
1052 /* res is C, the result. C may be A */
1054 /* set is the context; note that rounding mode has no effect */
1056 /* C must have space for set->digits digits. */
1058 /* Mathematical function restrictions apply (see above); a NaN is */
1059 /* returned with Invalid_operation if a restriction is violated. */
1061 /* Finite results will always be full precision and Inexact, except */
1062 /* when A is a zero or -Infinity (giving 1 or 0 respectively). */
1064 /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will */
1065 /* almost always be correctly rounded, but may be up to 1 ulp in */
1066 /* error in rare cases. */
1067 /* ------------------------------------------------------------------ */
1068 /* This is a wrapper for decExpOp which can handle the slightly wider */
1069 /* (double) range needed by Ln (which has to be able to calculate */
1070 /* exp(-a) where a can be the tiniest number (Ntiny). */
1071 /* ------------------------------------------------------------------ */
1072 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberExp(decNumber
*res
, const decNumber
*rhs
,
1074 uInt status
=0; /* accumulator */
1076 decNumber
*allocrhs
=NULL
; /* non-NULL if rounded rhs allocated */
1080 if (decCheckOperands(res
, DECUNUSED
, rhs
, set
)) return res
;
1083 /* Check restrictions; these restrictions ensure that if h=8 (see */
1084 /* decExpOp) then the result will either overflow or underflow to 0. */
1085 /* Other math functions restrict the input range, too, for inverses. */
1086 /* If not violated then carry out the operation. */
1087 if (!decCheckMath(rhs
, set
, &status
)) do { /* protect allocation */
1089 if (!set
->extended
) {
1090 /* reduce operand and set lostDigits status, as needed */
1091 if (rhs
->digits
>set
->digits
) {
1092 allocrhs
=decRoundOperand(rhs
, set
, &status
);
1093 if (allocrhs
==NULL
) break;
1098 decExpOp(res
, rhs
, set
, &status
);
1099 } while(0); /* end protected */
1102 if (allocrhs
!=NULL
) free(allocrhs
); /* drop any storage used */
1104 /* apply significant status */
1105 if (status
!=0) decStatus(res
, status
, set
);
1107 decCheckInexact(res
, set
);
1110 } /* decNumberExp */
1112 /* ------------------------------------------------------------------ */
1113 /* decNumberFMA -- fused multiply add */
1115 /* This computes D = (A * B) + C with only one rounding */
1117 /* res is D, the result. D may be A or B or C (e.g., X=FMA(X,X,X)) */
1120 /* fhs is C [far hand side] */
1121 /* set is the context */
1123 /* Mathematical function restrictions apply (see above); a NaN is */
1124 /* returned with Invalid_operation if a restriction is violated. */
1126 /* C must have space for set->digits digits. */
1127 /* ------------------------------------------------------------------ */
1128 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberFMA(decNumber
*res
, const decNumber
*lhs
,
1129 const decNumber
*rhs
, const decNumber
*fhs
,
1131 uInt status
=0; /* accumulator */
1132 decContext dcmul
; /* context for the multiplication */
1133 uInt needbytes
; /* for space calculations */
1134 decNumber bufa
[D2N(DECBUFFER
*2+1)];
1135 decNumber
*allocbufa
=NULL
; /* -> allocated bufa, iff allocated */
1136 decNumber
*acc
; /* accumulator pointer */
1137 decNumber dzero
; /* work */
1140 if (decCheckOperands(res
, lhs
, rhs
, set
)) return res
;
1141 if (decCheckOperands(res
, fhs
, DECUNUSED
, set
)) return res
;
1144 do { /* protect allocated storage */
1146 if (!set
->extended
) { /* [undefined if subset] */
1147 status
|=DEC_Invalid_operation
;
1150 /* Check math restrictions [these ensure no overflow or underflow] */
1151 if ((!decNumberIsSpecial(lhs
) && decCheckMath(lhs
, set
, &status
))
1152 || (!decNumberIsSpecial(rhs
) && decCheckMath(rhs
, set
, &status
))
1153 || (!decNumberIsSpecial(fhs
) && decCheckMath(fhs
, set
, &status
))) break;
1154 /* set up context for multiply */
1156 dcmul
.digits
=lhs
->digits
+rhs
->digits
; /* just enough */
1157 /* [The above may be an over-estimate for subset arithmetic, but that's OK] */
1158 dcmul
.emax
=DEC_MAX_EMAX
; /* effectively unbounded .. */
1159 dcmul
.emin
=DEC_MIN_EMIN
; /* [thanks to Math restrictions] */
1160 /* set up decNumber space to receive the result of the multiply */
1161 acc
=bufa
; /* may fit */
1162 needbytes
=sizeof(decNumber
)+(D2U(dcmul
.digits
)-1)*sizeof(Unit
);
1163 if (needbytes
>sizeof(bufa
)) { /* need malloc space */
1164 allocbufa
=(decNumber
*)malloc(needbytes
);
1165 if (allocbufa
==NULL
) { /* hopeless -- abandon */
1166 status
|=DEC_Insufficient_storage
;
1168 acc
=allocbufa
; /* use the allocated space */
1170 /* multiply with extended range and necessary precision */
1171 /*printf("emin=%ld\n", dcmul.emin); */
1172 decMultiplyOp(acc
, lhs
, rhs
, &dcmul
, &status
);
1173 /* Only Invalid operation (from sNaN or Inf * 0) is possible in */
1174 /* status; if either is seen than ignore fhs (in case it is */
1175 /* another sNaN) and set acc to NaN unless we had an sNaN */
1176 /* [decMultiplyOp leaves that to caller] */
1177 /* Note sNaN has to go through addOp to shorten payload if */
1179 if ((status
&DEC_Invalid_operation
)!=0) {
1180 if (!(status
&DEC_sNaN
)) { /* but be true invalid */
1181 uprv_decNumberZero(res
); /* acc not yet set */
1185 uprv_decNumberZero(&dzero
); /* make 0 (any non-NaN would do) */
1186 fhs
=&dzero
; /* use that */
1189 else { /* multiply was OK */
1190 if (status
!=0) printf("Status=%08lx after FMA multiply\n", (LI
)status
);
1193 /* add the third operand and result -> res, and all is done */
1194 decAddOp(res
, acc
, fhs
, set
, 0, &status
);
1195 } while(0); /* end protected */
1197 if (allocbufa
!=NULL
) free(allocbufa
); /* drop any storage used */
1198 if (status
!=0) decStatus(res
, status
, set
);
1200 decCheckInexact(res
, set
);
1203 } /* decNumberFMA */
1205 /* ------------------------------------------------------------------ */
1206 /* decNumberInvert -- invert a Number, digitwise */
1208 /* This computes C = ~A */
1210 /* res is C, the result. C may be A (e.g., X=~X) */
1212 /* set is the context (used for result length and error report) */
1214 /* C must have space for set->digits digits. */
1216 /* Logical function restrictions apply (see above); a NaN is */
1217 /* returned with Invalid_operation if a restriction is violated. */
1218 /* ------------------------------------------------------------------ */
1219 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberInvert(decNumber
*res
, const decNumber
*rhs
,
1221 const Unit
*ua
, *msua
; /* -> operand and its msu */
1222 Unit
*uc
, *msuc
; /* -> result and its msu */
1223 Int msudigs
; /* digits in res msu */
1225 if (decCheckOperands(res
, DECUNUSED
, rhs
, set
)) return res
;
1228 if (rhs
->exponent
!=0 || decNumberIsSpecial(rhs
) || decNumberIsNegative(rhs
)) {
1229 decStatus(res
, DEC_Invalid_operation
, set
);
1232 /* operand is valid */
1233 ua
=rhs
->lsu
; /* bottom-up */
1234 uc
=res
->lsu
; /* .. */
1235 msua
=ua
+D2U(rhs
->digits
)-1; /* -> msu of rhs */
1236 msuc
=uc
+D2U(set
->digits
)-1; /* -> msu of result */
1237 msudigs
=MSUDIGITS(set
->digits
); /* [faster than remainder] */
1238 for (; uc
<=msuc
; ua
++, uc
++) { /* Unit loop */
1239 Unit a
; /* extract unit */
1240 Int i
, j
; /* work */
1243 *uc
=0; /* can now write back */
1244 /* always need to examine all bits in rhs */
1245 /* This loop could be unrolled and/or use BIN2BCD tables */
1246 for (i
=0; i
<DECDPUN
; i
++) {
1247 if ((~a
)&1) *uc
=*uc
+(Unit
)powers
[i
]; /* effect INVERT */
1251 decStatus(res
, DEC_Invalid_operation
, set
);
1254 if (uc
==msuc
&& i
==msudigs
-1) break; /* just did final digit */
1257 /* [here uc-1 is the msu of the result] */
1258 res
->digits
=decGetDigits(res
->lsu
, static_cast<int32_t>(uc
- res
->lsu
));
1259 res
->exponent
=0; /* integer */
1260 res
->bits
=0; /* sign=0 */
1261 return res
; /* [no status to set] */
1262 } /* decNumberInvert */
1264 /* ------------------------------------------------------------------ */
1265 /* decNumberLn -- natural logarithm */
1267 /* This computes C = ln(A) */
1269 /* res is C, the result. C may be A */
1271 /* set is the context; note that rounding mode has no effect */
1273 /* C must have space for set->digits digits. */
1275 /* Notable cases: */
1276 /* A<0 -> Invalid */
1277 /* A=0 -> -Infinity (Exact) */
1278 /* A=+Infinity -> +Infinity (Exact) */
1279 /* A=1 exactly -> 0 (Exact) */
1281 /* Mathematical function restrictions apply (see above); a NaN is */
1282 /* returned with Invalid_operation if a restriction is violated. */
1284 /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will */
1285 /* almost always be correctly rounded, but may be up to 1 ulp in */
1286 /* error in rare cases. */
1287 /* ------------------------------------------------------------------ */
1288 /* This is a wrapper for decLnOp which can handle the slightly wider */
1289 /* (+11) range needed by Ln, Log10, etc. (which may have to be able */
1290 /* to calculate at p+e+2). */
1291 /* ------------------------------------------------------------------ */
1292 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberLn(decNumber
*res
, const decNumber
*rhs
,
1294 uInt status
=0; /* accumulator */
1296 decNumber
*allocrhs
=NULL
; /* non-NULL if rounded rhs allocated */
1300 if (decCheckOperands(res
, DECUNUSED
, rhs
, set
)) return res
;
1303 /* Check restrictions; this is a math function; if not violated */
1304 /* then carry out the operation. */
1305 if (!decCheckMath(rhs
, set
, &status
)) do { /* protect allocation */
1307 if (!set
->extended
) {
1308 /* reduce operand and set lostDigits status, as needed */
1309 if (rhs
->digits
>set
->digits
) {
1310 allocrhs
=decRoundOperand(rhs
, set
, &status
);
1311 if (allocrhs
==NULL
) break;
1314 /* special check in subset for rhs=0 */
1315 if (ISZERO(rhs
)) { /* +/- zeros -> error */
1316 status
|=DEC_Invalid_operation
;
1320 decLnOp(res
, rhs
, set
, &status
);
1321 } while(0); /* end protected */
1324 if (allocrhs
!=NULL
) free(allocrhs
); /* drop any storage used */
1326 /* apply significant status */
1327 if (status
!=0) decStatus(res
, status
, set
);
1329 decCheckInexact(res
, set
);
1334 /* ------------------------------------------------------------------ */
1335 /* decNumberLogB - get adjusted exponent, by 754 rules */
1337 /* This computes C = adjustedexponent(A) */
1339 /* res is C, the result. C may be A */
1341 /* set is the context, used only for digits and status */
1343 /* C must have space for 10 digits (A might have 10**9 digits and */
1344 /* an exponent of +999999999, or one digit and an exponent of */
1347 /* This returns the adjusted exponent of A after (in theory) padding */
1348 /* with zeros on the right to set->digits digits while keeping the */
1349 /* same value. The exponent is not limited by emin/emax. */
1351 /* Notable cases: */
1352 /* A<0 -> Use |A| */
1353 /* A=0 -> -Infinity (Division by zero) */
1354 /* A=Infinite -> +Infinity (Exact) */
1355 /* A=1 exactly -> 0 (Exact) */
1356 /* NaNs are propagated as usual */
1357 /* ------------------------------------------------------------------ */
1358 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberLogB(decNumber
*res
, const decNumber
*rhs
,
1360 uInt status
=0; /* accumulator */
1363 if (decCheckOperands(res
, DECUNUSED
, rhs
, set
)) return res
;
1366 /* NaNs as usual; Infinities return +Infinity; 0->oops */
1367 if (decNumberIsNaN(rhs
)) decNaNs(res
, rhs
, NULL
, set
, &status
);
1368 else if (decNumberIsInfinite(rhs
)) uprv_decNumberCopyAbs(res
, rhs
);
1369 else if (decNumberIsZero(rhs
)) {
1370 uprv_decNumberZero(res
); /* prepare for Infinity */
1371 res
->bits
=DECNEG
|DECINF
; /* -Infinity */
1372 status
|=DEC_Division_by_zero
; /* as per 754 */
1374 else { /* finite non-zero */
1375 Int ae
=rhs
->exponent
+rhs
->digits
-1; /* adjusted exponent */
1376 uprv_decNumberFromInt32(res
, ae
); /* lay it out */
1379 if (status
!=0) decStatus(res
, status
, set
);
1381 } /* decNumberLogB */
1383 /* ------------------------------------------------------------------ */
1384 /* decNumberLog10 -- logarithm in base 10 */
1386 /* This computes C = log10(A) */
1388 /* res is C, the result. C may be A */
1390 /* set is the context; note that rounding mode has no effect */
1392 /* C must have space for set->digits digits. */
1394 /* Notable cases: */
1395 /* A<0 -> Invalid */
1396 /* A=0 -> -Infinity (Exact) */
1397 /* A=+Infinity -> +Infinity (Exact) */
1398 /* A=10**n (if n is an integer) -> n (Exact) */
1400 /* Mathematical function restrictions apply (see above); a NaN is */
1401 /* returned with Invalid_operation if a restriction is violated. */
1403 /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will */
1404 /* almost always be correctly rounded, but may be up to 1 ulp in */
1405 /* error in rare cases. */
1406 /* ------------------------------------------------------------------ */
1407 /* This calculates ln(A)/ln(10) using appropriate precision. For */
1408 /* ln(A) this is the max(p, rhs->digits + t) + 3, where p is the */
1409 /* requested digits and t is the number of digits in the exponent */
1410 /* (maximum 6). For ln(10) it is p + 3; this is often handled by the */
1411 /* fastpath in decLnOp. The final division is done to the requested */
1413 /* ------------------------------------------------------------------ */
1414 #if defined(__clang__) || U_GCC_MAJOR_MINOR >= 406
1415 #pragma GCC diagnostic push
1416 #pragma GCC diagnostic ignored "-Warray-bounds"
1418 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberLog10(decNumber
*res
, const decNumber
*rhs
,
1420 uInt status
=0, ignore
=0; /* status accumulators */
1421 uInt needbytes
; /* for space calculations */
1422 Int p
; /* working precision */
1423 Int t
; /* digits in exponent of A */
1425 /* buffers for a and b working decimals */
1426 /* (adjustment calculator, same size) */
1427 decNumber bufa
[D2N(DECBUFFER
+2)];
1428 decNumber
*allocbufa
=NULL
; /* -> allocated bufa, iff allocated */
1429 decNumber
*a
=bufa
; /* temporary a */
1430 decNumber bufb
[D2N(DECBUFFER
+2)];
1431 decNumber
*allocbufb
=NULL
; /* -> allocated bufb, iff allocated */
1432 decNumber
*b
=bufb
; /* temporary b */
1433 decNumber bufw
[D2N(10)]; /* working 2-10 digit number */
1434 decNumber
*w
=bufw
; /* .. */
1436 decNumber
*allocrhs
=NULL
; /* non-NULL if rounded rhs allocated */
1439 decContext aset
; /* working context */
1442 if (decCheckOperands(res
, DECUNUSED
, rhs
, set
)) return res
;
1445 /* Check restrictions; this is a math function; if not violated */
1446 /* then carry out the operation. */
1447 if (!decCheckMath(rhs
, set
, &status
)) do { /* protect malloc */
1449 if (!set
->extended
) {
1450 /* reduce operand and set lostDigits status, as needed */
1451 if (rhs
->digits
>set
->digits
) {
1452 allocrhs
=decRoundOperand(rhs
, set
, &status
);
1453 if (allocrhs
==NULL
) break;
1456 /* special check in subset for rhs=0 */
1457 if (ISZERO(rhs
)) { /* +/- zeros -> error */
1458 status
|=DEC_Invalid_operation
;
1463 uprv_decContextDefault(&aset
, DEC_INIT_DECIMAL64
); /* clean context */
1465 /* handle exact powers of 10; only check if +ve finite */
1466 if (!(rhs
->bits
&(DECNEG
|DECSPECIAL
)) && !ISZERO(rhs
)) {
1467 Int residue
=0; /* (no residue) */
1468 uInt copystat
=0; /* clean status */
1470 /* round to a single digit... */
1472 decCopyFit(w
, rhs
, &aset
, &residue
, ©stat
); /* copy & shorten */
1473 /* if exact and the digit is 1, rhs is a power of 10 */
1474 if (!(copystat
&DEC_Inexact
) && w
->lsu
[0]==1) {
1475 /* the exponent, conveniently, is the power of 10; making */
1476 /* this the result needs a little care as it might not fit, */
1477 /* so first convert it into the working number, and then move */
1479 uprv_decNumberFromInt32(w
, w
->exponent
);
1481 decCopyFit(res
, w
, set
, &residue
, &status
); /* copy & round */
1482 decFinish(res
, set
, &residue
, &status
); /* cleanup/set flags */
1484 } /* not a power of 10 */
1485 } /* not a candidate for exact */
1487 /* simplify the information-content calculation to use 'total */
1488 /* number of digits in a, including exponent' as compared to the */
1489 /* requested digits, as increasing this will only rarely cost an */
1490 /* iteration in ln(a) anyway */
1491 t
=6; /* it can never be >6 */
1493 /* allocate space when needed... */
1494 p
=(rhs
->digits
+t
>set
->digits
?rhs
->digits
+t
:set
->digits
)+3;
1495 needbytes
=sizeof(decNumber
)+(D2U(p
)-1)*sizeof(Unit
);
1496 if (needbytes
>sizeof(bufa
)) { /* need malloc space */
1497 allocbufa
=(decNumber
*)malloc(needbytes
);
1498 if (allocbufa
==NULL
) { /* hopeless -- abandon */
1499 status
|=DEC_Insufficient_storage
;
1501 a
=allocbufa
; /* use the allocated space */
1503 aset
.digits
=p
; /* as calculated */
1504 aset
.emax
=DEC_MAX_MATH
; /* usual bounds */
1505 aset
.emin
=-DEC_MAX_MATH
; /* .. */
1506 aset
.clamp
=0; /* and no concrete format */
1507 decLnOp(a
, rhs
, &aset
, &status
); /* a=ln(rhs) */
1509 /* skip the division if the result so far is infinite, NaN, or */
1510 /* zero, or there was an error; note NaN from sNaN needs copy */
1511 if (status
&DEC_NaNs
&& !(status
&DEC_sNaN
)) break;
1512 if (a
->bits
&DECSPECIAL
|| ISZERO(a
)) {
1513 uprv_decNumberCopy(res
, a
); /* [will fit] */
1516 /* for ln(10) an extra 3 digits of precision are needed */
1518 needbytes
=sizeof(decNumber
)+(D2U(p
)-1)*sizeof(Unit
);
1519 if (needbytes
>sizeof(bufb
)) { /* need malloc space */
1520 allocbufb
=(decNumber
*)malloc(needbytes
);
1521 if (allocbufb
==NULL
) { /* hopeless -- abandon */
1522 status
|=DEC_Insufficient_storage
;
1524 b
=allocbufb
; /* use the allocated space */
1526 uprv_decNumberZero(w
); /* set up 10... */
1528 w
->lsu
[1]=1; w
->lsu
[0]=0; /* .. */
1530 w
->lsu
[0]=10; /* .. */
1532 w
->digits
=2; /* .. */
1535 decLnOp(b
, w
, &aset
, &ignore
); /* b=ln(10) */
1537 aset
.digits
=set
->digits
; /* for final divide */
1538 decDivideOp(res
, a
, b
, &aset
, DIVIDE
, &status
); /* into result */
1539 } while(0); /* [for break] */
1541 if (allocbufa
!=NULL
) free(allocbufa
); /* drop any storage used */
1542 if (allocbufb
!=NULL
) free(allocbufb
); /* .. */
1544 if (allocrhs
!=NULL
) free(allocrhs
); /* .. */
1546 /* apply significant status */
1547 if (status
!=0) decStatus(res
, status
, set
);
1549 decCheckInexact(res
, set
);
1552 } /* decNumberLog10 */
1553 #if defined(__clang__) || U_GCC_MAJOR_MINOR >= 406
1554 #pragma GCC diagnostic pop
1557 /* ------------------------------------------------------------------ */
1558 /* decNumberMax -- compare two Numbers and return the maximum */
1560 /* This computes C = A ? B, returning the maximum by 754 rules */
1562 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
1565 /* set is the context */
1567 /* C must have space for set->digits digits. */
1568 /* ------------------------------------------------------------------ */
1569 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberMax(decNumber
*res
, const decNumber
*lhs
,
1570 const decNumber
*rhs
, decContext
*set
) {
1571 uInt status
=0; /* accumulator */
1572 decCompareOp(res
, lhs
, rhs
, set
, COMPMAX
, &status
);
1573 if (status
!=0) decStatus(res
, status
, set
);
1575 decCheckInexact(res
, set
);
1578 } /* decNumberMax */
1580 /* ------------------------------------------------------------------ */
1581 /* decNumberMaxMag -- compare and return the maximum by magnitude */
1583 /* This computes C = A ? B, returning the maximum by 754 rules */
1585 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
1588 /* set is the context */
1590 /* C must have space for set->digits digits. */
1591 /* ------------------------------------------------------------------ */
1592 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberMaxMag(decNumber
*res
, const decNumber
*lhs
,
1593 const decNumber
*rhs
, decContext
*set
) {
1594 uInt status
=0; /* accumulator */
1595 decCompareOp(res
, lhs
, rhs
, set
, COMPMAXMAG
, &status
);
1596 if (status
!=0) decStatus(res
, status
, set
);
1598 decCheckInexact(res
, set
);
1601 } /* decNumberMaxMag */
1603 /* ------------------------------------------------------------------ */
1604 /* decNumberMin -- compare two Numbers and return the minimum */
1606 /* This computes C = A ? B, returning the minimum by 754 rules */
1608 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
1611 /* set is the context */
1613 /* C must have space for set->digits digits. */
1614 /* ------------------------------------------------------------------ */
1615 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberMin(decNumber
*res
, const decNumber
*lhs
,
1616 const decNumber
*rhs
, decContext
*set
) {
1617 uInt status
=0; /* accumulator */
1618 decCompareOp(res
, lhs
, rhs
, set
, COMPMIN
, &status
);
1619 if (status
!=0) decStatus(res
, status
, set
);
1621 decCheckInexact(res
, set
);
1624 } /* decNumberMin */
1626 /* ------------------------------------------------------------------ */
1627 /* decNumberMinMag -- compare and return the minimum by magnitude */
1629 /* This computes C = A ? B, returning the minimum by 754 rules */
1631 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
1634 /* set is the context */
1636 /* C must have space for set->digits digits. */
1637 /* ------------------------------------------------------------------ */
1638 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberMinMag(decNumber
*res
, const decNumber
*lhs
,
1639 const decNumber
*rhs
, decContext
*set
) {
1640 uInt status
=0; /* accumulator */
1641 decCompareOp(res
, lhs
, rhs
, set
, COMPMINMAG
, &status
);
1642 if (status
!=0) decStatus(res
, status
, set
);
1644 decCheckInexact(res
, set
);
1647 } /* decNumberMinMag */
1649 /* ------------------------------------------------------------------ */
1650 /* decNumberMinus -- prefix minus operator */
1652 /* This computes C = 0 - A */
1654 /* res is C, the result. C may be A */
1656 /* set is the context */
1658 /* See also decNumberCopyNegate for a quiet bitwise version of this. */
1659 /* C must have space for set->digits digits. */
1660 /* ------------------------------------------------------------------ */
1661 /* Simply use AddOp for the subtract, which will do the necessary. */
1662 /* ------------------------------------------------------------------ */
1663 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberMinus(decNumber
*res
, const decNumber
*rhs
,
1666 uInt status
=0; /* accumulator */
1669 if (decCheckOperands(res
, DECUNUSED
, rhs
, set
)) return res
;
1672 uprv_decNumberZero(&dzero
); /* make 0 */
1673 dzero
.exponent
=rhs
->exponent
; /* [no coefficient expansion] */
1674 decAddOp(res
, &dzero
, rhs
, set
, DECNEG
, &status
);
1675 if (status
!=0) decStatus(res
, status
, set
);
1677 decCheckInexact(res
, set
);
1680 } /* decNumberMinus */
1682 /* ------------------------------------------------------------------ */
1683 /* decNumberNextMinus -- next towards -Infinity */
1685 /* This computes C = A - infinitesimal, rounded towards -Infinity */
1687 /* res is C, the result. C may be A */
1689 /* set is the context */
1691 /* This is a generalization of 754 NextDown. */
1692 /* ------------------------------------------------------------------ */
1693 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberNextMinus(decNumber
*res
, const decNumber
*rhs
,
1695 decNumber dtiny
; /* constant */
1696 decContext workset
=*set
; /* work */
1697 uInt status
=0; /* accumulator */
1699 if (decCheckOperands(res
, DECUNUSED
, rhs
, set
)) return res
;
1702 /* +Infinity is the special case */
1703 if ((rhs
->bits
&(DECINF
|DECNEG
))==DECINF
) {
1704 decSetMaxValue(res
, set
); /* is +ve */
1705 /* there is no status to set */
1708 uprv_decNumberZero(&dtiny
); /* start with 0 */
1709 dtiny
.lsu
[0]=1; /* make number that is .. */
1710 dtiny
.exponent
=DEC_MIN_EMIN
-1; /* .. smaller than tiniest */
1711 workset
.round
=DEC_ROUND_FLOOR
;
1712 decAddOp(res
, rhs
, &dtiny
, &workset
, DECNEG
, &status
);
1713 status
&=DEC_Invalid_operation
|DEC_sNaN
; /* only sNaN Invalid please */
1714 if (status
!=0) decStatus(res
, status
, set
);
1716 } /* decNumberNextMinus */
1718 /* ------------------------------------------------------------------ */
1719 /* decNumberNextPlus -- next towards +Infinity */
1721 /* This computes C = A + infinitesimal, rounded towards +Infinity */
1723 /* res is C, the result. C may be A */
1725 /* set is the context */
1727 /* This is a generalization of 754 NextUp. */
1728 /* ------------------------------------------------------------------ */
1729 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberNextPlus(decNumber
*res
, const decNumber
*rhs
,
1731 decNumber dtiny
; /* constant */
1732 decContext workset
=*set
; /* work */
1733 uInt status
=0; /* accumulator */
1735 if (decCheckOperands(res
, DECUNUSED
, rhs
, set
)) return res
;
1738 /* -Infinity is the special case */
1739 if ((rhs
->bits
&(DECINF
|DECNEG
))==(DECINF
|DECNEG
)) {
1740 decSetMaxValue(res
, set
);
1741 res
->bits
=DECNEG
; /* negative */
1742 /* there is no status to set */
1745 uprv_decNumberZero(&dtiny
); /* start with 0 */
1746 dtiny
.lsu
[0]=1; /* make number that is .. */
1747 dtiny
.exponent
=DEC_MIN_EMIN
-1; /* .. smaller than tiniest */
1748 workset
.round
=DEC_ROUND_CEILING
;
1749 decAddOp(res
, rhs
, &dtiny
, &workset
, 0, &status
);
1750 status
&=DEC_Invalid_operation
|DEC_sNaN
; /* only sNaN Invalid please */
1751 if (status
!=0) decStatus(res
, status
, set
);
1753 } /* decNumberNextPlus */
1755 /* ------------------------------------------------------------------ */
1756 /* decNumberNextToward -- next towards rhs */
1758 /* This computes C = A +/- infinitesimal, rounded towards */
1759 /* +/-Infinity in the direction of B, as per 754-1985 nextafter */
1760 /* modified during revision but dropped from 754-2008. */
1762 /* res is C, the result. C may be A or B. */
1765 /* set is the context */
1767 /* This is a generalization of 754-1985 NextAfter. */
1768 /* ------------------------------------------------------------------ */
1769 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberNextToward(decNumber
*res
, const decNumber
*lhs
,
1770 const decNumber
*rhs
, decContext
*set
) {
1771 decNumber dtiny
; /* constant */
1772 decContext workset
=*set
; /* work */
1773 Int result
; /* .. */
1774 uInt status
=0; /* accumulator */
1776 if (decCheckOperands(res
, lhs
, rhs
, set
)) return res
;
1779 if (decNumberIsNaN(lhs
) || decNumberIsNaN(rhs
)) {
1780 decNaNs(res
, lhs
, rhs
, set
, &status
);
1782 else { /* Is numeric, so no chance of sNaN Invalid, etc. */
1783 result
=decCompare(lhs
, rhs
, 0); /* sign matters */
1784 if (result
==BADINT
) status
|=DEC_Insufficient_storage
; /* rare */
1785 else { /* valid compare */
1786 if (result
==0) uprv_decNumberCopySign(res
, lhs
, rhs
); /* easy */
1787 else { /* differ: need NextPlus or NextMinus */
1788 uByte sub
; /* add or subtract */
1789 if (result
<0) { /* lhs<rhs, do nextplus */
1790 /* -Infinity is the special case */
1791 if ((lhs
->bits
&(DECINF
|DECNEG
))==(DECINF
|DECNEG
)) {
1792 decSetMaxValue(res
, set
);
1793 res
->bits
=DECNEG
; /* negative */
1794 return res
; /* there is no status to set */
1796 workset
.round
=DEC_ROUND_CEILING
;
1797 sub
=0; /* add, please */
1799 else { /* lhs>rhs, do nextminus */
1800 /* +Infinity is the special case */
1801 if ((lhs
->bits
&(DECINF
|DECNEG
))==DECINF
) {
1802 decSetMaxValue(res
, set
);
1803 return res
; /* there is no status to set */
1805 workset
.round
=DEC_ROUND_FLOOR
;
1806 sub
=DECNEG
; /* subtract, please */
1808 uprv_decNumberZero(&dtiny
); /* start with 0 */
1809 dtiny
.lsu
[0]=1; /* make number that is .. */
1810 dtiny
.exponent
=DEC_MIN_EMIN
-1; /* .. smaller than tiniest */
1811 decAddOp(res
, lhs
, &dtiny
, &workset
, sub
, &status
); /* + or - */
1812 /* turn off exceptions if the result is a normal number */
1813 /* (including Nmin), otherwise let all status through */
1814 if (uprv_decNumberIsNormal(res
, set
)) status
=0;
1818 if (status
!=0) decStatus(res
, status
, set
);
1820 } /* decNumberNextToward */
1822 /* ------------------------------------------------------------------ */
1823 /* decNumberOr -- OR two Numbers, digitwise */
1825 /* This computes C = A | B */
1827 /* res is C, the result. C may be A and/or B (e.g., X=X|X) */
1830 /* set is the context (used for result length and error report) */
1832 /* C must have space for set->digits digits. */
1834 /* Logical function restrictions apply (see above); a NaN is */
1835 /* returned with Invalid_operation if a restriction is violated. */
1836 /* ------------------------------------------------------------------ */
1837 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberOr(decNumber
*res
, const decNumber
*lhs
,
1838 const decNumber
*rhs
, decContext
*set
) {
1839 const Unit
*ua
, *ub
; /* -> operands */
1840 const Unit
*msua
, *msub
; /* -> operand msus */
1841 Unit
*uc
, *msuc
; /* -> result and its msu */
1842 Int msudigs
; /* digits in res msu */
1844 if (decCheckOperands(res
, lhs
, rhs
, set
)) return res
;
1847 if (lhs
->exponent
!=0 || decNumberIsSpecial(lhs
) || decNumberIsNegative(lhs
)
1848 || rhs
->exponent
!=0 || decNumberIsSpecial(rhs
) || decNumberIsNegative(rhs
)) {
1849 decStatus(res
, DEC_Invalid_operation
, set
);
1852 /* operands are valid */
1853 ua
=lhs
->lsu
; /* bottom-up */
1854 ub
=rhs
->lsu
; /* .. */
1855 uc
=res
->lsu
; /* .. */
1856 msua
=ua
+D2U(lhs
->digits
)-1; /* -> msu of lhs */
1857 msub
=ub
+D2U(rhs
->digits
)-1; /* -> msu of rhs */
1858 msuc
=uc
+D2U(set
->digits
)-1; /* -> msu of result */
1859 msudigs
=MSUDIGITS(set
->digits
); /* [faster than remainder] */
1860 for (; uc
<=msuc
; ua
++, ub
++, uc
++) { /* Unit loop */
1861 Unit a
, b
; /* extract units */
1866 *uc
=0; /* can now write back */
1867 if (a
|b
) { /* maybe 1 bits to examine */
1869 /* This loop could be unrolled and/or use BIN2BCD tables */
1870 for (i
=0; i
<DECDPUN
; i
++) {
1871 if ((a
|b
)&1) *uc
=*uc
+(Unit
)powers
[i
]; /* effect OR */
1877 decStatus(res
, DEC_Invalid_operation
, set
);
1880 if (uc
==msuc
&& i
==msudigs
-1) break; /* just did final digit */
1884 /* [here uc-1 is the msu of the result] */
1885 res
->digits
=decGetDigits(res
->lsu
, static_cast<int32_t>(uc
-res
->lsu
));
1886 res
->exponent
=0; /* integer */
1887 res
->bits
=0; /* sign=0 */
1888 return res
; /* [no status to set] */
1891 /* ------------------------------------------------------------------ */
1892 /* decNumberPlus -- prefix plus operator */
1894 /* This computes C = 0 + A */
1896 /* res is C, the result. C may be A */
1898 /* set is the context */
1900 /* See also decNumberCopy for a quiet bitwise version of this. */
1901 /* C must have space for set->digits digits. */
1902 /* ------------------------------------------------------------------ */
1903 /* This simply uses AddOp; Add will take fast path after preparing A. */
1904 /* Performance is a concern here, as this routine is often used to */
1905 /* check operands and apply rounding and overflow/underflow testing. */
1906 /* ------------------------------------------------------------------ */
1907 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberPlus(decNumber
*res
, const decNumber
*rhs
,
1910 uInt status
=0; /* accumulator */
1912 if (decCheckOperands(res
, DECUNUSED
, rhs
, set
)) return res
;
1915 uprv_decNumberZero(&dzero
); /* make 0 */
1916 dzero
.exponent
=rhs
->exponent
; /* [no coefficient expansion] */
1917 decAddOp(res
, &dzero
, rhs
, set
, 0, &status
);
1918 if (status
!=0) decStatus(res
, status
, set
);
1920 decCheckInexact(res
, set
);
1923 } /* decNumberPlus */
1925 /* ------------------------------------------------------------------ */
1926 /* decNumberMultiply -- multiply two Numbers */
1928 /* This computes C = A x B */
1930 /* res is C, the result. C may be A and/or B (e.g., X=X+X) */
1933 /* set is the context */
1935 /* C must have space for set->digits digits. */
1936 /* ------------------------------------------------------------------ */
1937 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberMultiply(decNumber
*res
, const decNumber
*lhs
,
1938 const decNumber
*rhs
, decContext
*set
) {
1939 uInt status
=0; /* accumulator */
1940 decMultiplyOp(res
, lhs
, rhs
, set
, &status
);
1941 if (status
!=0) decStatus(res
, status
, set
);
1943 decCheckInexact(res
, set
);
1946 } /* decNumberMultiply */
1948 /* ------------------------------------------------------------------ */
1949 /* decNumberPower -- raise a number to a power */
1951 /* This computes C = A ** B */
1953 /* res is C, the result. C may be A and/or B (e.g., X=X**X) */
1956 /* set is the context */
1958 /* C must have space for set->digits digits. */
1960 /* Mathematical function restrictions apply (see above); a NaN is */
1961 /* returned with Invalid_operation if a restriction is violated. */
1963 /* However, if 1999999997<=B<=999999999 and B is an integer then the */
1964 /* restrictions on A and the context are relaxed to the usual bounds, */
1965 /* for compatibility with the earlier (integer power only) version */
1966 /* of this function. */
1968 /* When B is an integer, the result may be exact, even if rounded. */
1970 /* The final result is rounded according to the context; it will */
1971 /* almost always be correctly rounded, but may be up to 1 ulp in */
1972 /* error in rare cases. */
1973 /* ------------------------------------------------------------------ */
1974 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberPower(decNumber
*res
, const decNumber
*lhs
,
1975 const decNumber
*rhs
, decContext
*set
) {
1977 decNumber
*alloclhs
=NULL
; /* non-NULL if rounded lhs allocated */
1978 decNumber
*allocrhs
=NULL
; /* .., rhs */
1980 decNumber
*allocdac
=NULL
; /* -> allocated acc buffer, iff used */
1981 decNumber
*allocinv
=NULL
; /* -> allocated 1/x buffer, iff used */
1982 Int reqdigits
=set
->digits
; /* requested DIGITS */
1983 Int n
; /* rhs in binary */
1984 Flag rhsint
=0; /* 1 if rhs is an integer */
1985 Flag useint
=0; /* 1 if can use integer calculation */
1986 Flag isoddint
=0; /* 1 if rhs is an integer and odd */
1989 Int dropped
; /* .. */
1991 uInt needbytes
; /* buffer size needed */
1992 Flag seenbit
; /* seen a bit while powering */
1993 Int residue
=0; /* rounding residue */
1994 uInt status
=0; /* accumulators */
1995 uByte bits
=0; /* result sign if errors */
1996 decContext aset
; /* working context */
1997 decNumber dnOne
; /* work value 1... */
1998 /* local accumulator buffer [a decNumber, with digits+elength+1 digits] */
1999 decNumber dacbuff
[D2N(DECBUFFER
+9)];
2000 decNumber
*dac
=dacbuff
; /* -> result accumulator */
2001 /* same again for possible 1/lhs calculation */
2002 decNumber invbuff
[D2N(DECBUFFER
+9)];
2005 if (decCheckOperands(res
, lhs
, rhs
, set
)) return res
;
2008 do { /* protect allocated storage */
2010 if (!set
->extended
) { /* reduce operands and set status, as needed */
2011 if (lhs
->digits
>reqdigits
) {
2012 alloclhs
=decRoundOperand(lhs
, set
, &status
);
2013 if (alloclhs
==NULL
) break;
2016 if (rhs
->digits
>reqdigits
) {
2017 allocrhs
=decRoundOperand(rhs
, set
, &status
);
2018 if (allocrhs
==NULL
) break;
2023 /* [following code does not require input rounding] */
2025 /* handle NaNs and rhs Infinity (lhs infinity is harder) */
2027 if (decNumberIsNaN(lhs
) || decNumberIsNaN(rhs
)) { /* NaNs */
2028 decNaNs(res
, lhs
, rhs
, set
, &status
);
2030 if (decNumberIsInfinite(rhs
)) { /* rhs Infinity */
2031 Flag rhsneg
=rhs
->bits
&DECNEG
; /* save rhs sign */
2032 if (decNumberIsNegative(lhs
) /* lhs<0 */
2033 && !decNumberIsZero(lhs
)) /* .. */
2034 status
|=DEC_Invalid_operation
;
2035 else { /* lhs >=0 */
2036 uprv_decNumberZero(&dnOne
); /* set up 1 */
2038 uprv_decNumberCompare(dac
, lhs
, &dnOne
, set
); /* lhs ? 1 */
2039 uprv_decNumberZero(res
); /* prepare for 0/1/Infinity */
2040 if (decNumberIsNegative(dac
)) { /* lhs<1 */
2041 if (rhsneg
) res
->bits
|=DECINF
; /* +Infinity [else is +0] */
2043 else if (dac
->lsu
[0]==0) { /* lhs=1 */
2044 /* 1**Infinity is inexact, so return fully-padded 1.0000 */
2045 Int shift
=set
->digits
-1;
2046 *res
->lsu
=1; /* was 0, make int 1 */
2047 res
->digits
=decShiftToMost(res
->lsu
, 1, shift
);
2048 res
->exponent
=-shift
; /* make 1.0000... */
2049 status
|=DEC_Inexact
|DEC_Rounded
; /* deemed inexact */
2052 if (!rhsneg
) res
->bits
|=DECINF
; /* +Infinity [else is +0] */
2056 /* [lhs infinity drops through] */
2059 /* Original rhs may be an integer that fits and is in range */
2061 if (n
!=BADINT
) { /* it is an integer */
2062 rhsint
=1; /* record the fact for 1**n */
2063 isoddint
=(Flag
)n
&1; /* [works even if big] */
2064 if (n
!=BIGEVEN
&& n
!=BIGODD
) /* can use integer path? */
2065 useint
=1; /* looks good */
2068 if (decNumberIsNegative(lhs
) /* -x .. */
2069 && isoddint
) bits
=DECNEG
; /* .. to an odd power */
2071 /* handle LHS infinity */
2072 if (decNumberIsInfinite(lhs
)) { /* [NaNs already handled] */
2073 uByte rbits
=rhs
->bits
; /* save */
2074 uprv_decNumberZero(res
); /* prepare */
2075 if (n
==0) *res
->lsu
=1; /* [-]Inf**0 => 1 */
2077 /* -Inf**nonint -> error */
2078 if (!rhsint
&& decNumberIsNegative(lhs
)) {
2079 status
|=DEC_Invalid_operation
; /* -Inf**nonint is error */
2081 if (!(rbits
& DECNEG
)) bits
|=DECINF
; /* was not a **-n */
2082 /* [otherwise will be 0 or -0] */
2087 /* similarly handle LHS zero */
2088 if (decNumberIsZero(lhs
)) {
2089 if (n
==0) { /* 0**0 => Error */
2091 if (!set
->extended
) { /* [unless subset] */
2092 uprv_decNumberZero(res
);
2093 *res
->lsu
=1; /* return 1 */
2096 status
|=DEC_Invalid_operation
;
2099 uByte rbits
=rhs
->bits
; /* save */
2100 if (rbits
& DECNEG
) { /* was a 0**(-n) */
2102 if (!set
->extended
) { /* [bad if subset] */
2103 status
|=DEC_Invalid_operation
;
2108 uprv_decNumberZero(res
); /* prepare */
2109 /* [otherwise will be 0 or -0] */
2114 /* here both lhs and rhs are finite; rhs==0 is handled in the */
2115 /* integer path. Next handle the non-integer cases */
2116 if (!useint
) { /* non-integral rhs */
2117 /* any -ve lhs is bad, as is either operand or context out of */
2119 if (decNumberIsNegative(lhs
)) {
2120 status
|=DEC_Invalid_operation
;
2122 if (decCheckMath(lhs
, set
, &status
)
2123 || decCheckMath(rhs
, set
, &status
)) break; /* variable status */
2125 uprv_decContextDefault(&aset
, DEC_INIT_DECIMAL64
); /* clean context */
2126 aset
.emax
=DEC_MAX_MATH
; /* usual bounds */
2127 aset
.emin
=-DEC_MAX_MATH
; /* .. */
2128 aset
.clamp
=0; /* and no concrete format */
2130 /* calculate the result using exp(ln(lhs)*rhs), which can */
2131 /* all be done into the accumulator, dac. The precision needed */
2132 /* is enough to contain the full information in the lhs (which */
2133 /* is the total digits, including exponent), or the requested */
2134 /* precision, if larger, + 4; 6 is used for the exponent */
2135 /* maximum length, and this is also used when it is shorter */
2136 /* than the requested digits as it greatly reduces the >0.5 ulp */
2137 /* cases at little cost (because Ln doubles digits each */
2138 /* iteration so a few extra digits rarely causes an extra */
2140 aset
.digits
=MAXI(lhs
->digits
, set
->digits
)+6+4;
2141 } /* non-integer rhs */
2143 else { /* rhs is in-range integer */
2144 if (n
==0) { /* x**0 = 1 */
2145 /* (0**0 was handled above) */
2146 uprv_decNumberZero(res
); /* result=1 */
2147 *res
->lsu
=1; /* .. */
2149 /* rhs is a non-zero integer */
2150 if (n
<0) n
=-n
; /* use abs(n) */
2152 aset
=*set
; /* clone the context */
2153 aset
.round
=DEC_ROUND_HALF_EVEN
; /* internally use balanced */
2154 /* calculate the working DIGITS */
2155 aset
.digits
=reqdigits
+(rhs
->digits
+rhs
->exponent
)+2;
2157 if (!set
->extended
) aset
.digits
--; /* use classic precision */
2159 /* it's an error if this is more than can be handled */
2160 if (aset
.digits
>DECNUMMAXP
) {status
|=DEC_Invalid_operation
; break;}
2161 } /* integer path */
2163 /* aset.digits is the count of digits for the accumulator needed */
2164 /* if accumulator is too long for local storage, then allocate */
2165 needbytes
=sizeof(decNumber
)+(D2U(aset
.digits
)-1)*sizeof(Unit
);
2166 /* [needbytes also used below if 1/lhs needed] */
2167 if (needbytes
>sizeof(dacbuff
)) {
2168 allocdac
=(decNumber
*)malloc(needbytes
);
2169 if (allocdac
==NULL
) { /* hopeless -- abandon */
2170 status
|=DEC_Insufficient_storage
;
2172 dac
=allocdac
; /* use the allocated space */
2174 /* here, aset is set up and accumulator is ready for use */
2176 if (!useint
) { /* non-integral rhs */
2177 /* x ** y; special-case x=1 here as it will otherwise always */
2178 /* reduce to integer 1; decLnOp has a fastpath which detects */
2179 /* the case of x=1 */
2180 decLnOp(dac
, lhs
, &aset
, &status
); /* dac=ln(lhs) */
2181 /* [no error possible, as lhs 0 already handled] */
2182 if (ISZERO(dac
)) { /* x==1, 1.0, etc. */
2183 /* need to return fully-padded 1.0000 etc., but rhsint->1 */
2184 *dac
->lsu
=1; /* was 0, make int 1 */
2185 if (!rhsint
) { /* add padding */
2186 Int shift
=set
->digits
-1;
2187 dac
->digits
=decShiftToMost(dac
->lsu
, 1, shift
);
2188 dac
->exponent
=-shift
; /* make 1.0000... */
2189 status
|=DEC_Inexact
|DEC_Rounded
; /* deemed inexact */
2193 decMultiplyOp(dac
, dac
, rhs
, &aset
, &status
); /* dac=dac*rhs */
2194 decExpOp(dac
, dac
, &aset
, &status
); /* dac=exp(dac) */
2196 /* and drop through for final rounding */
2197 } /* non-integer rhs */
2199 else { /* carry on with integer */
2200 uprv_decNumberZero(dac
); /* acc=1 */
2201 *dac
->lsu
=1; /* .. */
2203 /* if a negative power the constant 1 is needed, and if not subset */
2204 /* invert the lhs now rather than inverting the result later */
2205 if (decNumberIsNegative(rhs
)) { /* was a **-n [hence digits>0] */
2206 decNumber
*inv
=invbuff
; /* asssume use fixed buffer */
2207 uprv_decNumberCopy(&dnOne
, dac
); /* dnOne=1; [needed now or later] */
2209 if (set
->extended
) { /* need to calculate 1/lhs */
2211 /* divide lhs into 1, putting result in dac [dac=1/dac] */
2212 decDivideOp(dac
, &dnOne
, lhs
, &aset
, DIVIDE
, &status
);
2213 /* now locate or allocate space for the inverted lhs */
2214 if (needbytes
>sizeof(invbuff
)) {
2215 allocinv
=(decNumber
*)malloc(needbytes
);
2216 if (allocinv
==NULL
) { /* hopeless -- abandon */
2217 status
|=DEC_Insufficient_storage
;
2219 inv
=allocinv
; /* use the allocated space */
2221 /* [inv now points to big-enough buffer or allocated storage] */
2222 uprv_decNumberCopy(inv
, dac
); /* copy the 1/lhs */
2223 uprv_decNumberCopy(dac
, &dnOne
); /* restore acc=1 */
2224 lhs
=inv
; /* .. and go forward with new lhs */
2230 /* Raise-to-the-power loop... */
2231 seenbit
=0; /* set once a 1-bit is encountered */
2232 for (i
=1;;i
++){ /* for each bit [top bit ignored] */
2233 /* abandon if had overflow or terminal underflow */
2234 if (status
& (DEC_Overflow
|DEC_Underflow
)) { /* interesting? */
2235 if (status
&DEC_Overflow
|| ISZERO(dac
)) break;
2237 /* [the following two lines revealed an optimizer bug in a C++ */
2238 /* compiler, with symptom: 5**3 -> 25, when n=n+n was used] */
2239 n
=n
<<1; /* move next bit to testable position */
2240 if (n
<0) { /* top bit is set */
2241 seenbit
=1; /* OK, significant bit seen */
2242 decMultiplyOp(dac
, dac
, lhs
, &aset
, &status
); /* dac=dac*x */
2244 if (i
==31) break; /* that was the last bit */
2245 if (!seenbit
) continue; /* no need to square 1 */
2246 decMultiplyOp(dac
, dac
, dac
, &aset
, &status
); /* dac=dac*dac [square] */
2247 } /*i*/ /* 32 bits */
2249 /* complete internal overflow or underflow processing */
2250 if (status
& (DEC_Overflow
|DEC_Underflow
)) {
2252 /* If subset, and power was negative, reverse the kind of -erflow */
2253 /* [1/x not yet done] */
2254 if (!set
->extended
&& decNumberIsNegative(rhs
)) {
2255 if (status
& DEC_Overflow
)
2256 status
^=DEC_Overflow
| DEC_Underflow
| DEC_Subnormal
;
2257 else { /* trickier -- Underflow may or may not be set */
2258 status
&=~(DEC_Underflow
| DEC_Subnormal
); /* [one or both] */
2259 status
|=DEC_Overflow
;
2263 dac
->bits
=(dac
->bits
& ~DECNEG
) | bits
; /* force correct sign */
2264 /* round subnormals [to set.digits rather than aset.digits] */
2265 /* or set overflow result similarly as required */
2266 decFinalize(dac
, set
, &residue
, &status
);
2267 uprv_decNumberCopy(res
, dac
); /* copy to result (is now OK length) */
2272 if (!set
->extended
&& /* subset math */
2273 decNumberIsNegative(rhs
)) { /* was a **-n [hence digits>0] */
2274 /* so divide result into 1 [dac=1/dac] */
2275 decDivideOp(dac
, &dnOne
, dac
, &aset
, DIVIDE
, &status
);
2278 } /* rhs integer path */
2280 /* reduce result to the requested length and copy to result */
2281 decCopyFit(res
, dac
, set
, &residue
, &status
);
2282 decFinish(res
, set
, &residue
, &status
); /* final cleanup */
2284 if (!set
->extended
) decTrim(res
, set
, 0, 1, &dropped
); /* trailing zeros */
2286 } while(0); /* end protected */
2288 if (allocdac
!=NULL
) free(allocdac
); /* drop any storage used */
2289 if (allocinv
!=NULL
) free(allocinv
); /* .. */
2291 if (alloclhs
!=NULL
) free(alloclhs
); /* .. */
2292 if (allocrhs
!=NULL
) free(allocrhs
); /* .. */
2294 if (status
!=0) decStatus(res
, status
, set
);
2296 decCheckInexact(res
, set
);
2299 } /* decNumberPower */
2301 /* ------------------------------------------------------------------ */
2302 /* decNumberQuantize -- force exponent to requested value */
2304 /* This computes C = op(A, B), where op adjusts the coefficient */
2305 /* of C (by rounding or shifting) such that the exponent (-scale) */
2306 /* of C has exponent of B. The numerical value of C will equal A, */
2307 /* except for the effects of any rounding that occurred. */
2309 /* res is C, the result. C may be A or B */
2310 /* lhs is A, the number to adjust */
2311 /* rhs is B, the number with exponent to match */
2312 /* set is the context */
2314 /* C must have space for set->digits digits. */
2316 /* Unless there is an error or the result is infinite, the exponent */
2317 /* after the operation is guaranteed to be equal to that of B. */
2318 /* ------------------------------------------------------------------ */
2319 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberQuantize(decNumber
*res
, const decNumber
*lhs
,
2320 const decNumber
*rhs
, decContext
*set
) {
2321 uInt status
=0; /* accumulator */
2322 decQuantizeOp(res
, lhs
, rhs
, set
, 1, &status
);
2323 if (status
!=0) decStatus(res
, status
, set
);
2325 } /* decNumberQuantize */
2327 /* ------------------------------------------------------------------ */
2328 /* decNumberReduce -- remove trailing zeros */
2330 /* This computes C = 0 + A, and normalizes the result */
2332 /* res is C, the result. C may be A */
2334 /* set is the context */
2336 /* C must have space for set->digits digits. */
2337 /* ------------------------------------------------------------------ */
2338 /* Previously known as Normalize */
2339 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberNormalize(decNumber
*res
, const decNumber
*rhs
,
2341 return uprv_decNumberReduce(res
, rhs
, set
);
2342 } /* decNumberNormalize */
2344 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberReduce(decNumber
*res
, const decNumber
*rhs
,
2347 decNumber
*allocrhs
=NULL
; /* non-NULL if rounded rhs allocated */
2349 uInt status
=0; /* as usual */
2350 Int residue
=0; /* as usual */
2351 Int dropped
; /* work */
2354 if (decCheckOperands(res
, DECUNUSED
, rhs
, set
)) return res
;
2357 do { /* protect allocated storage */
2359 if (!set
->extended
) {
2360 /* reduce operand and set lostDigits status, as needed */
2361 if (rhs
->digits
>set
->digits
) {
2362 allocrhs
=decRoundOperand(rhs
, set
, &status
);
2363 if (allocrhs
==NULL
) break;
2368 /* [following code does not require input rounding] */
2370 /* Infinities copy through; NaNs need usual treatment */
2371 if (decNumberIsNaN(rhs
)) {
2372 decNaNs(res
, rhs
, NULL
, set
, &status
);
2376 /* reduce result to the requested length and copy to result */
2377 decCopyFit(res
, rhs
, set
, &residue
, &status
); /* copy & round */
2378 decFinish(res
, set
, &residue
, &status
); /* cleanup/set flags */
2379 decTrim(res
, set
, 1, 0, &dropped
); /* normalize in place */
2381 } while(0); /* end protected */
2384 if (allocrhs
!=NULL
) free(allocrhs
); /* .. */
2386 if (status
!=0) decStatus(res
, status
, set
);/* then report status */
2388 } /* decNumberReduce */
2390 /* ------------------------------------------------------------------ */
2391 /* decNumberRescale -- force exponent to requested value */
2393 /* This computes C = op(A, B), where op adjusts the coefficient */
2394 /* of C (by rounding or shifting) such that the exponent (-scale) */
2395 /* of C has the value B. The numerical value of C will equal A, */
2396 /* except for the effects of any rounding that occurred. */
2398 /* res is C, the result. C may be A or B */
2399 /* lhs is A, the number to adjust */
2400 /* rhs is B, the requested exponent */
2401 /* set is the context */
2403 /* C must have space for set->digits digits. */
2405 /* Unless there is an error or the result is infinite, the exponent */
2406 /* after the operation is guaranteed to be equal to B. */
2407 /* ------------------------------------------------------------------ */
2408 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberRescale(decNumber
*res
, const decNumber
*lhs
,
2409 const decNumber
*rhs
, decContext
*set
) {
2410 uInt status
=0; /* accumulator */
2411 decQuantizeOp(res
, lhs
, rhs
, set
, 0, &status
);
2412 if (status
!=0) decStatus(res
, status
, set
);
2414 } /* decNumberRescale */
2416 /* ------------------------------------------------------------------ */
2417 /* decNumberRemainder -- divide and return remainder */
2419 /* This computes C = A % B */
2421 /* res is C, the result. C may be A and/or B (e.g., X=X%X) */
2424 /* set is the context */
2426 /* C must have space for set->digits digits. */
2427 /* ------------------------------------------------------------------ */
2428 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberRemainder(decNumber
*res
, const decNumber
*lhs
,
2429 const decNumber
*rhs
, decContext
*set
) {
2430 uInt status
=0; /* accumulator */
2431 decDivideOp(res
, lhs
, rhs
, set
, REMAINDER
, &status
);
2432 if (status
!=0) decStatus(res
, status
, set
);
2434 decCheckInexact(res
, set
);
2437 } /* decNumberRemainder */
2439 /* ------------------------------------------------------------------ */
2440 /* decNumberRemainderNear -- divide and return remainder from nearest */
2442 /* This computes C = A % B, where % is the IEEE remainder operator */
2444 /* res is C, the result. C may be A and/or B (e.g., X=X%X) */
2447 /* set is the context */
2449 /* C must have space for set->digits digits. */
2450 /* ------------------------------------------------------------------ */
2451 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberRemainderNear(decNumber
*res
, const decNumber
*lhs
,
2452 const decNumber
*rhs
, decContext
*set
) {
2453 uInt status
=0; /* accumulator */
2454 decDivideOp(res
, lhs
, rhs
, set
, REMNEAR
, &status
);
2455 if (status
!=0) decStatus(res
, status
, set
);
2457 decCheckInexact(res
, set
);
2460 } /* decNumberRemainderNear */
2462 /* ------------------------------------------------------------------ */
2463 /* decNumberRotate -- rotate the coefficient of a Number left/right */
2465 /* This computes C = A rot B (in base ten and rotating set->digits */
2468 /* res is C, the result. C may be A and/or B (e.g., X=XrotX) */
2470 /* rhs is B, the number of digits to rotate (-ve to right) */
2471 /* set is the context */
2473 /* The digits of the coefficient of A are rotated to the left (if B */
2474 /* is positive) or to the right (if B is negative) without adjusting */
2475 /* the exponent or the sign of A. If lhs->digits is less than */
2476 /* set->digits the coefficient is padded with zeros on the left */
2477 /* before the rotate. Any leading zeros in the result are removed */
2480 /* B must be an integer (q=0) and in the range -set->digits through */
2482 /* C must have space for set->digits digits. */
2483 /* NaNs are propagated as usual. Infinities are unaffected (but */
2484 /* B must be valid). No status is set unless B is invalid or an */
2485 /* operand is an sNaN. */
2486 /* ------------------------------------------------------------------ */
2487 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberRotate(decNumber
*res
, const decNumber
*lhs
,
2488 const decNumber
*rhs
, decContext
*set
) {
2489 uInt status
=0; /* accumulator */
2490 Int rotate
; /* rhs as an Int */
2493 if (decCheckOperands(res
, lhs
, rhs
, set
)) return res
;
2496 /* NaNs propagate as normal */
2497 if (decNumberIsNaN(lhs
) || decNumberIsNaN(rhs
))
2498 decNaNs(res
, lhs
, rhs
, set
, &status
);
2499 /* rhs must be an integer */
2500 else if (decNumberIsInfinite(rhs
) || rhs
->exponent
!=0)
2501 status
=DEC_Invalid_operation
;
2502 else { /* both numeric, rhs is an integer */
2503 rotate
=decGetInt(rhs
); /* [cannot fail] */
2504 if (rotate
==BADINT
/* something bad .. */
2505 || rotate
==BIGODD
|| rotate
==BIGEVEN
/* .. very big .. */
2506 || abs(rotate
)>set
->digits
) /* .. or out of range */
2507 status
=DEC_Invalid_operation
;
2508 else { /* rhs is OK */
2509 uprv_decNumberCopy(res
, lhs
);
2510 /* convert -ve rotate to equivalent positive rotation */
2511 if (rotate
<0) rotate
=set
->digits
+rotate
;
2512 if (rotate
!=0 && rotate
!=set
->digits
/* zero or full rotation */
2513 && !decNumberIsInfinite(res
)) { /* lhs was infinite */
2514 /* left-rotate to do; 0 < rotate < set->digits */
2515 uInt units
, shift
; /* work */
2516 uInt msudigits
; /* digits in result msu */
2517 Unit
*msu
=res
->lsu
+D2U(res
->digits
)-1; /* current msu */
2518 Unit
*msumax
=res
->lsu
+D2U(set
->digits
)-1; /* rotation msu */
2519 for (msu
++; msu
<=msumax
; msu
++) *msu
=0; /* ensure high units=0 */
2520 res
->digits
=set
->digits
; /* now full-length */
2521 msudigits
=MSUDIGITS(res
->digits
); /* actual digits in msu */
2523 /* rotation here is done in-place, in three steps */
2524 /* 1. shift all to least up to one unit to unit-align final */
2525 /* lsd [any digits shifted out are rotated to the left, */
2526 /* abutted to the original msd (which may require split)] */
2528 /* [if there are no whole units left to rotate, the */
2529 /* rotation is now complete] */
2531 /* 2. shift to least, from below the split point only, so that */
2532 /* the final msd is in the right place in its Unit [any */
2533 /* digits shifted out will fit exactly in the current msu, */
2534 /* left aligned, no split required] */
2536 /* 3. rotate all the units by reversing left part, right */
2537 /* part, and then whole */
2539 /* example: rotate right 8 digits (2 units + 2), DECDPUN=3. */
2541 /* start: 00a bcd efg hij klm npq */
2543 /* 1a 000 0ab cde fgh|ijk lmn [pq saved] */
2544 /* 1b 00p qab cde fgh|ijk lmn */
2546 /* 2a 00p qab cde fgh|00i jkl [mn saved] */
2547 /* 2b mnp qab cde fgh|00i jkl */
2549 /* 3a fgh cde qab mnp|00i jkl */
2550 /* 3b fgh cde qab mnp|jkl 00i */
2551 /* 3c 00i jkl mnp qab cde fgh */
2553 /* Step 1: amount to shift is the partial right-rotate count */
2554 rotate
=set
->digits
-rotate
; /* make it right-rotate */
2555 units
=rotate
/DECDPUN
; /* whole units to rotate */
2556 shift
=rotate%DECDPUN
; /* left-over digits count */
2557 if (shift
>0) { /* not an exact number of units */
2558 uInt save
=res
->lsu
[0]%powers
[shift
]; /* save low digit(s) */
2559 decShiftToLeast(res
->lsu
, D2U(res
->digits
), shift
);
2560 if (shift
>msudigits
) { /* msumax-1 needs >0 digits */
2561 uInt rem
=save%powers
[shift
-msudigits
];/* split save */
2562 *msumax
=(Unit
)(save
/powers
[shift
-msudigits
]); /* and insert */
2563 *(msumax
-1)=*(msumax
-1)
2564 +(Unit
)(rem
*powers
[DECDPUN
-(shift
-msudigits
)]); /* .. */
2566 else { /* all fits in msumax */
2567 *msumax
=*msumax
+(Unit
)(save
*powers
[msudigits
-shift
]); /* [maybe *1] */
2569 } /* digits shift needed */
2571 /* If whole units to rotate... */
2572 if (units
>0) { /* some to do */
2573 /* Step 2: the units to touch are the whole ones in rotate, */
2574 /* if any, and the shift is DECDPUN-msudigits (which may be */
2576 shift
=DECDPUN
-msudigits
;
2577 if (shift
>0) { /* not an exact number of units */
2578 uInt save
=res
->lsu
[0]%powers
[shift
]; /* save low digit(s) */
2579 decShiftToLeast(res
->lsu
, units
, shift
);
2580 *msumax
=*msumax
+(Unit
)(save
*powers
[msudigits
]);
2581 } /* partial shift needed */
2583 /* Step 3: rotate the units array using triple reverse */
2584 /* (reversing is easy and fast) */
2585 decReverse(res
->lsu
+units
, msumax
); /* left part */
2586 decReverse(res
->lsu
, res
->lsu
+units
-1); /* right part */
2587 decReverse(res
->lsu
, msumax
); /* whole */
2588 } /* whole units to rotate */
2589 /* the rotation may have left an undetermined number of zeros */
2590 /* on the left, so true length needs to be calculated */
2591 res
->digits
=decGetDigits(res
->lsu
, static_cast<int32_t>(msumax
-res
->lsu
+1));
2592 } /* rotate needed */
2595 if (status
!=0) decStatus(res
, status
, set
);
2597 } /* decNumberRotate */
2599 /* ------------------------------------------------------------------ */
2600 /* decNumberSameQuantum -- test for equal exponents */
2602 /* res is the result number, which will contain either 0 or 1 */
2603 /* lhs is a number to test */
2604 /* rhs is the second (usually a pattern) */
2606 /* No errors are possible and no context is needed. */
2607 /* ------------------------------------------------------------------ */
2608 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberSameQuantum(decNumber
*res
, const decNumber
*lhs
,
2609 const decNumber
*rhs
) {
2610 Unit ret
=0; /* return value */
2613 if (decCheckOperands(res
, lhs
, rhs
, DECUNCONT
)) return res
;
2617 if (decNumberIsNaN(lhs
) && decNumberIsNaN(rhs
)) ret
=1;
2618 else if (decNumberIsInfinite(lhs
) && decNumberIsInfinite(rhs
)) ret
=1;
2619 /* [anything else with a special gives 0] */
2621 else if (lhs
->exponent
==rhs
->exponent
) ret
=1;
2623 uprv_decNumberZero(res
); /* OK to overwrite an operand now */
2626 } /* decNumberSameQuantum */
2628 /* ------------------------------------------------------------------ */
2629 /* decNumberScaleB -- multiply by a power of 10 */
2631 /* This computes C = A x 10**B where B is an integer (q=0) with */
2632 /* maximum magnitude 2*(emax+digits) */
2634 /* res is C, the result. C may be A or B */
2635 /* lhs is A, the number to adjust */
2636 /* rhs is B, the requested power of ten to use */
2637 /* set is the context */
2639 /* C must have space for set->digits digits. */
2641 /* The result may underflow or overflow. */
2642 /* ------------------------------------------------------------------ */
2643 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberScaleB(decNumber
*res
, const decNumber
*lhs
,
2644 const decNumber
*rhs
, decContext
*set
) {
2645 Int reqexp
; /* requested exponent change [B] */
2646 uInt status
=0; /* accumulator */
2647 Int residue
; /* work */
2650 if (decCheckOperands(res
, lhs
, rhs
, set
)) return res
;
2653 /* Handle special values except lhs infinite */
2654 if (decNumberIsNaN(lhs
) || decNumberIsNaN(rhs
))
2655 decNaNs(res
, lhs
, rhs
, set
, &status
);
2656 /* rhs must be an integer */
2657 else if (decNumberIsInfinite(rhs
) || rhs
->exponent
!=0)
2658 status
=DEC_Invalid_operation
;
2660 /* lhs is a number; rhs is a finite with q==0 */
2661 reqexp
=decGetInt(rhs
); /* [cannot fail] */
2662 if (reqexp
==BADINT
/* something bad .. */
2663 || reqexp
==BIGODD
|| reqexp
==BIGEVEN
/* .. very big .. */
2664 || abs(reqexp
)>(2*(set
->digits
+set
->emax
))) /* .. or out of range */
2665 status
=DEC_Invalid_operation
;
2666 else { /* rhs is OK */
2667 uprv_decNumberCopy(res
, lhs
); /* all done if infinite lhs */
2668 if (!decNumberIsInfinite(res
)) { /* prepare to scale */
2669 res
->exponent
+=reqexp
; /* adjust the exponent */
2671 decFinalize(res
, set
, &residue
, &status
); /* .. and check */
2675 if (status
!=0) decStatus(res
, status
, set
);
2677 } /* decNumberScaleB */
2679 /* ------------------------------------------------------------------ */
2680 /* decNumberShift -- shift the coefficient of a Number left or right */
2682 /* This computes C = A << B or C = A >> -B (in base ten). */
2684 /* res is C, the result. C may be A and/or B (e.g., X=X<<X) */
2686 /* rhs is B, the number of digits to shift (-ve to right) */
2687 /* set is the context */
2689 /* The digits of the coefficient of A are shifted to the left (if B */
2690 /* is positive) or to the right (if B is negative) without adjusting */
2691 /* the exponent or the sign of A. */
2693 /* B must be an integer (q=0) and in the range -set->digits through */
2695 /* C must have space for set->digits digits. */
2696 /* NaNs are propagated as usual. Infinities are unaffected (but */
2697 /* B must be valid). No status is set unless B is invalid or an */
2698 /* operand is an sNaN. */
2699 /* ------------------------------------------------------------------ */
2700 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberShift(decNumber
*res
, const decNumber
*lhs
,
2701 const decNumber
*rhs
, decContext
*set
) {
2702 uInt status
=0; /* accumulator */
2703 Int shift
; /* rhs as an Int */
2706 if (decCheckOperands(res
, lhs
, rhs
, set
)) return res
;
2709 /* NaNs propagate as normal */
2710 if (decNumberIsNaN(lhs
) || decNumberIsNaN(rhs
))
2711 decNaNs(res
, lhs
, rhs
, set
, &status
);
2712 /* rhs must be an integer */
2713 else if (decNumberIsInfinite(rhs
) || rhs
->exponent
!=0)
2714 status
=DEC_Invalid_operation
;
2715 else { /* both numeric, rhs is an integer */
2716 shift
=decGetInt(rhs
); /* [cannot fail] */
2717 if (shift
==BADINT
/* something bad .. */
2718 || shift
==BIGODD
|| shift
==BIGEVEN
/* .. very big .. */
2719 || abs(shift
)>set
->digits
) /* .. or out of range */
2720 status
=DEC_Invalid_operation
;
2721 else { /* rhs is OK */
2722 uprv_decNumberCopy(res
, lhs
);
2723 if (shift
!=0 && !decNumberIsInfinite(res
)) { /* something to do */
2724 if (shift
>0) { /* to left */
2725 if (shift
==set
->digits
) { /* removing all */
2726 *res
->lsu
=0; /* so place 0 */
2727 res
->digits
=1; /* .. */
2730 /* first remove leading digits if necessary */
2731 if (res
->digits
+shift
>set
->digits
) {
2732 decDecap(res
, res
->digits
+shift
-set
->digits
);
2733 /* that updated res->digits; may have gone to 1 (for a */
2734 /* single digit or for zero */
2736 if (res
->digits
>1 || *res
->lsu
) /* if non-zero.. */
2737 res
->digits
=decShiftToMost(res
->lsu
, res
->digits
, shift
);
2738 } /* partial left */
2740 else { /* to right */
2741 if (-shift
>=res
->digits
) { /* discarding all */
2742 *res
->lsu
=0; /* so place 0 */
2743 res
->digits
=1; /* .. */
2746 decShiftToLeast(res
->lsu
, D2U(res
->digits
), -shift
);
2747 res
->digits
-=(-shift
);
2750 } /* non-0 non-Inf shift */
2753 if (status
!=0) decStatus(res
, status
, set
);
2755 } /* decNumberShift */
2757 /* ------------------------------------------------------------------ */
2758 /* decNumberSquareRoot -- square root operator */
2760 /* This computes C = squareroot(A) */
2762 /* res is C, the result. C may be A */
2764 /* set is the context; note that rounding mode has no effect */
2766 /* C must have space for set->digits digits. */
2767 /* ------------------------------------------------------------------ */
2768 /* This uses the following varying-precision algorithm in: */
2770 /* Properly Rounded Variable Precision Square Root, T. E. Hull and */
2771 /* A. Abrham, ACM Transactions on Mathematical Software, Vol 11 #3, */
2772 /* pp229-237, ACM, September 1985. */
2774 /* The square-root is calculated using Newton's method, after which */
2775 /* a check is made to ensure the result is correctly rounded. */
2777 /* % [Reformatted original Numerical Turing source code follows.] */
2778 /* function sqrt(x : real) : real */
2779 /* % sqrt(x) returns the properly rounded approximation to the square */
2780 /* % root of x, in the precision of the calling environment, or it */
2781 /* % fails if x < 0. */
2782 /* % t e hull and a abrham, august, 1984 */
2783 /* if x <= 0 then */
2790 /* var f := setexp(x, 0) % fraction part of x [0.1 <= x < 1] */
2791 /* var e := getexp(x) % exponent part of x */
2792 /* var approx : real */
2793 /* if e mod 2 = 0 then */
2794 /* approx := .259 + .819 * f % approx to root of f */
2796 /* f := f/l0 % adjustments */
2797 /* e := e + 1 % for odd */
2798 /* approx := .0819 + 2.59 * f % exponent */
2802 /* const maxp := currentprecision + 2 */
2804 /* p := min(2*p - 2, maxp) % p = 4,6,10, . . . , maxp */
2806 /* approx := .5 * (approx + f/approx) */
2807 /* exit when p = maxp */
2810 /* % approx is now within 1 ulp of the properly rounded square root */
2811 /* % of f; to ensure proper rounding, compare squares of (approx - */
2812 /* % l/2 ulp) and (approx + l/2 ulp) with f. */
2813 /* p := currentprecision */
2815 /* precision p + 2 */
2816 /* const approxsubhalf := approx - setexp(.5, -p) */
2817 /* if mulru(approxsubhalf, approxsubhalf) > f then */
2818 /* approx := approx - setexp(.l, -p + 1) */
2820 /* const approxaddhalf := approx + setexp(.5, -p) */
2821 /* if mulrd(approxaddhalf, approxaddhalf) < f then */
2822 /* approx := approx + setexp(.l, -p + 1) */
2826 /* result setexp(approx, e div 2) % fix exponent */
2828 /* ------------------------------------------------------------------ */
2829 #if defined(__clang__) || U_GCC_MAJOR_MINOR >= 406
2830 #pragma GCC diagnostic push
2831 #pragma GCC diagnostic ignored "-Warray-bounds"
2833 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberSquareRoot(decNumber
*res
, const decNumber
*rhs
,
2835 decContext workset
, approxset
; /* work contexts */
2836 decNumber dzero
; /* used for constant zero */
2837 Int maxp
; /* largest working precision */
2838 Int workp
; /* working precision */
2839 Int residue
=0; /* rounding residue */
2840 uInt status
=0, ignore
=0; /* status accumulators */
2841 uInt rstatus
; /* .. */
2842 Int exp
; /* working exponent */
2843 Int ideal
; /* ideal (preferred) exponent */
2844 Int needbytes
; /* work */
2845 Int dropped
; /* .. */
2848 decNumber
*allocrhs
=NULL
; /* non-NULL if rounded rhs allocated */
2850 /* buffer for f [needs +1 in case DECBUFFER 0] */
2851 decNumber buff
[D2N(DECBUFFER
+1)];
2852 /* buffer for a [needs +2 to match likely maxp] */
2853 decNumber bufa
[D2N(DECBUFFER
+2)];
2854 /* buffer for temporary, b [must be same size as a] */
2855 decNumber bufb
[D2N(DECBUFFER
+2)];
2856 decNumber
*allocbuff
=NULL
; /* -> allocated buff, iff allocated */
2857 decNumber
*allocbufa
=NULL
; /* -> allocated bufa, iff allocated */
2858 decNumber
*allocbufb
=NULL
; /* -> allocated bufb, iff allocated */
2859 decNumber
*f
=buff
; /* reduced fraction */
2860 decNumber
*a
=bufa
; /* approximation to result */
2861 decNumber
*b
=bufb
; /* intermediate result */
2862 /* buffer for temporary variable, up to 3 digits */
2863 decNumber buft
[D2N(3)];
2864 decNumber
*t
=buft
; /* up-to-3-digit constant or work */
2867 if (decCheckOperands(res
, DECUNUSED
, rhs
, set
)) return res
;
2870 do { /* protect allocated storage */
2872 if (!set
->extended
) {
2873 /* reduce operand and set lostDigits status, as needed */
2874 if (rhs
->digits
>set
->digits
) {
2875 allocrhs
=decRoundOperand(rhs
, set
, &status
);
2876 if (allocrhs
==NULL
) break;
2877 /* [Note: 'f' allocation below could reuse this buffer if */
2878 /* used, but as this is rare they are kept separate for clarity.] */
2883 /* [following code does not require input rounding] */
2885 /* handle infinities and NaNs */
2887 if (decNumberIsInfinite(rhs
)) { /* an infinity */
2888 if (decNumberIsNegative(rhs
)) status
|=DEC_Invalid_operation
;
2889 else uprv_decNumberCopy(res
, rhs
); /* +Infinity */
2891 else decNaNs(res
, rhs
, NULL
, set
, &status
); /* a NaN */
2895 /* calculate the ideal (preferred) exponent [floor(exp/2)] */
2896 /* [It would be nicer to write: ideal=rhs->exponent>>1, but this */
2897 /* generates a compiler warning. Generated code is the same.] */
2898 ideal
=(rhs
->exponent
&~1)/2; /* target */
2902 uprv_decNumberCopy(res
, rhs
); /* could be 0 or -0 */
2903 res
->exponent
=ideal
; /* use the ideal [safe] */
2904 /* use decFinish to clamp any out-of-range exponent, etc. */
2905 decFinish(res
, set
, &residue
, &status
);
2909 /* any other -x is an oops */
2910 if (decNumberIsNegative(rhs
)) {
2911 status
|=DEC_Invalid_operation
;
2915 /* space is needed for three working variables */
2916 /* f -- the same precision as the RHS, reduced to 0.01->0.99... */
2917 /* a -- Hull's approximation -- precision, when assigned, is */
2918 /* currentprecision+1 or the input argument precision, */
2919 /* whichever is larger (+2 for use as temporary) */
2920 /* b -- intermediate temporary result (same size as a) */
2921 /* if any is too long for local storage, then allocate */
2922 workp
=MAXI(set
->digits
+1, rhs
->digits
); /* actual rounding precision */
2923 workp
=MAXI(workp
, 7); /* at least 7 for low cases */
2924 maxp
=workp
+2; /* largest working precision */
2926 needbytes
=sizeof(decNumber
)+(D2U(rhs
->digits
)-1)*sizeof(Unit
);
2927 if (needbytes
>(Int
)sizeof(buff
)) {
2928 allocbuff
=(decNumber
*)malloc(needbytes
);
2929 if (allocbuff
==NULL
) { /* hopeless -- abandon */
2930 status
|=DEC_Insufficient_storage
;
2932 f
=allocbuff
; /* use the allocated space */
2934 /* a and b both need to be able to hold a maxp-length number */
2935 needbytes
=sizeof(decNumber
)+(D2U(maxp
)-1)*sizeof(Unit
);
2936 if (needbytes
>(Int
)sizeof(bufa
)) { /* [same applies to b] */
2937 allocbufa
=(decNumber
*)malloc(needbytes
);
2938 allocbufb
=(decNumber
*)malloc(needbytes
);
2939 if (allocbufa
==NULL
|| allocbufb
==NULL
) { /* hopeless */
2940 status
|=DEC_Insufficient_storage
;
2942 a
=allocbufa
; /* use the allocated spaces */
2943 b
=allocbufb
; /* .. */
2946 /* copy rhs -> f, save exponent, and reduce so 0.1 <= f < 1 */
2947 uprv_decNumberCopy(f
, rhs
);
2948 exp
=f
->exponent
+f
->digits
; /* adjusted to Hull rules */
2949 f
->exponent
=-(f
->digits
); /* to range */
2951 /* set up working context */
2952 uprv_decContextDefault(&workset
, DEC_INIT_DECIMAL64
);
2953 workset
.emax
=DEC_MAX_EMAX
;
2954 workset
.emin
=DEC_MIN_EMIN
;
2956 /* [Until further notice, no error is possible and status bits */
2957 /* (Rounded, etc.) should be ignored, not accumulated.] */
2959 /* Calculate initial approximation, and allow for odd exponent */
2960 workset
.digits
=workp
; /* p for initial calculation */
2961 t
->bits
=0; t
->digits
=3;
2962 a
->bits
=0; a
->digits
=3;
2963 if ((exp
& 1)==0) { /* even exponent */
2964 /* Set t=0.259, a=0.819 */
2971 t
->lsu
[0]=59; t
->lsu
[1]=2;
2972 a
->lsu
[0]=19; a
->lsu
[1]=8;
2974 t
->lsu
[0]=9; t
->lsu
[1]=5; t
->lsu
[2]=2;
2975 a
->lsu
[0]=9; a
->lsu
[1]=1; a
->lsu
[2]=8;
2978 else { /* odd exponent */
2979 /* Set t=0.0819, a=2.59 */
2980 f
->exponent
--; /* f=f/10 */
2988 t
->lsu
[0]=19; t
->lsu
[1]=8;
2989 a
->lsu
[0]=59; a
->lsu
[1]=2;
2991 t
->lsu
[0]=9; t
->lsu
[1]=1; t
->lsu
[2]=8;
2992 a
->lsu
[0]=9; a
->lsu
[1]=5; a
->lsu
[2]=2;
2996 decMultiplyOp(a
, a
, f
, &workset
, &ignore
); /* a=a*f */
2997 decAddOp(a
, a
, t
, &workset
, 0, &ignore
); /* ..+t */
2998 /* [a is now the initial approximation for sqrt(f), calculated with */
2999 /* currentprecision, which is also a's precision.] */
3001 /* the main calculation loop */
3002 uprv_decNumberZero(&dzero
); /* make 0 */
3003 uprv_decNumberZero(t
); /* set t = 0.5 */
3004 t
->lsu
[0]=5; /* .. */
3005 t
->exponent
=-1; /* .. */
3006 workset
.digits
=3; /* initial p */
3007 for (; workset
.digits
<maxp
;) {
3008 /* set p to min(2*p - 2, maxp) [hence 3; or: 4, 6, 10, ... , maxp] */
3009 workset
.digits
=MINI(workset
.digits
*2-2, maxp
);
3010 /* a = 0.5 * (a + f/a) */
3011 /* [calculated at p then rounded to currentprecision] */
3012 decDivideOp(b
, f
, a
, &workset
, DIVIDE
, &ignore
); /* b=f/a */
3013 decAddOp(b
, b
, a
, &workset
, 0, &ignore
); /* b=b+a */
3014 decMultiplyOp(a
, b
, t
, &workset
, &ignore
); /* a=b*0.5 */
3017 /* Here, 0.1 <= a < 1 [Hull], and a has maxp digits */
3018 /* now reduce to length, etc.; this needs to be done with a */
3019 /* having the correct exponent so as to handle subnormals */
3021 approxset
=*set
; /* get emin, emax, etc. */
3022 approxset
.round
=DEC_ROUND_HALF_EVEN
;
3023 a
->exponent
+=exp
/2; /* set correct exponent */
3024 rstatus
=0; /* clear status */
3025 residue
=0; /* .. and accumulator */
3026 decCopyFit(a
, a
, &approxset
, &residue
, &rstatus
); /* reduce (if needed) */
3027 decFinish(a
, &approxset
, &residue
, &rstatus
); /* clean and finalize */
3029 /* Overflow was possible if the input exponent was out-of-range, */
3030 /* in which case quit */
3031 if (rstatus
&DEC_Overflow
) {
3032 status
=rstatus
; /* use the status as-is */
3033 uprv_decNumberCopy(res
, a
); /* copy to result */
3037 /* Preserve status except Inexact/Rounded */
3038 status
|=(rstatus
& ~(DEC_Rounded
|DEC_Inexact
));
3040 /* Carry out the Hull correction */
3041 a
->exponent
-=exp
/2; /* back to 0.1->1 */
3043 /* a is now at final precision and within 1 ulp of the properly */
3044 /* rounded square root of f; to ensure proper rounding, compare */
3045 /* squares of (a - l/2 ulp) and (a + l/2 ulp) with f. */
3046 /* Here workset.digits=maxp and t=0.5, and a->digits determines */
3048 workset
.digits
--; /* maxp-1 is OK now */
3049 t
->exponent
=-a
->digits
-1; /* make 0.5 ulp */
3050 decAddOp(b
, a
, t
, &workset
, DECNEG
, &ignore
); /* b = a - 0.5 ulp */
3051 workset
.round
=DEC_ROUND_UP
;
3052 decMultiplyOp(b
, b
, b
, &workset
, &ignore
); /* b = mulru(b, b) */
3053 decCompareOp(b
, f
, b
, &workset
, COMPARE
, &ignore
); /* b ? f, reversed */
3054 if (decNumberIsNegative(b
)) { /* f < b [i.e., b > f] */
3055 /* this is the more common adjustment, though both are rare */
3056 t
->exponent
++; /* make 1.0 ulp */
3057 t
->lsu
[0]=1; /* .. */
3058 decAddOp(a
, a
, t
, &workset
, DECNEG
, &ignore
); /* a = a - 1 ulp */
3059 /* assign to approx [round to length] */
3060 approxset
.emin
-=exp
/2; /* adjust to match a */
3061 approxset
.emax
-=exp
/2;
3062 decAddOp(a
, &dzero
, a
, &approxset
, 0, &ignore
);
3065 decAddOp(b
, a
, t
, &workset
, 0, &ignore
); /* b = a + 0.5 ulp */
3066 workset
.round
=DEC_ROUND_DOWN
;
3067 decMultiplyOp(b
, b
, b
, &workset
, &ignore
); /* b = mulrd(b, b) */
3068 decCompareOp(b
, b
, f
, &workset
, COMPARE
, &ignore
); /* b ? f */
3069 if (decNumberIsNegative(b
)) { /* b < f */
3070 t
->exponent
++; /* make 1.0 ulp */
3071 t
->lsu
[0]=1; /* .. */
3072 decAddOp(a
, a
, t
, &workset
, 0, &ignore
); /* a = a + 1 ulp */
3073 /* assign to approx [round to length] */
3074 approxset
.emin
-=exp
/2; /* adjust to match a */
3075 approxset
.emax
-=exp
/2;
3076 decAddOp(a
, &dzero
, a
, &approxset
, 0, &ignore
);
3079 /* [no errors are possible in the above, and rounding/inexact during */
3080 /* estimation are irrelevant, so status was not accumulated] */
3082 /* Here, 0.1 <= a < 1 (still), so adjust back */
3083 a
->exponent
+=exp
/2; /* set correct exponent */
3085 /* count droppable zeros [after any subnormal rounding] by */
3086 /* trimming a copy */
3087 uprv_decNumberCopy(b
, a
);
3088 decTrim(b
, set
, 1, 1, &dropped
); /* [drops trailing zeros] */
3090 /* Set Inexact and Rounded. The answer can only be exact if */
3091 /* it is short enough so that squaring it could fit in workp */
3092 /* digits, so this is the only (relatively rare) condition that */
3093 /* a careful check is needed */
3094 if (b
->digits
*2-1 > workp
) { /* cannot fit */
3095 status
|=DEC_Inexact
|DEC_Rounded
;
3097 else { /* could be exact/unrounded */
3098 uInt mstatus
=0; /* local status */
3099 decMultiplyOp(b
, b
, b
, &workset
, &mstatus
); /* try the multiply */
3100 if (mstatus
&DEC_Overflow
) { /* result just won't fit */
3101 status
|=DEC_Inexact
|DEC_Rounded
;
3103 else { /* plausible */
3104 decCompareOp(t
, b
, rhs
, &workset
, COMPARE
, &mstatus
); /* b ? rhs */
3105 if (!ISZERO(t
)) status
|=DEC_Inexact
|DEC_Rounded
; /* not equal */
3106 else { /* is Exact */
3107 /* here, dropped is the count of trailing zeros in 'a' */
3108 /* use closest exponent to ideal... */
3109 Int todrop
=ideal
-a
->exponent
; /* most that can be dropped */
3110 if (todrop
<0) status
|=DEC_Rounded
; /* ideally would add 0s */
3111 else { /* unrounded */
3112 /* there are some to drop, but emax may not allow all */
3113 Int maxexp
=set
->emax
-set
->digits
+1;
3114 Int maxdrop
=maxexp
-a
->exponent
;
3115 if (todrop
>maxdrop
&& set
->clamp
) { /* apply clamping */
3117 status
|=DEC_Clamped
;
3119 if (dropped
<todrop
) { /* clamp to those available */
3121 status
|=DEC_Clamped
;
3123 if (todrop
>0) { /* have some to drop */
3124 decShiftToLeast(a
->lsu
, D2U(a
->digits
), todrop
);
3125 a
->exponent
+=todrop
; /* maintain numerical value */
3126 a
->digits
-=todrop
; /* new length */
3133 /* double-check Underflow, as perhaps the result could not have */
3134 /* been subnormal (initial argument too big), or it is now Exact */
3135 if (status
&DEC_Underflow
) {
3136 Int ae
=rhs
->exponent
+rhs
->digits
-1; /* adjusted exponent */
3137 /* check if truly subnormal */
3138 #if DECEXTFLAG /* DEC_Subnormal too */
3139 if (ae
>=set
->emin
*2) status
&=~(DEC_Subnormal
|DEC_Underflow
);
3141 if (ae
>=set
->emin
*2) status
&=~DEC_Underflow
;
3143 /* check if truly inexact */
3144 if (!(status
&DEC_Inexact
)) status
&=~DEC_Underflow
;
3147 uprv_decNumberCopy(res
, a
); /* a is now the result */
3148 } while(0); /* end protected */
3150 if (allocbuff
!=NULL
) free(allocbuff
); /* drop any storage used */
3151 if (allocbufa
!=NULL
) free(allocbufa
); /* .. */
3152 if (allocbufb
!=NULL
) free(allocbufb
); /* .. */
3154 if (allocrhs
!=NULL
) free(allocrhs
); /* .. */
3156 if (status
!=0) decStatus(res
, status
, set
);/* then report status */
3158 decCheckInexact(res
, set
);
3161 } /* decNumberSquareRoot */
3162 #if defined(__clang__) || U_GCC_MAJOR_MINOR >= 406
3163 #pragma GCC diagnostic pop
3166 /* ------------------------------------------------------------------ */
3167 /* decNumberSubtract -- subtract two Numbers */
3169 /* This computes C = A - B */
3171 /* res is C, the result. C may be A and/or B (e.g., X=X-X) */
3174 /* set is the context */
3176 /* C must have space for set->digits digits. */
3177 /* ------------------------------------------------------------------ */
3178 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberSubtract(decNumber
*res
, const decNumber
*lhs
,
3179 const decNumber
*rhs
, decContext
*set
) {
3180 uInt status
=0; /* accumulator */
3182 decAddOp(res
, lhs
, rhs
, set
, DECNEG
, &status
);
3183 if (status
!=0) decStatus(res
, status
, set
);
3185 decCheckInexact(res
, set
);
3188 } /* decNumberSubtract */
3190 /* ------------------------------------------------------------------ */
3191 /* decNumberToIntegralExact -- round-to-integral-value with InExact */
3192 /* decNumberToIntegralValue -- round-to-integral-value */
3194 /* res is the result */
3195 /* rhs is input number */
3196 /* set is the context */
3198 /* res must have space for any value of rhs. */
3200 /* This implements the IEEE special operators and therefore treats */
3201 /* special values as valid. For finite numbers it returns */
3202 /* rescale(rhs, 0) if rhs->exponent is <0. */
3203 /* Otherwise the result is rhs (so no error is possible, except for */
3206 /* The context is used for rounding mode and status after sNaN, but */
3207 /* the digits setting is ignored. The Exact version will signal */
3208 /* Inexact if the result differs numerically from rhs; the other */
3209 /* never signals Inexact. */
3210 /* ------------------------------------------------------------------ */
3211 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberToIntegralExact(decNumber
*res
, const decNumber
*rhs
,
3214 decContext workset
; /* working context */
3215 uInt status
=0; /* accumulator */
3218 if (decCheckOperands(res
, DECUNUSED
, rhs
, set
)) return res
;
3221 /* handle infinities and NaNs */
3223 if (decNumberIsInfinite(rhs
)) uprv_decNumberCopy(res
, rhs
); /* an Infinity */
3224 else decNaNs(res
, rhs
, NULL
, set
, &status
); /* a NaN */
3227 /* have a finite number; no error possible (res must be big enough) */
3228 if (rhs
->exponent
>=0) return uprv_decNumberCopy(res
, rhs
);
3229 /* that was easy, but if negative exponent there is work to do... */
3230 workset
=*set
; /* clone rounding, etc. */
3231 workset
.digits
=rhs
->digits
; /* no length rounding */
3232 workset
.traps
=0; /* no traps */
3233 uprv_decNumberZero(&dn
); /* make a number with exponent 0 */
3234 uprv_decNumberQuantize(res
, rhs
, &dn
, &workset
);
3235 status
|=workset
.status
;
3237 if (status
!=0) decStatus(res
, status
, set
);
3239 } /* decNumberToIntegralExact */
3241 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberToIntegralValue(decNumber
*res
, const decNumber
*rhs
,
3243 decContext workset
=*set
; /* working context */
3244 workset
.traps
=0; /* no traps */
3245 uprv_decNumberToIntegralExact(res
, rhs
, &workset
);
3246 /* this never affects set, except for sNaNs; NaN will have been set */
3247 /* or propagated already, so no need to call decStatus */
3248 set
->status
|=workset
.status
&DEC_Invalid_operation
;
3250 } /* decNumberToIntegralValue */
3252 /* ------------------------------------------------------------------ */
3253 /* decNumberXor -- XOR two Numbers, digitwise */
3255 /* This computes C = A ^ B */
3257 /* res is C, the result. C may be A and/or B (e.g., X=X^X) */
3260 /* set is the context (used for result length and error report) */
3262 /* C must have space for set->digits digits. */
3264 /* Logical function restrictions apply (see above); a NaN is */
3265 /* returned with Invalid_operation if a restriction is violated. */
3266 /* ------------------------------------------------------------------ */
3267 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberXor(decNumber
*res
, const decNumber
*lhs
,
3268 const decNumber
*rhs
, decContext
*set
) {
3269 const Unit
*ua
, *ub
; /* -> operands */
3270 const Unit
*msua
, *msub
; /* -> operand msus */
3271 Unit
*uc
, *msuc
; /* -> result and its msu */
3272 Int msudigs
; /* digits in res msu */
3274 if (decCheckOperands(res
, lhs
, rhs
, set
)) return res
;
3277 if (lhs
->exponent
!=0 || decNumberIsSpecial(lhs
) || decNumberIsNegative(lhs
)
3278 || rhs
->exponent
!=0 || decNumberIsSpecial(rhs
) || decNumberIsNegative(rhs
)) {
3279 decStatus(res
, DEC_Invalid_operation
, set
);
3282 /* operands are valid */
3283 ua
=lhs
->lsu
; /* bottom-up */
3284 ub
=rhs
->lsu
; /* .. */
3285 uc
=res
->lsu
; /* .. */
3286 msua
=ua
+D2U(lhs
->digits
)-1; /* -> msu of lhs */
3287 msub
=ub
+D2U(rhs
->digits
)-1; /* -> msu of rhs */
3288 msuc
=uc
+D2U(set
->digits
)-1; /* -> msu of result */
3289 msudigs
=MSUDIGITS(set
->digits
); /* [faster than remainder] */
3290 for (; uc
<=msuc
; ua
++, ub
++, uc
++) { /* Unit loop */
3291 Unit a
, b
; /* extract units */
3296 *uc
=0; /* can now write back */
3297 if (a
|b
) { /* maybe 1 bits to examine */
3299 /* This loop could be unrolled and/or use BIN2BCD tables */
3300 for (i
=0; i
<DECDPUN
; i
++) {
3301 if ((a
^b
)&1) *uc
=*uc
+(Unit
)powers
[i
]; /* effect XOR */
3307 decStatus(res
, DEC_Invalid_operation
, set
);
3310 if (uc
==msuc
&& i
==msudigs
-1) break; /* just did final digit */
3314 /* [here uc-1 is the msu of the result] */
3315 res
->digits
=decGetDigits(res
->lsu
, static_cast<int32_t>(uc
-res
->lsu
));
3316 res
->exponent
=0; /* integer */
3317 res
->bits
=0; /* sign=0 */
3318 return res
; /* [no status to set] */
3319 } /* decNumberXor */
3322 /* ================================================================== */
3323 /* Utility routines */
3324 /* ================================================================== */
3326 /* ------------------------------------------------------------------ */
3327 /* decNumberClass -- return the decClass of a decNumber */
3328 /* dn -- the decNumber to test */
3329 /* set -- the context to use for Emin */
3330 /* returns the decClass enum */
3331 /* ------------------------------------------------------------------ */
3332 enum decClass
uprv_decNumberClass(const decNumber
*dn
, decContext
*set
) {
3333 if (decNumberIsSpecial(dn
)) {
3334 if (decNumberIsQNaN(dn
)) return DEC_CLASS_QNAN
;
3335 if (decNumberIsSNaN(dn
)) return DEC_CLASS_SNAN
;
3336 /* must be an infinity */
3337 if (decNumberIsNegative(dn
)) return DEC_CLASS_NEG_INF
;
3338 return DEC_CLASS_POS_INF
;
3341 if (uprv_decNumberIsNormal(dn
, set
)) { /* most common */
3342 if (decNumberIsNegative(dn
)) return DEC_CLASS_NEG_NORMAL
;
3343 return DEC_CLASS_POS_NORMAL
;
3345 /* is subnormal or zero */
3346 if (decNumberIsZero(dn
)) { /* most common */
3347 if (decNumberIsNegative(dn
)) return DEC_CLASS_NEG_ZERO
;
3348 return DEC_CLASS_POS_ZERO
;
3350 if (decNumberIsNegative(dn
)) return DEC_CLASS_NEG_SUBNORMAL
;
3351 return DEC_CLASS_POS_SUBNORMAL
;
3352 } /* decNumberClass */
3354 /* ------------------------------------------------------------------ */
3355 /* decNumberClassToString -- convert decClass to a string */
3357 /* eclass is a valid decClass */
3358 /* returns a constant string describing the class (max 13+1 chars) */
3359 /* ------------------------------------------------------------------ */
3360 const char *uprv_decNumberClassToString(enum decClass eclass
) {
3361 if (eclass
==DEC_CLASS_POS_NORMAL
) return DEC_ClassString_PN
;
3362 if (eclass
==DEC_CLASS_NEG_NORMAL
) return DEC_ClassString_NN
;
3363 if (eclass
==DEC_CLASS_POS_ZERO
) return DEC_ClassString_PZ
;
3364 if (eclass
==DEC_CLASS_NEG_ZERO
) return DEC_ClassString_NZ
;
3365 if (eclass
==DEC_CLASS_POS_SUBNORMAL
) return DEC_ClassString_PS
;
3366 if (eclass
==DEC_CLASS_NEG_SUBNORMAL
) return DEC_ClassString_NS
;
3367 if (eclass
==DEC_CLASS_POS_INF
) return DEC_ClassString_PI
;
3368 if (eclass
==DEC_CLASS_NEG_INF
) return DEC_ClassString_NI
;
3369 if (eclass
==DEC_CLASS_QNAN
) return DEC_ClassString_QN
;
3370 if (eclass
==DEC_CLASS_SNAN
) return DEC_ClassString_SN
;
3371 return DEC_ClassString_UN
; /* Unknown */
3372 } /* decNumberClassToString */
3374 /* ------------------------------------------------------------------ */
3375 /* decNumberCopy -- copy a number */
3377 /* dest is the target decNumber */
3378 /* src is the source decNumber */
3381 /* (dest==src is allowed and is a no-op) */
3382 /* All fields are updated as required. This is a utility operation, */
3383 /* so special values are unchanged and no error is possible. */
3384 /* ------------------------------------------------------------------ */
3385 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberCopy(decNumber
*dest
, const decNumber
*src
) {
3388 if (src
==NULL
) return uprv_decNumberZero(dest
);
3391 if (dest
==src
) return dest
; /* no copy required */
3393 /* Use explicit assignments here as structure assignment could copy */
3394 /* more than just the lsu (for small DECDPUN). This would not affect */
3395 /* the value of the results, but could disturb test harness spill */
3397 dest
->bits
=src
->bits
;
3398 dest
->exponent
=src
->exponent
;
3399 dest
->digits
=src
->digits
;
3400 dest
->lsu
[0]=src
->lsu
[0];
3401 if (src
->digits
>DECDPUN
) { /* more Units to come */
3402 const Unit
*smsup
, *s
; /* work */
3404 /* memcpy for the remaining Units would be safe as they cannot */
3405 /* overlap. However, this explicit loop is faster in short cases. */
3406 d
=dest
->lsu
+1; /* -> first destination */
3407 smsup
=src
->lsu
+D2U(src
->digits
); /* -> source msu+1 */
3408 for (s
=src
->lsu
+1; s
<smsup
; s
++, d
++) *d
=*s
;
3411 } /* decNumberCopy */
3413 /* ------------------------------------------------------------------ */
3414 /* decNumberCopyAbs -- quiet absolute value operator */
3416 /* This sets C = abs(A) */
3418 /* res is C, the result. C may be A */
3421 /* C must have space for set->digits digits. */
3422 /* No exception or error can occur; this is a quiet bitwise operation.*/
3423 /* See also decNumberAbs for a checking version of this. */
3424 /* ------------------------------------------------------------------ */
3425 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberCopyAbs(decNumber
*res
, const decNumber
*rhs
) {
3427 if (decCheckOperands(res
, DECUNUSED
, rhs
, DECUNCONT
)) return res
;
3429 uprv_decNumberCopy(res
, rhs
);
3430 res
->bits
&=~DECNEG
; /* turn off sign */
3432 } /* decNumberCopyAbs */
3434 /* ------------------------------------------------------------------ */
3435 /* decNumberCopyNegate -- quiet negate value operator */
3437 /* This sets C = negate(A) */
3439 /* res is C, the result. C may be A */
3442 /* C must have space for set->digits digits. */
3443 /* No exception or error can occur; this is a quiet bitwise operation.*/
3444 /* See also decNumberMinus for a checking version of this. */
3445 /* ------------------------------------------------------------------ */
3446 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberCopyNegate(decNumber
*res
, const decNumber
*rhs
) {
3448 if (decCheckOperands(res
, DECUNUSED
, rhs
, DECUNCONT
)) return res
;
3450 uprv_decNumberCopy(res
, rhs
);
3451 res
->bits
^=DECNEG
; /* invert the sign */
3453 } /* decNumberCopyNegate */
3455 /* ------------------------------------------------------------------ */
3456 /* decNumberCopySign -- quiet copy and set sign operator */
3458 /* This sets C = A with the sign of B */
3460 /* res is C, the result. C may be A */
3464 /* C must have space for set->digits digits. */
3465 /* No exception or error can occur; this is a quiet bitwise operation.*/
3466 /* ------------------------------------------------------------------ */
3467 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberCopySign(decNumber
*res
, const decNumber
*lhs
,
3468 const decNumber
*rhs
) {
3469 uByte sign
; /* rhs sign */
3471 if (decCheckOperands(res
, DECUNUSED
, rhs
, DECUNCONT
)) return res
;
3473 sign
=rhs
->bits
& DECNEG
; /* save sign bit */
3474 uprv_decNumberCopy(res
, lhs
);
3475 res
->bits
&=~DECNEG
; /* clear the sign */
3476 res
->bits
|=sign
; /* set from rhs */
3478 } /* decNumberCopySign */
3480 /* ------------------------------------------------------------------ */
3481 /* decNumberGetBCD -- get the coefficient in BCD8 */
3482 /* dn is the source decNumber */
3483 /* bcd is the uInt array that will receive dn->digits BCD bytes, */
3484 /* most-significant at offset 0 */
3487 /* bcd must have at least dn->digits bytes. No error is possible; if */
3488 /* dn is a NaN or Infinite, digits must be 1 and the coefficient 0. */
3489 /* ------------------------------------------------------------------ */
3490 U_CAPI uByte
* U_EXPORT2
uprv_decNumberGetBCD(const decNumber
*dn
, uByte
*bcd
) {
3491 uByte
*ub
=bcd
+dn
->digits
-1; /* -> lsd */
3492 const Unit
*up
=dn
->lsu
; /* Unit pointer, -> lsu */
3494 #if DECDPUN==1 /* trivial simple copy */
3495 for (; ub
>=bcd
; ub
--, up
++) *ub
=*up
;
3496 #else /* chopping needed */
3497 uInt u
=*up
; /* work */
3498 uInt cut
=DECDPUN
; /* downcounter through unit */
3499 for (; ub
>=bcd
; ub
--) {
3500 *ub
=(uByte
)(u%10
); /* [*6554 trick inhibits, here] */
3503 if (cut
>0) continue; /* more in this unit */
3510 } /* decNumberGetBCD */
3512 /* ------------------------------------------------------------------ */
3513 /* decNumberSetBCD -- set (replace) the coefficient from BCD8 */
3514 /* dn is the target decNumber */
3515 /* bcd is the uInt array that will source n BCD bytes, most- */
3516 /* significant at offset 0 */
3517 /* n is the number of digits in the source BCD array (bcd) */
3520 /* dn must have space for at least n digits. No error is possible; */
3521 /* if dn is a NaN, or Infinite, or is to become a zero, n must be 1 */
3522 /* and bcd[0] zero. */
3523 /* ------------------------------------------------------------------ */
3524 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberSetBCD(decNumber
*dn
, const uByte
*bcd
, uInt n
) {
3525 Unit
*up
=dn
->lsu
+D2U(dn
->digits
)-1; /* -> msu [target pointer] */
3526 const uByte
*ub
=bcd
; /* -> source msd */
3528 #if DECDPUN==1 /* trivial simple copy */
3529 for (; ub
<bcd
+n
; ub
++, up
--) *up
=*ub
;
3530 #else /* some assembly needed */
3531 /* calculate how many digits in msu, and hence first cut */
3532 Int cut
=MSUDIGITS(n
); /* [faster than remainder] */
3533 for (;up
>=dn
->lsu
; up
--) { /* each Unit from msu */
3534 *up
=0; /* will take <=DECDPUN digits */
3535 for (; cut
>0; ub
++, cut
--) *up
=X10(*up
)+*ub
;
3536 cut
=DECDPUN
; /* next Unit has all digits */
3539 dn
->digits
=n
; /* set digit count */
3541 } /* decNumberSetBCD */
3543 /* ------------------------------------------------------------------ */
3544 /* decNumberIsNormal -- test normality of a decNumber */
3545 /* dn is the decNumber to test */
3546 /* set is the context to use for Emin */
3547 /* returns 1 if |dn| is finite and >=Nmin, 0 otherwise */
3548 /* ------------------------------------------------------------------ */
3549 Int
uprv_decNumberIsNormal(const decNumber
*dn
, decContext
*set
) {
3550 Int ae
; /* adjusted exponent */
3552 if (decCheckOperands(DECUNRESU
, DECUNUSED
, dn
, set
)) return 0;
3555 if (decNumberIsSpecial(dn
)) return 0; /* not finite */
3556 if (decNumberIsZero(dn
)) return 0; /* not non-zero */
3558 ae
=dn
->exponent
+dn
->digits
-1; /* adjusted exponent */
3559 if (ae
<set
->emin
) return 0; /* is subnormal */
3561 } /* decNumberIsNormal */
3563 /* ------------------------------------------------------------------ */
3564 /* decNumberIsSubnormal -- test subnormality of a decNumber */
3565 /* dn is the decNumber to test */
3566 /* set is the context to use for Emin */
3567 /* returns 1 if |dn| is finite, non-zero, and <Nmin, 0 otherwise */
3568 /* ------------------------------------------------------------------ */
3569 Int
uprv_decNumberIsSubnormal(const decNumber
*dn
, decContext
*set
) {
3570 Int ae
; /* adjusted exponent */
3572 if (decCheckOperands(DECUNRESU
, DECUNUSED
, dn
, set
)) return 0;
3575 if (decNumberIsSpecial(dn
)) return 0; /* not finite */
3576 if (decNumberIsZero(dn
)) return 0; /* not non-zero */
3578 ae
=dn
->exponent
+dn
->digits
-1; /* adjusted exponent */
3579 if (ae
<set
->emin
) return 1; /* is subnormal */
3581 } /* decNumberIsSubnormal */
3583 /* ------------------------------------------------------------------ */
3584 /* decNumberTrim -- remove insignificant zeros */
3586 /* dn is the number to trim */
3589 /* All fields are updated as required. This is a utility operation, */
3590 /* so special values are unchanged and no error is possible. The */
3591 /* zeros are removed unconditionally. */
3592 /* ------------------------------------------------------------------ */
3593 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberTrim(decNumber
*dn
) {
3594 Int dropped
; /* work */
3595 decContext set
; /* .. */
3597 if (decCheckOperands(DECUNRESU
, DECUNUSED
, dn
, DECUNCONT
)) return dn
;
3599 uprv_decContextDefault(&set
, DEC_INIT_BASE
); /* clamp=0 */
3600 return decTrim(dn
, &set
, 0, 1, &dropped
);
3601 } /* decNumberTrim */
3603 /* ------------------------------------------------------------------ */
3604 /* decNumberVersion -- return the name and version of this module */
3606 /* No error is possible. */
3607 /* ------------------------------------------------------------------ */
3608 const char * uprv_decNumberVersion(void) {
3610 } /* decNumberVersion */
3612 /* ------------------------------------------------------------------ */
3613 /* decNumberZero -- set a number to 0 */
3615 /* dn is the number to set, with space for one digit */
3618 /* No error is possible. */
3619 /* ------------------------------------------------------------------ */
3620 /* Memset is not used as it is much slower in some environments. */
3621 U_CAPI decNumber
* U_EXPORT2
uprv_decNumberZero(decNumber
*dn
) {
3624 if (decCheckOperands(dn
, DECUNUSED
, DECUNUSED
, DECUNCONT
)) return dn
;
3632 } /* decNumberZero */
3634 /* ================================================================== */
3635 /* Local routines */
3636 /* ================================================================== */
3638 /* ------------------------------------------------------------------ */
3639 /* decToString -- lay out a number into a string */
3641 /* dn is the number to lay out */
3642 /* string is where to lay out the number */
3643 /* eng is 1 if Engineering, 0 if Scientific */
3645 /* string must be at least dn->digits+14 characters long */
3646 /* No error is possible. */
3648 /* Note that this routine can generate a -0 or 0.000. These are */
3649 /* never generated in subset to-number or arithmetic, but can occur */
3650 /* in non-subset arithmetic (e.g., -1*0 or 1.234-1.234). */
3651 /* ------------------------------------------------------------------ */
3652 /* If DECCHECK is enabled the string "?" is returned if a number is */
3654 static void decToString(const decNumber
*dn
, char *string
, Flag eng
) {
3655 Int exp
=dn
->exponent
; /* local copy */
3656 Int e
; /* E-part value */
3657 Int pre
; /* digits before the '.' */
3658 Int cut
; /* for counting digits in a Unit */
3659 char *c
=string
; /* work [output pointer] */
3660 const Unit
*up
=dn
->lsu
+D2U(dn
->digits
)-1; /* -> msu [input pointer] */
3661 uInt u
, pow
; /* work */
3664 if (decCheckOperands(DECUNRESU
, dn
, DECUNUSED
, DECUNCONT
)) {
3665 strcpy(string
, "?");
3669 if (decNumberIsNegative(dn
)) { /* Negatives get a minus */
3673 if (dn
->bits
&DECSPECIAL
) { /* Is a special value */
3674 if (decNumberIsInfinite(dn
)) {
3676 strcpy(c
+3, "inity");
3679 if (dn
->bits
&DECSNAN
) { /* signalling NaN */
3684 c
+=3; /* step past */
3685 /* if not a clean non-zero coefficient, that's all there is in a */
3687 if (exp
!=0 || (*dn
->lsu
==0 && dn
->digits
==1)) return;
3688 /* [drop through to add integer] */
3691 /* calculate how many digits in msu, and hence first cut */
3692 cut
=MSUDIGITS(dn
->digits
); /* [faster than remainder] */
3693 cut
--; /* power of ten for digit */
3695 if (exp
==0) { /* simple integer [common fastpath] */
3696 for (;up
>=dn
->lsu
; up
--) { /* each Unit from msu */
3697 u
=*up
; /* contains DECDPUN digits to lay out */
3698 for (; cut
>=0; c
++, cut
--) TODIGIT(u
, cut
, c
, pow
);
3699 cut
=DECDPUN
-1; /* next Unit has all digits */
3701 *c
='\0'; /* terminate the string */
3704 /* non-0 exponent -- assume plain form */
3705 pre
=dn
->digits
+exp
; /* digits before '.' */
3707 if ((exp
>0) || (pre
<-5)) { /* need exponential form */
3708 e
=exp
+dn
->digits
-1; /* calculate E value */
3709 pre
=1; /* assume one digit before '.' */
3710 if (eng
&& (e
!=0)) { /* engineering: may need to adjust */
3711 Int adj
; /* adjustment */
3712 /* The C remainder operator is undefined for negative numbers, so */
3713 /* a positive remainder calculation must be used here */
3716 if (adj
!=0) adj
=3-adj
;
3722 /* if dealing with zero still produce an exponent which is a */
3723 /* multiple of three, as expected, but there will only be the */
3724 /* one zero before the E, still. Otherwise note the padding. */
3725 if (!ISZERO(dn
)) pre
+=adj
;
3726 else { /* is zero */
3727 if (adj
!=0) { /* 0.00Esnn needed */
3733 } /* need exponent */
3735 /* lay out the digits of the coefficient, adding 0s and . as needed */
3737 if (pre
>0) { /* xxx.xxx or xx00 (engineering) form */
3739 for (; pre
>0; pre
--, c
++, cut
--) {
3740 if (cut
<0) { /* need new Unit */
3741 if (up
==dn
->lsu
) break; /* out of input digits (pre>digits) */
3746 TODIGIT(u
, cut
, c
, pow
);
3748 if (n
<dn
->digits
) { /* more to come, after '.' */
3750 for (;; c
++, cut
--) {
3751 if (cut
<0) { /* need new Unit */
3752 if (up
==dn
->lsu
) break; /* out of input digits */
3757 TODIGIT(u
, cut
, c
, pow
);
3760 else for (; pre
>0; pre
--, c
++) *c
='0'; /* 0 padding (for engineering) needed */
3762 else { /* 0.xxx or 0.000xxx form */
3765 for (; pre
<0; pre
++, c
++) *c
='0'; /* add any 0's after '.' */
3766 for (; ; c
++, cut
--) {
3767 if (cut
<0) { /* need new Unit */
3768 if (up
==dn
->lsu
) break; /* out of input digits */
3773 TODIGIT(u
, cut
, c
, pow
);
3777 /* Finally add the E-part, if needed. It will never be 0, has a
3778 base maximum and minimum of +999999999 through -999999999, but
3779 could range down to -1999999998 for anormal numbers */
3781 Flag had
=0; /* 1=had non-zero */
3783 *c
='+'; c
++; /* assume positive */
3786 *(c
-1)='-'; /* oops, need - */
3787 u
=-e
; /* uInt, please */
3789 /* lay out the exponent [_itoa or equivalent is not ANSI C] */
3790 for (cut
=9; cut
>=0; cut
--) {
3791 TODIGIT(u
, cut
, c
, pow
);
3792 if (*c
=='0' && !had
) continue; /* skip leading zeros */
3793 had
=1; /* had non-0 */
3794 c
++; /* step for next */
3797 *c
='\0'; /* terminate the string (all paths) */
3801 /* ------------------------------------------------------------------ */
3802 /* decAddOp -- add/subtract operation */
3804 /* This computes C = A + B */
3806 /* res is C, the result. C may be A and/or B (e.g., X=X+X) */
3809 /* set is the context */
3810 /* negate is DECNEG if rhs should be negated, or 0 otherwise */
3811 /* status accumulates status for the caller */
3813 /* C must have space for set->digits digits. */
3814 /* Inexact in status must be 0 for correct Exact zero sign in result */
3815 /* ------------------------------------------------------------------ */
3816 /* If possible, the coefficient is calculated directly into C. */
3818 /* -- a digits+1 calculation is needed because the numbers are */
3819 /* unaligned and span more than set->digits digits */
3820 /* -- a carry to digits+1 digits looks possible */
3821 /* -- C is the same as A or B, and the result would destructively */
3822 /* overlap the A or B coefficient */
3823 /* then the result must be calculated into a temporary buffer. In */
3824 /* this case a local (stack) buffer is used if possible, and only if */
3825 /* too long for that does malloc become the final resort. */
3827 /* Misalignment is handled as follows: */
3828 /* Apad: (AExp>BExp) Swap operands and proceed as for BExp>AExp. */
3829 /* BPad: Apply the padding by a combination of shifting (whole */
3830 /* units) and multiplication (part units). */
3832 /* Addition, especially x=x+1, is speed-critical. */
3833 /* The static buffer is larger than might be expected to allow for */
3834 /* calls from higher-level funtions (notable exp). */
3835 /* ------------------------------------------------------------------ */
3836 static decNumber
* decAddOp(decNumber
*res
, const decNumber
*lhs
,
3837 const decNumber
*rhs
, decContext
*set
,
3838 uByte negate
, uInt
*status
) {
3840 decNumber
*alloclhs
=NULL
; /* non-NULL if rounded lhs allocated */
3841 decNumber
*allocrhs
=NULL
; /* .., rhs */
3843 Int rhsshift
; /* working shift (in Units) */
3844 Int maxdigits
; /* longest logical length */
3845 Int mult
; /* multiplier */
3846 Int residue
; /* rounding accumulator */
3847 uByte bits
; /* result bits */
3848 Flag diffsign
; /* non-0 if arguments have different sign */
3849 Unit
*acc
; /* accumulator for result */
3850 Unit accbuff
[SD2U(DECBUFFER
*2+20)]; /* local buffer [*2+20 reduces many */
3851 /* allocations when called from */
3852 /* other operations, notable exp] */
3853 Unit
*allocacc
=NULL
; /* -> allocated acc buffer, iff allocated */
3854 Int reqdigits
=set
->digits
; /* local copy; requested DIGITS */
3855 Int padding
; /* work */
3858 if (decCheckOperands(res
, lhs
, rhs
, set
)) return res
;
3861 do { /* protect allocated storage */
3863 if (!set
->extended
) {
3864 /* reduce operands and set lostDigits status, as needed */
3865 if (lhs
->digits
>reqdigits
) {
3866 alloclhs
=decRoundOperand(lhs
, set
, status
);
3867 if (alloclhs
==NULL
) break;
3870 if (rhs
->digits
>reqdigits
) {
3871 allocrhs
=decRoundOperand(rhs
, set
, status
);
3872 if (allocrhs
==NULL
) break;
3877 /* [following code does not require input rounding] */
3879 /* note whether signs differ [used all paths] */
3880 diffsign
=(Flag
)((lhs
->bits
^rhs
->bits
^negate
)&DECNEG
);
3882 /* handle infinities and NaNs */
3883 if (SPECIALARGS
) { /* a special bit set */
3884 if (SPECIALARGS
& (DECSNAN
| DECNAN
)) /* a NaN */
3885 decNaNs(res
, lhs
, rhs
, set
, status
);
3886 else { /* one or two infinities */
3887 if (decNumberIsInfinite(lhs
)) { /* LHS is infinity */
3888 /* two infinities with different signs is invalid */
3889 if (decNumberIsInfinite(rhs
) && diffsign
) {
3890 *status
|=DEC_Invalid_operation
;
3893 bits
=lhs
->bits
& DECNEG
; /* get sign from LHS */
3895 else bits
=(rhs
->bits
^negate
) & DECNEG
;/* RHS must be Infinity */
3897 uprv_decNumberZero(res
);
3898 res
->bits
=bits
; /* set +/- infinity */
3903 /* Quick exit for add 0s; return the non-0, modified as need be */
3905 Int adjust
; /* work */
3906 Int lexp
=lhs
->exponent
; /* save in case LHS==RES */
3907 bits
=lhs
->bits
; /* .. */
3908 residue
=0; /* clear accumulator */
3909 decCopyFit(res
, rhs
, set
, &residue
, status
); /* copy (as needed) */
3910 res
->bits
^=negate
; /* flip if rhs was negated */
3912 if (set
->extended
) { /* exponents on zeros count */
3914 /* exponent will be the lower of the two */
3915 adjust
=lexp
-res
->exponent
; /* adjustment needed [if -ve] */
3916 if (ISZERO(res
)) { /* both 0: special IEEE 754 rules */
3917 if (adjust
<0) res
->exponent
=lexp
; /* set exponent */
3918 /* 0-0 gives +0 unless rounding to -infinity, and -0-0 gives -0 */
3920 if (set
->round
!=DEC_ROUND_FLOOR
) res
->bits
=0;
3921 else res
->bits
=DECNEG
; /* preserve 0 sign */
3924 else { /* non-0 res */
3925 if (adjust
<0) { /* 0-padding needed */
3926 if ((res
->digits
-adjust
)>set
->digits
) {
3927 adjust
=res
->digits
-set
->digits
; /* to fit exactly */
3928 *status
|=DEC_Rounded
; /* [but exact] */
3930 res
->digits
=decShiftToMost(res
->lsu
, res
->digits
, -adjust
);
3931 res
->exponent
+=adjust
; /* set the exponent. */
3937 decFinish(res
, set
, &residue
, status
); /* clean and finalize */
3940 if (ISZERO(rhs
)) { /* [lhs is non-zero] */
3941 Int adjust
; /* work */
3942 Int rexp
=rhs
->exponent
; /* save in case RHS==RES */
3943 bits
=rhs
->bits
; /* be clean */
3944 residue
=0; /* clear accumulator */
3945 decCopyFit(res
, lhs
, set
, &residue
, status
); /* copy (as needed) */
3947 if (set
->extended
) { /* exponents on zeros count */
3949 /* exponent will be the lower of the two */
3950 /* [0-0 case handled above] */
3951 adjust
=rexp
-res
->exponent
; /* adjustment needed [if -ve] */
3952 if (adjust
<0) { /* 0-padding needed */
3953 if ((res
->digits
-adjust
)>set
->digits
) {
3954 adjust
=res
->digits
-set
->digits
; /* to fit exactly */
3955 *status
|=DEC_Rounded
; /* [but exact] */
3957 res
->digits
=decShiftToMost(res
->lsu
, res
->digits
, -adjust
);
3958 res
->exponent
+=adjust
; /* set the exponent. */
3963 decFinish(res
, set
, &residue
, status
); /* clean and finalize */
3966 /* [NB: both fastpath and mainpath code below assume these cases */
3967 /* (notably 0-0) have already been handled] */
3969 /* calculate the padding needed to align the operands */
3970 padding
=rhs
->exponent
-lhs
->exponent
;
3972 /* Fastpath cases where the numbers are aligned and normal, the RHS */
3973 /* is all in one unit, no operand rounding is needed, and no carry, */
3974 /* lengthening, or borrow is needed */
3976 && rhs
->digits
<=DECDPUN
3977 && rhs
->exponent
>=set
->emin
/* [some normals drop through] */
3978 && rhs
->exponent
<=set
->emax
-set
->digits
+1 /* [could clamp] */
3979 && rhs
->digits
<=reqdigits
3980 && lhs
->digits
<=reqdigits
) {
3981 Int partial
=*lhs
->lsu
;
3982 if (!diffsign
) { /* adding */
3984 if ((partial
<=DECDPUNMAX
) /* result fits in unit */
3985 && (lhs
->digits
>=DECDPUN
|| /* .. and no digits-count change */
3986 partial
<(Int
)powers
[lhs
->digits
])) { /* .. */
3987 if (res
!=lhs
) uprv_decNumberCopy(res
, lhs
); /* not in place */
3988 *res
->lsu
=(Unit
)partial
; /* [copy could have overwritten RHS] */
3991 /* else drop out for careful add */
3993 else { /* signs differ */
3995 if (partial
>0) { /* no borrow needed, and non-0 result */
3996 if (res
!=lhs
) uprv_decNumberCopy(res
, lhs
); /* not in place */
3997 *res
->lsu
=(Unit
)partial
;
3998 /* this could have reduced digits [but result>0] */
3999 res
->digits
=decGetDigits(res
->lsu
, D2U(res
->digits
));
4002 /* else drop out for careful subtract */
4006 /* Now align (pad) the lhs or rhs so they can be added or */
4007 /* subtracted, as necessary. If one number is much larger than */
4008 /* the other (that is, if in plain form there is a least one */
4009 /* digit between the lowest digit of one and the highest of the */
4010 /* other) padding with up to DIGITS-1 trailing zeros may be */
4011 /* needed; then apply rounding (as exotic rounding modes may be */
4012 /* affected by the residue). */
4013 rhsshift
=0; /* rhs shift to left (padding) in Units */
4014 bits
=lhs
->bits
; /* assume sign is that of LHS */
4015 mult
=1; /* likely multiplier */
4017 /* [if padding==0 the operands are aligned; no padding is needed] */
4019 /* some padding needed; always pad the RHS, as any required */
4020 /* padding can then be effected by a simple combination of */
4021 /* shifts and a multiply */
4023 if (padding
<0) { /* LHS needs the padding */
4025 padding
=-padding
; /* will be +ve */
4026 bits
=(uByte
)(rhs
->bits
^negate
); /* assumed sign is now that of RHS */
4027 t
=lhs
; lhs
=rhs
; rhs
=t
;
4031 /* If, after pad, rhs would be longer than lhs by digits+1 or */
4032 /* more then lhs cannot affect the answer, except as a residue, */
4033 /* so only need to pad up to a length of DIGITS+1. */
4034 if (rhs
->digits
+padding
> lhs
->digits
+reqdigits
+1) {
4035 /* The RHS is sufficient */
4036 /* for residue use the relative sign indication... */
4037 Int shift
=reqdigits
-rhs
->digits
; /* left shift needed */
4038 residue
=1; /* residue for rounding */
4039 if (diffsign
) residue
=-residue
; /* signs differ */
4040 /* copy, shortening if necessary */
4041 decCopyFit(res
, rhs
, set
, &residue
, status
);
4042 /* if it was already shorter, then need to pad with zeros */
4044 res
->digits
=decShiftToMost(res
->lsu
, res
->digits
, shift
);
4045 res
->exponent
-=shift
; /* adjust the exponent. */
4047 /* flip the result sign if unswapped and rhs was negated */
4048 if (!swapped
) res
->bits
^=negate
;
4049 decFinish(res
, set
, &residue
, status
); /* done */
4052 /* LHS digits may affect result */
4053 rhsshift
=D2U(padding
+1)-1; /* this much by Unit shift .. */
4054 mult
=powers
[padding
-(rhsshift
*DECDPUN
)]; /* .. this by multiplication */
4055 } /* padding needed */
4057 if (diffsign
) mult
=-mult
; /* signs differ */
4059 /* determine the longer operand */
4060 maxdigits
=rhs
->digits
+padding
; /* virtual length of RHS */
4061 if (lhs
->digits
>maxdigits
) maxdigits
=lhs
->digits
;
4063 /* Decide on the result buffer to use; if possible place directly */
4065 acc
=res
->lsu
; /* assume add direct to result */
4066 /* If destructive overlap, or the number is too long, or a carry or */
4067 /* borrow to DIGITS+1 might be possible, a buffer must be used. */
4068 /* [Might be worth more sophisticated tests when maxdigits==reqdigits] */
4069 if ((maxdigits
>=reqdigits
) /* is, or could be, too large */
4070 || (res
==rhs
&& rhsshift
>0)) { /* destructive overlap */
4071 /* buffer needed, choose it; units for maxdigits digits will be */
4072 /* needed, +1 Unit for carry or borrow */
4073 Int need
=D2U(maxdigits
)+1;
4074 acc
=accbuff
; /* assume use local buffer */
4075 if (need
*sizeof(Unit
)>sizeof(accbuff
)) {
4076 /* printf("malloc add %ld %ld\n", need, sizeof(accbuff)); */
4077 allocacc
=(Unit
*)malloc(need
*sizeof(Unit
));
4078 if (allocacc
==NULL
) { /* hopeless -- abandon */
4079 *status
|=DEC_Insufficient_storage
;
4085 res
->bits
=(uByte
)(bits
&DECNEG
); /* it's now safe to overwrite.. */
4086 res
->exponent
=lhs
->exponent
; /* .. operands (even if aliased) */
4089 decDumpAr('A', lhs
->lsu
, D2U(lhs
->digits
));
4090 decDumpAr('B', rhs
->lsu
, D2U(rhs
->digits
));
4091 printf(" :h: %ld %ld\n", rhsshift
, mult
);
4094 /* add [A+B*m] or subtract [A+B*(-m)] */
4095 U_ASSERT(rhs
->digits
> 0);
4096 U_ASSERT(lhs
->digits
> 0);
4097 res
->digits
=decUnitAddSub(lhs
->lsu
, D2U(lhs
->digits
),
4098 rhs
->lsu
, D2U(rhs
->digits
),
4099 rhsshift
, acc
, mult
)
4100 *DECDPUN
; /* [units -> digits] */
4101 if (res
->digits
<0) { /* borrowed... */
4102 res
->digits
=-res
->digits
;
4103 res
->bits
^=DECNEG
; /* flip the sign */
4106 decDumpAr('+', acc
, D2U(res
->digits
));
4109 /* If a buffer was used the result must be copied back, possibly */
4110 /* shortening. (If no buffer was used then the result must have */
4111 /* fit, so can't need rounding and residue must be 0.) */
4112 residue
=0; /* clear accumulator */
4113 if (acc
!=res
->lsu
) {
4115 if (set
->extended
) { /* round from first significant digit */
4117 /* remove leading zeros that were added due to rounding up to */
4118 /* integral Units -- before the test for rounding. */
4119 if (res
->digits
>reqdigits
)
4120 res
->digits
=decGetDigits(acc
, D2U(res
->digits
));
4121 decSetCoeff(res
, set
, acc
, res
->digits
, &residue
, status
);
4124 else { /* subset arithmetic rounds from original significant digit */
4125 /* May have an underestimate. This only occurs when both */
4126 /* numbers fit in DECDPUN digits and are padding with a */
4127 /* negative multiple (-10, -100...) and the top digit(s) become */
4128 /* 0. (This only matters when using X3.274 rules where the */
4129 /* leading zero could be included in the rounding.) */
4130 if (res
->digits
<maxdigits
) {
4131 *(acc
+D2U(res
->digits
))=0; /* ensure leading 0 is there */
4132 res
->digits
=maxdigits
;
4135 /* remove leading zeros that added due to rounding up to */
4136 /* integral Units (but only those in excess of the original */
4137 /* maxdigits length, unless extended) before test for rounding. */
4138 if (res
->digits
>reqdigits
) {
4139 res
->digits
=decGetDigits(acc
, D2U(res
->digits
));
4140 if (res
->digits
<maxdigits
) res
->digits
=maxdigits
;
4143 decSetCoeff(res
, set
, acc
, res
->digits
, &residue
, status
);
4144 /* Now apply rounding if needed before removing leading zeros. */
4145 /* This is safe because subnormals are not a possibility */
4147 decApplyRound(res
, set
, residue
, status
);
4148 residue
=0; /* did what needed to be done */
4154 /* strip leading zeros [these were left on in case of subset subtract] */
4155 res
->digits
=decGetDigits(res
->lsu
, D2U(res
->digits
));
4157 /* apply checks and rounding */
4158 decFinish(res
, set
, &residue
, status
);
4160 /* "When the sum of two operands with opposite signs is exactly */
4161 /* zero, the sign of that sum shall be '+' in all rounding modes */
4162 /* except round toward -Infinity, in which mode that sign shall be */
4163 /* '-'." [Subset zeros also never have '-', set by decFinish.] */
4164 if (ISZERO(res
) && diffsign
4168 && (*status
&DEC_Inexact
)==0) {
4169 if (set
->round
==DEC_ROUND_FLOOR
) res
->bits
|=DECNEG
; /* sign - */
4170 else res
->bits
&=~DECNEG
; /* sign + */
4172 } while(0); /* end protected */
4174 if (allocacc
!=NULL
) free(allocacc
); /* drop any storage used */
4176 if (allocrhs
!=NULL
) free(allocrhs
); /* .. */
4177 if (alloclhs
!=NULL
) free(alloclhs
); /* .. */
4182 /* ------------------------------------------------------------------ */
4183 /* decDivideOp -- division operation */
4185 /* This routine performs the calculations for all four division */
4186 /* operators (divide, divideInteger, remainder, remainderNear). */
4190 /* res is C, the result. C may be A and/or B (e.g., X=X/X) */
4193 /* set is the context */
4194 /* op is DIVIDE, DIVIDEINT, REMAINDER, or REMNEAR respectively. */
4195 /* status is the usual accumulator */
4197 /* C must have space for set->digits digits. */
4199 /* ------------------------------------------------------------------ */
4200 /* The underlying algorithm of this routine is the same as in the */
4201 /* 1981 S/370 implementation, that is, non-restoring long division */
4202 /* with bi-unit (rather than bi-digit) estimation for each unit */
4203 /* multiplier. In this pseudocode overview, complications for the */
4204 /* Remainder operators and division residues for exact rounding are */
4205 /* omitted for clarity. */
4207 /* Prepare operands and handle special values */
4208 /* Test for x/0 and then 0/x */
4209 /* Exp =Exp1 - Exp2 */
4210 /* Exp =Exp +len(var1) -len(var2) */
4211 /* Sign=Sign1 * Sign2 */
4212 /* Pad accumulator (Var1) to double-length with 0's (pad1) */
4213 /* Pad Var2 to same length as Var1 */
4214 /* msu2pair/plus=1st 2 or 1 units of var2, +1 to allow for round */
4216 /* Do until (have=digits+1 OR residue=0) */
4217 /* if exp<0 then if integer divide/residue then leave */
4220 /* compare numbers */
4221 /* if <0 then leave inner_loop */
4222 /* if =0 then (* quick exit without subtract *) do */
4223 /* this_unit=this_unit+1; output this_unit */
4224 /* leave outer_loop; end */
4225 /* Compare lengths of numbers (mantissae): */
4226 /* If same then tops2=msu2pair -- {units 1&2 of var2} */
4227 /* else tops2=msu2plus -- {0, unit 1 of var2} */
4228 /* tops1=first_unit_of_Var1*10**DECDPUN +second_unit_of_var1 */
4229 /* mult=tops1/tops2 -- Good and safe guess at divisor */
4230 /* if mult=0 then mult=1 */
4231 /* this_unit=this_unit+mult */
4233 /* end inner_loop */
4234 /* if have\=0 | this_unit\=0 then do */
4235 /* output this_unit */
4236 /* have=have+1; end */
4239 /* end outer_loop */
4240 /* exp=exp+1 -- set the proper exponent */
4241 /* if have=0 then generate answer=0 */
4242 /* Return (Result is defined by Var1) */
4244 /* ------------------------------------------------------------------ */
4245 /* Two working buffers are needed during the division; one (digits+ */
4246 /* 1) to accumulate the result, and the other (up to 2*digits+1) for */
4247 /* long subtractions. These are acc and var1 respectively. */
4248 /* var1 is a copy of the lhs coefficient, var2 is the rhs coefficient.*/
4249 /* The static buffers may be larger than might be expected to allow */
4250 /* for calls from higher-level funtions (notable exp). */
4251 /* ------------------------------------------------------------------ */
4252 static decNumber
* decDivideOp(decNumber
*res
,
4253 const decNumber
*lhs
, const decNumber
*rhs
,
4254 decContext
*set
, Flag op
, uInt
*status
) {
4256 decNumber
*alloclhs
=NULL
; /* non-NULL if rounded lhs allocated */
4257 decNumber
*allocrhs
=NULL
; /* .., rhs */
4259 Unit accbuff
[SD2U(DECBUFFER
+DECDPUN
+10)]; /* local buffer */
4260 Unit
*acc
=accbuff
; /* -> accumulator array for result */
4261 Unit
*allocacc
=NULL
; /* -> allocated buffer, iff allocated */
4262 Unit
*accnext
; /* -> where next digit will go */
4263 Int acclength
; /* length of acc needed [Units] */
4264 Int accunits
; /* count of units accumulated */
4265 Int accdigits
; /* count of digits accumulated */
4267 Unit varbuff
[SD2U(DECBUFFER
*2+DECDPUN
)]; /* buffer for var1 */
4268 Unit
*var1
=varbuff
; /* -> var1 array for long subtraction */
4269 Unit
*varalloc
=NULL
; /* -> allocated buffer, iff used */
4270 Unit
*msu1
; /* -> msu of var1 */
4272 const Unit
*var2
; /* -> var2 array */
4273 const Unit
*msu2
; /* -> msu of var2 */
4274 Int msu2plus
; /* msu2 plus one [does not vary] */
4275 eInt msu2pair
; /* msu2 pair plus one [does not vary] */
4277 Int var1units
, var2units
; /* actual lengths */
4278 Int var2ulen
; /* logical length (units) */
4279 Int var1initpad
=0; /* var1 initial padding (digits) */
4280 Int maxdigits
; /* longest LHS or required acc length */
4281 Int mult
; /* multiplier for subtraction */
4282 Unit thisunit
; /* current unit being accumulated */
4283 Int residue
; /* for rounding */
4284 Int reqdigits
=set
->digits
; /* requested DIGITS */
4285 Int exponent
; /* working exponent */
4286 Int maxexponent
=0; /* DIVIDE maximum exponent if unrounded */
4287 uByte bits
; /* working sign */
4288 Unit
*target
; /* work */
4289 const Unit
*source
; /* .. */
4290 uInt
const *pow
; /* .. */
4291 Int shift
, cut
; /* .. */
4293 Int dropped
; /* work */
4297 if (decCheckOperands(res
, lhs
, rhs
, set
)) return res
;
4300 do { /* protect allocated storage */
4302 if (!set
->extended
) {
4303 /* reduce operands and set lostDigits status, as needed */
4304 if (lhs
->digits
>reqdigits
) {
4305 alloclhs
=decRoundOperand(lhs
, set
, status
);
4306 if (alloclhs
==NULL
) break;
4309 if (rhs
->digits
>reqdigits
) {
4310 allocrhs
=decRoundOperand(rhs
, set
, status
);
4311 if (allocrhs
==NULL
) break;
4316 /* [following code does not require input rounding] */
4318 bits
=(lhs
->bits
^rhs
->bits
)&DECNEG
; /* assumed sign for divisions */
4320 /* handle infinities and NaNs */
4321 if (SPECIALARGS
) { /* a special bit set */
4322 if (SPECIALARGS
& (DECSNAN
| DECNAN
)) { /* one or two NaNs */
4323 decNaNs(res
, lhs
, rhs
, set
, status
);
4326 /* one or two infinities */
4327 if (decNumberIsInfinite(lhs
)) { /* LHS (dividend) is infinite */
4328 if (decNumberIsInfinite(rhs
) || /* two infinities are invalid .. */
4329 op
& (REMAINDER
| REMNEAR
)) { /* as is remainder of infinity */
4330 *status
|=DEC_Invalid_operation
;
4333 /* [Note that infinity/0 raises no exceptions] */
4334 uprv_decNumberZero(res
);
4335 res
->bits
=bits
|DECINF
; /* set +/- infinity */
4338 else { /* RHS (divisor) is infinite */
4340 if (op
&(REMAINDER
|REMNEAR
)) {
4341 /* result is [finished clone of] lhs */
4342 decCopyFit(res
, lhs
, set
, &residue
, status
);
4344 else { /* a division */
4345 uprv_decNumberZero(res
);
4346 res
->bits
=bits
; /* set +/- zero */
4347 /* for DIVIDEINT the exponent is always 0. For DIVIDE, result */
4348 /* is a 0 with infinitely negative exponent, clamped to minimum */
4350 res
->exponent
=set
->emin
-set
->digits
+1;
4351 *status
|=DEC_Clamped
;
4354 decFinish(res
, set
, &residue
, status
);
4359 /* handle 0 rhs (x/0) */
4360 if (ISZERO(rhs
)) { /* x/0 is always exceptional */
4362 uprv_decNumberZero(res
); /* [after lhs test] */
4363 *status
|=DEC_Division_undefined
;/* 0/0 will become NaN */
4366 uprv_decNumberZero(res
);
4367 if (op
&(REMAINDER
|REMNEAR
)) *status
|=DEC_Invalid_operation
;
4369 *status
|=DEC_Division_by_zero
; /* x/0 */
4370 res
->bits
=bits
|DECINF
; /* .. is +/- Infinity */
4375 /* handle 0 lhs (0/x) */
4376 if (ISZERO(lhs
)) { /* 0/x [x!=0] */
4378 if (!set
->extended
) uprv_decNumberZero(res
);
4383 exponent
=lhs
->exponent
-rhs
->exponent
; /* ideal exponent */
4384 uprv_decNumberCopy(res
, lhs
); /* [zeros always fit] */
4385 res
->bits
=bits
; /* sign as computed */
4386 res
->exponent
=exponent
; /* exponent, too */
4387 decFinalize(res
, set
, &residue
, status
); /* check exponent */
4389 else if (op
&DIVIDEINT
) {
4390 uprv_decNumberZero(res
); /* integer 0 */
4391 res
->bits
=bits
; /* sign as computed */
4393 else { /* a remainder */
4394 exponent
=rhs
->exponent
; /* [save in case overwrite] */
4395 uprv_decNumberCopy(res
, lhs
); /* [zeros always fit] */
4396 if (exponent
<res
->exponent
) res
->exponent
=exponent
; /* use lower */
4403 /* Precalculate exponent. This starts off adjusted (and hence fits */
4404 /* in 31 bits) and becomes the usual unadjusted exponent as the */
4405 /* division proceeds. The order of evaluation is important, here, */
4406 /* to avoid wrap. */
4407 exponent
=(lhs
->exponent
+lhs
->digits
)-(rhs
->exponent
+rhs
->digits
);
4409 /* If the working exponent is -ve, then some quick exits are */
4410 /* possible because the quotient is known to be <1 */
4411 /* [for REMNEAR, it needs to be < -1, as -0.5 could need work] */
4412 if (exponent
<0 && !(op
==DIVIDE
)) {
4414 uprv_decNumberZero(res
); /* integer part is 0 */
4418 res
->bits
=bits
; /* set +/- zero */
4420 /* fastpath remainders so long as the lhs has the smaller */
4421 /* (or equal) exponent */
4422 if (lhs
->exponent
<=rhs
->exponent
) {
4423 if (op
&REMAINDER
|| exponent
<-1) {
4424 /* It is REMAINDER or safe REMNEAR; result is [finished */
4425 /* clone of] lhs (r = x - 0*y) */
4427 decCopyFit(res
, lhs
, set
, &residue
, status
);
4428 decFinish(res
, set
, &residue
, status
);
4431 /* [unsafe REMNEAR drops through] */
4435 /* Long (slow) division is needed; roll up the sleeves... */
4437 /* The accumulator will hold the quotient of the division. */
4438 /* If it needs to be too long for stack storage, then allocate. */
4439 acclength
=D2U(reqdigits
+DECDPUN
); /* in Units */
4440 if (acclength
*sizeof(Unit
)>sizeof(accbuff
)) {
4441 /* printf("malloc dvacc %ld units\n", acclength); */
4442 allocacc
=(Unit
*)malloc(acclength
*sizeof(Unit
));
4443 if (allocacc
==NULL
) { /* hopeless -- abandon */
4444 *status
|=DEC_Insufficient_storage
;
4446 acc
=allocacc
; /* use the allocated space */
4449 /* var1 is the padded LHS ready for subtractions. */
4450 /* If it needs to be too long for stack storage, then allocate. */
4451 /* The maximum units needed for var1 (long subtraction) is: */
4453 /* (rhs->digits+reqdigits-1) -- to allow full slide to right */
4454 /* or (lhs->digits) -- to allow for long lhs */
4455 /* whichever is larger */
4456 /* +1 -- for rounding of slide to right */
4457 /* +1 -- for leading 0s */
4458 /* +1 -- for pre-adjust if a remainder or DIVIDEINT */
4459 /* [Note: unused units do not participate in decUnitAddSub data] */
4460 maxdigits
=rhs
->digits
+reqdigits
-1;
4461 if (lhs
->digits
>maxdigits
) maxdigits
=lhs
->digits
;
4462 var1units
=D2U(maxdigits
)+2;
4463 /* allocate a guard unit above msu1 for REMAINDERNEAR */
4464 if (!(op
&DIVIDE
)) var1units
++;
4465 if ((var1units
+1)*sizeof(Unit
)>sizeof(varbuff
)) {
4466 /* printf("malloc dvvar %ld units\n", var1units+1); */
4467 varalloc
=(Unit
*)malloc((var1units
+1)*sizeof(Unit
));
4468 if (varalloc
==NULL
) { /* hopeless -- abandon */
4469 *status
|=DEC_Insufficient_storage
;
4471 var1
=varalloc
; /* use the allocated space */
4474 /* Extend the lhs and rhs to full long subtraction length. The lhs */
4475 /* is truly extended into the var1 buffer, with 0 padding, so a */
4476 /* subtract in place is always possible. The rhs (var2) has */
4477 /* virtual padding (implemented by decUnitAddSub). */
4478 /* One guard unit was allocated above msu1 for rem=rem+rem in */
4479 /* REMAINDERNEAR. */
4480 msu1
=var1
+var1units
-1; /* msu of var1 */
4481 source
=lhs
->lsu
+D2U(lhs
->digits
)-1; /* msu of input array */
4482 for (target
=msu1
; source
>=lhs
->lsu
; source
--, target
--) *target
=*source
;
4483 for (; target
>=var1
; target
--) *target
=0;
4485 /* rhs (var2) is left-aligned with var1 at the start */
4486 var2ulen
=var1units
; /* rhs logical length (units) */
4487 var2units
=D2U(rhs
->digits
); /* rhs actual length (units) */
4488 var2
=rhs
->lsu
; /* -> rhs array */
4489 msu2
=var2
+var2units
-1; /* -> msu of var2 [never changes] */
4490 /* now set up the variables which will be used for estimating the */
4491 /* multiplication factor. If these variables are not exact, add */
4492 /* 1 to make sure that the multiplier is never overestimated. */
4493 msu2plus
=*msu2
; /* it's value .. */
4494 if (var2units
>1) msu2plus
++; /* .. +1 if any more */
4495 msu2pair
=(eInt
)*msu2
*(DECDPUNMAX
+1);/* top two pair .. */
4496 if (var2units
>1) { /* .. [else treat 2nd as 0] */
4497 msu2pair
+=*(msu2
-1); /* .. */
4498 if (var2units
>2) msu2pair
++; /* .. +1 if any more */
4501 /* The calculation is working in units, which may have leading zeros, */
4502 /* but the exponent was calculated on the assumption that they are */
4503 /* both left-aligned. Adjust the exponent to compensate: add the */
4504 /* number of leading zeros in var1 msu and subtract those in var2 msu. */
4505 /* [This is actually done by counting the digits and negating, as */
4506 /* lead1=DECDPUN-digits1, and similarly for lead2.] */
4507 for (pow
=&powers
[1]; *msu1
>=*pow
; pow
++) exponent
--;
4508 for (pow
=&powers
[1]; *msu2
>=*pow
; pow
++) exponent
++;
4510 /* Now, if doing an integer divide or remainder, ensure that */
4511 /* the result will be Unit-aligned. To do this, shift the var1 */
4512 /* accumulator towards least if need be. (It's much easier to */
4513 /* do this now than to reassemble the residue afterwards, if */
4514 /* doing a remainder.) Also ensure the exponent is not negative. */
4517 /* save the initial 'false' padding of var1, in digits */
4518 var1initpad
=(var1units
-D2U(lhs
->digits
))*DECDPUN
;
4519 /* Determine the shift to do. */
4520 if (exponent
<0) cut
=-exponent
;
4521 else cut
=DECDPUN
-exponent%DECDPUN
;
4522 decShiftToLeast(var1
, var1units
, cut
);
4523 exponent
+=cut
; /* maintain numerical value */
4524 var1initpad
-=cut
; /* .. and reduce padding */
4525 /* clean any most-significant units which were just emptied */
4526 for (u
=msu1
; cut
>=DECDPUN
; cut
-=DECDPUN
, u
--) *u
=0;
4528 else { /* is DIVIDE */
4529 maxexponent
=lhs
->exponent
-rhs
->exponent
; /* save */
4530 /* optimization: if the first iteration will just produce 0, */
4531 /* preadjust to skip it [valid for DIVIDE only] */
4533 var2ulen
--; /* shift down */
4534 exponent
-=DECDPUN
; /* update the exponent */
4538 /* ---- start the long-division loops ------------------------------ */
4539 accunits
=0; /* no units accumulated yet */
4540 accdigits
=0; /* .. or digits */
4541 accnext
=acc
+acclength
-1; /* -> msu of acc [NB: allows digits+1] */
4542 for (;;) { /* outer forever loop */
4543 thisunit
=0; /* current unit assumed 0 */
4544 /* find the next unit */
4545 for (;;) { /* inner forever loop */
4546 /* strip leading zero units [from either pre-adjust or from */
4547 /* subtract last time around]. Leave at least one unit. */
4548 for (; *msu1
==0 && msu1
>var1
; msu1
--) var1units
--;
4550 if (var1units
<var2ulen
) break; /* var1 too low for subtract */
4551 if (var1units
==var2ulen
) { /* unit-by-unit compare needed */
4552 /* compare the two numbers, from msu */
4553 const Unit
*pv1
, *pv2
;
4554 Unit v2
; /* units to compare */
4555 pv2
=msu2
; /* -> msu */
4556 for (pv1
=msu1
; ; pv1
--, pv2
--) {
4557 /* v1=*pv1 -- always OK */
4558 v2
=0; /* assume in padding */
4559 if (pv2
>=var2
) v2
=*pv2
; /* in range */
4560 if (*pv1
!=v2
) break; /* no longer the same */
4561 if (pv1
==var1
) break; /* done; leave pv1 as is */
4563 /* here when all inspected or a difference seen */
4564 if (*pv1
<v2
) break; /* var1 too low to subtract */
4565 if (*pv1
==v2
) { /* var1 == var2 */
4566 /* reach here if var1 and var2 are identical; subtraction */
4567 /* would increase digit by one, and the residue will be 0 so */
4568 /* the calculation is done; leave the loop with residue=0. */
4569 thisunit
++; /* as though subtracted */
4570 *var1
=0; /* set var1 to 0 */
4571 var1units
=1; /* .. */
4572 break; /* from inner */
4573 } /* var1 == var2 */
4574 /* *pv1>v2. Prepare for real subtraction; the lengths are equal */
4575 /* Estimate the multiplier (there's always a msu1-1)... */
4576 /* Bring in two units of var2 to provide a good estimate. */
4577 mult
=(Int
)(((eInt
)*msu1
*(DECDPUNMAX
+1)+*(msu1
-1))/msu2pair
);
4578 } /* lengths the same */
4579 else { /* var1units > var2ulen, so subtraction is safe */
4580 /* The var2 msu is one unit towards the lsu of the var1 msu, */
4581 /* so only one unit for var2 can be used. */
4582 mult
=(Int
)(((eInt
)*msu1
*(DECDPUNMAX
+1)+*(msu1
-1))/msu2plus
);
4584 if (mult
==0) mult
=1; /* must always be at least 1 */
4585 /* subtraction needed; var1 is > var2 */
4586 thisunit
=(Unit
)(thisunit
+mult
); /* accumulate */
4587 /* subtract var1-var2, into var1; only the overlap needs */
4588 /* processing, as this is an in-place calculation */
4589 shift
=var2ulen
-var2units
;
4591 decDumpAr('1', &var1
[shift
], var1units
-shift
);
4592 decDumpAr('2', var2
, var2units
);
4593 printf("m=%ld\n", -mult
);
4595 decUnitAddSub(&var1
[shift
], var1units
-shift
,
4597 &var1
[shift
], -mult
);
4599 decDumpAr('#', &var1
[shift
], var1units
-shift
);
4601 /* var1 now probably has leading zeros; these are removed at the */
4602 /* top of the inner loop. */
4605 /* The next unit has been calculated in full; unless it's a */
4606 /* leading zero, add to acc */
4607 if (accunits
!=0 || thisunit
!=0) { /* is first or non-zero */
4608 *accnext
=thisunit
; /* store in accumulator */
4609 /* account exactly for the new digits */
4611 accdigits
++; /* at least one */
4612 for (pow
=&powers
[1]; thisunit
>=*pow
; pow
++) accdigits
++;
4614 else accdigits
+=DECDPUN
;
4615 accunits
++; /* update count */
4616 accnext
--; /* ready for next */
4617 if (accdigits
>reqdigits
) break; /* have enough digits */
4620 /* if the residue is zero, the operation is done (unless divide */
4621 /* or divideInteger and still not enough digits yet) */
4622 if (*var1
==0 && var1units
==1) { /* residue is 0 */
4623 if (op
&(REMAINDER
|REMNEAR
)) break;
4624 if ((op
&DIVIDE
) && (exponent
<=maxexponent
)) break;
4625 /* [drop through if divideInteger] */
4627 /* also done enough if calculating remainder or integer */
4628 /* divide and just did the last ('units') unit */
4629 if (exponent
==0 && !(op
&DIVIDE
)) break;
4631 /* to get here, var1 is less than var2, so divide var2 by the per- */
4632 /* Unit power of ten and go for the next digit */
4633 var2ulen
--; /* shift down */
4634 exponent
-=DECDPUN
; /* update the exponent */
4637 /* ---- division is complete --------------------------------------- */
4638 /* here: acc has at least reqdigits+1 of good results (or fewer */
4639 /* if early stop), starting at accnext+1 (its lsu) */
4640 /* var1 has any residue at the stopping point */
4641 /* accunits is the number of digits collected in acc */
4642 if (accunits
==0) { /* acc is 0 */
4643 accunits
=1; /* show have a unit .. */
4644 accdigits
=1; /* .. */
4645 *accnext
=0; /* .. whose value is 0 */
4647 else accnext
++; /* back to last placed */
4648 /* accnext now -> lowest unit of result */
4650 residue
=0; /* assume no residue */
4652 /* record the presence of any residue, for rounding */
4653 if (*var1
!=0 || var1units
>1) residue
=1;
4654 else { /* no residue */
4655 /* Had an exact division; clean up spurious trailing 0s. */
4656 /* There will be at most DECDPUN-1, from the final multiply, */
4657 /* and then only if the result is non-0 (and even) and the */
4658 /* exponent is 'loose'. */
4661 if (!(lsu
&0x01) && (lsu
!=0)) {
4662 /* count the trailing zeros */
4664 for (;; drop
++) { /* [will terminate because lsu!=0] */
4665 if (exponent
>=maxexponent
) break; /* don't chop real 0s */
4667 if ((lsu
-QUOT10(lsu
, drop
+1)
4668 *powers
[drop
+1])!=0) break; /* found non-0 digit */
4670 if (lsu%powers
[drop
+1]!=0) break; /* found non-0 digit */
4675 accunits
=decShiftToLeast(accnext
, accunits
, drop
);
4676 accdigits
=decGetDigits(accnext
, accunits
);
4677 accunits
=D2U(accdigits
);
4678 /* [exponent was adjusted in the loop] */
4680 } /* neither odd nor 0 */
4682 } /* exact divide */
4684 else /* op!=DIVIDE */ {
4685 /* check for coefficient overflow */
4686 if (accdigits
+exponent
>reqdigits
) {
4687 *status
|=DEC_Division_impossible
;
4690 if (op
& (REMAINDER
|REMNEAR
)) {
4691 /* [Here, the exponent will be 0, because var1 was adjusted */
4692 /* appropriately.] */
4693 Int postshift
; /* work */
4694 Flag wasodd
=0; /* integer was odd */
4695 Unit
*quotlsu
; /* for save */
4696 Int quotdigits
; /* .. */
4698 bits
=lhs
->bits
; /* remainder sign is always as lhs */
4700 /* Fastpath when residue is truly 0 is worthwhile [and */
4701 /* simplifies the code below] */
4702 if (*var1
==0 && var1units
==1) { /* residue is 0 */
4703 Int exp
=lhs
->exponent
; /* save min(exponents) */
4704 if (rhs
->exponent
<exp
) exp
=rhs
->exponent
;
4705 uprv_decNumberZero(res
); /* 0 coefficient */
4709 res
->exponent
=exp
; /* .. with proper exponent */
4710 res
->bits
=(uByte
)(bits
&DECNEG
); /* [cleaned] */
4711 decFinish(res
, set
, &residue
, status
); /* might clamp */
4714 /* note if the quotient was odd */
4715 if (*accnext
& 0x01) wasodd
=1; /* acc is odd */
4716 quotlsu
=accnext
; /* save in case need to reinspect */
4717 quotdigits
=accdigits
; /* .. */
4719 /* treat the residue, in var1, as the value to return, via acc */
4720 /* calculate the unused zero digits. This is the smaller of: */
4721 /* var1 initial padding (saved above) */
4722 /* var2 residual padding, which happens to be given by: */
4723 postshift
=var1initpad
+exponent
-lhs
->exponent
+rhs
->exponent
;
4724 /* [the 'exponent' term accounts for the shifts during divide] */
4725 if (var1initpad
<postshift
) postshift
=var1initpad
;
4727 /* shift var1 the requested amount, and adjust its digits */
4728 var1units
=decShiftToLeast(var1
, var1units
, postshift
);
4730 accdigits
=decGetDigits(var1
, var1units
);
4731 accunits
=D2U(accdigits
);
4733 exponent
=lhs
->exponent
; /* exponent is smaller of lhs & rhs */
4734 if (rhs
->exponent
<exponent
) exponent
=rhs
->exponent
;
4736 /* Now correct the result if doing remainderNear; if it */
4737 /* (looking just at coefficients) is > rhs/2, or == rhs/2 and */
4738 /* the integer was odd then the result should be rem-rhs. */
4740 Int compare
, tarunits
; /* work */
4742 /* calculate remainder*2 into the var1 buffer (which has */
4743 /* 'headroom' of an extra unit and hence enough space) */
4744 /* [a dedicated 'double' loop would be faster, here] */
4745 tarunits
=decUnitAddSub(accnext
, accunits
, accnext
, accunits
,
4747 /* decDumpAr('r', accnext, tarunits); */
4749 /* Here, accnext (var1) holds tarunits Units with twice the */
4750 /* remainder's coefficient, which must now be compared to the */
4751 /* RHS. The remainder's exponent may be smaller than the RHS's. */
4752 compare
=decUnitCompare(accnext
, tarunits
, rhs
->lsu
, D2U(rhs
->digits
),
4753 rhs
->exponent
-exponent
);
4754 if (compare
==BADINT
) { /* deep trouble */
4755 *status
|=DEC_Insufficient_storage
;
4758 /* now restore the remainder by dividing by two; the lsu */
4759 /* is known to be even. */
4760 for (up
=accnext
; up
<accnext
+tarunits
; up
++) {
4761 Int half
; /* half to add to lower unit */
4763 *up
/=2; /* [shift] */
4764 if (!half
) continue;
4765 *(up
-1)+=(DECDPUNMAX
+1)/2;
4767 /* [accunits still describes the original remainder length] */
4769 if (compare
>0 || (compare
==0 && wasodd
)) { /* adjustment needed */
4770 Int exp
, expunits
, exprem
; /* work */
4771 /* This is effectively causing round-up of the quotient, */
4772 /* so if it was the rare case where it was full and all */
4773 /* nines, it would overflow and hence division-impossible */
4774 /* should be raised */
4775 Flag allnines
=0; /* 1 if quotient all nines */
4776 if (quotdigits
==reqdigits
) { /* could be borderline */
4777 for (up
=quotlsu
; ; up
++) {
4778 if (quotdigits
>DECDPUN
) {
4779 if (*up
!=DECDPUNMAX
) break;/* non-nines */
4781 else { /* this is the last Unit */
4782 if (*up
==powers
[quotdigits
]-1) allnines
=1;
4785 quotdigits
-=DECDPUN
; /* checked those digits */
4787 } /* borderline check */
4789 *status
|=DEC_Division_impossible
;
4792 /* rem-rhs is needed; the sign will invert. Again, var1 */
4793 /* can safely be used for the working Units array. */
4794 exp
=rhs
->exponent
-exponent
; /* RHS padding needed */
4795 /* Calculate units and remainder from exponent. */
4796 expunits
=exp
/DECDPUN
;
4798 /* subtract [A+B*(-m)]; the result will always be negative */
4799 accunits
=-decUnitAddSub(accnext
, accunits
,
4800 rhs
->lsu
, D2U(rhs
->digits
),
4801 expunits
, accnext
, -(Int
)powers
[exprem
]);
4802 accdigits
=decGetDigits(accnext
, accunits
); /* count digits exactly */
4803 accunits
=D2U(accdigits
); /* and recalculate the units for copy */
4804 /* [exponent is as for original remainder] */
4805 bits
^=DECNEG
; /* flip the sign */
4808 } /* REMAINDER or REMNEAR */
4811 /* Set exponent and bits */
4812 res
->exponent
=exponent
;
4813 res
->bits
=(uByte
)(bits
&DECNEG
); /* [cleaned] */
4815 /* Now the coefficient. */
4816 decSetCoeff(res
, set
, accnext
, accdigits
, &residue
, status
);
4818 decFinish(res
, set
, &residue
, status
); /* final cleanup */
4821 /* If a divide then strip trailing zeros if subset [after round] */
4822 if (!set
->extended
&& (op
==DIVIDE
)) decTrim(res
, set
, 0, 1, &dropped
);
4824 } while(0); /* end protected */
4826 if (varalloc
!=NULL
) free(varalloc
); /* drop any storage used */
4827 if (allocacc
!=NULL
) free(allocacc
); /* .. */
4829 if (allocrhs
!=NULL
) free(allocrhs
); /* .. */
4830 if (alloclhs
!=NULL
) free(alloclhs
); /* .. */
4835 /* ------------------------------------------------------------------ */
4836 /* decMultiplyOp -- multiplication operation */
4838 /* This routine performs the multiplication C=A x B. */
4840 /* res is C, the result. C may be A and/or B (e.g., X=X*X) */
4843 /* set is the context */
4844 /* status is the usual accumulator */
4846 /* C must have space for set->digits digits. */
4848 /* ------------------------------------------------------------------ */
4849 /* 'Classic' multiplication is used rather than Karatsuba, as the */
4850 /* latter would give only a minor improvement for the short numbers */
4851 /* expected to be handled most (and uses much more memory). */
4853 /* There are two major paths here: the general-purpose ('old code') */
4854 /* path which handles all DECDPUN values, and a fastpath version */
4855 /* which is used if 64-bit ints are available, DECDPUN<=4, and more */
4856 /* than two calls to decUnitAddSub would be made. */
4858 /* The fastpath version lumps units together into 8-digit or 9-digit */
4859 /* chunks, and also uses a lazy carry strategy to minimise expensive */
4860 /* 64-bit divisions. The chunks are then broken apart again into */
4861 /* units for continuing processing. Despite this overhead, the */
4862 /* fastpath can speed up some 16-digit operations by 10x (and much */
4863 /* more for higher-precision calculations). */
4865 /* A buffer always has to be used for the accumulator; in the */
4866 /* fastpath, buffers are also always needed for the chunked copies of */
4867 /* of the operand coefficients. */
4868 /* Static buffers are larger than needed just for multiply, to allow */
4869 /* for calls from other operations (notably exp). */
4870 /* ------------------------------------------------------------------ */
4871 #define FASTMUL (DECUSE64 && DECDPUN<5)
4872 static decNumber
* decMultiplyOp(decNumber
*res
, const decNumber
*lhs
,
4873 const decNumber
*rhs
, decContext
*set
,
4875 Int accunits
; /* Units of accumulator in use */
4876 Int exponent
; /* work */
4877 Int residue
=0; /* rounding residue */
4878 uByte bits
; /* result sign */
4879 Unit
*acc
; /* -> accumulator Unit array */
4880 Int needbytes
; /* size calculator */
4881 void *allocacc
=NULL
; /* -> allocated accumulator, iff allocated */
4882 Unit accbuff
[SD2U(DECBUFFER
*4+1)]; /* buffer (+1 for DECBUFFER==0, */
4883 /* *4 for calls from other operations) */
4884 const Unit
*mer
, *mermsup
; /* work */
4885 Int madlength
; /* Units in multiplicand */
4886 Int shift
; /* Units to shift multiplicand by */
4889 /* if DECDPUN is 1 or 3 work in base 10**9, otherwise */
4890 /* (DECDPUN is 2 or 4) then work in base 10**8 */
4891 #if DECDPUN & 1 /* odd */
4892 #define FASTBASE 1000000000 /* base */
4893 #define FASTDIGS 9 /* digits in base */
4894 #define FASTLAZY 18 /* carry resolution point [1->18] */
4896 #define FASTBASE 100000000
4898 #define FASTLAZY 1844 /* carry resolution point [1->1844] */
4900 /* three buffers are used, two for chunked copies of the operands */
4901 /* (base 10**8 or base 10**9) and one base 2**64 accumulator with */
4902 /* lazy carry evaluation */
4903 uInt zlhibuff
[(DECBUFFER
*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0) */
4904 uInt
*zlhi
=zlhibuff
; /* -> lhs array */
4905 uInt
*alloclhi
=NULL
; /* -> allocated buffer, iff allocated */
4906 uInt zrhibuff
[(DECBUFFER
*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0) */
4907 uInt
*zrhi
=zrhibuff
; /* -> rhs array */
4908 uInt
*allocrhi
=NULL
; /* -> allocated buffer, iff allocated */
4909 uLong zaccbuff
[(DECBUFFER
*2+1)/4+2]; /* buffer (+1 for DECBUFFER==0) */
4910 /* [allocacc is shared for both paths, as only one will run] */
4911 uLong
*zacc
=zaccbuff
; /* -> accumulator array for exact result */
4913 Int zoff
; /* accumulator offset */
4915 uInt
*lip
, *rip
; /* item pointers */
4916 uInt
*lmsi
, *rmsi
; /* most significant items */
4917 Int ilhs
, irhs
, iacc
; /* item counts in the arrays */
4918 Int lazy
; /* lazy carry counter */
4919 uLong lcarry
; /* uLong carry */
4920 uInt carry
; /* carry (NB not uLong) */
4921 Int count
; /* work */
4922 const Unit
*cup
; /* .. */
4929 decNumber
*alloclhs
=NULL
; /* -> allocated buffer, iff allocated */
4930 decNumber
*allocrhs
=NULL
; /* -> allocated buffer, iff allocated */
4934 if (decCheckOperands(res
, lhs
, rhs
, set
)) return res
;
4937 /* precalculate result sign */
4938 bits
=(uByte
)((lhs
->bits
^rhs
->bits
)&DECNEG
);
4940 /* handle infinities and NaNs */
4941 if (SPECIALARGS
) { /* a special bit set */
4942 if (SPECIALARGS
& (DECSNAN
| DECNAN
)) { /* one or two NaNs */
4943 decNaNs(res
, lhs
, rhs
, set
, status
);
4945 /* one or two infinities; Infinity * 0 is invalid */
4946 if (((lhs
->bits
& DECINF
)==0 && ISZERO(lhs
))
4947 ||((rhs
->bits
& DECINF
)==0 && ISZERO(rhs
))) {
4948 *status
|=DEC_Invalid_operation
;
4950 uprv_decNumberZero(res
);
4951 res
->bits
=bits
|DECINF
; /* infinity */
4954 /* For best speed, as in DMSRCN [the original Rexx numerics */
4955 /* module], use the shorter number as the multiplier (rhs) and */
4956 /* the longer as the multiplicand (lhs) to minimise the number of */
4957 /* adds (partial products) */
4958 if (lhs
->digits
<rhs
->digits
) { /* swap... */
4959 const decNumber
*hold
=lhs
;
4964 do { /* protect allocated storage */
4966 if (!set
->extended
) {
4967 /* reduce operands and set lostDigits status, as needed */
4968 if (lhs
->digits
>set
->digits
) {
4969 alloclhs
=decRoundOperand(lhs
, set
, status
);
4970 if (alloclhs
==NULL
) break;
4973 if (rhs
->digits
>set
->digits
) {
4974 allocrhs
=decRoundOperand(rhs
, set
, status
);
4975 if (allocrhs
==NULL
) break;
4980 /* [following code does not require input rounding] */
4982 #if FASTMUL /* fastpath can be used */
4983 /* use the fast path if there are enough digits in the shorter */
4984 /* operand to make the setup and takedown worthwhile */
4985 #define NEEDTWO (DECDPUN*2) /* within two decUnitAddSub calls */
4986 if (rhs
->digits
>NEEDTWO
) { /* use fastpath... */
4987 /* calculate the number of elements in each array */
4988 ilhs
=(lhs
->digits
+FASTDIGS
-1)/FASTDIGS
; /* [ceiling] */
4989 irhs
=(rhs
->digits
+FASTDIGS
-1)/FASTDIGS
; /* .. */
4992 /* allocate buffers if required, as usual */
4993 needbytes
=ilhs
*sizeof(uInt
);
4994 if (needbytes
>(Int
)sizeof(zlhibuff
)) {
4995 alloclhi
=(uInt
*)malloc(needbytes
);
4997 needbytes
=irhs
*sizeof(uInt
);
4998 if (needbytes
>(Int
)sizeof(zrhibuff
)) {
4999 allocrhi
=(uInt
*)malloc(needbytes
);
5002 /* Allocating the accumulator space needs a special case when */
5003 /* DECDPUN=1 because when converting the accumulator to Units */
5004 /* after the multiplication each 8-byte item becomes 9 1-byte */
5005 /* units. Therefore iacc extra bytes are needed at the front */
5006 /* (rounded up to a multiple of 8 bytes), and the uLong */
5007 /* accumulator starts offset the appropriate number of units */
5008 /* to the right to avoid overwrite during the unchunking. */
5010 /* Make sure no signed int overflow below. This is always true */
5011 /* if the given numbers have less digits than DEC_MAX_DIGITS. */
5012 U_ASSERT((uint32_t)iacc
<= INT32_MAX
/sizeof(uLong
));
5013 needbytes
=iacc
*sizeof(uLong
);
5015 zoff
=(iacc
+7)/8; /* items to offset by */
5018 if (needbytes
>(Int
)sizeof(zaccbuff
)) {
5019 allocacc
=(uLong
*)malloc(needbytes
);
5020 zacc
=(uLong
*)allocacc
;}
5021 if (zlhi
==NULL
||zrhi
==NULL
||zacc
==NULL
) {
5022 *status
|=DEC_Insufficient_storage
;
5025 acc
=(Unit
*)zacc
; /* -> target Unit array */
5027 zacc
+=zoff
; /* start uLong accumulator to right */
5030 /* assemble the chunked copies of the left and right sides */
5031 for (count
=lhs
->digits
, cup
=lhs
->lsu
, lip
=zlhi
; count
>0; lip
++)
5032 for (p
=0, *lip
=0; p
<FASTDIGS
&& count
>0;
5033 p
+=DECDPUN
, cup
++, count
-=DECDPUN
)
5034 *lip
+=*cup
*powers
[p
];
5035 lmsi
=lip
-1; /* save -> msi */
5036 for (count
=rhs
->digits
, cup
=rhs
->lsu
, rip
=zrhi
; count
>0; rip
++)
5037 for (p
=0, *rip
=0; p
<FASTDIGS
&& count
>0;
5038 p
+=DECDPUN
, cup
++, count
-=DECDPUN
)
5039 *rip
+=*cup
*powers
[p
];
5040 rmsi
=rip
-1; /* save -> msi */
5042 /* zero the accumulator */
5043 for (lp
=zacc
; lp
<zacc
+iacc
; lp
++) *lp
=0;
5045 /* Start the multiplication */
5046 /* Resolving carries can dominate the cost of accumulating the */
5047 /* partial products, so this is only done when necessary. */
5048 /* Each uLong item in the accumulator can hold values up to */
5049 /* 2**64-1, and each partial product can be as large as */
5050 /* (10**FASTDIGS-1)**2. When FASTDIGS=9, this can be added to */
5051 /* itself 18.4 times in a uLong without overflowing, so during */
5052 /* the main calculation resolution is carried out every 18th */
5053 /* add -- every 162 digits. Similarly, when FASTDIGS=8, the */
5054 /* partial products can be added to themselves 1844.6 times in */
5055 /* a uLong without overflowing, so intermediate carry */
5056 /* resolution occurs only every 14752 digits. Hence for common */
5057 /* short numbers usually only the one final carry resolution */
5059 /* (The count is set via FASTLAZY to simplify experiments to */
5060 /* measure the value of this approach: a 35% improvement on a */
5061 /* [34x34] multiply.) */
5062 lazy
=FASTLAZY
; /* carry delay count */
5063 for (rip
=zrhi
; rip
<=rmsi
; rip
++) { /* over each item in rhs */
5064 lp
=zacc
+(rip
-zrhi
); /* where to add the lhs */
5065 for (lip
=zlhi
; lip
<=lmsi
; lip
++, lp
++) { /* over each item in lhs */
5066 *lp
+=(uLong
)(*lip
)*(*rip
); /* [this should in-line] */
5069 if (lazy
>0 && rip
!=rmsi
) continue;
5070 lazy
=FASTLAZY
; /* reset delay count */
5071 /* spin up the accumulator resolving overflows */
5072 for (lp
=zacc
; lp
<zacc
+iacc
; lp
++) {
5073 if (*lp
<FASTBASE
) continue; /* it fits */
5074 lcarry
=*lp
/FASTBASE
; /* top part [slow divide] */
5075 /* lcarry can exceed 2**32-1, so check again; this check */
5076 /* and occasional extra divide (slow) is well worth it, as */
5077 /* it allows FASTLAZY to be increased to 18 rather than 4 */
5078 /* in the FASTDIGS=9 case */
5079 if (lcarry
<FASTBASE
) carry
=(uInt
)lcarry
; /* [usual] */
5080 else { /* two-place carry [fairly rare] */
5081 uInt carry2
=(uInt
)(lcarry
/FASTBASE
); /* top top part */
5082 *(lp
+2)+=carry2
; /* add to item+2 */
5083 *lp
-=((uLong
)FASTBASE
*FASTBASE
*carry2
); /* [slow] */
5084 carry
=(uInt
)(lcarry
-((uLong
)FASTBASE
*carry2
)); /* [inline] */
5086 *(lp
+1)+=carry
; /* add to item above [inline] */
5087 *lp
-=((uLong
)FASTBASE
*carry
); /* [inline] */
5088 } /* carry resolution */
5091 /* The multiplication is complete; time to convert back into */
5092 /* units. This can be done in-place in the accumulator and in */
5093 /* 32-bit operations, because carries were resolved after the */
5094 /* final add. This needs N-1 divides and multiplies for */
5095 /* each item in the accumulator (which will become up to N */
5096 /* units, where 2<=N<=9). */
5097 for (lp
=zacc
, up
=acc
; lp
<zacc
+iacc
; lp
++) {
5098 uInt item
=(uInt
)*lp
; /* decapitate to uInt */
5099 for (p
=0; p
<FASTDIGS
-DECDPUN
; p
+=DECDPUN
, up
++) {
5100 uInt part
=item
/(DECDPUNMAX
+1);
5101 *up
=(Unit
)(item
-(part
*(DECDPUNMAX
+1)));
5104 *up
=(Unit
)item
; up
++; /* [final needs no division] */
5106 accunits
= static_cast<int32_t>(up
-acc
); /* count of units */
5108 else { /* here to use units directly, without chunking ['old code'] */
5111 /* if accumulator will be too long for local storage, then allocate */
5112 acc
=accbuff
; /* -> assume buffer for accumulator */
5113 needbytes
=(D2U(lhs
->digits
)+D2U(rhs
->digits
))*sizeof(Unit
);
5114 if (needbytes
>(Int
)sizeof(accbuff
)) {
5115 allocacc
=(Unit
*)malloc(needbytes
);
5116 if (allocacc
==NULL
) {*status
|=DEC_Insufficient_storage
; break;}
5117 acc
=(Unit
*)allocacc
; /* use the allocated space */
5120 /* Now the main long multiplication loop */
5121 /* Unlike the equivalent in the IBM Java implementation, there */
5122 /* is no advantage in calculating from msu to lsu. So, do it */
5123 /* by the book, as it were. */
5124 /* Each iteration calculates ACC=ACC+MULTAND*MULT */
5125 accunits
=1; /* accumulator starts at '0' */
5126 *acc
=0; /* .. (lsu=0) */
5127 shift
=0; /* no multiplicand shift at first */
5128 madlength
=D2U(lhs
->digits
); /* this won't change */
5129 mermsup
=rhs
->lsu
+D2U(rhs
->digits
); /* -> msu+1 of multiplier */
5131 for (mer
=rhs
->lsu
; mer
<mermsup
; mer
++) {
5132 /* Here, *mer is the next Unit in the multiplier to use */
5133 /* If non-zero [optimization] add it... */
5134 if (*mer
!=0) accunits
=decUnitAddSub(&acc
[shift
], accunits
-shift
,
5135 lhs
->lsu
, madlength
, 0,
5138 else { /* extend acc with a 0; it will be used shortly */
5139 *(acc
+accunits
)=0; /* [this avoids length of <=0 later] */
5142 /* multiply multiplicand by 10**DECDPUN for next Unit to left */
5143 shift
++; /* add this for 'logical length' */
5146 } /* unchunked units */
5148 /* common end-path */
5150 decDumpAr('*', acc
, accunits
); /* Show exact result */
5153 /* acc now contains the exact result of the multiplication, */
5154 /* possibly with a leading zero unit; build the decNumber from */
5155 /* it, noting if any residue */
5156 res
->bits
=bits
; /* set sign */
5157 res
->digits
=decGetDigits(acc
, accunits
); /* count digits exactly */
5159 /* There can be a 31-bit wrap in calculating the exponent. */
5160 /* This can only happen if both input exponents are negative and */
5161 /* both their magnitudes are large. If there was a wrap, set a */
5162 /* safe very negative exponent, from which decFinalize() will */
5163 /* raise a hard underflow shortly. */
5164 exponent
=lhs
->exponent
+rhs
->exponent
; /* calculate exponent */
5165 if (lhs
->exponent
<0 && rhs
->exponent
<0 && exponent
>0)
5166 exponent
=-2*DECNUMMAXE
; /* force underflow */
5167 res
->exponent
=exponent
; /* OK to overwrite now */
5170 /* Set the coefficient. If any rounding, residue records */
5171 decSetCoeff(res
, set
, acc
, res
->digits
, &residue
, status
);
5172 decFinish(res
, set
, &residue
, status
); /* final cleanup */
5173 } while(0); /* end protected */
5175 if (allocacc
!=NULL
) free(allocacc
); /* drop any storage used */
5177 if (allocrhs
!=NULL
) free(allocrhs
); /* .. */
5178 if (alloclhs
!=NULL
) free(alloclhs
); /* .. */
5181 if (allocrhi
!=NULL
) free(allocrhi
); /* .. */
5182 if (alloclhi
!=NULL
) free(alloclhi
); /* .. */
5185 } /* decMultiplyOp */
5187 /* ------------------------------------------------------------------ */
5188 /* decExpOp -- effect exponentiation */
5190 /* This computes C = exp(A) */
5192 /* res is C, the result. C may be A */
5194 /* set is the context; note that rounding mode has no effect */
5196 /* C must have space for set->digits digits. status is updated but */
5201 /* digits, emax, and -emin in the context must be less than */
5202 /* 2*DEC_MAX_MATH (1999998), and the rhs must be within these */
5203 /* bounds or a zero. This is an internal routine, so these */
5204 /* restrictions are contractual and not enforced. */
5206 /* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will */
5207 /* almost always be correctly rounded, but may be up to 1 ulp in */
5208 /* error in rare cases. */
5210 /* Finite results will always be full precision and Inexact, except */
5211 /* when A is a zero or -Infinity (giving 1 or 0 respectively). */
5212 /* ------------------------------------------------------------------ */
5213 /* This approach used here is similar to the algorithm described in */
5215 /* Variable Precision Exponential Function, T. E. Hull and */
5216 /* A. Abrham, ACM Transactions on Mathematical Software, Vol 12 #2, */
5217 /* pp79-91, ACM, June 1986. */
5219 /* with the main difference being that the iterations in the series */
5220 /* evaluation are terminated dynamically (which does not require the */
5221 /* extra variable-precision variables which are expensive in this */
5224 /* The error analysis in Hull & Abrham's paper applies except for the */
5225 /* round-off error accumulation during the series evaluation. This */
5226 /* code does not precalculate the number of iterations and so cannot */
5227 /* use Horner's scheme. Instead, the accumulation is done at double- */
5228 /* precision, which ensures that the additions of the terms are exact */
5229 /* and do not accumulate round-off (and any round-off errors in the */
5230 /* terms themselves move 'to the right' faster than they can */
5231 /* accumulate). This code also extends the calculation by allowing, */
5232 /* in the spirit of other decNumber operators, the input to be more */
5233 /* precise than the result (the precision used is based on the more */
5234 /* precise of the input or requested result). */
5236 /* Implementation notes: */
5238 /* 1. This is separated out as decExpOp so it can be called from */
5239 /* other Mathematical functions (notably Ln) with a wider range */
5240 /* than normal. In particular, it can handle the slightly wider */
5241 /* (double) range needed by Ln (which has to be able to calculate */
5242 /* exp(-x) where x can be the tiniest number (Ntiny). */
5244 /* 2. Normalizing x to be <=0.1 (instead of <=1) reduces loop */
5245 /* iterations by appoximately a third with additional (although */
5246 /* diminishing) returns as the range is reduced to even smaller */
5247 /* fractions. However, h (the power of 10 used to correct the */
5248 /* result at the end, see below) must be kept <=8 as otherwise */
5249 /* the final result cannot be computed. Hence the leverage is a */
5250 /* sliding value (8-h), where potentially the range is reduced */
5251 /* more for smaller values. */
5253 /* The leverage that can be applied in this way is severely */
5254 /* limited by the cost of the raise-to-the power at the end, */
5255 /* which dominates when the number of iterations is small (less */
5256 /* than ten) or when rhs is short. As an example, the adjustment */
5257 /* x**10,000,000 needs 31 multiplications, all but one full-width. */
5259 /* 3. The restrictions (especially precision) could be raised with */
5260 /* care, but the full decNumber range seems very hard within the */
5261 /* 32-bit limits. */
5263 /* 4. The working precisions for the static buffers are twice the */
5264 /* obvious size to allow for calls from decNumberPower. */
5265 /* ------------------------------------------------------------------ */
5266 decNumber
* decExpOp(decNumber
*res
, const decNumber
*rhs
,
5267 decContext
*set
, uInt
*status
) {
5268 uInt ignore
=0; /* working status */
5269 Int h
; /* adjusted exponent for 0.xxxx */
5270 Int p
; /* working precision */
5271 Int residue
; /* rounding residue */
5272 uInt needbytes
; /* for space calculations */
5273 const decNumber
*x
=rhs
; /* (may point to safe copy later) */
5274 decContext aset
, tset
, dset
; /* working contexts */
5275 Int comp
; /* work */
5277 /* the argument is often copied to normalize it, so (unusually) it */
5278 /* is treated like other buffers, using DECBUFFER, +1 in case */
5279 /* DECBUFFER is 0 */
5280 decNumber bufr
[D2N(DECBUFFER
*2+1)];
5281 decNumber
*allocrhs
=NULL
; /* non-NULL if rhs buffer allocated */
5283 /* the working precision will be no more than set->digits+8+1 */
5284 /* so for on-stack buffers DECBUFFER+9 is used, +1 in case DECBUFFER */
5285 /* is 0 (and twice that for the accumulator) */
5287 /* buffer for t, term (working precision plus) */
5288 decNumber buft
[D2N(DECBUFFER
*2+9+1)];
5289 decNumber
*allocbuft
=NULL
; /* -> allocated buft, iff allocated */
5290 decNumber
*t
=buft
; /* term */
5291 /* buffer for a, accumulator (working precision * 2), at least 9 */
5292 decNumber bufa
[D2N(DECBUFFER
*4+18+1)];
5293 decNumber
*allocbufa
=NULL
; /* -> allocated bufa, iff allocated */
5294 decNumber
*a
=bufa
; /* accumulator */
5295 /* decNumber for the divisor term; this needs at most 9 digits */
5296 /* and so can be fixed size [16 so can use standard context] */
5297 decNumber bufd
[D2N(16)];
5298 decNumber
*d
=bufd
; /* divisor */
5299 decNumber numone
; /* constant 1 */
5302 Int iterations
=0; /* for later sanity check */
5303 if (decCheckOperands(res
, DECUNUSED
, rhs
, set
)) return res
;
5306 do { /* protect allocated storage */
5307 if (SPECIALARG
) { /* handle infinities and NaNs */
5308 if (decNumberIsInfinite(rhs
)) { /* an infinity */
5309 if (decNumberIsNegative(rhs
)) /* -Infinity -> +0 */
5310 uprv_decNumberZero(res
);
5311 else uprv_decNumberCopy(res
, rhs
); /* +Infinity -> self */
5313 else decNaNs(res
, rhs
, NULL
, set
, status
); /* a NaN */
5316 if (ISZERO(rhs
)) { /* zeros -> exact 1 */
5317 uprv_decNumberZero(res
); /* make clean 1 */
5318 *res
->lsu
=1; /* .. */
5319 break;} /* [no status to set] */
5321 /* e**x when 0 < x < 0.66 is < 1+3x/2, hence can fast-path */
5322 /* positive and negative tiny cases which will result in inexact */
5323 /* 1. This also allows the later add-accumulate to always be */
5324 /* exact (because its length will never be more than twice the */
5325 /* working precision). */
5326 /* The comparator (tiny) needs just one digit, so use the */
5327 /* decNumber d for it (reused as the divisor, etc., below); its */
5328 /* exponent is such that if x is positive it will have */
5329 /* set->digits-1 zeros between the decimal point and the digit, */
5330 /* which is 4, and if x is negative one more zero there as the */
5331 /* more precise result will be of the form 0.9999999 rather than */
5332 /* 1.0000001. Hence, tiny will be 0.0000004 if digits=7 and x>0 */
5333 /* or 0.00000004 if digits=7 and x<0. If RHS not larger than */
5334 /* this then the result will be 1.000000 */
5335 uprv_decNumberZero(d
); /* clean */
5336 *d
->lsu
=4; /* set 4 .. */
5337 d
->exponent
=-set
->digits
; /* * 10**(-d) */
5338 if (decNumberIsNegative(rhs
)) d
->exponent
--; /* negative case */
5339 comp
=decCompare(d
, rhs
, 1); /* signless compare */
5341 *status
|=DEC_Insufficient_storage
;
5343 if (comp
>=0) { /* rhs < d */
5344 Int shift
=set
->digits
-1;
5345 uprv_decNumberZero(res
); /* set 1 */
5346 *res
->lsu
=1; /* .. */
5347 res
->digits
=decShiftToMost(res
->lsu
, 1, shift
);
5348 res
->exponent
=-shift
; /* make 1.0000... */
5349 *status
|=DEC_Inexact
| DEC_Rounded
; /* .. inexactly */
5352 /* set up the context to be used for calculating a, as this is */
5353 /* used on both paths below */
5354 uprv_decContextDefault(&aset
, DEC_INIT_DECIMAL64
);
5355 /* accumulator bounds are as requested (could underflow) */
5356 aset
.emax
=set
->emax
; /* usual bounds */
5357 aset
.emin
=set
->emin
; /* .. */
5358 aset
.clamp
=0; /* and no concrete format */
5360 /* calculate the adjusted (Hull & Abrham) exponent (where the */
5361 /* decimal point is just to the left of the coefficient msd) */
5362 h
=rhs
->exponent
+rhs
->digits
;
5363 /* if h>8 then 10**h cannot be calculated safely; however, when */
5364 /* h=8 then exp(|rhs|) will be at least exp(1E+7) which is at */
5365 /* least 6.59E+4342944, so (due to the restriction on Emax/Emin) */
5366 /* overflow (or underflow to 0) is guaranteed -- so this case can */
5367 /* be handled by simply forcing the appropriate excess */
5368 if (h
>8) { /* overflow/underflow */
5369 /* set up here so Power call below will over or underflow to */
5370 /* zero; set accumulator to either 2 or 0.02 */
5371 /* [stack buffer for a is always big enough for this] */
5372 uprv_decNumberZero(a
);
5373 *a
->lsu
=2; /* not 1 but < exp(1) */
5374 if (decNumberIsNegative(rhs
)) a
->exponent
=-2; /* make 0.02 */
5375 h
=8; /* clamp so 10**h computable */
5376 p
=9; /* set a working precision */
5379 Int maxlever
=(rhs
->digits
>8?1:0);
5380 /* [could/should increase this for precisions >40 or so, too] */
5382 /* if h is 8, cannot normalize to a lower upper limit because */
5383 /* the final result will not be computable (see notes above), */
5384 /* but leverage can be applied whenever h is less than 8. */
5385 /* Apply as much as possible, up to a MAXLEVER digits, which */
5386 /* sets the tradeoff against the cost of the later a**(10**h). */
5387 /* As h is increased, the working precision below also */
5388 /* increases to compensate for the "constant digits at the */
5389 /* front" effect. */
5390 Int lever
=MINI(8-h
, maxlever
); /* leverage attainable */
5391 Int use
=-rhs
->digits
-lever
; /* exponent to use for RHS */
5392 h
+=lever
; /* apply leverage selected */
5393 if (h
<0) { /* clamp */
5394 use
+=h
; /* [may end up subnormal] */
5397 /* Take a copy of RHS if it needs normalization (true whenever x>=1) */
5398 if (rhs
->exponent
!=use
) {
5399 decNumber
*newrhs
=bufr
; /* assume will fit on stack */
5400 needbytes
=sizeof(decNumber
)+(D2U(rhs
->digits
)-1)*sizeof(Unit
);
5401 if (needbytes
>sizeof(bufr
)) { /* need malloc space */
5402 allocrhs
=(decNumber
*)malloc(needbytes
);
5403 if (allocrhs
==NULL
) { /* hopeless -- abandon */
5404 *status
|=DEC_Insufficient_storage
;
5406 newrhs
=allocrhs
; /* use the allocated space */
5408 uprv_decNumberCopy(newrhs
, rhs
); /* copy to safe space */
5409 newrhs
->exponent
=use
; /* normalize; now <1 */
5410 x
=newrhs
; /* ready for use */
5411 /* decNumberShow(x); */
5414 /* Now use the usual power series to evaluate exp(x). The */
5415 /* series starts as 1 + x + x^2/2 ... so prime ready for the */
5416 /* third term by setting the term variable t=x, the accumulator */
5417 /* a=1, and the divisor d=2. */
5419 /* First determine the working precision. From Hull & Abrham */
5420 /* this is set->digits+h+2. However, if x is 'over-precise' we */
5421 /* need to allow for all its digits to potentially participate */
5422 /* (consider an x where all the excess digits are 9s) so in */
5423 /* this case use x->digits+h+2 */
5424 p
=MAXI(x
->digits
, set
->digits
)+h
+2; /* [h<=8] */
5426 /* a and t are variable precision, and depend on p, so space */
5427 /* must be allocated for them if necessary */
5429 /* the accumulator needs to be able to hold 2p digits so that */
5430 /* the additions on the second and subsequent iterations are */
5431 /* sufficiently exact. */
5432 needbytes
=sizeof(decNumber
)+(D2U(p
*2)-1)*sizeof(Unit
);
5433 if (needbytes
>sizeof(bufa
)) { /* need malloc space */
5434 allocbufa
=(decNumber
*)malloc(needbytes
);
5435 if (allocbufa
==NULL
) { /* hopeless -- abandon */
5436 *status
|=DEC_Insufficient_storage
;
5438 a
=allocbufa
; /* use the allocated space */
5440 /* the term needs to be able to hold p digits (which is */
5441 /* guaranteed to be larger than x->digits, so the initial copy */
5442 /* is safe); it may also be used for the raise-to-power */
5443 /* calculation below, which needs an extra two digits */
5444 needbytes
=sizeof(decNumber
)+(D2U(p
+2)-1)*sizeof(Unit
);
5445 if (needbytes
>sizeof(buft
)) { /* need malloc space */
5446 allocbuft
=(decNumber
*)malloc(needbytes
);
5447 if (allocbuft
==NULL
) { /* hopeless -- abandon */
5448 *status
|=DEC_Insufficient_storage
;
5450 t
=allocbuft
; /* use the allocated space */
5453 uprv_decNumberCopy(t
, x
); /* term=x */
5454 uprv_decNumberZero(a
); *a
->lsu
=1; /* accumulator=1 */
5455 uprv_decNumberZero(d
); *d
->lsu
=2; /* divisor=2 */
5456 uprv_decNumberZero(&numone
); *numone
.lsu
=1; /* constant 1 for increment */
5458 /* set up the contexts for calculating a, t, and d */
5459 uprv_decContextDefault(&tset
, DEC_INIT_DECIMAL64
);
5461 /* accumulator bounds are set above, set precision now */
5462 aset
.digits
=p
*2; /* double */
5463 /* term bounds avoid any underflow or overflow */
5465 tset
.emin
=DEC_MIN_EMIN
; /* [emax is plenty] */
5466 /* [dset.digits=16, etc., are sufficient] */
5468 /* finally ready to roll */
5473 /* only the status from the accumulation is interesting */
5474 /* [but it should remain unchanged after first add] */
5475 decAddOp(a
, a
, t
, &aset
, 0, status
); /* a=a+t */
5476 decMultiplyOp(t
, t
, x
, &tset
, &ignore
); /* t=t*x */
5477 decDivideOp(t
, t
, d
, &tset
, DIVIDE
, &ignore
); /* t=t/d */
5478 /* the iteration ends when the term cannot affect the result, */
5479 /* if rounded to p digits, which is when its value is smaller */
5480 /* than the accumulator by p+1 digits. There must also be */
5481 /* full precision in a. */
5482 if (((a
->digits
+a
->exponent
)>=(t
->digits
+t
->exponent
+p
+1))
5483 && (a
->digits
>=p
)) break;
5484 decAddOp(d
, d
, &numone
, &dset
, 0, &ignore
); /* d=d+1 */
5488 /* just a sanity check; comment out test to show always */
5490 printf("Exp iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
5491 (LI
)iterations
, (LI
)*status
, (LI
)p
, (LI
)x
->digits
);
5495 /* apply postconditioning: a=a**(10**h) -- this is calculated */
5496 /* at a slightly higher precision than Hull & Abrham suggest */
5498 Int seenbit
=0; /* set once a 1-bit is seen */
5499 Int i
; /* counter */
5500 Int n
=powers
[h
]; /* always positive */
5501 aset
.digits
=p
+2; /* sufficient precision */
5502 /* avoid the overhead and many extra digits of decNumberPower */
5503 /* as all that is needed is the short 'multipliers' loop; here */
5504 /* accumulate the answer into t */
5505 uprv_decNumberZero(t
); *t
->lsu
=1; /* acc=1 */
5506 for (i
=1;;i
++){ /* for each bit [top bit ignored] */
5507 /* abandon if have had overflow or terminal underflow */
5508 if (*status
& (DEC_Overflow
|DEC_Underflow
)) { /* interesting? */
5509 if (*status
&DEC_Overflow
|| ISZERO(t
)) break;}
5510 n
=n
<<1; /* move next bit to testable position */
5511 if (n
<0) { /* top bit is set */
5512 seenbit
=1; /* OK, have a significant bit */
5513 decMultiplyOp(t
, t
, a
, &aset
, status
); /* acc=acc*x */
5515 if (i
==31) break; /* that was the last bit */
5516 if (!seenbit
) continue; /* no need to square 1 */
5517 decMultiplyOp(t
, t
, t
, &aset
, status
); /* acc=acc*acc [square] */
5518 } /*i*/ /* 32 bits */
5519 /* decNumberShow(t); */
5520 a
=t
; /* and carry on using t instead of a */
5523 /* Copy and round the result to res */
5524 residue
=1; /* indicate dirt to right .. */
5525 if (ISZERO(a
)) residue
=0; /* .. unless underflowed to 0 */
5526 aset
.digits
=set
->digits
; /* [use default rounding] */
5527 decCopyFit(res
, a
, &aset
, &residue
, status
); /* copy & shorten */
5528 decFinish(res
, set
, &residue
, status
); /* cleanup/set flags */
5529 } while(0); /* end protected */
5531 if (allocrhs
!=NULL
) free(allocrhs
); /* drop any storage used */
5532 if (allocbufa
!=NULL
) free(allocbufa
); /* .. */
5533 if (allocbuft
!=NULL
) free(allocbuft
); /* .. */
5534 /* [status is handled by caller] */
5538 /* ------------------------------------------------------------------ */
5539 /* Initial-estimate natural logarithm table */
5541 /* LNnn -- 90-entry 16-bit table for values from .10 through .99. */
5542 /* The result is a 4-digit encode of the coefficient (c=the */
5543 /* top 14 bits encoding 0-9999) and a 2-digit encode of the */
5544 /* exponent (e=the bottom 2 bits encoding 0-3) */
5546 /* The resulting value is given by: */
5548 /* v = -c * 10**(-e-3) */
5550 /* where e and c are extracted from entry k = LNnn[x-10] */
5551 /* where x is truncated (NB) into the range 10 through 99, */
5552 /* and then c = k>>2 and e = k&3. */
5553 /* ------------------------------------------------------------------ */
5554 static const uShort LNnn
[90]={9016, 8652, 8316, 8008, 7724, 7456, 7208,
5555 6972, 6748, 6540, 6340, 6148, 5968, 5792, 5628, 5464, 5312,
5556 5164, 5020, 4884, 4748, 4620, 4496, 4376, 4256, 4144, 4032,
5557 39233, 38181, 37157, 36157, 35181, 34229, 33297, 32389, 31501, 30629,
5558 29777, 28945, 28129, 27329, 26545, 25777, 25021, 24281, 23553, 22837,
5559 22137, 21445, 20769, 20101, 19445, 18801, 18165, 17541, 16925, 16321,
5560 15721, 15133, 14553, 13985, 13421, 12865, 12317, 11777, 11241, 10717,
5561 10197, 9685, 9177, 8677, 8185, 7697, 7213, 6737, 6269, 5801,
5562 5341, 4889, 4437, 39930, 35534, 31186, 26886, 22630, 18418, 14254,
5563 10130, 6046, 20055};
5565 /* ------------------------------------------------------------------ */
5566 /* decLnOp -- effect natural logarithm */
5568 /* This computes C = ln(A) */
5570 /* res is C, the result. C may be A */
5572 /* set is the context; note that rounding mode has no effect */
5574 /* C must have space for set->digits digits. */
5576 /* Notable cases: */
5577 /* A<0 -> Invalid */
5578 /* A=0 -> -Infinity (Exact) */
5579 /* A=+Infinity -> +Infinity (Exact) */
5580 /* A=1 exactly -> 0 (Exact) */
5582 /* Restrictions (as for Exp): */
5584 /* digits, emax, and -emin in the context must be less than */
5585 /* DEC_MAX_MATH+11 (1000010), and the rhs must be within these */
5586 /* bounds or a zero. This is an internal routine, so these */
5587 /* restrictions are contractual and not enforced. */
5589 /* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will */
5590 /* almost always be correctly rounded, but may be up to 1 ulp in */
5591 /* error in rare cases. */
5592 /* ------------------------------------------------------------------ */
5593 /* The result is calculated using Newton's method, with each */
5594 /* iteration calculating a' = a + x * exp(-a) - 1. See, for example, */
5595 /* Epperson 1989. */
5597 /* The iteration ends when the adjustment x*exp(-a)-1 is tiny enough. */
5598 /* This has to be calculated at the sum of the precision of x and the */
5599 /* working precision. */
5601 /* Implementation notes: */
5603 /* 1. This is separated out as decLnOp so it can be called from */
5604 /* other Mathematical functions (e.g., Log 10) with a wider range */
5605 /* than normal. In particular, it can handle the slightly wider */
5606 /* (+9+2) range needed by a power function. */
5608 /* 2. The speed of this function is about 10x slower than exp, as */
5609 /* it typically needs 4-6 iterations for short numbers, and the */
5610 /* extra precision needed adds a squaring effect, twice. */
5612 /* 3. Fastpaths are included for ln(10) and ln(2), up to length 40, */
5613 /* as these are common requests. ln(10) is used by log10(x). */
5615 /* 4. An iteration might be saved by widening the LNnn table, and */
5616 /* would certainly save at least one if it were made ten times */
5617 /* bigger, too (for truncated fractions 0.100 through 0.999). */
5618 /* However, for most practical evaluations, at least four or five */
5619 /* iterations will be neede -- so this would only speed up by */
5620 /* 20-25% and that probably does not justify increasing the table */
5623 /* 5. The static buffers are larger than might be expected to allow */
5624 /* for calls from decNumberPower. */
5625 /* ------------------------------------------------------------------ */
5626 #if defined(__clang__) || U_GCC_MAJOR_MINOR >= 406
5627 #pragma GCC diagnostic push
5628 #pragma GCC diagnostic ignored "-Warray-bounds"
5630 decNumber
* decLnOp(decNumber
*res
, const decNumber
*rhs
,
5631 decContext
*set
, uInt
*status
) {
5632 uInt ignore
=0; /* working status accumulator */
5633 uInt needbytes
; /* for space calculations */
5634 Int residue
; /* rounding residue */
5635 Int r
; /* rhs=f*10**r [see below] */
5636 Int p
; /* working precision */
5637 Int pp
; /* precision for iteration */
5640 /* buffers for a (accumulator, typically precision+2) and b */
5641 /* (adjustment calculator, same size) */
5642 decNumber bufa
[D2N(DECBUFFER
+12)];
5643 decNumber
*allocbufa
=NULL
; /* -> allocated bufa, iff allocated */
5644 decNumber
*a
=bufa
; /* accumulator/work */
5645 decNumber bufb
[D2N(DECBUFFER
*2+2)];
5646 decNumber
*allocbufb
=NULL
; /* -> allocated bufa, iff allocated */
5647 decNumber
*b
=bufb
; /* adjustment/work */
5649 decNumber numone
; /* constant 1 */
5650 decNumber cmp
; /* work */
5651 decContext aset
, bset
; /* working contexts */
5654 Int iterations
=0; /* for later sanity check */
5655 if (decCheckOperands(res
, DECUNUSED
, rhs
, set
)) return res
;
5658 do { /* protect allocated storage */
5659 if (SPECIALARG
) { /* handle infinities and NaNs */
5660 if (decNumberIsInfinite(rhs
)) { /* an infinity */
5661 if (decNumberIsNegative(rhs
)) /* -Infinity -> error */
5662 *status
|=DEC_Invalid_operation
;
5663 else uprv_decNumberCopy(res
, rhs
); /* +Infinity -> self */
5665 else decNaNs(res
, rhs
, NULL
, set
, status
); /* a NaN */
5668 if (ISZERO(rhs
)) { /* +/- zeros -> -Infinity */
5669 uprv_decNumberZero(res
); /* make clean */
5670 res
->bits
=DECINF
|DECNEG
; /* set - infinity */
5671 break;} /* [no status to set] */
5673 /* Non-zero negatives are bad... */
5674 if (decNumberIsNegative(rhs
)) { /* -x -> error */
5675 *status
|=DEC_Invalid_operation
;
5678 /* Here, rhs is positive, finite, and in range */
5680 /* lookaside fastpath code for ln(2) and ln(10) at common lengths */
5681 if (rhs
->exponent
==0 && set
->digits
<=40) {
5683 if (rhs
->lsu
[0]==0 && rhs
->lsu
[1]==1 && rhs
->digits
==2) { /* ln(10) */
5685 if (rhs
->lsu
[0]==10 && rhs
->digits
==2) { /* ln(10) */
5687 aset
=*set
; aset
.round
=DEC_ROUND_HALF_EVEN
;
5688 #define LN10 "2.302585092994045684017991454684364207601"
5689 uprv_decNumberFromString(res
, LN10
, &aset
);
5690 *status
|=(DEC_Inexact
| DEC_Rounded
); /* is inexact */
5692 if (rhs
->lsu
[0]==2 && rhs
->digits
==1) { /* ln(2) */
5693 aset
=*set
; aset
.round
=DEC_ROUND_HALF_EVEN
;
5694 #define LN2 "0.6931471805599453094172321214581765680755"
5695 uprv_decNumberFromString(res
, LN2
, &aset
);
5696 *status
|=(DEC_Inexact
| DEC_Rounded
);
5698 } /* integer and short */
5700 /* Determine the working precision. This is normally the */
5701 /* requested precision + 2, with a minimum of 9. However, if */
5702 /* the rhs is 'over-precise' then allow for all its digits to */
5703 /* potentially participate (consider an rhs where all the excess */
5704 /* digits are 9s) so in this case use rhs->digits+2. */
5705 p
=MAXI(rhs
->digits
, MAXI(set
->digits
, 7))+2;
5707 /* Allocate space for the accumulator and the high-precision */
5708 /* adjustment calculator, if necessary. The accumulator must */
5709 /* be able to hold p digits, and the adjustment up to */
5710 /* rhs->digits+p digits. They are also made big enough for 16 */
5711 /* digits so that they can be used for calculating the initial */
5713 needbytes
=sizeof(decNumber
)+(D2U(MAXI(p
,16))-1)*sizeof(Unit
);
5714 if (needbytes
>sizeof(bufa
)) { /* need malloc space */
5715 allocbufa
=(decNumber
*)malloc(needbytes
);
5716 if (allocbufa
==NULL
) { /* hopeless -- abandon */
5717 *status
|=DEC_Insufficient_storage
;
5719 a
=allocbufa
; /* use the allocated space */
5722 needbytes
=sizeof(decNumber
)+(D2U(MAXI(pp
,16))-1)*sizeof(Unit
);
5723 if (needbytes
>sizeof(bufb
)) { /* need malloc space */
5724 allocbufb
=(decNumber
*)malloc(needbytes
);
5725 if (allocbufb
==NULL
) { /* hopeless -- abandon */
5726 *status
|=DEC_Insufficient_storage
;
5728 b
=allocbufb
; /* use the allocated space */
5731 /* Prepare an initial estimate in acc. Calculate this by */
5732 /* considering the coefficient of x to be a normalized fraction, */
5733 /* f, with the decimal point at far left and multiplied by */
5734 /* 10**r. Then, rhs=f*10**r and 0.1<=f<1, and */
5735 /* ln(x) = ln(f) + ln(10)*r */
5736 /* Get the initial estimate for ln(f) from a small lookup */
5737 /* table (see above) indexed by the first two digits of f, */
5740 uprv_decContextDefault(&aset
, DEC_INIT_DECIMAL64
); /* 16-digit extended */
5741 r
=rhs
->exponent
+rhs
->digits
; /* 'normalised' exponent */
5742 uprv_decNumberFromInt32(a
, r
); /* a=r */
5743 uprv_decNumberFromInt32(b
, 2302585); /* b=ln(10) (2.302585) */
5744 b
->exponent
=-6; /* .. */
5745 decMultiplyOp(a
, a
, b
, &aset
, &ignore
); /* a=a*b */
5746 /* now get top two digits of rhs into b by simple truncate and */
5747 /* force to integer */
5748 residue
=0; /* (no residue) */
5749 aset
.digits
=2; aset
.round
=DEC_ROUND_DOWN
;
5750 decCopyFit(b
, rhs
, &aset
, &residue
, &ignore
); /* copy & shorten */
5751 b
->exponent
=0; /* make integer */
5752 t
=decGetInt(b
); /* [cannot fail] */
5753 if (t
<10) t
=X10(t
); /* adjust single-digit b */
5754 t
=LNnn
[t
-10]; /* look up ln(b) */
5755 uprv_decNumberFromInt32(b
, t
>>2); /* b=ln(b) coefficient */
5756 b
->exponent
=-(t
&3)-3; /* set exponent */
5757 b
->bits
=DECNEG
; /* ln(0.10)->ln(0.99) always -ve */
5758 aset
.digits
=16; aset
.round
=DEC_ROUND_HALF_EVEN
; /* restore */
5759 decAddOp(a
, a
, b
, &aset
, 0, &ignore
); /* acc=a+b */
5760 /* the initial estimate is now in a, with up to 4 digits correct. */
5761 /* When rhs is at or near Nmax the estimate will be low, so we */
5762 /* will approach it from below, avoiding overflow when calling exp. */
5764 uprv_decNumberZero(&numone
); *numone
.lsu
=1; /* constant 1 for adjustment */
5766 /* accumulator bounds are as requested (could underflow, but */
5767 /* cannot overflow) */
5768 aset
.emax
=set
->emax
;
5769 aset
.emin
=set
->emin
;
5770 aset
.clamp
=0; /* no concrete format */
5771 /* set up a context to be used for the multiply and subtract */
5773 bset
.emax
=DEC_MAX_MATH
*2; /* use double bounds for the */
5774 bset
.emin
=-DEC_MAX_MATH
*2; /* adjustment calculation */
5775 /* [see decExpOp call below] */
5776 /* for each iteration double the number of digits to calculate, */
5777 /* up to a maximum of p */
5778 pp
=9; /* initial precision */
5779 /* [initially 9 as then the sequence starts 7+2, 16+2, and */
5780 /* 34+2, which is ideal for standard-sized numbers] */
5781 aset
.digits
=pp
; /* working context */
5782 bset
.digits
=pp
+rhs
->digits
; /* wider context */
5783 for (;;) { /* iterate */
5786 if (iterations
>24) break; /* consider 9 * 2**24 */
5788 /* calculate the adjustment (exp(-a)*x-1) into b. This is a */
5789 /* catastrophic subtraction but it really is the difference */
5790 /* from 1 that is of interest. */
5791 /* Use the internal entry point to Exp as it allows the double */
5792 /* range for calculating exp(-a) when a is the tiniest subnormal. */
5793 a
->bits
^=DECNEG
; /* make -a */
5794 decExpOp(b
, a
, &bset
, &ignore
); /* b=exp(-a) */
5795 a
->bits
^=DECNEG
; /* restore sign of a */
5796 /* now multiply by rhs and subtract 1, at the wider precision */
5797 decMultiplyOp(b
, b
, rhs
, &bset
, &ignore
); /* b=b*rhs */
5798 decAddOp(b
, b
, &numone
, &bset
, DECNEG
, &ignore
); /* b=b-1 */
5800 /* the iteration ends when the adjustment cannot affect the */
5801 /* result by >=0.5 ulp (at the requested digits), which */
5802 /* is when its value is smaller than the accumulator by */
5803 /* set->digits+1 digits (or it is zero) -- this is a looser */
5804 /* requirement than for Exp because all that happens to the */
5805 /* accumulator after this is the final rounding (but note that */
5806 /* there must also be full precision in a, or a=0). */
5808 if (decNumberIsZero(b
) ||
5809 (a
->digits
+a
->exponent
)>=(b
->digits
+b
->exponent
+set
->digits
+1)) {
5810 if (a
->digits
==p
) break;
5811 if (decNumberIsZero(a
)) {
5812 decCompareOp(&cmp
, rhs
, &numone
, &aset
, COMPARE
, &ignore
); /* rhs=1 ? */
5813 if (cmp
.lsu
[0]==0) a
->exponent
=0; /* yes, exact 0 */
5814 else *status
|=(DEC_Inexact
| DEC_Rounded
); /* no, inexact */
5817 /* force padding if adjustment has gone to 0 before full length */
5818 if (decNumberIsZero(b
)) b
->exponent
=a
->exponent
-p
;
5821 /* not done yet ... */
5822 decAddOp(a
, a
, b
, &aset
, 0, &ignore
); /* a=a+b for next estimate */
5823 if (pp
==p
) continue; /* precision is at maximum */
5824 /* lengthen the next calculation */
5825 pp
=pp
*2; /* double precision */
5826 if (pp
>p
) pp
=p
; /* clamp to maximum */
5827 aset
.digits
=pp
; /* working context */
5828 bset
.digits
=pp
+rhs
->digits
; /* wider context */
5829 } /* Newton's iteration */
5832 /* just a sanity check; remove the test to show always */
5834 printf("Ln iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
5835 (LI
)iterations
, (LI
)*status
, (LI
)p
, (LI
)rhs
->digits
);
5838 /* Copy and round the result to res */
5839 residue
=1; /* indicate dirt to right */
5840 if (ISZERO(a
)) residue
=0; /* .. unless underflowed to 0 */
5841 aset
.digits
=set
->digits
; /* [use default rounding] */
5842 decCopyFit(res
, a
, &aset
, &residue
, status
); /* copy & shorten */
5843 decFinish(res
, set
, &residue
, status
); /* cleanup/set flags */
5844 } while(0); /* end protected */
5846 if (allocbufa
!=NULL
) free(allocbufa
); /* drop any storage used */
5847 if (allocbufb
!=NULL
) free(allocbufb
); /* .. */
5848 /* [status is handled by caller] */
5851 #if defined(__clang__) || U_GCC_MAJOR_MINOR >= 406
5852 #pragma GCC diagnostic pop
5855 /* ------------------------------------------------------------------ */
5856 /* decQuantizeOp -- force exponent to requested value */
5858 /* This computes C = op(A, B), where op adjusts the coefficient */
5859 /* of C (by rounding or shifting) such that the exponent (-scale) */
5860 /* of C has the value B or matches the exponent of B. */
5861 /* The numerical value of C will equal A, except for the effects of */
5862 /* any rounding that occurred. */
5864 /* res is C, the result. C may be A or B */
5865 /* lhs is A, the number to adjust */
5866 /* rhs is B, the requested exponent */
5867 /* set is the context */
5868 /* quant is 1 for quantize or 0 for rescale */
5869 /* status is the status accumulator (this can be called without */
5870 /* risk of control loss) */
5872 /* C must have space for set->digits digits. */
5874 /* Unless there is an error or the result is infinite, the exponent */
5875 /* after the operation is guaranteed to be that requested. */
5876 /* ------------------------------------------------------------------ */
5877 static decNumber
* decQuantizeOp(decNumber
*res
, const decNumber
*lhs
,
5878 const decNumber
*rhs
, decContext
*set
,
5879 Flag quant
, uInt
*status
) {
5881 decNumber
*alloclhs
=NULL
; /* non-NULL if rounded lhs allocated */
5882 decNumber
*allocrhs
=NULL
; /* .., rhs */
5884 const decNumber
*inrhs
=rhs
; /* save original rhs */
5885 Int reqdigits
=set
->digits
; /* requested DIGITS */
5886 Int reqexp
; /* requested exponent [-scale] */
5887 Int residue
=0; /* rounding residue */
5888 Int etiny
=set
->emin
-(reqdigits
-1);
5891 if (decCheckOperands(res
, lhs
, rhs
, set
)) return res
;
5894 do { /* protect allocated storage */
5896 if (!set
->extended
) {
5897 /* reduce operands and set lostDigits status, as needed */
5898 if (lhs
->digits
>reqdigits
) {
5899 alloclhs
=decRoundOperand(lhs
, set
, status
);
5900 if (alloclhs
==NULL
) break;
5903 if (rhs
->digits
>reqdigits
) { /* [this only checks lostDigits] */
5904 allocrhs
=decRoundOperand(rhs
, set
, status
);
5905 if (allocrhs
==NULL
) break;
5910 /* [following code does not require input rounding] */
5912 /* Handle special values */
5914 /* NaNs get usual processing */
5915 if (SPECIALARGS
& (DECSNAN
| DECNAN
))
5916 decNaNs(res
, lhs
, rhs
, set
, status
);
5917 /* one infinity but not both is bad */
5918 else if ((lhs
->bits
^ rhs
->bits
) & DECINF
)
5919 *status
|=DEC_Invalid_operation
;
5920 /* both infinity: return lhs */
5921 else uprv_decNumberCopy(res
, lhs
); /* [nop if in place] */
5925 /* set requested exponent */
5926 if (quant
) reqexp
=inrhs
->exponent
; /* quantize -- match exponents */
5927 else { /* rescale -- use value of rhs */
5928 /* Original rhs must be an integer that fits and is in range, */
5929 /* which could be from -1999999997 to +999999999, thanks to */
5931 reqexp
=decGetInt(inrhs
); /* [cannot fail] */
5935 if (!set
->extended
) etiny
=set
->emin
; /* no subnormals */
5938 if (reqexp
==BADINT
/* bad (rescale only) or .. */
5939 || reqexp
==BIGODD
|| reqexp
==BIGEVEN
/* very big (ditto) or .. */
5940 || (reqexp
<etiny
) /* < lowest */
5941 || (reqexp
>set
->emax
)) { /* > emax */
5942 *status
|=DEC_Invalid_operation
;
5945 /* the RHS has been processed, so it can be overwritten now if necessary */
5946 if (ISZERO(lhs
)) { /* zero coefficient unchanged */
5947 uprv_decNumberCopy(res
, lhs
); /* [nop if in place] */
5948 res
->exponent
=reqexp
; /* .. just set exponent */
5950 if (!set
->extended
) res
->bits
=0; /* subset specification; no -0 */
5953 else { /* non-zero lhs */
5954 Int adjust
=reqexp
-lhs
->exponent
; /* digit adjustment needed */
5955 /* if adjusted coefficient will definitely not fit, give up now */
5956 if ((lhs
->digits
-adjust
)>reqdigits
) {
5957 *status
|=DEC_Invalid_operation
;
5961 if (adjust
>0) { /* increasing exponent */
5962 /* this will decrease the length of the coefficient by adjust */
5963 /* digits, and must round as it does so */
5964 decContext workset
; /* work */
5965 workset
=*set
; /* clone rounding, etc. */
5966 workset
.digits
=lhs
->digits
-adjust
; /* set requested length */
5967 /* [note that the latter can be <1, here] */
5968 decCopyFit(res
, lhs
, &workset
, &residue
, status
); /* fit to result */
5969 decApplyRound(res
, &workset
, residue
, status
); /* .. and round */
5970 residue
=0; /* [used] */
5971 /* If just rounded a 999s case, exponent will be off by one; */
5972 /* adjust back (after checking space), if so. */
5973 if (res
->exponent
>reqexp
) {
5974 /* re-check needed, e.g., for quantize(0.9999, 0.001) under */
5975 /* set->digits==3 */
5976 if (res
->digits
==reqdigits
) { /* cannot shift by 1 */
5977 *status
&=~(DEC_Inexact
| DEC_Rounded
); /* [clean these] */
5978 *status
|=DEC_Invalid_operation
;
5981 res
->digits
=decShiftToMost(res
->lsu
, res
->digits
, 1); /* shift */
5982 res
->exponent
--; /* (re)adjust the exponent. */
5985 if (ISZERO(res
) && !set
->extended
) res
->bits
=0; /* subset; no -0 */
5988 else /* adjust<=0 */ { /* decreasing or = exponent */
5989 /* this will increase the length of the coefficient by -adjust */
5990 /* digits, by adding zero or more trailing zeros; this is */
5991 /* already checked for fit, above */
5992 uprv_decNumberCopy(res
, lhs
); /* [it will fit] */
5993 /* if padding needed (adjust<0), add it now... */
5995 res
->digits
=decShiftToMost(res
->lsu
, res
->digits
, -adjust
);
5996 res
->exponent
+=adjust
; /* adjust the exponent */
6001 /* Check for overflow [do not use Finalize in this case, as an */
6002 /* overflow here is a "don't fit" situation] */
6003 if (res
->exponent
>set
->emax
-res
->digits
+1) { /* too big */
6004 *status
|=DEC_Invalid_operation
;
6008 decFinalize(res
, set
, &residue
, status
); /* set subnormal flags */
6009 *status
&=~DEC_Underflow
; /* suppress Underflow [as per 754] */
6011 } while(0); /* end protected */
6014 if (allocrhs
!=NULL
) free(allocrhs
); /* drop any storage used */
6015 if (alloclhs
!=NULL
) free(alloclhs
); /* .. */
6018 } /* decQuantizeOp */
6020 /* ------------------------------------------------------------------ */
6021 /* decCompareOp -- compare, min, or max two Numbers */
6023 /* This computes C = A ? B and carries out one of four operations: */
6024 /* COMPARE -- returns the signum (as a number) giving the */
6025 /* result of a comparison unless one or both */
6026 /* operands is a NaN (in which case a NaN results) */
6027 /* COMPSIG -- as COMPARE except that a quiet NaN raises */
6028 /* Invalid operation. */
6029 /* COMPMAX -- returns the larger of the operands, using the */
6030 /* 754 maxnum operation */
6031 /* COMPMAXMAG -- ditto, comparing absolute values */
6032 /* COMPMIN -- the 754 minnum operation */
6033 /* COMPMINMAG -- ditto, comparing absolute values */
6034 /* COMTOTAL -- returns the signum (as a number) giving the */
6035 /* result of a comparison using 754 total ordering */
6037 /* res is C, the result. C may be A and/or B (e.g., X=X?X) */
6040 /* set is the context */
6041 /* op is the operation flag */
6042 /* status is the usual accumulator */
6044 /* C must have space for one digit for COMPARE or set->digits for */
6045 /* COMPMAX, COMPMIN, COMPMAXMAG, or COMPMINMAG. */
6046 /* ------------------------------------------------------------------ */
6047 /* The emphasis here is on speed for common cases, and avoiding */
6048 /* coefficient comparison if possible. */
6049 /* ------------------------------------------------------------------ */
6050 static decNumber
* decCompareOp(decNumber
*res
, const decNumber
*lhs
,
6051 const decNumber
*rhs
, decContext
*set
,
6052 Flag op
, uInt
*status
) {
6054 decNumber
*alloclhs
=NULL
; /* non-NULL if rounded lhs allocated */
6055 decNumber
*allocrhs
=NULL
; /* .., rhs */
6057 Int result
=0; /* default result value */
6058 uByte merged
; /* work */
6061 if (decCheckOperands(res
, lhs
, rhs
, set
)) return res
;
6064 do { /* protect allocated storage */
6066 if (!set
->extended
) {
6067 /* reduce operands and set lostDigits status, as needed */
6068 if (lhs
->digits
>set
->digits
) {
6069 alloclhs
=decRoundOperand(lhs
, set
, status
);
6070 if (alloclhs
==NULL
) {result
=BADINT
; break;}
6073 if (rhs
->digits
>set
->digits
) {
6074 allocrhs
=decRoundOperand(rhs
, set
, status
);
6075 if (allocrhs
==NULL
) {result
=BADINT
; break;}
6080 /* [following code does not require input rounding] */
6082 /* If total ordering then handle differing signs 'up front' */
6083 if (op
==COMPTOTAL
) { /* total ordering */
6084 if (decNumberIsNegative(lhs
) && !decNumberIsNegative(rhs
)) {
6088 if (!decNumberIsNegative(lhs
) && decNumberIsNegative(rhs
)) {
6094 /* handle NaNs specially; let infinities drop through */
6095 /* This assumes sNaN (even just one) leads to NaN. */
6096 merged
=(lhs
->bits
| rhs
->bits
) & (DECSNAN
| DECNAN
);
6097 if (merged
) { /* a NaN bit set */
6098 if (op
==COMPARE
); /* result will be NaN */
6099 else if (op
==COMPSIG
) /* treat qNaN as sNaN */
6100 *status
|=DEC_Invalid_operation
| DEC_sNaN
;
6101 else if (op
==COMPTOTAL
) { /* total ordering, always finite */
6102 /* signs are known to be the same; compute the ordering here */
6103 /* as if the signs are both positive, then invert for negatives */
6104 if (!decNumberIsNaN(lhs
)) result
=-1;
6105 else if (!decNumberIsNaN(rhs
)) result
=+1;
6106 /* here if both NaNs */
6107 else if (decNumberIsSNaN(lhs
) && decNumberIsQNaN(rhs
)) result
=-1;
6108 else if (decNumberIsQNaN(lhs
) && decNumberIsSNaN(rhs
)) result
=+1;
6109 else { /* both NaN or both sNaN */
6110 /* now it just depends on the payload */
6111 result
=decUnitCompare(lhs
->lsu
, D2U(lhs
->digits
),
6112 rhs
->lsu
, D2U(rhs
->digits
), 0);
6113 /* [Error not possible, as these are 'aligned'] */
6114 } /* both same NaNs */
6115 if (decNumberIsNegative(lhs
)) result
=-result
;
6119 else if (merged
& DECSNAN
); /* sNaN -> qNaN */
6120 else { /* here if MIN or MAX and one or two quiet NaNs */
6121 /* min or max -- 754 rules ignore single NaN */
6122 if (!decNumberIsNaN(lhs
) || !decNumberIsNaN(rhs
)) {
6123 /* just one NaN; force choice to be the non-NaN operand */
6125 if (lhs
->bits
& DECNAN
) result
=-1; /* pick rhs */
6126 else result
=+1; /* pick lhs */
6130 op
=COMPNAN
; /* use special path */
6131 decNaNs(res
, lhs
, rhs
, set
, status
); /* propagate NaN */
6135 if (op
==COMPMAXMAG
|| op
==COMPMINMAG
) result
=decCompare(lhs
, rhs
, 1);
6136 else result
=decCompare(lhs
, rhs
, 0); /* sign matters */
6137 } while(0); /* end protected */
6139 if (result
==BADINT
) *status
|=DEC_Insufficient_storage
; /* rare */
6141 if (op
==COMPARE
|| op
==COMPSIG
||op
==COMPTOTAL
) { /* returning signum */
6142 if (op
==COMPTOTAL
&& result
==0) {
6143 /* operands are numerically equal or same NaN (and same sign, */
6144 /* tested first); if identical, leave result 0 */
6145 if (lhs
->exponent
!=rhs
->exponent
) {
6146 if (lhs
->exponent
<rhs
->exponent
) result
=-1;
6148 if (decNumberIsNegative(lhs
)) result
=-result
;
6150 } /* total-order by exponent */
6151 uprv_decNumberZero(res
); /* [always a valid result] */
6152 if (result
!=0) { /* must be -1 or +1 */
6154 if (result
<0) res
->bits
=DECNEG
;
6157 else if (op
==COMPNAN
); /* special, drop through */
6158 else { /* MAX or MIN, non-NaN result */
6159 Int residue
=0; /* rounding accumulator */
6160 /* choose the operand for the result */
6161 const decNumber
*choice
;
6162 if (result
==0) { /* operands are numerically equal */
6163 /* choose according to sign then exponent (see 754) */
6164 uByte slhs
=(lhs
->bits
& DECNEG
);
6165 uByte srhs
=(rhs
->bits
& DECNEG
);
6167 if (!set
->extended
) { /* subset: force left-hand */
6173 if (slhs
!=srhs
) { /* signs differ */
6174 if (slhs
) result
=-1; /* rhs is max */
6175 else result
=+1; /* lhs is max */
6177 else if (slhs
&& srhs
) { /* both negative */
6178 if (lhs
->exponent
<rhs
->exponent
) result
=+1;
6180 /* [if equal, use lhs, technically identical] */
6182 else { /* both positive */
6183 if (lhs
->exponent
>rhs
->exponent
) result
=+1;
6187 } /* numerically equal */
6188 /* here result will be non-0; reverse if looking for MIN */
6189 if (op
==COMPMIN
|| op
==COMPMINMAG
) result
=-result
;
6190 choice
=(result
>0 ? lhs
: rhs
); /* choose */
6191 /* copy chosen to result, rounding if need be */
6192 decCopyFit(res
, choice
, set
, &residue
, status
);
6193 decFinish(res
, set
, &residue
, status
);
6197 if (allocrhs
!=NULL
) free(allocrhs
); /* free any storage used */
6198 if (alloclhs
!=NULL
) free(alloclhs
); /* .. */
6201 } /* decCompareOp */
6203 /* ------------------------------------------------------------------ */
6204 /* decCompare -- compare two decNumbers by numerical value */
6206 /* This routine compares A ? B without altering them. */
6208 /* Arg1 is A, a decNumber which is not a NaN */
6209 /* Arg2 is B, a decNumber which is not a NaN */
6210 /* Arg3 is 1 for a sign-independent compare, 0 otherwise */
6212 /* returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure */
6213 /* (the only possible failure is an allocation error) */
6214 /* ------------------------------------------------------------------ */
6215 static Int
decCompare(const decNumber
*lhs
, const decNumber
*rhs
,
6217 Int result
; /* result value */
6218 Int sigr
; /* rhs signum */
6219 Int compare
; /* work */
6221 result
=1; /* assume signum(lhs) */
6222 if (ISZERO(lhs
)) result
=0;
6224 if (ISZERO(rhs
)) return result
; /* LHS wins or both 0 */
6225 /* RHS is non-zero */
6226 if (result
==0) return -1; /* LHS is 0; RHS wins */
6227 /* [here, both non-zero, result=1] */
6229 else { /* signs matter */
6230 if (result
&& decNumberIsNegative(lhs
)) result
=-1;
6231 sigr
=1; /* compute signum(rhs) */
6232 if (ISZERO(rhs
)) sigr
=0;
6233 else if (decNumberIsNegative(rhs
)) sigr
=-1;
6234 if (result
> sigr
) return +1; /* L > R, return 1 */
6235 if (result
< sigr
) return -1; /* L < R, return -1 */
6236 if (result
==0) return 0; /* both 0 */
6239 /* signums are the same; both are non-zero */
6240 if ((lhs
->bits
| rhs
->bits
) & DECINF
) { /* one or more infinities */
6241 if (decNumberIsInfinite(rhs
)) {
6242 if (decNumberIsInfinite(lhs
)) result
=0;/* both infinite */
6243 else result
=-result
; /* only rhs infinite */
6247 /* must compare the coefficients, allowing for exponents */
6248 if (lhs
->exponent
>rhs
->exponent
) { /* LHS exponent larger */
6249 /* swap sides, and sign */
6250 const decNumber
*temp
=lhs
;
6255 compare
=decUnitCompare(lhs
->lsu
, D2U(lhs
->digits
),
6256 rhs
->lsu
, D2U(rhs
->digits
),
6257 rhs
->exponent
-lhs
->exponent
);
6258 if (compare
!=BADINT
) compare
*=result
; /* comparison succeeded */
6262 /* ------------------------------------------------------------------ */
6263 /* decUnitCompare -- compare two >=0 integers in Unit arrays */
6265 /* This routine compares A ? B*10**E where A and B are unit arrays */
6266 /* A is a plain integer */
6267 /* B has an exponent of E (which must be non-negative) */
6269 /* Arg1 is A first Unit (lsu) */
6270 /* Arg2 is A length in Units */
6271 /* Arg3 is B first Unit (lsu) */
6272 /* Arg4 is B length in Units */
6273 /* Arg5 is E (0 if the units are aligned) */
6275 /* returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure */
6276 /* (the only possible failure is an allocation error, which can */
6277 /* only occur if E!=0) */
6278 /* ------------------------------------------------------------------ */
6279 static Int
decUnitCompare(const Unit
*a
, Int alength
,
6280 const Unit
*b
, Int blength
, Int exp
) {
6281 Unit
*acc
; /* accumulator for result */
6282 Unit accbuff
[SD2U(DECBUFFER
*2+1)]; /* local buffer */
6283 Unit
*allocacc
=NULL
; /* -> allocated acc buffer, iff allocated */
6284 Int accunits
, need
; /* units in use or needed for acc */
6285 const Unit
*l
, *r
, *u
; /* work */
6286 Int expunits
, exprem
, result
; /* .. */
6288 if (exp
==0) { /* aligned; fastpath */
6289 if (alength
>blength
) return 1;
6290 if (alength
<blength
) return -1;
6291 /* same number of units in both -- need unit-by-unit compare */
6294 for (;l
>=a
; l
--, r
--) {
6295 if (*l
>*r
) return 1;
6296 if (*l
<*r
) return -1;
6298 return 0; /* all units match */
6301 /* Unaligned. If one is >1 unit longer than the other, padded */
6302 /* approximately, then can return easily */
6303 if (alength
>blength
+(Int
)D2U(exp
)) return 1;
6304 if (alength
+1<blength
+(Int
)D2U(exp
)) return -1;
6306 /* Need to do a real subtract. For this, a result buffer is needed */
6307 /* even though only the sign is of interest. Its length needs */
6308 /* to be the larger of alength and padded blength, +2 */
6309 need
=blength
+D2U(exp
); /* maximum real length of B */
6310 if (need
<alength
) need
=alength
;
6312 acc
=accbuff
; /* assume use local buffer */
6313 if (need
*sizeof(Unit
)>sizeof(accbuff
)) {
6314 allocacc
=(Unit
*)malloc(need
*sizeof(Unit
));
6315 if (allocacc
==NULL
) return BADINT
; /* hopeless -- abandon */
6318 /* Calculate units and remainder from exponent. */
6319 expunits
=exp
/DECDPUN
;
6321 /* subtract [A+B*(-m)] */
6322 accunits
=decUnitAddSub(a
, alength
, b
, blength
, expunits
, acc
,
6323 -(Int
)powers
[exprem
]);
6324 /* [UnitAddSub result may have leading zeros, even on zero] */
6325 if (accunits
<0) result
=-1; /* negative result */
6326 else { /* non-negative result */
6327 /* check units of the result before freeing any storage */
6328 for (u
=acc
; u
<acc
+accunits
-1 && *u
==0;) u
++;
6329 result
=(*u
==0 ? 0 : +1);
6331 /* clean up and return the result */
6332 if (allocacc
!=NULL
) free(allocacc
); /* drop any storage used */
6334 } /* decUnitCompare */
6336 /* ------------------------------------------------------------------ */
6337 /* decUnitAddSub -- add or subtract two >=0 integers in Unit arrays */
6339 /* This routine performs the calculation: */
6343 /* Where M is in the range -DECDPUNMAX through +DECDPUNMAX. */
6345 /* A may be shorter or longer than B. */
6347 /* Leading zeros are not removed after a calculation. The result is */
6348 /* either the same length as the longer of A and B (adding any */
6349 /* shift), or one Unit longer than that (if a Unit carry occurred). */
6351 /* A and B content are not altered unless C is also A or B. */
6352 /* C may be the same array as A or B, but only if no zero padding is */
6353 /* requested (that is, C may be B only if bshift==0). */
6354 /* C is filled from the lsu; only those units necessary to complete */
6355 /* the calculation are referenced. */
6357 /* Arg1 is A first Unit (lsu) */
6358 /* Arg2 is A length in Units */
6359 /* Arg3 is B first Unit (lsu) */
6360 /* Arg4 is B length in Units */
6361 /* Arg5 is B shift in Units (>=0; pads with 0 units if positive) */
6362 /* Arg6 is C first Unit (lsu) */
6363 /* Arg7 is M, the multiplier */
6365 /* returns the count of Units written to C, which will be non-zero */
6366 /* and negated if the result is negative. That is, the sign of the */
6367 /* returned Int is the sign of the result (positive for zero) and */
6368 /* the absolute value of the Int is the count of Units. */
6370 /* It is the caller's responsibility to make sure that C size is */
6371 /* safe, allowing space if necessary for a one-Unit carry. */
6373 /* This routine is severely performance-critical; *any* change here */
6374 /* must be measured (timed) to assure no performance degradation. */
6375 /* In particular, trickery here tends to be counter-productive, as */
6376 /* increased complexity of code hurts register optimizations on */
6377 /* register-poor architectures. Avoiding divisions is nearly */
6378 /* always a Good Idea, however. */
6380 /* Special thanks to Rick McGuire (IBM Cambridge, MA) and Dave Clark */
6381 /* (IBM Warwick, UK) for some of the ideas used in this routine. */
6382 /* ------------------------------------------------------------------ */
6383 static Int
decUnitAddSub(const Unit
*a
, Int alength
,
6384 const Unit
*b
, Int blength
, Int bshift
,
6386 const Unit
*alsu
=a
; /* A lsu [need to remember it] */
6387 Unit
*clsu
=c
; /* C ditto */
6388 Unit
*minC
; /* low water mark for C */
6389 Unit
*maxC
; /* high water mark for C */
6390 eInt carry
=0; /* carry integer (could be Long) */
6392 #if DECDPUN<=4 /* myriadal, millenary, etc. */
6393 Int est
; /* estimated quotient */
6397 if (alength
<1 || blength
<1)
6398 printf("decUnitAddSub: alen blen m %ld %ld [%ld]\n", alength
, blength
, m
);
6401 maxC
=c
+alength
; /* A is usually the longer */
6402 minC
=c
+blength
; /* .. and B the shorter */
6403 if (bshift
!=0) { /* B is shifted; low As copy across */
6405 /* if in place [common], skip copy unless there's a gap [rare] */
6406 if (a
==c
&& bshift
<=alength
) {
6410 else for (; c
<clsu
+bshift
; a
++, c
++) { /* copy needed */
6411 if (a
<alsu
+alength
) *c
=*a
;
6415 if (minC
>maxC
) { /* swap */
6421 /* For speed, do the addition as two loops; the first where both A */
6422 /* and B contribute, and the second (if necessary) where only one or */
6423 /* other of the numbers contribute. */
6424 /* Carry handling is the same (i.e., duplicated) in each case. */
6425 for (; c
<minC
; c
++) {
6428 carry
+=((eInt
)*b
)*m
; /* [special-casing m=1/-1 */
6429 b
++; /* here is not a win] */
6430 /* here carry is new Unit of digits; it could be +ve or -ve */
6431 if ((ueInt
)carry
<=DECDPUNMAX
) { /* fastpath 0-DECDPUNMAX */
6436 #if DECDPUN==4 /* use divide-by-multiply */
6438 est
=(((ueInt
)carry
>>11)*53687)>>18;
6439 *c
=(Unit
)(carry
-est
*(DECDPUNMAX
+1)); /* remainder */
6440 carry
=est
; /* likely quotient [89%] */
6441 if (*c
<DECDPUNMAX
+1) continue; /* estimate was correct */
6447 carry
=carry
+(eInt
)(DECDPUNMAX
+1)*(DECDPUNMAX
+1); /* make positive */
6448 est
=(((ueInt
)carry
>>11)*53687)>>18;
6449 *c
=(Unit
)(carry
-est
*(DECDPUNMAX
+1));
6450 carry
=est
-(DECDPUNMAX
+1); /* correctly negative */
6451 if (*c
<DECDPUNMAX
+1) continue; /* was OK */
6456 est
=(((ueInt
)carry
>>3)*16777)>>21;
6457 *c
=(Unit
)(carry
-est
*(DECDPUNMAX
+1)); /* remainder */
6458 carry
=est
; /* likely quotient [99%] */
6459 if (*c
<DECDPUNMAX
+1) continue; /* estimate was correct */
6465 carry
=carry
+(eInt
)(DECDPUNMAX
+1)*(DECDPUNMAX
+1); /* make positive */
6466 est
=(((ueInt
)carry
>>3)*16777)>>21;
6467 *c
=(Unit
)(carry
-est
*(DECDPUNMAX
+1));
6468 carry
=est
-(DECDPUNMAX
+1); /* correctly negative */
6469 if (*c
<DECDPUNMAX
+1) continue; /* was OK */
6473 /* Can use QUOT10 as carry <= 4 digits */
6475 est
=QUOT10(carry
, DECDPUN
);
6476 *c
=(Unit
)(carry
-est
*(DECDPUNMAX
+1)); /* remainder */
6477 carry
=est
; /* quotient */
6481 carry
=carry
+(eInt
)(DECDPUNMAX
+1)*(DECDPUNMAX
+1); /* make positive */
6482 est
=QUOT10(carry
, DECDPUN
);
6483 *c
=(Unit
)(carry
-est
*(DECDPUNMAX
+1));
6484 carry
=est
-(DECDPUNMAX
+1); /* correctly negative */
6486 /* remainder operator is undefined if negative, so must test */
6487 if ((ueInt
)carry
<(DECDPUNMAX
+1)*2) { /* fastpath carry +1 */
6488 *c
=(Unit
)(carry
-(DECDPUNMAX
+1)); /* [helps additions] */
6493 *c
=(Unit
)(carry
%(DECDPUNMAX
+1));
6494 carry
=carry
/(DECDPUNMAX
+1);
6498 carry
=carry
+(eInt
)(DECDPUNMAX
+1)*(DECDPUNMAX
+1); /* make positive */
6499 *c
=(Unit
)(carry
%(DECDPUNMAX
+1));
6500 carry
=carry
/(DECDPUNMAX
+1)-(DECDPUNMAX
+1);
6504 /* now may have one or other to complete */
6505 /* [pretest to avoid loop setup/shutdown] */
6506 if (c
<maxC
) for (; c
<maxC
; c
++) {
6507 if (a
<alsu
+alength
) { /* still in A */
6511 else { /* inside B */
6512 carry
+=((eInt
)*b
)*m
;
6515 /* here carry is new Unit of digits; it could be +ve or -ve and */
6516 /* magnitude up to DECDPUNMAX squared */
6517 if ((ueInt
)carry
<=DECDPUNMAX
) { /* fastpath 0-DECDPUNMAX */
6522 /* result for this unit is negative or >DECDPUNMAX */
6523 #if DECDPUN==4 /* use divide-by-multiply */
6525 est
=(((ueInt
)carry
>>11)*53687)>>18;
6526 *c
=(Unit
)(carry
-est
*(DECDPUNMAX
+1)); /* remainder */
6527 carry
=est
; /* likely quotient [79.7%] */
6528 if (*c
<DECDPUNMAX
+1) continue; /* estimate was correct */
6534 carry
=carry
+(eInt
)(DECDPUNMAX
+1)*(DECDPUNMAX
+1); /* make positive */
6535 est
=(((ueInt
)carry
>>11)*53687)>>18;
6536 *c
=(Unit
)(carry
-est
*(DECDPUNMAX
+1));
6537 carry
=est
-(DECDPUNMAX
+1); /* correctly negative */
6538 if (*c
<DECDPUNMAX
+1) continue; /* was OK */
6543 est
=(((ueInt
)carry
>>3)*16777)>>21;
6544 *c
=(Unit
)(carry
-est
*(DECDPUNMAX
+1)); /* remainder */
6545 carry
=est
; /* likely quotient [99%] */
6546 if (*c
<DECDPUNMAX
+1) continue; /* estimate was correct */
6552 carry
=carry
+(eInt
)(DECDPUNMAX
+1)*(DECDPUNMAX
+1); /* make positive */
6553 est
=(((ueInt
)carry
>>3)*16777)>>21;
6554 *c
=(Unit
)(carry
-est
*(DECDPUNMAX
+1));
6555 carry
=est
-(DECDPUNMAX
+1); /* correctly negative */
6556 if (*c
<DECDPUNMAX
+1) continue; /* was OK */
6561 est
=QUOT10(carry
, DECDPUN
);
6562 *c
=(Unit
)(carry
-est
*(DECDPUNMAX
+1)); /* remainder */
6563 carry
=est
; /* quotient */
6567 carry
=carry
+(eInt
)(DECDPUNMAX
+1)*(DECDPUNMAX
+1); /* make positive */
6568 est
=QUOT10(carry
, DECDPUN
);
6569 *c
=(Unit
)(carry
-est
*(DECDPUNMAX
+1));
6570 carry
=est
-(DECDPUNMAX
+1); /* correctly negative */
6572 if ((ueInt
)carry
<(DECDPUNMAX
+1)*2){ /* fastpath carry 1 */
6573 *c
=(Unit
)(carry
-(DECDPUNMAX
+1));
6577 /* remainder operator is undefined if negative, so must test */
6579 *c
=(Unit
)(carry
%(DECDPUNMAX
+1));
6580 carry
=carry
/(DECDPUNMAX
+1);
6584 carry
=carry
+(eInt
)(DECDPUNMAX
+1)*(DECDPUNMAX
+1); /* make positive */
6585 *c
=(Unit
)(carry
%(DECDPUNMAX
+1));
6586 carry
=carry
/(DECDPUNMAX
+1)-(DECDPUNMAX
+1);
6590 /* OK, all A and B processed; might still have carry or borrow */
6591 /* return number of Units in the result, negated if a borrow */
6592 if (carry
==0) return static_cast<int32_t>(c
-clsu
); /* no carry, so no more to do */
6593 if (carry
>0) { /* positive carry */
6594 *c
=(Unit
)carry
; /* place as new unit */
6596 return static_cast<int32_t>(c
-clsu
);
6598 /* -ve carry: it's a borrow; complement needed */
6599 add
=1; /* temporary carry... */
6600 for (c
=clsu
; c
<maxC
; c
++) {
6601 add
=DECDPUNMAX
+add
-*c
;
6602 if (add
<=DECDPUNMAX
) {
6611 /* add an extra unit iff it would be non-zero */
6613 printf("UAS borrow: add %ld, carry %ld\n", add
, carry
);
6615 if ((add
-carry
-1)!=0) {
6616 *c
=(Unit
)(add
-carry
-1);
6617 c
++; /* interesting, include it */
6619 return static_cast<int32_t>(clsu
-c
); /* -ve result indicates borrowed */
6620 } /* decUnitAddSub */
6622 /* ------------------------------------------------------------------ */
6623 /* decTrim -- trim trailing zeros or normalize */
6625 /* dn is the number to trim or normalize */
6626 /* set is the context to use to check for clamp */
6627 /* all is 1 to remove all trailing zeros, 0 for just fraction ones */
6628 /* noclamp is 1 to unconditional (unclamped) trim */
6629 /* dropped returns the number of discarded trailing zeros */
6632 /* If clamp is set in the context then the number of zeros trimmed */
6633 /* may be limited if the exponent is high. */
6634 /* All fields are updated as required. This is a utility operation, */
6635 /* so special values are unchanged and no error is possible. */
6636 /* ------------------------------------------------------------------ */
6637 static decNumber
* decTrim(decNumber
*dn
, decContext
*set
, Flag all
,
6638 Flag noclamp
, Int
*dropped
) {
6639 Int d
, exp
; /* work */
6641 Unit
*up
; /* -> current Unit */
6644 if (decCheckOperands(dn
, DECUNUSED
, DECUNUSED
, DECUNCONT
)) return dn
;
6647 *dropped
=0; /* assume no zeros dropped */
6648 if ((dn
->bits
& DECSPECIAL
) /* fast exit if special .. */
6649 || (*dn
->lsu
& 0x01)) return dn
; /* .. or odd */
6650 if (ISZERO(dn
)) { /* .. or 0 */
6651 dn
->exponent
=0; /* (sign is preserved) */
6655 /* have a finite number which is even */
6657 cut
=1; /* digit (1-DECDPUN) in Unit */
6658 up
=dn
->lsu
; /* -> current Unit */
6659 for (d
=0; d
<dn
->digits
-1; d
++) { /* [don't strip the final digit] */
6660 /* slice by powers */
6662 uInt quot
=QUOT10(*up
, cut
);
6663 if ((*up
-quot
*powers
[cut
])!=0) break; /* found non-0 digit */
6665 if (*up%powers
[cut
]!=0) break; /* found non-0 digit */
6667 /* have a trailing 0 */
6668 if (!all
) { /* trimming */
6669 /* [if exp>0 then all trailing 0s are significant for trim] */
6670 if (exp
<=0) { /* if digit might be significant */
6671 if (exp
==0) break; /* then quit */
6672 exp
++; /* next digit might be significant */
6675 cut
++; /* next power */
6676 if (cut
>DECDPUN
) { /* need new Unit */
6681 if (d
==0) return dn
; /* none to drop */
6683 /* may need to limit drop if clamping */
6684 if (set
->clamp
&& !noclamp
) {
6685 Int maxd
=set
->emax
-set
->digits
+1-dn
->exponent
;
6686 if (maxd
<=0) return dn
; /* nothing possible */
6690 /* effect the drop */
6691 decShiftToLeast(dn
->lsu
, D2U(dn
->digits
), d
);
6692 dn
->exponent
+=d
; /* maintain numerical value */
6693 dn
->digits
-=d
; /* new length */
6694 *dropped
=d
; /* report the count */
6698 /* ------------------------------------------------------------------ */
6699 /* decReverse -- reverse a Unit array in place */
6701 /* ulo is the start of the array */
6702 /* uhi is the end of the array (highest Unit to include) */
6704 /* The units ulo through uhi are reversed in place (if the number */
6705 /* of units is odd, the middle one is untouched). Note that the */
6706 /* digit(s) in each unit are unaffected. */
6707 /* ------------------------------------------------------------------ */
6708 static void decReverse(Unit
*ulo
, Unit
*uhi
) {
6710 for (; ulo
<uhi
; ulo
++, uhi
--) {
6718 /* ------------------------------------------------------------------ */
6719 /* decShiftToMost -- shift digits in array towards most significant */
6721 /* uar is the array */
6722 /* digits is the count of digits in use in the array */
6723 /* shift is the number of zeros to pad with (least significant); */
6724 /* it must be zero or positive */
6726 /* returns the new length of the integer in the array, in digits */
6728 /* No overflow is permitted (that is, the uar array must be known to */
6729 /* be large enough to hold the result, after shifting). */
6730 /* ------------------------------------------------------------------ */
6731 static Int
decShiftToMost(Unit
*uar
, Int digits
, Int shift
) {
6732 Unit
*target
, *source
, *first
; /* work */
6733 Int cut
; /* odd 0's to add */
6734 uInt next
; /* work */
6736 if (shift
==0) return digits
; /* [fastpath] nothing to do */
6737 if ((digits
+shift
)<=DECDPUN
) { /* [fastpath] single-unit case */
6738 *uar
=(Unit
)(*uar
*powers
[shift
]);
6739 return digits
+shift
;
6742 next
=0; /* all paths */
6743 source
=uar
+D2U(digits
)-1; /* where msu comes from */
6744 target
=source
+D2U(shift
); /* where upper part of first cut goes */
6745 cut
=DECDPUN
-MSUDIGITS(shift
); /* where to slice */
6746 if (cut
==0) { /* unit-boundary case */
6747 for (; source
>=uar
; source
--, target
--) *target
=*source
;
6750 first
=uar
+D2U(digits
+shift
)-1; /* where msu of source will end up */
6751 for (; source
>=uar
; source
--, target
--) {
6752 /* split the source Unit and accumulate remainder for next */
6754 uInt quot
=QUOT10(*source
, cut
);
6755 uInt rem
=*source
-quot
*powers
[cut
];
6758 uInt rem
=*source%powers
[cut
];
6759 next
+=*source
/powers
[cut
];
6761 if (target
<=first
) *target
=(Unit
)next
; /* write to target iff valid */
6762 next
=rem
*powers
[DECDPUN
-cut
]; /* save remainder for next Unit */
6766 /* propagate any partial unit to one below and clear the rest */
6767 for (; target
>=uar
; target
--) {
6771 return digits
+shift
;
6772 } /* decShiftToMost */
6774 /* ------------------------------------------------------------------ */
6775 /* decShiftToLeast -- shift digits in array towards least significant */
6777 /* uar is the array */
6778 /* units is length of the array, in units */
6779 /* shift is the number of digits to remove from the lsu end; it */
6780 /* must be zero or positive and <= than units*DECDPUN. */
6782 /* returns the new length of the integer in the array, in units */
6784 /* Removed digits are discarded (lost). Units not required to hold */
6785 /* the final result are unchanged. */
6786 /* ------------------------------------------------------------------ */
6787 static Int
decShiftToLeast(Unit
*uar
, Int units
, Int shift
) {
6788 Unit
*target
, *up
; /* work */
6789 Int cut
, count
; /* work */
6790 Int quot
, rem
; /* for division */
6792 if (shift
==0) return units
; /* [fastpath] nothing to do */
6793 if (shift
==units
*DECDPUN
) { /* [fastpath] little to do */
6794 *uar
=0; /* all digits cleared gives zero */
6795 return 1; /* leaves just the one */
6798 target
=uar
; /* both paths */
6799 cut
=MSUDIGITS(shift
);
6800 if (cut
==DECDPUN
) { /* unit-boundary case; easy */
6802 for (; up
<uar
+units
; target
++, up
++) *target
=*up
;
6803 return static_cast<int32_t>(target
-uar
);
6807 up
=uar
+D2U(shift
-cut
); /* source; correct to whole Units */
6808 count
=units
*DECDPUN
-shift
; /* the maximum new length */
6810 quot
=QUOT10(*up
, cut
);
6812 quot
=*up
/powers
[cut
];
6814 for (; ; target
++) {
6816 count
-=(DECDPUN
-cut
);
6817 if (count
<=0) break;
6821 quot
=QUOT10(quot
, cut
);
6822 rem
=*up
-quot
*powers
[cut
];
6824 rem
=quot%powers
[cut
];
6825 quot
=quot
/powers
[cut
];
6827 *target
=(Unit
)(*target
+rem
*powers
[DECDPUN
-cut
]);
6829 if (count
<=0) break;
6831 return static_cast<int32_t>(target
-uar
+1);
6832 } /* decShiftToLeast */
6835 /* ------------------------------------------------------------------ */
6836 /* decRoundOperand -- round an operand [used for subset only] */
6838 /* dn is the number to round (dn->digits is > set->digits) */
6839 /* set is the relevant context */
6840 /* status is the status accumulator */
6842 /* returns an allocated decNumber with the rounded result. */
6844 /* lostDigits and other status may be set by this. */
6846 /* Since the input is an operand, it must not be modified. */
6847 /* Instead, return an allocated decNumber, rounded as required. */
6848 /* It is the caller's responsibility to free the allocated storage. */
6850 /* If no storage is available then the result cannot be used, so NULL */
6852 /* ------------------------------------------------------------------ */
6853 static decNumber
*decRoundOperand(const decNumber
*dn
, decContext
*set
,
6855 decNumber
*res
; /* result structure */
6856 uInt newstatus
=0; /* status from round */
6857 Int residue
=0; /* rounding accumulator */
6859 /* Allocate storage for the returned decNumber, big enough for the */
6860 /* length specified by the context */
6861 res
=(decNumber
*)malloc(sizeof(decNumber
)
6862 +(D2U(set
->digits
)-1)*sizeof(Unit
));
6864 *status
|=DEC_Insufficient_storage
;
6867 decCopyFit(res
, dn
, set
, &residue
, &newstatus
);
6868 decApplyRound(res
, set
, residue
, &newstatus
);
6870 /* If that set Inexact then "lost digits" is raised... */
6871 if (newstatus
& DEC_Inexact
) newstatus
|=DEC_Lost_digits
;
6874 } /* decRoundOperand */
6877 /* ------------------------------------------------------------------ */
6878 /* decCopyFit -- copy a number, truncating the coefficient if needed */
6880 /* dest is the target decNumber */
6881 /* src is the source decNumber */
6882 /* set is the context [used for length (digits) and rounding mode] */
6883 /* residue is the residue accumulator */
6884 /* status contains the current status to be updated */
6886 /* (dest==src is allowed and will be a no-op if fits) */
6887 /* All fields are updated as required. */
6888 /* ------------------------------------------------------------------ */
6889 static void decCopyFit(decNumber
*dest
, const decNumber
*src
,
6890 decContext
*set
, Int
*residue
, uInt
*status
) {
6891 dest
->bits
=src
->bits
;
6892 dest
->exponent
=src
->exponent
;
6893 decSetCoeff(dest
, set
, src
->lsu
, src
->digits
, residue
, status
);
6896 /* ------------------------------------------------------------------ */
6897 /* decSetCoeff -- set the coefficient of a number */
6899 /* dn is the number whose coefficient array is to be set. */
6900 /* It must have space for set->digits digits */
6901 /* set is the context [for size] */
6902 /* lsu -> lsu of the source coefficient [may be dn->lsu] */
6903 /* len is digits in the source coefficient [may be dn->digits] */
6904 /* residue is the residue accumulator. This has values as in */
6905 /* decApplyRound, and will be unchanged unless the */
6906 /* target size is less than len. In this case, the */
6907 /* coefficient is truncated and the residue is updated to */
6908 /* reflect the previous residue and the dropped digits. */
6909 /* status is the status accumulator, as usual */
6911 /* The coefficient may already be in the number, or it can be an */
6912 /* external intermediate array. If it is in the number, lsu must == */
6913 /* dn->lsu and len must == dn->digits. */
6915 /* Note that the coefficient length (len) may be < set->digits, and */
6916 /* in this case this merely copies the coefficient (or is a no-op */
6917 /* if dn->lsu==lsu). */
6919 /* Note also that (only internally, from decQuantizeOp and */
6920 /* decSetSubnormal) the value of set->digits may be less than one, */
6921 /* indicating a round to left. This routine handles that case */
6922 /* correctly; caller ensures space. */
6924 /* dn->digits, dn->lsu (and as required), and dn->exponent are */
6925 /* updated as necessary. dn->bits (sign) is unchanged. */
6927 /* DEC_Rounded status is set if any digits are discarded. */
6928 /* DEC_Inexact status is set if any non-zero digits are discarded, or */
6929 /* incoming residue was non-0 (implies rounded) */
6930 /* ------------------------------------------------------------------ */
6931 /* mapping array: maps 0-9 to canonical residues, so that a residue */
6932 /* can be adjusted in the range [-1, +1] and achieve correct rounding */
6933 /* 0 1 2 3 4 5 6 7 8 9 */
6934 static const uByte resmap
[10]={0, 3, 3, 3, 3, 5, 7, 7, 7, 7};
6935 static void decSetCoeff(decNumber
*dn
, decContext
*set
, const Unit
*lsu
,
6936 Int len
, Int
*residue
, uInt
*status
) {
6937 Int discard
; /* number of digits to discard */
6938 uInt cut
; /* cut point in Unit */
6939 const Unit
*up
; /* work */
6940 Unit
*target
; /* .. */
6946 discard
=len
-set
->digits
; /* digits to discard */
6947 if (discard
<=0) { /* no digits are being discarded */
6948 if (dn
->lsu
!=lsu
) { /* copy needed */
6949 /* copy the coefficient array to the result number; no shift needed */
6950 count
=len
; /* avoids D2U */
6952 for (target
=dn
->lsu
; count
>0; target
++, up
++, count
-=DECDPUN
)
6954 dn
->digits
=len
; /* set the new length */
6956 /* dn->exponent and residue are unchanged, record any inexactitude */
6957 if (*residue
!=0) *status
|=(DEC_Inexact
| DEC_Rounded
);
6961 /* some digits must be discarded ... */
6962 dn
->exponent
+=discard
; /* maintain numerical value */
6963 *status
|=DEC_Rounded
; /* accumulate Rounded status */
6964 if (*residue
>1) *residue
=1; /* previous residue now to right, so reduce */
6966 if (discard
>len
) { /* everything, +1, is being discarded */
6967 /* guard digit is 0 */
6968 /* residue is all the number [NB could be all 0s] */
6969 if (*residue
<=0) { /* not already positive */
6970 count
=len
; /* avoids D2U */
6971 for (up
=lsu
; count
>0; up
++, count
-=DECDPUN
) if (*up
!=0) { /* found non-0 */
6973 break; /* no need to check any others */
6976 if (*residue
!=0) *status
|=DEC_Inexact
; /* record inexactitude */
6977 *dn
->lsu
=0; /* coefficient will now be 0 */
6978 dn
->digits
=1; /* .. */
6980 } /* total discard */
6982 /* partial discard [most common case] */
6983 /* here, at least the first (most significant) discarded digit exists */
6985 /* spin up the number, noting residue during the spin, until get to */
6986 /* the Unit with the first discarded digit. When reach it, extract */
6987 /* it and remember its position */
6989 for (up
=lsu
;; up
++) {
6991 if (count
>=discard
) break; /* full ones all checked */
6992 if (*up
!=0) *residue
=1;
6995 /* here up -> Unit with first discarded digit */
6996 cut
=discard
-(count
-DECDPUN
)-1;
6997 if (cut
==DECDPUN
-1) { /* unit-boundary case (fast) */
6998 Unit half
=(Unit
)powers
[DECDPUN
]>>1;
6999 /* set residue directly */
7001 if (*up
>half
) *residue
=7;
7002 else *residue
+=5; /* add sticky bit */
7005 if (*up
!=0) *residue
=3; /* [else is 0, leave as sticky bit] */
7007 if (set
->digits
<=0) { /* special for Quantize/Subnormal :-( */
7008 *dn
->lsu
=0; /* .. result is 0 */
7009 dn
->digits
=1; /* .. */
7011 else { /* shift to least */
7012 count
=set
->digits
; /* now digits to end up with */
7013 dn
->digits
=count
; /* set the new length */
7014 up
++; /* move to next */
7015 /* on unit boundary, so shift-down copy loop is simple */
7016 for (target
=dn
->lsu
; count
>0; target
++, up
++, count
-=DECDPUN
)
7019 } /* unit-boundary case */
7021 else { /* discard digit is in low digit(s), and not top digit */
7022 uInt discard1
; /* first discarded digit */
7023 uInt quot
, rem
; /* for divisions */
7024 if (cut
==0) quot
=*up
; /* is at bottom of unit */
7025 else /* cut>0 */ { /* it's not at bottom of unit */
7027 U_ASSERT(/* cut >= 0 &&*/ cut
<= 4);
7028 quot
=QUOT10(*up
, cut
);
7029 rem
=*up
-quot
*powers
[cut
];
7031 rem
=*up%powers
[cut
];
7032 quot
=*up
/powers
[cut
];
7034 if (rem
!=0) *residue
=1;
7036 /* discard digit is now at bottom of quot */
7038 temp
=(quot
*6554)>>16; /* fast /10 */
7039 /* Vowels algorithm here not a win (9 instructions) */
7040 discard1
=quot
-X10(temp
);
7046 /* here, discard1 is the guard digit, and residue is everything */
7047 /* else [use mapping array to accumulate residue safely] */
7048 *residue
+=resmap
[discard1
];
7049 cut
++; /* update cut */
7050 /* here: up -> Unit of the array with bottom digit */
7051 /* cut is the division point for each Unit */
7052 /* quot holds the uncut high-order digits for the current unit */
7053 if (set
->digits
<=0) { /* special for Quantize/Subnormal :-( */
7054 *dn
->lsu
=0; /* .. result is 0 */
7055 dn
->digits
=1; /* .. */
7057 else { /* shift to least needed */
7058 count
=set
->digits
; /* now digits to end up with */
7059 dn
->digits
=count
; /* set the new length */
7060 /* shift-copy the coefficient array to the result number */
7061 for (target
=dn
->lsu
; ; target
++) {
7063 count
-=(DECDPUN
-cut
);
7064 if (count
<=0) break;
7068 quot
=QUOT10(quot
, cut
);
7069 rem
=*up
-quot
*powers
[cut
];
7071 rem
=quot%powers
[cut
];
7072 quot
=quot
/powers
[cut
];
7074 *target
=(Unit
)(*target
+rem
*powers
[DECDPUN
-cut
]);
7076 if (count
<=0) break;
7077 } /* shift-copy loop */
7078 } /* shift to least */
7079 } /* not unit boundary */
7081 if (*residue
!=0) *status
|=DEC_Inexact
; /* record inexactitude */
7085 /* ------------------------------------------------------------------ */
7086 /* decApplyRound -- apply pending rounding to a number */
7088 /* dn is the number, with space for set->digits digits */
7089 /* set is the context [for size and rounding mode] */
7090 /* residue indicates pending rounding, being any accumulated */
7091 /* guard and sticky information. It may be: */
7092 /* 6-9: rounding digit is >5 */
7093 /* 5: rounding digit is exactly half-way */
7094 /* 1-4: rounding digit is <5 and >0 */
7095 /* 0: the coefficient is exact */
7096 /* -1: as 1, but the hidden digits are subtractive, that */
7097 /* is, of the opposite sign to dn. In this case the */
7098 /* coefficient must be non-0. This case occurs when */
7099 /* subtracting a small number (which can be reduced to */
7100 /* a sticky bit); see decAddOp. */
7101 /* status is the status accumulator, as usual */
7103 /* This routine applies rounding while keeping the length of the */
7104 /* coefficient constant. The exponent and status are unchanged */
7107 /* -- the coefficient was increased and is all nines (in which */
7108 /* case Overflow could occur, and is handled directly here so */
7109 /* the caller does not need to re-test for overflow) */
7111 /* -- the coefficient was decreased and becomes all nines (in which */
7112 /* case Underflow could occur, and is also handled directly). */
7114 /* All fields in dn are updated as required. */
7116 /* ------------------------------------------------------------------ */
7117 static void decApplyRound(decNumber
*dn
, decContext
*set
, Int residue
,
7119 Int bump
; /* 1 if coefficient needs to be incremented */
7120 /* -1 if coefficient needs to be decremented */
7122 if (residue
==0) return; /* nothing to apply */
7124 bump
=0; /* assume a smooth ride */
7126 /* now decide whether, and how, to round, depending on mode */
7127 switch (set
->round
) {
7128 case DEC_ROUND_05UP
: { /* round zero or five up (for reround) */
7129 /* This is the same as DEC_ROUND_DOWN unless there is a */
7130 /* positive residue and the lsd of dn is 0 or 5, in which case */
7131 /* it is bumped; when residue is <0, the number is therefore */
7132 /* bumped down unless the final digit was 1 or 6 (in which */
7133 /* case it is bumped down and then up -- a no-op) */
7134 Int lsd5
=*dn
->lsu%5
; /* get lsd and quintate */
7135 if (residue
<0 && lsd5
!=1) bump
=-1;
7136 else if (residue
>0 && lsd5
==0) bump
=1;
7137 /* [bump==1 could be applied directly; use common path for clarity] */
7140 case DEC_ROUND_DOWN
: {
7141 /* no change, except if negative residue */
7142 if (residue
<0) bump
=-1;
7145 case DEC_ROUND_HALF_DOWN
: {
7146 if (residue
>5) bump
=1;
7149 case DEC_ROUND_HALF_EVEN
: {
7150 if (residue
>5) bump
=1; /* >0.5 goes up */
7151 else if (residue
==5) { /* exactly 0.5000... */
7152 /* 0.5 goes up iff [new] lsd is odd */
7153 if (*dn
->lsu
& 0x01) bump
=1;
7157 case DEC_ROUND_HALF_UP
: {
7158 if (residue
>=5) bump
=1;
7161 case DEC_ROUND_UP
: {
7162 if (residue
>0) bump
=1;
7165 case DEC_ROUND_CEILING
: {
7166 /* same as _UP for positive numbers, and as _DOWN for negatives */
7167 /* [negative residue cannot occur on 0] */
7168 if (decNumberIsNegative(dn
)) {
7169 if (residue
<0) bump
=-1;
7172 if (residue
>0) bump
=1;
7176 case DEC_ROUND_FLOOR
: {
7177 /* same as _UP for negative numbers, and as _DOWN for positive */
7178 /* [negative residue cannot occur on 0] */
7179 if (!decNumberIsNegative(dn
)) {
7180 if (residue
<0) bump
=-1;
7183 if (residue
>0) bump
=1;
7187 default: { /* e.g., DEC_ROUND_MAX */
7188 *status
|=DEC_Invalid_context
;
7189 #if DECTRACE || (DECCHECK && DECVERB)
7190 printf("Unknown rounding mode: %d\n", set
->round
);
7195 /* now bump the number, up or down, if need be */
7196 if (bump
==0) return; /* no action required */
7198 /* Simply use decUnitAddSub unless bumping up and the number is */
7199 /* all nines. In this special case set to 100... explicitly */
7200 /* and adjust the exponent by one (as otherwise could overflow */
7202 /* Similarly handle all-nines result if bumping down. */
7204 Unit
*up
; /* work */
7205 uInt count
=dn
->digits
; /* digits to be checked */
7206 for (up
=dn
->lsu
; ; up
++) {
7207 if (count
<=DECDPUN
) {
7208 /* this is the last Unit (the msu) */
7209 if (*up
!=powers
[count
]-1) break; /* not still 9s */
7210 /* here if it, too, is all nines */
7211 *up
=(Unit
)powers
[count
-1]; /* here 999 -> 100 etc. */
7212 for (up
=up
-1; up
>=dn
->lsu
; up
--) *up
=0; /* others all to 0 */
7213 dn
->exponent
++; /* and bump exponent */
7214 /* [which, very rarely, could cause Overflow...] */
7215 if ((dn
->exponent
+dn
->digits
)>set
->emax
+1) {
7216 decSetOverflow(dn
, set
, status
);
7220 /* a full unit to check, with more to come */
7221 if (*up
!=DECDPUNMAX
) break; /* not still 9s */
7226 /* here checking for a pre-bump of 1000... (leading 1, all */
7227 /* other digits zero) */
7228 Unit
*up
, *sup
; /* work */
7229 uInt count
=dn
->digits
; /* digits to be checked */
7230 for (up
=dn
->lsu
; ; up
++) {
7231 if (count
<=DECDPUN
) {
7232 /* this is the last Unit (the msu) */
7233 if (*up
!=powers
[count
-1]) break; /* not 100.. */
7234 /* here if have the 1000... case */
7235 sup
=up
; /* save msu pointer */
7236 *up
=(Unit
)powers
[count
]-1; /* here 100 in msu -> 999 */
7237 /* others all to all-nines, too */
7238 for (up
=up
-1; up
>=dn
->lsu
; up
--) *up
=(Unit
)powers
[DECDPUN
]-1;
7239 dn
->exponent
--; /* and bump exponent */
7241 /* iff the number was at the subnormal boundary (exponent=etiny) */
7242 /* then the exponent is now out of range, so it will in fact get */
7243 /* clamped to etiny and the final 9 dropped. */
7244 /* printf(">> emin=%d exp=%d sdig=%d\n", set->emin, */
7245 /* dn->exponent, set->digits); */
7246 if (dn
->exponent
+1==set
->emin
-set
->digits
+1) {
7247 if (count
==1 && dn
->digits
==1) *sup
=0; /* here 9 -> 0[.9] */
7249 *sup
=(Unit
)powers
[count
-1]-1; /* here 999.. in msu -> 99.. */
7253 *status
|=DEC_Underflow
| DEC_Subnormal
| DEC_Inexact
| DEC_Rounded
;
7258 /* a full unit to check, with more to come */
7259 if (*up
!=0) break; /* not still 0s */
7265 /* Actual bump needed. Do it. */
7266 decUnitAddSub(dn
->lsu
, D2U(dn
->digits
), uarrone
, 1, 0, dn
->lsu
, bump
);
7267 } /* decApplyRound */
7270 /* ------------------------------------------------------------------ */
7271 /* decFinish -- finish processing a number */
7273 /* dn is the number */
7274 /* set is the context */
7275 /* residue is the rounding accumulator (as in decApplyRound) */
7276 /* status is the accumulator */
7278 /* This finishes off the current number by: */
7279 /* 1. If not extended: */
7280 /* a. Converting a zero result to clean '0' */
7281 /* b. Reducing positive exponents to 0, if would fit in digits */
7282 /* 2. Checking for overflow and subnormals (always) */
7283 /* Note this is just Finalize when no subset arithmetic. */
7284 /* All fields are updated as required. */
7285 /* ------------------------------------------------------------------ */
7286 static void decFinish(decNumber
*dn
, decContext
*set
, Int
*residue
,
7288 if (!set
->extended
) {
7289 if ISZERO(dn
) { /* value is zero */
7290 dn
->exponent
=0; /* clean exponent .. */
7291 dn
->bits
=0; /* .. and sign */
7292 return; /* no error possible */
7294 if (dn
->exponent
>=0) { /* non-negative exponent */
7295 /* >0; reduce to integer if possible */
7296 if (set
->digits
>= (dn
->exponent
+dn
->digits
)) {
7297 dn
->digits
=decShiftToMost(dn
->lsu
, dn
->digits
, dn
->exponent
);
7303 decFinalize(dn
, set
, residue
, status
);
7307 /* ------------------------------------------------------------------ */
7308 /* decFinalize -- final check, clamp, and round of a number */
7310 /* dn is the number */
7311 /* set is the context */
7312 /* residue is the rounding accumulator (as in decApplyRound) */
7313 /* status is the status accumulator */
7315 /* This finishes off the current number by checking for subnormal */
7316 /* results, applying any pending rounding, checking for overflow, */
7317 /* and applying any clamping. */
7318 /* Underflow and overflow conditions are raised as appropriate. */
7319 /* All fields are updated as required. */
7320 /* ------------------------------------------------------------------ */
7321 static void decFinalize(decNumber
*dn
, decContext
*set
, Int
*residue
,
7323 Int shift
; /* shift needed if clamping */
7324 Int tinyexp
=set
->emin
-dn
->digits
+1; /* precalculate subnormal boundary */
7326 /* Must be careful, here, when checking the exponent as the */
7327 /* adjusted exponent could overflow 31 bits [because it may already */
7328 /* be up to twice the expected]. */
7330 /* First test for subnormal. This must be done before any final */
7331 /* round as the result could be rounded to Nmin or 0. */
7332 if (dn
->exponent
<=tinyexp
) { /* prefilter */
7335 /* A very nasty case here is dn == Nmin and residue<0 */
7336 if (dn
->exponent
<tinyexp
) {
7337 /* Go handle subnormals; this will apply round if needed. */
7338 decSetSubnormal(dn
, set
, residue
, status
);
7341 /* Equals case: only subnormal if dn=Nmin and negative residue */
7342 uprv_decNumberZero(&nmin
);
7344 nmin
.exponent
=set
->emin
;
7345 comp
=decCompare(dn
, &nmin
, 1); /* (signless compare) */
7346 if (comp
==BADINT
) { /* oops */
7347 *status
|=DEC_Insufficient_storage
; /* abandon... */
7350 if (*residue
<0 && comp
==0) { /* neg residue and dn==Nmin */
7351 decApplyRound(dn
, set
, *residue
, status
); /* might force down */
7352 decSetSubnormal(dn
, set
, residue
, status
);
7357 /* now apply any pending round (this could raise overflow). */
7358 if (*residue
!=0) decApplyRound(dn
, set
, *residue
, status
);
7360 /* Check for overflow [redundant in the 'rare' case] or clamp */
7361 if (dn
->exponent
<=set
->emax
-set
->digits
+1) return; /* neither needed */
7364 /* here when might have an overflow or clamp to do */
7365 if (dn
->exponent
>set
->emax
-dn
->digits
+1) { /* too big */
7366 decSetOverflow(dn
, set
, status
);
7369 /* here when the result is normal but in clamp range */
7370 if (!set
->clamp
) return;
7372 /* here when need to apply the IEEE exponent clamp (fold-down) */
7373 shift
=dn
->exponent
-(set
->emax
-set
->digits
+1);
7375 /* shift coefficient (if non-zero) */
7377 dn
->digits
=decShiftToMost(dn
->lsu
, dn
->digits
, shift
);
7379 dn
->exponent
-=shift
; /* adjust the exponent to match */
7380 *status
|=DEC_Clamped
; /* and record the dirty deed */
7384 /* ------------------------------------------------------------------ */
7385 /* decSetOverflow -- set number to proper overflow value */
7387 /* dn is the number (used for sign [only] and result) */
7388 /* set is the context [used for the rounding mode, etc.] */
7389 /* status contains the current status to be updated */
7391 /* This sets the sign of a number and sets its value to either */
7392 /* Infinity or the maximum finite value, depending on the sign of */
7393 /* dn and the rounding mode, following IEEE 754 rules. */
7394 /* ------------------------------------------------------------------ */
7395 static void decSetOverflow(decNumber
*dn
, decContext
*set
, uInt
*status
) {
7396 Flag needmax
=0; /* result is maximum finite value */
7397 uByte sign
=dn
->bits
&DECNEG
; /* clean and save sign bit */
7399 if (ISZERO(dn
)) { /* zero does not overflow magnitude */
7400 Int emax
=set
->emax
; /* limit value */
7401 if (set
->clamp
) emax
-=set
->digits
-1; /* lower if clamping */
7402 if (dn
->exponent
>emax
) { /* clamp required */
7404 *status
|=DEC_Clamped
;
7409 uprv_decNumberZero(dn
);
7410 switch (set
->round
) {
7411 case DEC_ROUND_DOWN
: {
7412 needmax
=1; /* never Infinity */
7414 case DEC_ROUND_05UP
: {
7415 needmax
=1; /* never Infinity */
7417 case DEC_ROUND_CEILING
: {
7418 if (sign
) needmax
=1; /* Infinity if non-negative */
7420 case DEC_ROUND_FLOOR
: {
7421 if (!sign
) needmax
=1; /* Infinity if negative */
7423 default: break; /* Infinity in all other cases */
7426 decSetMaxValue(dn
, set
);
7427 dn
->bits
=sign
; /* set sign */
7429 else dn
->bits
=sign
|DECINF
; /* Value is +/-Infinity */
7430 *status
|=DEC_Overflow
| DEC_Inexact
| DEC_Rounded
;
7431 } /* decSetOverflow */
7433 /* ------------------------------------------------------------------ */
7434 /* decSetMaxValue -- set number to +Nmax (maximum normal value) */
7436 /* dn is the number to set */
7437 /* set is the context [used for digits and emax] */
7439 /* This sets the number to the maximum positive value. */
7440 /* ------------------------------------------------------------------ */
7441 static void decSetMaxValue(decNumber
*dn
, decContext
*set
) {
7442 Unit
*up
; /* work */
7443 Int count
=set
->digits
; /* nines to add */
7445 /* fill in all nines to set maximum value */
7446 for (up
=dn
->lsu
; ; up
++) {
7447 if (count
>DECDPUN
) *up
=DECDPUNMAX
; /* unit full o'nines */
7448 else { /* this is the msu */
7449 *up
=(Unit
)(powers
[count
]-1);
7452 count
-=DECDPUN
; /* filled those digits */
7454 dn
->bits
=0; /* + sign */
7455 dn
->exponent
=set
->emax
-set
->digits
+1;
7456 } /* decSetMaxValue */
7458 /* ------------------------------------------------------------------ */
7459 /* decSetSubnormal -- process value whose exponent is <Emin */
7461 /* dn is the number (used as input as well as output; it may have */
7462 /* an allowed subnormal value, which may need to be rounded) */
7463 /* set is the context [used for the rounding mode] */
7464 /* residue is any pending residue */
7465 /* status contains the current status to be updated */
7467 /* If subset mode, set result to zero and set Underflow flags. */
7469 /* Value may be zero with a low exponent; this does not set Subnormal */
7470 /* but the exponent will be clamped to Etiny. */
7472 /* Otherwise ensure exponent is not out of range, and round as */
7473 /* necessary. Underflow is set if the result is Inexact. */
7474 /* ------------------------------------------------------------------ */
7475 static void decSetSubnormal(decNumber
*dn
, decContext
*set
, Int
*residue
,
7477 decContext workset
; /* work */
7478 Int etiny
, adjust
; /* .. */
7481 /* simple set to zero and 'hard underflow' for subset */
7482 if (!set
->extended
) {
7483 uprv_decNumberZero(dn
);
7484 /* always full overflow */
7485 *status
|=DEC_Underflow
| DEC_Subnormal
| DEC_Inexact
| DEC_Rounded
;
7490 /* Full arithmetic -- allow subnormals, rounded to minimum exponent */
7491 /* (Etiny) if needed */
7492 etiny
=set
->emin
-(set
->digits
-1); /* smallest allowed exponent */
7494 if ISZERO(dn
) { /* value is zero */
7495 /* residue can never be non-zero here */
7498 printf("++ Subnormal 0 residue %ld\n", (LI
)*residue
);
7499 *status
|=DEC_Invalid_operation
;
7502 if (dn
->exponent
<etiny
) { /* clamp required */
7504 *status
|=DEC_Clamped
;
7509 *status
|=DEC_Subnormal
; /* have a non-zero subnormal */
7510 adjust
=etiny
-dn
->exponent
; /* calculate digits to remove */
7511 if (adjust
<=0) { /* not out of range; unrounded */
7512 /* residue can never be non-zero here, except in the Nmin-residue */
7513 /* case (which is a subnormal result), so can take fast-path here */
7514 /* it may already be inexact (from setting the coefficient) */
7515 if (*status
&DEC_Inexact
) *status
|=DEC_Underflow
;
7519 /* adjust>0, so need to rescale the result so exponent becomes Etiny */
7520 /* [this code is similar to that in rescale] */
7521 workset
=*set
; /* clone rounding, etc. */
7522 workset
.digits
=dn
->digits
-adjust
; /* set requested length */
7523 workset
.emin
-=adjust
; /* and adjust emin to match */
7524 /* [note that the latter can be <1, here, similar to Rescale case] */
7525 decSetCoeff(dn
, &workset
, dn
->lsu
, dn
->digits
, residue
, status
);
7526 decApplyRound(dn
, &workset
, *residue
, status
);
7528 /* Use 754 default rule: Underflow is set iff Inexact */
7529 /* [independent of whether trapped] */
7530 if (*status
&DEC_Inexact
) *status
|=DEC_Underflow
;
7532 /* if rounded up a 999s case, exponent will be off by one; adjust */
7533 /* back if so [it will fit, because it was shortened earlier] */
7534 if (dn
->exponent
>etiny
) {
7535 dn
->digits
=decShiftToMost(dn
->lsu
, dn
->digits
, 1);
7536 dn
->exponent
--; /* (re)adjust the exponent. */
7539 /* if rounded to zero, it is by definition clamped... */
7540 if (ISZERO(dn
)) *status
|=DEC_Clamped
;
7541 } /* decSetSubnormal */
7543 /* ------------------------------------------------------------------ */
7544 /* decCheckMath - check entry conditions for a math function */
7546 /* This checks the context and the operand */
7548 /* rhs is the operand to check */
7549 /* set is the context to check */
7550 /* status is unchanged if both are good */
7552 /* returns non-zero if status is changed, 0 otherwise */
7554 /* Restrictions enforced: */
7556 /* digits, emax, and -emin in the context must be less than */
7557 /* DEC_MAX_MATH (999999), and A must be within these bounds if */
7558 /* non-zero. Invalid_operation is set in the status if a */
7559 /* restriction is violated. */
7560 /* ------------------------------------------------------------------ */
7561 static uInt
decCheckMath(const decNumber
*rhs
, decContext
*set
,
7563 uInt save
=*status
; /* record */
7564 if (set
->digits
>DEC_MAX_MATH
7565 || set
->emax
>DEC_MAX_MATH
7566 || -set
->emin
>DEC_MAX_MATH
) *status
|=DEC_Invalid_context
;
7567 else if ((rhs
->digits
>DEC_MAX_MATH
7568 || rhs
->exponent
+rhs
->digits
>DEC_MAX_MATH
+1
7569 || rhs
->exponent
+rhs
->digits
<2*(1-DEC_MAX_MATH
))
7570 && !ISZERO(rhs
)) *status
|=DEC_Invalid_operation
;
7571 return (*status
!=save
);
7572 } /* decCheckMath */
7574 /* ------------------------------------------------------------------ */
7575 /* decGetInt -- get integer from a number */
7577 /* dn is the number [which will not be altered] */
7579 /* returns one of: */
7580 /* BADINT if there is a non-zero fraction */
7581 /* the converted integer */
7582 /* BIGEVEN if the integer is even and magnitude > 2*10**9 */
7583 /* BIGODD if the integer is odd and magnitude > 2*10**9 */
7585 /* This checks and gets a whole number from the input decNumber. */
7586 /* The sign can be determined from dn by the caller when BIGEVEN or */
7587 /* BIGODD is returned. */
7588 /* ------------------------------------------------------------------ */
7589 static Int
decGetInt(const decNumber
*dn
) {
7590 Int theInt
; /* result accumulator */
7591 const Unit
*up
; /* work */
7592 Int got
; /* digits (real or not) processed */
7593 Int ilength
=dn
->digits
+dn
->exponent
; /* integral length */
7594 Flag neg
=decNumberIsNegative(dn
); /* 1 if -ve */
7596 /* The number must be an integer that fits in 10 digits */
7597 /* Assert, here, that 10 is enough for any rescale Etiny */
7598 #if DEC_MAX_EMAX > 999999999
7599 #error GetInt may need updating [for Emax]
7601 #if DEC_MIN_EMIN < -999999999
7602 #error GetInt may need updating [for Emin]
7604 if (ISZERO(dn
)) return 0; /* zeros are OK, with any exponent */
7606 up
=dn
->lsu
; /* ready for lsu */
7607 theInt
=0; /* ready to accumulate */
7608 if (dn
->exponent
>=0) { /* relatively easy */
7609 /* no fractional part [usual]; allow for positive exponent */
7612 else { /* -ve exponent; some fractional part to check and discard */
7613 Int count
=-dn
->exponent
; /* digits to discard */
7614 /* spin up whole units until reach the Unit with the unit digit */
7615 for (; count
>=DECDPUN
; up
++) {
7616 if (*up
!=0) return BADINT
; /* non-zero Unit to discard */
7619 if (count
==0) got
=0; /* [a multiple of DECDPUN] */
7620 else { /* [not multiple of DECDPUN] */
7622 /* slice off fraction digits and check for non-zero */
7624 theInt
=QUOT10(*up
, count
);
7625 rem
=*up
-theInt
*powers
[count
];
7627 rem
=*up%powers
[count
]; /* slice off discards */
7628 theInt
=*up
/powers
[count
];
7630 if (rem
!=0) return BADINT
; /* non-zero fraction */
7632 got
=DECDPUN
-count
; /* number of digits so far */
7633 up
++; /* ready for next */
7636 /* now it's known there's no fractional part */
7638 /* tricky code now, to accumulate up to 9.3 digits */
7639 if (got
==0) {theInt
=*up
; got
+=DECDPUN
; up
++;} /* ensure lsu is there */
7643 /* collect any remaining unit(s) */
7644 for (; got
<ilength
; up
++) {
7645 theInt
+=*up
*powers
[got
];
7648 if (ilength
==10) { /* need to check for wrap */
7649 if (theInt
/(Int
)powers
[got
-DECDPUN
]!=(Int
)*(up
-1)) ilength
=11;
7650 /* [that test also disallows the BADINT result case] */
7651 else if (neg
&& theInt
>1999999997) ilength
=11;
7652 else if (!neg
&& theInt
>999999999) ilength
=11;
7653 if (ilength
==11) theInt
=save
; /* restore correct low bit */
7657 if (ilength
>10) { /* too big */
7658 if (theInt
&1) return BIGODD
; /* bottom bit 1 */
7659 return BIGEVEN
; /* bottom bit 0 */
7662 if (neg
) theInt
=-theInt
; /* apply sign */
7666 /* ------------------------------------------------------------------ */
7667 /* decDecap -- decapitate the coefficient of a number */
7669 /* dn is the number to be decapitated */
7670 /* drop is the number of digits to be removed from the left of dn; */
7671 /* this must be <= dn->digits (if equal, the coefficient is */
7674 /* Returns dn; dn->digits will be <= the initial digits less drop */
7675 /* (after removing drop digits there may be leading zero digits */
7676 /* which will also be removed). Only dn->lsu and dn->digits change. */
7677 /* ------------------------------------------------------------------ */
7678 static decNumber
*decDecap(decNumber
*dn
, Int drop
) {
7679 Unit
*msu
; /* -> target cut point */
7681 if (drop
>=dn
->digits
) { /* losing the whole thing */
7683 if (drop
>dn
->digits
)
7684 printf("decDecap called with drop>digits [%ld>%ld]\n",
7685 (LI
)drop
, (LI
)dn
->digits
);
7691 msu
=dn
->lsu
+D2U(dn
->digits
-drop
)-1; /* -> likely msu */
7692 cut
=MSUDIGITS(dn
->digits
-drop
); /* digits to be in use in msu */
7693 if (cut
!=DECDPUN
) *msu
%=powers
[cut
]; /* clear left digits */
7694 /* that may have left leading zero digits, so do a proper count... */
7695 dn
->digits
=decGetDigits(dn
->lsu
, static_cast<int32_t>(msu
-dn
->lsu
+1));
7699 /* ------------------------------------------------------------------ */
7700 /* decBiStr -- compare string with pairwise options */
7702 /* targ is the string to compare */
7703 /* str1 is one of the strings to compare against (length may be 0) */
7704 /* str2 is the other; it must be the same length as str1 */
7706 /* returns 1 if strings compare equal, (that is, it is the same */
7707 /* length as str1 and str2, and each character of targ is in either */
7708 /* str1 or str2 in the corresponding position), or 0 otherwise */
7710 /* This is used for generic caseless compare, including the awkward */
7711 /* case of the Turkish dotted and dotless Is. Use as (for example): */
7712 /* if (decBiStr(test, "mike", "MIKE")) ... */
7713 /* ------------------------------------------------------------------ */
7714 static Flag
decBiStr(const char *targ
, const char *str1
, const char *str2
) {
7715 for (;;targ
++, str1
++, str2
++) {
7716 if (*targ
!=*str1
&& *targ
!=*str2
) return 0;
7717 /* *targ has a match in one (or both, if terminator) */
7718 if (*targ
=='\0') break;
7723 /* ------------------------------------------------------------------ */
7724 /* decNaNs -- handle NaN operand or operands */
7726 /* res is the result number */
7727 /* lhs is the first operand */
7728 /* rhs is the second operand, or NULL if none */
7729 /* context is used to limit payload length */
7730 /* status contains the current status */
7731 /* returns res in case convenient */
7733 /* Called when one or both operands is a NaN, and propagates the */
7734 /* appropriate result to res. When an sNaN is found, it is changed */
7735 /* to a qNaN and Invalid operation is set. */
7736 /* ------------------------------------------------------------------ */
7737 static decNumber
* decNaNs(decNumber
*res
, const decNumber
*lhs
,
7738 const decNumber
*rhs
, decContext
*set
,
7740 /* This decision tree ends up with LHS being the source pointer, */
7741 /* and status updated if need be */
7742 if (lhs
->bits
& DECSNAN
)
7743 *status
|=DEC_Invalid_operation
| DEC_sNaN
;
7744 else if (rhs
==NULL
);
7745 else if (rhs
->bits
& DECSNAN
) {
7747 *status
|=DEC_Invalid_operation
| DEC_sNaN
;
7749 else if (lhs
->bits
& DECNAN
);
7752 /* propagate the payload */
7753 if (lhs
->digits
<=set
->digits
) uprv_decNumberCopy(res
, lhs
); /* easy */
7754 else { /* too long */
7757 /* copy safe number of units, then decapitate */
7758 res
->bits
=lhs
->bits
; /* need sign etc. */
7759 uresp1
=res
->lsu
+D2U(set
->digits
);
7760 for (ur
=res
->lsu
, ul
=lhs
->lsu
; ur
<uresp1
; ur
++, ul
++) *ur
=*ul
;
7761 res
->digits
=D2U(set
->digits
)*DECDPUN
;
7762 /* maybe still too long */
7763 if (res
->digits
>set
->digits
) decDecap(res
, res
->digits
-set
->digits
);
7766 res
->bits
&=~DECSNAN
; /* convert any sNaN to NaN, while */
7767 res
->bits
|=DECNAN
; /* .. preserving sign */
7768 res
->exponent
=0; /* clean exponent */
7769 /* [coefficient was copied/decapitated] */
7773 /* ------------------------------------------------------------------ */
7774 /* decStatus -- apply non-zero status */
7776 /* dn is the number to set if error */
7777 /* status contains the current status (not yet in context) */
7778 /* set is the context */
7780 /* If the status is an error status, the number is set to a NaN, */
7781 /* unless the error was an overflow, divide-by-zero, or underflow, */
7782 /* in which case the number will have already been set. */
7784 /* The context status is then updated with the new status. Note that */
7785 /* this may raise a signal, so control may never return from this */
7786 /* routine (hence resources must be recovered before it is called). */
7787 /* ------------------------------------------------------------------ */
7788 static void decStatus(decNumber
*dn
, uInt status
, decContext
*set
) {
7789 if (status
& DEC_NaNs
) { /* error status -> NaN */
7790 /* if cause was an sNaN, clear and propagate [NaN is already set up] */
7791 if (status
& DEC_sNaN
) status
&=~DEC_sNaN
;
7793 uprv_decNumberZero(dn
); /* other error: clean throughout */
7794 dn
->bits
=DECNAN
; /* and make a quiet NaN */
7797 uprv_decContextSetStatus(set
, status
); /* [may not return] */
7801 /* ------------------------------------------------------------------ */
7802 /* decGetDigits -- count digits in a Units array */
7804 /* uar is the Unit array holding the number (this is often an */
7805 /* accumulator of some sort) */
7806 /* len is the length of the array in units [>=1] */
7808 /* returns the number of (significant) digits in the array */
7810 /* All leading zeros are excluded, except the last if the array has */
7811 /* only zero Units. */
7812 /* ------------------------------------------------------------------ */
7813 /* This may be called twice during some operations. */
7814 static Int
decGetDigits(Unit
*uar
, Int len
) {
7815 Unit
*up
=uar
+(len
-1); /* -> msu */
7816 Int digits
=(len
-1)*DECDPUN
+1; /* possible digits excluding msu */
7818 uInt
const *pow
; /* work */
7820 /* (at least 1 in final msu) */
7822 if (len
<1) printf("decGetDigits called with len<1 [%ld]\n", (LI
)len
);
7825 for (; up
>=uar
; up
--) {
7826 if (*up
==0) { /* unit is all 0s */
7827 if (digits
==1) break; /* a zero has one digit */
7828 digits
-=DECDPUN
; /* adjust for 0 unit */
7830 /* found the first (most significant) non-zero Unit */
7831 #if DECDPUN>1 /* not done yet */
7832 if (*up
<10) break; /* is 1-9 */
7834 #if DECDPUN>2 /* not done yet */
7835 if (*up
<100) break; /* is 10-99 */
7837 #if DECDPUN>3 /* not done yet */
7838 if (*up
<1000) break; /* is 100-999 */
7840 #if DECDPUN>4 /* count the rest ... */
7841 for (pow
=&powers
[4]; *up
>=*pow
; pow
++) digits
++;
7849 } /* decGetDigits */
7851 #if DECTRACE | DECCHECK
7852 /* ------------------------------------------------------------------ */
7853 /* decNumberShow -- display a number [debug aid] */
7854 /* dn is the number to show */
7856 /* Shows: sign, exponent, coefficient (msu first), digits */
7857 /* or: sign, special-value */
7858 /* ------------------------------------------------------------------ */
7859 /* this is public so other modules can use it */
7860 void uprv_decNumberShow(const decNumber
*dn
) {
7861 const Unit
*up
; /* work */
7864 char isign
='+'; /* main sign */
7868 if (decNumberIsNegative(dn
)) isign
='-';
7869 printf(" >> %c ", isign
);
7870 if (dn
->bits
&DECSPECIAL
) { /* Is a special value */
7871 if (decNumberIsInfinite(dn
)) printf("Infinity");
7873 if (dn
->bits
&DECSNAN
) printf("sNaN"); /* signalling NaN */
7876 /* if coefficient and exponent are 0, no more to do */
7877 if (dn
->exponent
==0 && dn
->digits
==1 && *dn
->lsu
==0) {
7880 /* drop through to report other information */
7884 /* now carefully display the coefficient */
7885 up
=dn
->lsu
+D2U(dn
->digits
)-1; /* msu */
7886 printf("%ld", (LI
)*up
);
7887 for (up
=up
-1; up
>=dn
->lsu
; up
--) {
7890 for (cut
=DECDPUN
-1; cut
>=0; cut
--) {
7893 printf("%ld", (LI
)d
);
7896 if (dn
->exponent
!=0) {
7898 if (dn
->exponent
<0) esign
='-';
7899 printf(" E%c%ld", esign
, (LI
)abs(dn
->exponent
));
7901 printf(" [%ld]\n", (LI
)dn
->digits
);
7902 } /* decNumberShow */
7905 #if DECTRACE || DECCHECK
7906 /* ------------------------------------------------------------------ */
7907 /* decDumpAr -- display a unit array [debug/check aid] */
7908 /* name is a single-character tag name */
7909 /* ar is the array to display */
7910 /* len is the length of the array in Units */
7911 /* ------------------------------------------------------------------ */
7912 static void decDumpAr(char name
, const Unit
*ar
, Int len
) {
7934 printf(" :%c: ", name
);
7935 for (i
=len
-1; i
>=0; i
--) {
7936 if (i
==len
-1) printf("%ld ", (LI
)ar
[i
]);
7937 else printf(spec
, ar
[i
]);
7944 /* ------------------------------------------------------------------ */
7945 /* decCheckOperands -- check operand(s) to a routine */
7946 /* res is the result structure (not checked; it will be set to */
7947 /* quiet NaN if error found (and it is not NULL)) */
7948 /* lhs is the first operand (may be DECUNRESU) */
7949 /* rhs is the second (may be DECUNUSED) */
7950 /* set is the context (may be DECUNCONT) */
7951 /* returns 0 if both operands, and the context are clean, or 1 */
7952 /* otherwise (in which case the context will show an error, */
7953 /* unless NULL). Note that res is not cleaned; caller should */
7954 /* handle this so res=NULL case is safe. */
7955 /* The caller is expected to abandon immediately if 1 is returned. */
7956 /* ------------------------------------------------------------------ */
7957 static Flag
decCheckOperands(decNumber
*res
, const decNumber
*lhs
,
7958 const decNumber
*rhs
, decContext
*set
) {
7960 if (set
==NULL
) { /* oops; hopeless */
7961 #if DECTRACE || DECVERB
7962 printf("Reference to context is NULL.\n");
7966 else if (set
!=DECUNCONT
7967 && (set
->digits
<1 || set
->round
>=DEC_ROUND_MAX
)) {
7969 #if DECTRACE || DECVERB
7970 printf("Bad context [digits=%ld round=%ld].\n",
7971 (LI
)set
->digits
, (LI
)set
->round
);
7978 /* this one not DECVERB as standard tests include NULL */
7979 printf("Reference to result is NULL.\n");
7982 if (!bad
&& lhs
!=DECUNUSED
) bad
=(decCheckNumber(lhs
));
7983 if (!bad
&& rhs
!=DECUNUSED
) bad
=(decCheckNumber(rhs
));
7986 if (set
!=DECUNCONT
) uprv_decContextSetStatus(set
, DEC_Invalid_operation
);
7987 if (res
!=DECUNRESU
&& res
!=NULL
) {
7988 uprv_decNumberZero(res
);
7989 res
->bits
=DECNAN
; /* qNaN */
7993 } /* decCheckOperands */
7995 /* ------------------------------------------------------------------ */
7996 /* decCheckNumber -- check a number */
7997 /* dn is the number to check */
7998 /* returns 0 if the number is clean, or 1 otherwise */
8000 /* The number is considered valid if it could be a result from some */
8001 /* operation in some valid context. */
8002 /* ------------------------------------------------------------------ */
8003 static Flag
decCheckNumber(const decNumber
*dn
) {
8004 const Unit
*up
; /* work */
8005 uInt maxuint
; /* .. */
8006 Int ae
, d
, digits
; /* .. */
8007 Int emin
, emax
; /* .. */
8009 if (dn
==NULL
) { /* hopeless */
8011 /* this one not DECVERB as standard tests include NULL */
8012 printf("Reference to decNumber is NULL.\n");
8016 /* check special values */
8017 if (dn
->bits
& DECSPECIAL
) {
8018 if (dn
->exponent
!=0) {
8019 #if DECTRACE || DECVERB
8020 printf("Exponent %ld (not 0) for a special value [%02x].\n",
8021 (LI
)dn
->exponent
, dn
->bits
);
8025 /* 2003.09.08: NaNs may now have coefficients, so next tests Inf only */
8026 if (decNumberIsInfinite(dn
)) {
8027 if (dn
->digits
!=1) {
8028 #if DECTRACE || DECVERB
8029 printf("Digits %ld (not 1) for an infinity.\n", (LI
)dn
->digits
);
8033 #if DECTRACE || DECVERB
8034 printf("LSU %ld (not 0) for an infinity.\n", (LI
)*dn
->lsu
);
8036 decDumpAr('I', dn
->lsu
, D2U(dn
->digits
));
8039 /* 2002.12.26: negative NaNs can now appear through proposed IEEE */
8040 /* concrete formats (decimal64, etc.). */
8044 /* check the coefficient */
8045 if (dn
->digits
<1 || dn
->digits
>DECNUMMAXP
) {
8046 #if DECTRACE || DECVERB
8047 printf("Digits %ld in number.\n", (LI
)dn
->digits
);
8053 for (up
=dn
->lsu
; d
>0; up
++) {
8054 if (d
>DECDPUN
) maxuint
=DECDPUNMAX
;
8055 else { /* reached the msu */
8056 maxuint
=powers
[d
]-1;
8057 if (dn
->digits
>1 && *up
<powers
[d
-1]) {
8058 #if DECTRACE || DECVERB
8059 printf("Leading 0 in number.\n");
8060 uprv_decNumberShow(dn
);
8065 #if DECTRACE || DECVERB
8066 printf("Bad Unit [%08lx] in %ld-digit number at offset %ld [maxuint %ld].\n",
8067 (LI
)*up
, (LI
)dn
->digits
, (LI
)(up
-dn
->lsu
), (LI
)maxuint
);
8073 /* check the exponent. Note that input operands can have exponents */
8074 /* which are out of the set->emin/set->emax and set->digits range */
8075 /* (just as they can have more digits than set->digits). */
8076 ae
=dn
->exponent
+dn
->digits
-1; /* adjusted exponent */
8080 if (ae
<emin
-(digits
-1)) {
8081 #if DECTRACE || DECVERB
8082 printf("Adjusted exponent underflow [%ld].\n", (LI
)ae
);
8083 uprv_decNumberShow(dn
);
8087 #if DECTRACE || DECVERB
8088 printf("Adjusted exponent overflow [%ld].\n", (LI
)ae
);
8089 uprv_decNumberShow(dn
);
8093 return 0; /* it's OK */
8094 } /* decCheckNumber */
8096 /* ------------------------------------------------------------------ */
8097 /* decCheckInexact -- check a normal finite inexact result has digits */
8098 /* dn is the number to check */
8099 /* set is the context (for status and precision) */
8100 /* sets Invalid operation, etc., if some digits are missing */
8101 /* [this check is not made for DECSUBSET compilation or when */
8102 /* subnormal is not set] */
8103 /* ------------------------------------------------------------------ */
8104 static void decCheckInexact(const decNumber
*dn
, decContext
*set
) {
8105 #if !DECSUBSET && DECEXTFLAG
8106 if ((set
->status
& (DEC_Inexact
|DEC_Subnormal
))==DEC_Inexact
8107 && (set
->digits
!=dn
->digits
) && !(dn
->bits
& DECSPECIAL
)) {
8108 #if DECTRACE || DECVERB
8109 printf("Insufficient digits [%ld] on normal Inexact result.\n",
8111 uprv_decNumberShow(dn
);
8113 uprv_decContextSetStatus(set
, DEC_Invalid_operation
);
8116 /* next is a noop for quiet compiler */
8117 if (dn
!=NULL
&& dn
->digits
==0) set
->status
|=DEC_Invalid_operation
;
8120 } /* decCheckInexact */
8126 /* ------------------------------------------------------------------ */
8127 /* decMalloc -- accountable allocation routine */
8128 /* n is the number of bytes to allocate */
8130 /* Semantics is the same as the stdlib malloc routine, but bytes */
8131 /* allocated are accounted for globally, and corruption fences are */
8132 /* added before and after the 'actual' storage. */
8133 /* ------------------------------------------------------------------ */
8134 /* This routine allocates storage with an extra twelve bytes; 8 are */
8135 /* at the start and hold: */
8136 /* 0-3 the original length requested */
8137 /* 4-7 buffer corruption detection fence (DECFENCE, x4) */
8138 /* The 4 bytes at the end also hold a corruption fence (DECFENCE, x4) */
8139 /* ------------------------------------------------------------------ */
8140 static void *decMalloc(size_t n
) {
8141 uInt size
=n
+12; /* true size */
8142 void *alloc
; /* -> allocated storage */
8143 uByte
*b
, *b0
; /* work */
8144 uInt uiwork
; /* for macros */
8146 alloc
=malloc(size
); /* -> allocated storage */
8147 if (alloc
==NULL
) return NULL
; /* out of strorage */
8148 b0
=(uByte
*)alloc
; /* as bytes */
8149 decAllocBytes
+=n
; /* account for storage */
8150 UBFROMUI(alloc
, n
); /* save n */
8151 /* printf(" alloc ++ dAB: %ld (%ld)\n", (LI)decAllocBytes, (LI)n); */
8152 for (b
=b0
+4; b
<b0
+8; b
++) *b
=DECFENCE
;
8153 for (b
=b0
+n
+8; b
<b0
+n
+12; b
++) *b
=DECFENCE
;
8154 return b0
+8; /* -> play area */
8157 /* ------------------------------------------------------------------ */
8158 /* decFree -- accountable free routine */
8159 /* alloc is the storage to free */
8161 /* Semantics is the same as the stdlib malloc routine, except that */
8162 /* the global storage accounting is updated and the fences are */
8163 /* checked to ensure that no routine has written 'out of bounds'. */
8164 /* ------------------------------------------------------------------ */
8165 /* This routine first checks that the fences have not been corrupted. */
8166 /* It then frees the storage using the 'truw' storage address (that */
8167 /* is, offset by 8). */
8168 /* ------------------------------------------------------------------ */
8169 static void decFree(void *alloc
) {
8170 uInt n
; /* original length */
8171 uByte
*b
, *b0
; /* work */
8172 uInt uiwork
; /* for macros */
8174 if (alloc
==NULL
) return; /* allowed; it's a nop */
8175 b0
=(uByte
*)alloc
; /* as bytes */
8176 b0
-=8; /* -> true start of storage */
8177 n
=UBTOUI(b0
); /* lift length */
8178 for (b
=b0
+4; b
<b0
+8; b
++) if (*b
!=DECFENCE
)
8179 printf("=== Corrupt byte [%02x] at offset %d from %ld ===\n", *b
,
8181 for (b
=b0
+n
+8; b
<b0
+n
+12; b
++) if (*b
!=DECFENCE
)
8182 printf("=== Corrupt byte [%02x] at offset +%d from %ld, n=%ld ===\n", *b
,
8183 b
-b0
-8, (LI
)b0
, (LI
)n
);
8184 free(b0
); /* drop the storage */
8185 decAllocBytes
-=n
; /* account for storage */
8186 /* printf(" free -- dAB: %d (%d)\n", decAllocBytes, -n); */
8188 #define malloc(a) decMalloc(a)
8189 #define free(a) decFree(a)