1/*
2 * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26/*
27 * Portions Copyright IBM Corporation, 2001. All Rights Reserved.
28 */
29
30package java.math;
31
32import static java.math.BigInteger.LONG_MASK;
33import java.util.Arrays;
34
35/**
36 * Immutable, arbitrary-precision signed decimal numbers.  A
37 * {@code BigDecimal} consists of an arbitrary precision integer
38 * <i>unscaled value</i> and a 32-bit integer <i>scale</i>.  If zero
39 * or positive, the scale is the number of digits to the right of the
40 * decimal point.  If negative, the unscaled value of the number is
41 * multiplied by ten to the power of the negation of the scale.  The
42 * value of the number represented by the {@code BigDecimal} is
43 * therefore <code>(unscaledValue &times; 10<sup>-scale</sup>)</code>.
44 *
45 * <p>The {@code BigDecimal} class provides operations for
46 * arithmetic, scale manipulation, rounding, comparison, hashing, and
47 * format conversion.  The {@link #toString} method provides a
48 * canonical representation of a {@code BigDecimal}.
49 *
50 * <p>The {@code BigDecimal} class gives its user complete control
51 * over rounding behavior.  If no rounding mode is specified and the
52 * exact result cannot be represented, an exception is thrown;
53 * otherwise, calculations can be carried out to a chosen precision
54 * and rounding mode by supplying an appropriate {@link MathContext}
55 * object to the operation.  In either case, eight <em>rounding
56 * modes</em> are provided for the control of rounding.  Using the
57 * integer fields in this class (such as {@link #ROUND_HALF_UP}) to
58 * represent rounding mode is deprecated; the enumeration values
59 * of the {@code RoundingMode} {@code enum}, (such as {@link
60 * RoundingMode#HALF_UP}) should be used instead.
61 *
62 * <p>When a {@code MathContext} object is supplied with a precision
63 * setting of 0 (for example, {@link MathContext#UNLIMITED}),
64 * arithmetic operations are exact, as are the arithmetic methods
65 * which take no {@code MathContext} object.  (This is the only
66 * behavior that was supported in releases prior to 5.)  As a
67 * corollary of computing the exact result, the rounding mode setting
68 * of a {@code MathContext} object with a precision setting of 0 is
69 * not used and thus irrelevant.  In the case of divide, the exact
70 * quotient could have an infinitely long decimal expansion; for
71 * example, 1 divided by 3.  If the quotient has a nonterminating
72 * decimal expansion and the operation is specified to return an exact
73 * result, an {@code ArithmeticException} is thrown.  Otherwise, the
74 * exact result of the division is returned, as done for other
75 * operations.
76 *
77 * <p>When the precision setting is not 0, the rules of
78 * {@code BigDecimal} arithmetic are broadly compatible with selected
79 * modes of operation of the arithmetic defined in ANSI X3.274-1996
80 * and ANSI X3.274-1996/AM 1-2000 (section 7.4).  Unlike those
81 * standards, {@code BigDecimal} includes many rounding modes, which
82 * were mandatory for division in {@code BigDecimal} releases prior
83 * to 5.  Any conflicts between these ANSI standards and the
84 * {@code BigDecimal} specification are resolved in favor of
85 * {@code BigDecimal}.
86 *
87 * <p>Since the same numerical value can have different
88 * representations (with different scales), the rules of arithmetic
89 * and rounding must specify both the numerical result and the scale
90 * used in the result's representation.
91 *
92 *
93 * <p>In general the rounding modes and precision setting determine
94 * how operations return results with a limited number of digits when
95 * the exact result has more digits (perhaps infinitely many in the
96 * case of division and square root) than the number of digits returned.
97 *
98 * First, the
99 * total number of digits to return is specified by the
100 * {@code MathContext}'s {@code precision} setting; this determines
101 * the result's <i>precision</i>.  The digit count starts from the
102 * leftmost nonzero digit of the exact result.  The rounding mode
103 * determines how any discarded trailing digits affect the returned
104 * result.
105 *
106 * <p>For all arithmetic operators , the operation is carried out as
107 * though an exact intermediate result were first calculated and then
108 * rounded to the number of digits specified by the precision setting
109 * (if necessary), using the selected rounding mode.  If the exact
110 * result is not returned, some digit positions of the exact result
111 * are discarded.  When rounding increases the magnitude of the
112 * returned result, it is possible for a new digit position to be
113 * created by a carry propagating to a leading {@literal "9"} digit.
114 * For example, rounding the value 999.9 to three digits rounding up
115 * would be numerically equal to one thousand, represented as
116 * 100&times;10<sup>1</sup>.  In such cases, the new {@literal "1"} is
117 * the leading digit position of the returned result.
118 *
119 * <p>Besides a logical exact result, each arithmetic operation has a
120 * preferred scale for representing a result.  The preferred
121 * scale for each operation is listed in the table below.
122 *
123 * <table class="plain">
124 * <caption><b>Preferred Scales for Results of Arithmetic Operations
125 * </b></caption>
126 * <thead>
127 * <tr><th>Operation</th><th>Preferred Scale of Result</th></tr>
128 * </thead>
129 * <tbody>
130 * <tr><td>Add</td><td>max(addend.scale(), augend.scale())</td>
131 * <tr><td>Subtract</td><td>max(minuend.scale(), subtrahend.scale())</td>
132 * <tr><td>Multiply</td><td>multiplier.scale() + multiplicand.scale()</td>
133 * <tr><td>Divide</td><td>dividend.scale() - divisor.scale()</td>
134 * <tr><td>Square root</td><td>radicand.scale()/2</td>
135 * </tbody>
136 * </table>
137 *
138 * These scales are the ones used by the methods which return exact
139 * arithmetic results; except that an exact divide may have to use a
140 * larger scale since the exact result may have more digits.  For
141 * example, {@code 1/32} is {@code 0.03125}.
142 *
143 * <p>Before rounding, the scale of the logical exact intermediate
144 * result is the preferred scale for that operation.  If the exact
145 * numerical result cannot be represented in {@code precision}
146 * digits, rounding selects the set of digits to return and the scale
147 * of the result is reduced from the scale of the intermediate result
148 * to the least scale which can represent the {@code precision}
149 * digits actually returned.  If the exact result can be represented
150 * with at most {@code precision} digits, the representation
151 * of the result with the scale closest to the preferred scale is
152 * returned.  In particular, an exactly representable quotient may be
153 * represented in fewer than {@code precision} digits by removing
154 * trailing zeros and decreasing the scale.  For example, rounding to
155 * three digits using the {@linkplain RoundingMode#FLOOR floor}
156 * rounding mode, <br>
157 *
158 * {@code 19/100 = 0.19   // integer=19,  scale=2} <br>
159 *
160 * but<br>
161 *
162 * {@code 21/110 = 0.190  // integer=190, scale=3} <br>
163 *
164 * <p>Note that for add, subtract, and multiply, the reduction in
165 * scale will equal the number of digit positions of the exact result
166 * which are discarded. If the rounding causes a carry propagation to
167 * create a new high-order digit position, an additional digit of the
168 * result is discarded than when no new digit position is created.
169 *
170 * <p>Other methods may have slightly different rounding semantics.
171 * For example, the result of the {@code pow} method using the
172 * {@linkplain #pow(int, MathContext) specified algorithm} can
173 * occasionally differ from the rounded mathematical result by more
174 * than one unit in the last place, one <i>{@linkplain #ulp() ulp}</i>.
175 *
176 * <p>Two types of operations are provided for manipulating the scale
177 * of a {@code BigDecimal}: scaling/rounding operations and decimal
178 * point motion operations.  Scaling/rounding operations ({@link
179 * #setScale setScale} and {@link #round round}) return a
180 * {@code BigDecimal} whose value is approximately (or exactly) equal
181 * to that of the operand, but whose scale or precision is the
182 * specified value; that is, they increase or decrease the precision
183 * of the stored number with minimal effect on its value.  Decimal
184 * point motion operations ({@link #movePointLeft movePointLeft} and
185 * {@link #movePointRight movePointRight}) return a
186 * {@code BigDecimal} created from the operand by moving the decimal
187 * point a specified distance in the specified direction.
188 *
189 * <p>For the sake of brevity and clarity, pseudo-code is used
190 * throughout the descriptions of {@code BigDecimal} methods.  The
191 * pseudo-code expression {@code (i + j)} is shorthand for "a
192 * {@code BigDecimal} whose value is that of the {@code BigDecimal}
193 * {@code i} added to that of the {@code BigDecimal}
194 * {@code j}." The pseudo-code expression {@code (i == j)} is
195 * shorthand for "{@code true} if and only if the
196 * {@code BigDecimal} {@code i} represents the same value as the
197 * {@code BigDecimal} {@code j}." Other pseudo-code expressions
198 * are interpreted similarly.  Square brackets are used to represent
199 * the particular {@code BigInteger} and scale pair defining a
200 * {@code BigDecimal} value; for example [19, 2] is the
201 * {@code BigDecimal} numerically equal to 0.19 having a scale of 2.
202 *
203 *
204 * <p>All methods and constructors for this class throw
205 * {@code NullPointerException} when passed a {@code null} object
206 * reference for any input parameter.
207 *
208 * @apiNote Care should be exercised if {@code BigDecimal} objects
209 * are used as keys in a {@link java.util.SortedMap SortedMap} or
210 * elements in a {@link java.util.SortedSet SortedSet} since
211 * {@code BigDecimal}'s <i>natural ordering</i> is <em>inconsistent
212 * with equals</em>.  See {@link Comparable}, {@link
213 * java.util.SortedMap} or {@link java.util.SortedSet} for more
214 * information.
215 *
216 * @see     BigInteger
217 * @see     MathContext
218 * @see     RoundingMode
219 * @see     java.util.SortedMap
220 * @see     java.util.SortedSet
221 * @author  Josh Bloch
222 * @author  Mike Cowlishaw
223 * @author  Joseph D. Darcy
224 * @author  Sergey V. Kuksenko
225 * @since 1.1
226 */
227public class BigDecimal extends Number implements Comparable<BigDecimal> {
228    /**
229     * The unscaled value of this BigDecimal, as returned by {@link
230     * #unscaledValue}.
231     *
232     * @serial
233     * @see #unscaledValue
234     */
235    private final BigInteger intVal;
236
237    /**
238     * The scale of this BigDecimal, as returned by {@link #scale}.
239     *
240     * @serial
241     * @see #scale
242     */
243    private final int scale;  // Note: this may have any value, so
244                              // calculations must be done in longs
245
246    /**
247     * The number of decimal digits in this BigDecimal, or 0 if the
248     * number of digits are not known (lookaside information).  If
249     * nonzero, the value is guaranteed correct.  Use the precision()
250     * method to obtain and set the value if it might be 0.  This
251     * field is mutable until set nonzero.
252     *
253     * @since  1.5
254     */
255    private transient int precision;
256
257    /**
258     * Used to store the canonical string representation, if computed.
259     */
260    private transient String stringCache;
261
262    /**
263     * Sentinel value for {@link #intCompact} indicating the
264     * significand information is only available from {@code intVal}.
265     */
266    static final long INFLATED = Long.MIN_VALUE;
267
268    private static final BigInteger INFLATED_BIGINT = BigInteger.valueOf(INFLATED);
269
270    /**
271     * If the absolute value of the significand of this BigDecimal is
272     * less than or equal to {@code Long.MAX_VALUE}, the value can be
273     * compactly stored in this field and used in computations.
274     */
275    private final transient long intCompact;
276
277    // All 18-digit base ten strings fit into a long; not all 19-digit
278    // strings will
279    private static final int MAX_COMPACT_DIGITS = 18;
280
281    /* Appease the serialization gods */
282    private static final long serialVersionUID = 6108874887143696463L;
283
284    private static final ThreadLocal<StringBuilderHelper>
285        threadLocalStringBuilderHelper = new ThreadLocal<StringBuilderHelper>() {
286        @Override
287        protected StringBuilderHelper initialValue() {
288            return new StringBuilderHelper();
289        }
290    };
291
292    // Cache of common small BigDecimal values.
293    private static final BigDecimal ZERO_THROUGH_TEN[] = {
294        new BigDecimal(BigInteger.ZERO,       0,  0, 1),
295        new BigDecimal(BigInteger.ONE,        1,  0, 1),
296        new BigDecimal(BigInteger.TWO,        2,  0, 1),
297        new BigDecimal(BigInteger.valueOf(3), 3,  0, 1),
298        new BigDecimal(BigInteger.valueOf(4), 4,  0, 1),
299        new BigDecimal(BigInteger.valueOf(5), 5,  0, 1),
300        new BigDecimal(BigInteger.valueOf(6), 6,  0, 1),
301        new BigDecimal(BigInteger.valueOf(7), 7,  0, 1),
302        new BigDecimal(BigInteger.valueOf(8), 8,  0, 1),
303        new BigDecimal(BigInteger.valueOf(9), 9,  0, 1),
304        new BigDecimal(BigInteger.TEN,        10, 0, 2),
305    };
306
307    // Cache of zero scaled by 0 - 15
308    private static final BigDecimal[] ZERO_SCALED_BY = {
309        ZERO_THROUGH_TEN[0],
310        new BigDecimal(BigInteger.ZERO, 0, 1, 1),
311        new BigDecimal(BigInteger.ZERO, 0, 2, 1),
312        new BigDecimal(BigInteger.ZERO, 0, 3, 1),
313        new BigDecimal(BigInteger.ZERO, 0, 4, 1),
314        new BigDecimal(BigInteger.ZERO, 0, 5, 1),
315        new BigDecimal(BigInteger.ZERO, 0, 6, 1),
316        new BigDecimal(BigInteger.ZERO, 0, 7, 1),
317        new BigDecimal(BigInteger.ZERO, 0, 8, 1),
318        new BigDecimal(BigInteger.ZERO, 0, 9, 1),
319        new BigDecimal(BigInteger.ZERO, 0, 10, 1),
320        new BigDecimal(BigInteger.ZERO, 0, 11, 1),
321        new BigDecimal(BigInteger.ZERO, 0, 12, 1),
322        new BigDecimal(BigInteger.ZERO, 0, 13, 1),
323        new BigDecimal(BigInteger.ZERO, 0, 14, 1),
324        new BigDecimal(BigInteger.ZERO, 0, 15, 1),
325    };
326
327    // Half of Long.MIN_VALUE & Long.MAX_VALUE.
328    private static final long HALF_LONG_MAX_VALUE = Long.MAX_VALUE / 2;
329    private static final long HALF_LONG_MIN_VALUE = Long.MIN_VALUE / 2;
330
331    // Constants
332    /**
333     * The value 0, with a scale of 0.
334     *
335     * @since  1.5
336     */
337    public static final BigDecimal ZERO =
338        ZERO_THROUGH_TEN[0];
339
340    /**
341     * The value 1, with a scale of 0.
342     *
343     * @since  1.5
344     */
345    public static final BigDecimal ONE =
346        ZERO_THROUGH_TEN[1];
347
348    /**
349     * The value 10, with a scale of 0.
350     *
351     * @since  1.5
352     */
353    public static final BigDecimal TEN =
354        ZERO_THROUGH_TEN[10];
355
356    /**
357     * The value 0.1, with a scale of 1.
358     */
359    private static final BigDecimal ONE_TENTH = valueOf(1L, 1);
360
361    /**
362     * The value 0.5, with a scale of 1.
363     */
364    private static final BigDecimal ONE_HALF = valueOf(5L, 1);
365
366    // Constructors
367
368    /**
369     * Trusted package private constructor.
370     * Trusted simply means if val is INFLATED, intVal could not be null and
371     * if intVal is null, val could not be INFLATED.
372     */
373    BigDecimal(BigInteger intVal, long val, int scale, int prec) {
374        this.scale = scale;
375        this.precision = prec;
376        this.intCompact = val;
377        this.intVal = intVal;
378    }
379
380    /**
381     * Translates a character array representation of a
382     * {@code BigDecimal} into a {@code BigDecimal}, accepting the
383     * same sequence of characters as the {@link #BigDecimal(String)}
384     * constructor, while allowing a sub-array to be specified.
385     *
386     * @implNote If the sequence of characters is already available
387     * within a character array, using this constructor is faster than
388     * converting the {@code char} array to string and using the
389     * {@code BigDecimal(String)} constructor.
390     *
391     * @param  in {@code char} array that is the source of characters.
392     * @param  offset first character in the array to inspect.
393     * @param  len number of characters to consider.
394     * @throws NumberFormatException if {@code in} is not a valid
395     *         representation of a {@code BigDecimal} or the defined subarray
396     *         is not wholly within {@code in}.
397     * @since  1.5
398     */
399    public BigDecimal(char[] in, int offset, int len) {
400        this(in,offset,len,MathContext.UNLIMITED);
401    }
402
403    /**
404     * Translates a character array representation of a
405     * {@code BigDecimal} into a {@code BigDecimal}, accepting the
406     * same sequence of characters as the {@link #BigDecimal(String)}
407     * constructor, while allowing a sub-array to be specified and
408     * with rounding according to the context settings.
409     *
410     * @implNote If the sequence of characters is already available
411     * within a character array, using this constructor is faster than
412     * converting the {@code char} array to string and using the
413     * {@code BigDecimal(String)} constructor.
414     *
415     * @param  in {@code char} array that is the source of characters.
416     * @param  offset first character in the array to inspect.
417     * @param  len number of characters to consider.
418     * @param  mc the context to use.
419     * @throws ArithmeticException if the result is inexact but the
420     *         rounding mode is {@code UNNECESSARY}.
421     * @throws NumberFormatException if {@code in} is not a valid
422     *         representation of a {@code BigDecimal} or the defined subarray
423     *         is not wholly within {@code in}.
424     * @since  1.5
425     */
426    public BigDecimal(char[] in, int offset, int len, MathContext mc) {
427        // protect against huge length.
428        if (offset + len > in.length || offset < 0)
429            throw new NumberFormatException("Bad offset or len arguments for char[] input.");
430        // This is the primary string to BigDecimal constructor; all
431        // incoming strings end up here; it uses explicit (inline)
432        // parsing for speed and generates at most one intermediate
433        // (temporary) object (a char[] array) for non-compact case.
434
435        // Use locals for all fields values until completion
436        int prec = 0;                 // record precision value
437        int scl = 0;                  // record scale value
438        long rs = 0;                  // the compact value in long
439        BigInteger rb = null;         // the inflated value in BigInteger
440        // use array bounds checking to handle too-long, len == 0,
441        // bad offset, etc.
442        try {
443            // handle the sign
444            boolean isneg = false;          // assume positive
445            if (in[offset] == '-') {
446                isneg = true;               // leading minus means negative
447                offset++;
448                len--;
449            } else if (in[offset] == '+') { // leading + allowed
450                offset++;
451                len--;
452            }
453
454            // should now be at numeric part of the significand
455            boolean dot = false;             // true when there is a '.'
456            long exp = 0;                    // exponent
457            char c;                          // current character
458            boolean isCompact = (len <= MAX_COMPACT_DIGITS);
459            // integer significand array & idx is the index to it. The array
460            // is ONLY used when we can't use a compact representation.
461            int idx = 0;
462            if (isCompact) {
463                // First compact case, we need not to preserve the character
464                // and we can just compute the value in place.
465                for (; len > 0; offset++, len--) {
466                    c = in[offset];
467                    if ((c == '0')) { // have zero
468                        if (prec == 0)
469                            prec = 1;
470                        else if (rs != 0) {
471                            rs *= 10;
472                            ++prec;
473                        } // else digit is a redundant leading zero
474                        if (dot)
475                            ++scl;
476                    } else if ((c >= '1' && c <= '9')) { // have digit
477                        int digit = c - '0';
478                        if (prec != 1 || rs != 0)
479                            ++prec; // prec unchanged if preceded by 0s
480                        rs = rs * 10 + digit;
481                        if (dot)
482                            ++scl;
483                    } else if (c == '.') {   // have dot
484                        // have dot
485                        if (dot) // two dots
486                            throw new NumberFormatException("Character array"
487                                + " contains more than one decimal point.");
488                        dot = true;
489                    } else if (Character.isDigit(c)) { // slow path
490                        int digit = Character.digit(c, 10);
491                        if (digit == 0) {
492                            if (prec == 0)
493                                prec = 1;
494                            else if (rs != 0) {
495                                rs *= 10;
496                                ++prec;
497                            } // else digit is a redundant leading zero
498                        } else {
499                            if (prec != 1 || rs != 0)
500                                ++prec; // prec unchanged if preceded by 0s
501                            rs = rs * 10 + digit;
502                        }
503                        if (dot)
504                            ++scl;
505                    } else if ((c == 'e') || (c == 'E')) {
506                        exp = parseExp(in, offset, len);
507                        // Next test is required for backwards compatibility
508                        if ((int) exp != exp) // overflow
509                            throw new NumberFormatException("Exponent overflow.");
510                        break; // [saves a test]
511                    } else {
512                        throw new NumberFormatException("Character " + c
513                            + " is neither a decimal digit number, decimal point, nor"
514                            + " \"e\" notation exponential mark.");
515                    }
516                }
517                if (prec == 0) // no digits found
518                    throw new NumberFormatException("No digits found.");
519                // Adjust scale if exp is not zero.
520                if (exp != 0) { // had significant exponent
521                    scl = adjustScale(scl, exp);
522                }
523                rs = isneg ? -rs : rs;
524                int mcp = mc.precision;
525                int drop = prec - mcp; // prec has range [1, MAX_INT], mcp has range [0, MAX_INT];
526                                       // therefore, this subtract cannot overflow
527                if (mcp > 0 && drop > 0) {  // do rounding
528                    while (drop > 0) {
529                        scl = checkScaleNonZero((long) scl - drop);
530                        rs = divideAndRound(rs, LONG_TEN_POWERS_TABLE[drop], mc.roundingMode.oldMode);
531                        prec = longDigitLength(rs);
532                        drop = prec - mcp;
533                    }
534                }
535            } else {
536                char coeff[] = new char[len];
537                for (; len > 0; offset++, len--) {
538                    c = in[offset];
539                    // have digit
540                    if ((c >= '0' && c <= '9') || Character.isDigit(c)) {
541                        // First compact case, we need not to preserve the character
542                        // and we can just compute the value in place.
543                        if (c == '0' || Character.digit(c, 10) == 0) {
544                            if (prec == 0) {
545                                coeff[idx] = c;
546                                prec = 1;
547                            } else if (idx != 0) {
548                                coeff[idx++] = c;
549                                ++prec;
550                            } // else c must be a redundant leading zero
551                        } else {
552                            if (prec != 1 || idx != 0)
553                                ++prec; // prec unchanged if preceded by 0s
554                            coeff[idx++] = c;
555                        }
556                        if (dot)
557                            ++scl;
558                        continue;
559                    }
560                    // have dot
561                    if (c == '.') {
562                        // have dot
563                        if (dot) // two dots
564                            throw new NumberFormatException("Character array"
565                                + " contains more than one decimal point.");
566                        dot = true;
567                        continue;
568                    }
569                    // exponent expected
570                    if ((c != 'e') && (c != 'E'))
571                        throw new NumberFormatException("Character array"
572                            + " is missing \"e\" notation exponential mark.");
573                    exp = parseExp(in, offset, len);
574                    // Next test is required for backwards compatibility
575                    if ((int) exp != exp) // overflow
576                        throw new NumberFormatException("Exponent overflow.");
577                    break; // [saves a test]
578                }
579                // here when no characters left
580                if (prec == 0) // no digits found
581                    throw new NumberFormatException("No digits found.");
582                // Adjust scale if exp is not zero.
583                if (exp != 0) { // had significant exponent
584                    scl = adjustScale(scl, exp);
585                }
586                // Remove leading zeros from precision (digits count)
587                rb = new BigInteger(coeff, isneg ? -1 : 1, prec);
588                rs = compactValFor(rb);
589                int mcp = mc.precision;
590                if (mcp > 0 && (prec > mcp)) {
591                    if (rs == INFLATED) {
592                        int drop = prec - mcp;
593                        while (drop > 0) {
594                            scl = checkScaleNonZero((long) scl - drop);
595                            rb = divideAndRoundByTenPow(rb, drop, mc.roundingMode.oldMode);
596                            rs = compactValFor(rb);
597                            if (rs != INFLATED) {
598                                prec = longDigitLength(rs);
599                                break;
600                            }
601                            prec = bigDigitLength(rb);
602                            drop = prec - mcp;
603                        }
604                    }
605                    if (rs != INFLATED) {
606                        int drop = prec - mcp;
607                        while (drop > 0) {
608                            scl = checkScaleNonZero((long) scl - drop);
609                            rs = divideAndRound(rs, LONG_TEN_POWERS_TABLE[drop], mc.roundingMode.oldMode);
610                            prec = longDigitLength(rs);
611                            drop = prec - mcp;
612                        }
613                        rb = null;
614                    }
615                }
616            }
617        } catch (ArrayIndexOutOfBoundsException | NegativeArraySizeException e) {
618            NumberFormatException nfe = new NumberFormatException();
619            nfe.initCause(e);
620            throw nfe;
621        }
622        this.scale = scl;
623        this.precision = prec;
624        this.intCompact = rs;
625        this.intVal = rb;
626    }
627
628    private int adjustScale(int scl, long exp) {
629        long adjustedScale = scl - exp;
630        if (adjustedScale > Integer.MAX_VALUE || adjustedScale < Integer.MIN_VALUE)
631            throw new NumberFormatException("Scale out of range.");
632        scl = (int) adjustedScale;
633        return scl;
634    }
635
636    /*
637     * parse exponent
638     */
639    private static long parseExp(char[] in, int offset, int len){
640        long exp = 0;
641        offset++;
642        char c = in[offset];
643        len--;
644        boolean negexp = (c == '-');
645        // optional sign
646        if (negexp || c == '+') {
647            offset++;
648            c = in[offset];
649            len--;
650        }
651        if (len <= 0) // no exponent digits
652            throw new NumberFormatException("No exponent digits.");
653        // skip leading zeros in the exponent
654        while (len > 10 && (c=='0' || (Character.digit(c, 10) == 0))) {
655            offset++;
656            c = in[offset];
657            len--;
658        }
659        if (len > 10) // too many nonzero exponent digits
660            throw new NumberFormatException("Too many nonzero exponent digits.");
661        // c now holds first digit of exponent
662        for (;; len--) {
663            int v;
664            if (c >= '0' && c <= '9') {
665                v = c - '0';
666            } else {
667                v = Character.digit(c, 10);
668                if (v < 0) // not a digit
669                    throw new NumberFormatException("Not a digit.");
670            }
671            exp = exp * 10 + v;
672            if (len == 1)
673                break; // that was final character
674            offset++;
675            c = in[offset];
676        }
677        if (negexp) // apply sign
678            exp = -exp;
679        return exp;
680    }
681
682    /**
683     * Translates a character array representation of a
684     * {@code BigDecimal} into a {@code BigDecimal}, accepting the
685     * same sequence of characters as the {@link #BigDecimal(String)}
686     * constructor.
687     *
688     * @implNote If the sequence of characters is already available
689     * as a character array, using this constructor is faster than
690     * converting the {@code char} array to string and using the
691     * {@code BigDecimal(String)} constructor.
692     *
693     * @param in {@code char} array that is the source of characters.
694     * @throws NumberFormatException if {@code in} is not a valid
695     *         representation of a {@code BigDecimal}.
696     * @since  1.5
697     */
698    public BigDecimal(char[] in) {
699        this(in, 0, in.length);
700    }
701
702    /**
703     * Translates a character array representation of a
704     * {@code BigDecimal} into a {@code BigDecimal}, accepting the
705     * same sequence of characters as the {@link #BigDecimal(String)}
706     * constructor and with rounding according to the context
707     * settings.
708     *
709     * @implNote If the sequence of characters is already available
710     * as a character array, using this constructor is faster than
711     * converting the {@code char} array to string and using the
712     * {@code BigDecimal(String)} constructor.
713     *
714     * @param  in {@code char} array that is the source of characters.
715     * @param  mc the context to use.
716     * @throws ArithmeticException if the result is inexact but the
717     *         rounding mode is {@code UNNECESSARY}.
718     * @throws NumberFormatException if {@code in} is not a valid
719     *         representation of a {@code BigDecimal}.
720     * @since  1.5
721     */
722    public BigDecimal(char[] in, MathContext mc) {
723        this(in, 0, in.length, mc);
724    }
725
726    /**
727     * Translates the string representation of a {@code BigDecimal}
728     * into a {@code BigDecimal}.  The string representation consists
729     * of an optional sign, {@code '+'} (<code> '&#92;u002B'</code>) or
730     * {@code '-'} (<code>'&#92;u002D'</code>), followed by a sequence of
731     * zero or more decimal digits ("the integer"), optionally
732     * followed by a fraction, optionally followed by an exponent.
733     *
734     * <p>The fraction consists of a decimal point followed by zero
735     * or more decimal digits.  The string must contain at least one
736     * digit in either the integer or the fraction.  The number formed
737     * by the sign, the integer and the fraction is referred to as the
738     * <i>significand</i>.
739     *
740     * <p>The exponent consists of the character {@code 'e'}
741     * (<code>'&#92;u0065'</code>) or {@code 'E'} (<code>'&#92;u0045'</code>)
742     * followed by one or more decimal digits.  The value of the
743     * exponent must lie between -{@link Integer#MAX_VALUE} ({@link
744     * Integer#MIN_VALUE}+1) and {@link Integer#MAX_VALUE}, inclusive.
745     *
746     * <p>More formally, the strings this constructor accepts are
747     * described by the following grammar:
748     * <blockquote>
749     * <dl>
750     * <dt><i>BigDecimalString:</i>
751     * <dd><i>Sign<sub>opt</sub> Significand Exponent<sub>opt</sub></i>
752     * <dt><i>Sign:</i>
753     * <dd>{@code +}
754     * <dd>{@code -}
755     * <dt><i>Significand:</i>
756     * <dd><i>IntegerPart</i> {@code .} <i>FractionPart<sub>opt</sub></i>
757     * <dd>{@code .} <i>FractionPart</i>
758     * <dd><i>IntegerPart</i>
759     * <dt><i>IntegerPart:</i>
760     * <dd><i>Digits</i>
761     * <dt><i>FractionPart:</i>
762     * <dd><i>Digits</i>
763     * <dt><i>Exponent:</i>
764     * <dd><i>ExponentIndicator SignedInteger</i>
765     * <dt><i>ExponentIndicator:</i>
766     * <dd>{@code e}
767     * <dd>{@code E}
768     * <dt><i>SignedInteger:</i>
769     * <dd><i>Sign<sub>opt</sub> Digits</i>
770     * <dt><i>Digits:</i>
771     * <dd><i>Digit</i>
772     * <dd><i>Digits Digit</i>
773     * <dt><i>Digit:</i>
774     * <dd>any character for which {@link Character#isDigit}
775     * returns {@code true}, including 0, 1, 2 ...
776     * </dl>
777     * </blockquote>
778     *
779     * <p>The scale of the returned {@code BigDecimal} will be the
780     * number of digits in the fraction, or zero if the string
781     * contains no decimal point, subject to adjustment for any
782     * exponent; if the string contains an exponent, the exponent is
783     * subtracted from the scale.  The value of the resulting scale
784     * must lie between {@code Integer.MIN_VALUE} and
785     * {@code Integer.MAX_VALUE}, inclusive.
786     *
787     * <p>The character-to-digit mapping is provided by {@link
788     * java.lang.Character#digit} set to convert to radix 10.  The
789     * String may not contain any extraneous characters (whitespace,
790     * for example).
791     *
792     * <p><b>Examples:</b><br>
793     * The value of the returned {@code BigDecimal} is equal to
794     * <i>significand</i> &times; 10<sup>&nbsp;<i>exponent</i></sup>.
795     * For each string on the left, the resulting representation
796     * [{@code BigInteger}, {@code scale}] is shown on the right.
797     * <pre>
798     * "0"            [0,0]
799     * "0.00"         [0,2]
800     * "123"          [123,0]
801     * "-123"         [-123,0]
802     * "1.23E3"       [123,-1]
803     * "1.23E+3"      [123,-1]
804     * "12.3E+7"      [123,-6]
805     * "12.0"         [120,1]
806     * "12.3"         [123,1]
807     * "0.00123"      [123,5]
808     * "-1.23E-12"    [-123,14]
809     * "1234.5E-4"    [12345,5]
810     * "0E+7"         [0,-7]
811     * "-0"           [0,0]
812     * </pre>
813     *
814     * @apiNote For values other than {@code float} and
815     * {@code double} NaN and &plusmn;Infinity, this constructor is
816     * compatible with the values returned by {@link Float#toString}
817     * and {@link Double#toString}.  This is generally the preferred
818     * way to convert a {@code float} or {@code double} into a
819     * BigDecimal, as it doesn't suffer from the unpredictability of
820     * the {@link #BigDecimal(double)} constructor.
821     *
822     * @param val String representation of {@code BigDecimal}.
823     *
824     * @throws NumberFormatException if {@code val} is not a valid
825     *         representation of a {@code BigDecimal}.
826     */
827    public BigDecimal(String val) {
828        this(val.toCharArray(), 0, val.length());
829    }
830
831    /**
832     * Translates the string representation of a {@code BigDecimal}
833     * into a {@code BigDecimal}, accepting the same strings as the
834     * {@link #BigDecimal(String)} constructor, with rounding
835     * according to the context settings.
836     *
837     * @param  val string representation of a {@code BigDecimal}.
838     * @param  mc the context to use.
839     * @throws ArithmeticException if the result is inexact but the
840     *         rounding mode is {@code UNNECESSARY}.
841     * @throws NumberFormatException if {@code val} is not a valid
842     *         representation of a BigDecimal.
843     * @since  1.5
844     */
845    public BigDecimal(String val, MathContext mc) {
846        this(val.toCharArray(), 0, val.length(), mc);
847    }
848
849    /**
850     * Translates a {@code double} into a {@code BigDecimal} which
851     * is the exact decimal representation of the {@code double}'s
852     * binary floating-point value.  The scale of the returned
853     * {@code BigDecimal} is the smallest value such that
854     * <code>(10<sup>scale</sup> &times; val)</code> is an integer.
855     * <p>
856     * <b>Notes:</b>
857     * <ol>
858     * <li>
859     * The results of this constructor can be somewhat unpredictable.
860     * One might assume that writing {@code new BigDecimal(0.1)} in
861     * Java creates a {@code BigDecimal} which is exactly equal to
862     * 0.1 (an unscaled value of 1, with a scale of 1), but it is
863     * actually equal to
864     * 0.1000000000000000055511151231257827021181583404541015625.
865     * This is because 0.1 cannot be represented exactly as a
866     * {@code double} (or, for that matter, as a binary fraction of
867     * any finite length).  Thus, the value that is being passed
868     * <em>in</em> to the constructor is not exactly equal to 0.1,
869     * appearances notwithstanding.
870     *
871     * <li>
872     * The {@code String} constructor, on the other hand, is
873     * perfectly predictable: writing {@code new BigDecimal("0.1")}
874     * creates a {@code BigDecimal} which is <em>exactly</em> equal to
875     * 0.1, as one would expect.  Therefore, it is generally
876     * recommended that the {@linkplain #BigDecimal(String)
877     * String constructor} be used in preference to this one.
878     *
879     * <li>
880     * When a {@code double} must be used as a source for a
881     * {@code BigDecimal}, note that this constructor provides an
882     * exact conversion; it does not give the same result as
883     * converting the {@code double} to a {@code String} using the
884     * {@link Double#toString(double)} method and then using the
885     * {@link #BigDecimal(String)} constructor.  To get that result,
886     * use the {@code static} {@link #valueOf(double)} method.
887     * </ol>
888     *
889     * @param val {@code double} value to be converted to
890     *        {@code BigDecimal}.
891     * @throws NumberFormatException if {@code val} is infinite or NaN.
892     */
893    public BigDecimal(double val) {
894        this(val,MathContext.UNLIMITED);
895    }
896
897    /**
898     * Translates a {@code double} into a {@code BigDecimal}, with
899     * rounding according to the context settings.  The scale of the
900     * {@code BigDecimal} is the smallest value such that
901     * <code>(10<sup>scale</sup> &times; val)</code> is an integer.
902     *
903     * <p>The results of this constructor can be somewhat unpredictable
904     * and its use is generally not recommended; see the notes under
905     * the {@link #BigDecimal(double)} constructor.
906     *
907     * @param  val {@code double} value to be converted to
908     *         {@code BigDecimal}.
909     * @param  mc the context to use.
910     * @throws ArithmeticException if the result is inexact but the
911     *         RoundingMode is UNNECESSARY.
912     * @throws NumberFormatException if {@code val} is infinite or NaN.
913     * @since  1.5
914     */
915    public BigDecimal(double val, MathContext mc) {
916        if (Double.isInfinite(val) || Double.isNaN(val))
917            throw new NumberFormatException("Infinite or NaN");
918        // Translate the double into sign, exponent and significand, according
919        // to the formulae in JLS, Section 20.10.22.
920        long valBits = Double.doubleToLongBits(val);
921        int sign = ((valBits >> 63) == 0 ? 1 : -1);
922        int exponent = (int) ((valBits >> 52) & 0x7ffL);
923        long significand = (exponent == 0
924                ? (valBits & ((1L << 52) - 1)) << 1
925                : (valBits & ((1L << 52) - 1)) | (1L << 52));
926        exponent -= 1075;
927        // At this point, val == sign * significand * 2**exponent.
928
929        /*
930         * Special case zero to supress nonterminating normalization and bogus
931         * scale calculation.
932         */
933        if (significand == 0) {
934            this.intVal = BigInteger.ZERO;
935            this.scale = 0;
936            this.intCompact = 0;
937            this.precision = 1;
938            return;
939        }
940        // Normalize
941        while ((significand & 1) == 0) { // i.e., significand is even
942            significand >>= 1;
943            exponent++;
944        }
945        int scl = 0;
946        // Calculate intVal and scale
947        BigInteger rb;
948        long compactVal = sign * significand;
949        if (exponent == 0) {
950            rb = (compactVal == INFLATED) ? INFLATED_BIGINT : null;
951        } else {
952            if (exponent < 0) {
953                rb = BigInteger.valueOf(5).pow(-exponent).multiply(compactVal);
954                scl = -exponent;
955            } else { //  (exponent > 0)
956                rb = BigInteger.TWO.pow(exponent).multiply(compactVal);
957            }
958            compactVal = compactValFor(rb);
959        }
960        int prec = 0;
961        int mcp = mc.precision;
962        if (mcp > 0) { // do rounding
963            int mode = mc.roundingMode.oldMode;
964            int drop;
965            if (compactVal == INFLATED) {
966                prec = bigDigitLength(rb);
967                drop = prec - mcp;
968                while (drop > 0) {
969                    scl = checkScaleNonZero((long) scl - drop);
970                    rb = divideAndRoundByTenPow(rb, drop, mode);
971                    compactVal = compactValFor(rb);
972                    if (compactVal != INFLATED) {
973                        break;
974                    }
975                    prec = bigDigitLength(rb);
976                    drop = prec - mcp;
977                }
978            }
979            if (compactVal != INFLATED) {
980                prec = longDigitLength(compactVal);
981                drop = prec - mcp;
982                while (drop > 0) {
983                    scl = checkScaleNonZero((long) scl - drop);
984                    compactVal = divideAndRound(compactVal, LONG_TEN_POWERS_TABLE[drop], mc.roundingMode.oldMode);
985                    prec = longDigitLength(compactVal);
986                    drop = prec - mcp;
987                }
988                rb = null;
989            }
990        }
991        this.intVal = rb;
992        this.intCompact = compactVal;
993        this.scale = scl;
994        this.precision = prec;
995    }
996
997    /**
998     * Translates a {@code BigInteger} into a {@code BigDecimal}.
999     * The scale of the {@code BigDecimal} is zero.
1000     *
1001     * @param val {@code BigInteger} value to be converted to
1002     *            {@code BigDecimal}.
1003     */
1004    public BigDecimal(BigInteger val) {
1005        scale = 0;
1006        intVal = val;
1007        intCompact = compactValFor(val);
1008    }
1009
1010    /**
1011     * Translates a {@code BigInteger} into a {@code BigDecimal}
1012     * rounding according to the context settings.  The scale of the
1013     * {@code BigDecimal} is zero.
1014     *
1015     * @param val {@code BigInteger} value to be converted to
1016     *            {@code BigDecimal}.
1017     * @param  mc the context to use.
1018     * @throws ArithmeticException if the result is inexact but the
1019     *         rounding mode is {@code UNNECESSARY}.
1020     * @since  1.5
1021     */
1022    public BigDecimal(BigInteger val, MathContext mc) {
1023        this(val,0,mc);
1024    }
1025
1026    /**
1027     * Translates a {@code BigInteger} unscaled value and an
1028     * {@code int} scale into a {@code BigDecimal}.  The value of
1029     * the {@code BigDecimal} is
1030     * <code>(unscaledVal &times; 10<sup>-scale</sup>)</code>.
1031     *
1032     * @param unscaledVal unscaled value of the {@code BigDecimal}.
1033     * @param scale scale of the {@code BigDecimal}.
1034     */
1035    public BigDecimal(BigInteger unscaledVal, int scale) {
1036        // Negative scales are now allowed
1037        this.intVal = unscaledVal;
1038        this.intCompact = compactValFor(unscaledVal);
1039        this.scale = scale;
1040    }
1041
1042    /**
1043     * Translates a {@code BigInteger} unscaled value and an
1044     * {@code int} scale into a {@code BigDecimal}, with rounding
1045     * according to the context settings.  The value of the
1046     * {@code BigDecimal} is <code>(unscaledVal &times;
1047     * 10<sup>-scale</sup>)</code>, rounded according to the
1048     * {@code precision} and rounding mode settings.
1049     *
1050     * @param  unscaledVal unscaled value of the {@code BigDecimal}.
1051     * @param  scale scale of the {@code BigDecimal}.
1052     * @param  mc the context to use.
1053     * @throws ArithmeticException if the result is inexact but the
1054     *         rounding mode is {@code UNNECESSARY}.
1055     * @since  1.5
1056     */
1057    public BigDecimal(BigInteger unscaledVal, int scale, MathContext mc) {
1058        long compactVal = compactValFor(unscaledVal);
1059        int mcp = mc.precision;
1060        int prec = 0;
1061        if (mcp > 0) { // do rounding
1062            int mode = mc.roundingMode.oldMode;
1063            if (compactVal == INFLATED) {
1064                prec = bigDigitLength(unscaledVal);
1065                int drop = prec - mcp;
1066                while (drop > 0) {
1067                    scale = checkScaleNonZero((long) scale - drop);
1068                    unscaledVal = divideAndRoundByTenPow(unscaledVal, drop, mode);
1069                    compactVal = compactValFor(unscaledVal);
1070                    if (compactVal != INFLATED) {
1071                        break;
1072                    }
1073                    prec = bigDigitLength(unscaledVal);
1074                    drop = prec - mcp;
1075                }
1076            }
1077            if (compactVal != INFLATED) {
1078                prec = longDigitLength(compactVal);
1079                int drop = prec - mcp;     // drop can't be more than 18
1080                while (drop > 0) {
1081                    scale = checkScaleNonZero((long) scale - drop);
1082                    compactVal = divideAndRound(compactVal, LONG_TEN_POWERS_TABLE[drop], mode);
1083                    prec = longDigitLength(compactVal);
1084                    drop = prec - mcp;
1085                }
1086                unscaledVal = null;
1087            }
1088        }
1089        this.intVal = unscaledVal;
1090        this.intCompact = compactVal;
1091        this.scale = scale;
1092        this.precision = prec;
1093    }
1094
1095    /**
1096     * Translates an {@code int} into a {@code BigDecimal}.  The
1097     * scale of the {@code BigDecimal} is zero.
1098     *
1099     * @param val {@code int} value to be converted to
1100     *            {@code BigDecimal}.
1101     * @since  1.5
1102     */
1103    public BigDecimal(int val) {
1104        this.intCompact = val;
1105        this.scale = 0;
1106        this.intVal = null;
1107    }
1108
1109    /**
1110     * Translates an {@code int} into a {@code BigDecimal}, with
1111     * rounding according to the context settings.  The scale of the
1112     * {@code BigDecimal}, before any rounding, is zero.
1113     *
1114     * @param  val {@code int} value to be converted to {@code BigDecimal}.
1115     * @param  mc the context to use.
1116     * @throws ArithmeticException if the result is inexact but the
1117     *         rounding mode is {@code UNNECESSARY}.
1118     * @since  1.5
1119     */
1120    public BigDecimal(int val, MathContext mc) {
1121        int mcp = mc.precision;
1122        long compactVal = val;
1123        int scl = 0;
1124        int prec = 0;
1125        if (mcp > 0) { // do rounding
1126            prec = longDigitLength(compactVal);
1127            int drop = prec - mcp; // drop can't be more than 18
1128            while (drop > 0) {
1129                scl = checkScaleNonZero((long) scl - drop);
1130                compactVal = divideAndRound(compactVal, LONG_TEN_POWERS_TABLE[drop], mc.roundingMode.oldMode);
1131                prec = longDigitLength(compactVal);
1132                drop = prec - mcp;
1133            }
1134        }
1135        this.intVal = null;
1136        this.intCompact = compactVal;
1137        this.scale = scl;
1138        this.precision = prec;
1139    }
1140
1141    /**
1142     * Translates a {@code long} into a {@code BigDecimal}.  The
1143     * scale of the {@code BigDecimal} is zero.
1144     *
1145     * @param val {@code long} value to be converted to {@code BigDecimal}.
1146     * @since  1.5
1147     */
1148    public BigDecimal(long val) {
1149        this.intCompact = val;
1150        this.intVal = (val == INFLATED) ? INFLATED_BIGINT : null;
1151        this.scale = 0;
1152    }
1153
1154    /**
1155     * Translates a {@code long} into a {@code BigDecimal}, with
1156     * rounding according to the context settings.  The scale of the
1157     * {@code BigDecimal}, before any rounding, is zero.
1158     *
1159     * @param  val {@code long} value to be converted to {@code BigDecimal}.
1160     * @param  mc the context to use.
1161     * @throws ArithmeticException if the result is inexact but the
1162     *         rounding mode is {@code UNNECESSARY}.
1163     * @since  1.5
1164     */
1165    public BigDecimal(long val, MathContext mc) {
1166        int mcp = mc.precision;
1167        int mode = mc.roundingMode.oldMode;
1168        int prec = 0;
1169        int scl = 0;
1170        BigInteger rb = (val == INFLATED) ? INFLATED_BIGINT : null;
1171        if (mcp > 0) { // do rounding
1172            if (val == INFLATED) {
1173                prec = 19;
1174                int drop = prec - mcp;
1175                while (drop > 0) {
1176                    scl = checkScaleNonZero((long) scl - drop);
1177                    rb = divideAndRoundByTenPow(rb, drop, mode);
1178                    val = compactValFor(rb);
1179                    if (val != INFLATED) {
1180                        break;
1181                    }
1182                    prec = bigDigitLength(rb);
1183                    drop = prec - mcp;
1184                }
1185            }
1186            if (val != INFLATED) {
1187                prec = longDigitLength(val);
1188                int drop = prec - mcp;
1189                while (drop > 0) {
1190                    scl = checkScaleNonZero((long) scl - drop);
1191                    val = divideAndRound(val, LONG_TEN_POWERS_TABLE[drop], mc.roundingMode.oldMode);
1192                    prec = longDigitLength(val);
1193                    drop = prec - mcp;
1194                }
1195                rb = null;
1196            }
1197        }
1198        this.intVal = rb;
1199        this.intCompact = val;
1200        this.scale = scl;
1201        this.precision = prec;
1202    }
1203
1204    // Static Factory Methods
1205
1206    /**
1207     * Translates a {@code long} unscaled value and an
1208     * {@code int} scale into a {@code BigDecimal}.
1209     *
1210     * @apiNote This static factory method is provided in preference
1211     * to a ({@code long}, {@code int}) constructor because it allows
1212     * for reuse of frequently used {@code BigDecimal} values.
1213     *
1214     * @param unscaledVal unscaled value of the {@code BigDecimal}.
1215     * @param scale scale of the {@code BigDecimal}.
1216     * @return a {@code BigDecimal} whose value is
1217     *         <code>(unscaledVal &times; 10<sup>-scale</sup>)</code>.
1218     */
1219    public static BigDecimal valueOf(long unscaledVal, int scale) {
1220        if (scale == 0)
1221            return valueOf(unscaledVal);
1222        else if (unscaledVal == 0) {
1223            return zeroValueOf(scale);
1224        }
1225        return new BigDecimal(unscaledVal == INFLATED ?
1226                              INFLATED_BIGINT : null,
1227                              unscaledVal, scale, 0);
1228    }
1229
1230    /**
1231     * Translates a {@code long} value into a {@code BigDecimal}
1232     * with a scale of zero.
1233     *
1234     * @apiNote This static factory method is provided in preference
1235     * to a ({@code long}) constructor because it allows for reuse of
1236     * frequently used {@code BigDecimal} values.
1237     *
1238     * @param val value of the {@code BigDecimal}.
1239     * @return a {@code BigDecimal} whose value is {@code val}.
1240     */
1241    public static BigDecimal valueOf(long val) {
1242        if (val >= 0 && val < ZERO_THROUGH_TEN.length)
1243            return ZERO_THROUGH_TEN[(int)val];
1244        else if (val != INFLATED)
1245            return new BigDecimal(null, val, 0, 0);
1246        return new BigDecimal(INFLATED_BIGINT, val, 0, 0);
1247    }
1248
1249    static BigDecimal valueOf(long unscaledVal, int scale, int prec) {
1250        if (scale == 0 && unscaledVal >= 0 && unscaledVal < ZERO_THROUGH_TEN.length) {
1251            return ZERO_THROUGH_TEN[(int) unscaledVal];
1252        } else if (unscaledVal == 0) {
1253            return zeroValueOf(scale);
1254        }
1255        return new BigDecimal(unscaledVal == INFLATED ? INFLATED_BIGINT : null,
1256                unscaledVal, scale, prec);
1257    }
1258
1259    static BigDecimal valueOf(BigInteger intVal, int scale, int prec) {
1260        long val = compactValFor(intVal);
1261        if (val == 0) {
1262            return zeroValueOf(scale);
1263        } else if (scale == 0 && val >= 0 && val < ZERO_THROUGH_TEN.length) {
1264            return ZERO_THROUGH_TEN[(int) val];
1265        }
1266        return new BigDecimal(intVal, val, scale, prec);
1267    }
1268
1269    static BigDecimal zeroValueOf(int scale) {
1270        if (scale >= 0 && scale < ZERO_SCALED_BY.length)
1271            return ZERO_SCALED_BY[scale];
1272        else
1273            return new BigDecimal(BigInteger.ZERO, 0, scale, 1);
1274    }
1275
1276    /**
1277     * Translates a {@code double} into a {@code BigDecimal}, using
1278     * the {@code double}'s canonical string representation provided
1279     * by the {@link Double#toString(double)} method.
1280     *
1281     * @apiNote This is generally the preferred way to convert a
1282     * {@code double} (or {@code float}) into a {@code BigDecimal}, as
1283     * the value returned is equal to that resulting from constructing
1284     * a {@code BigDecimal} from the result of using {@link
1285     * Double#toString(double)}.
1286     *
1287     * @param  val {@code double} to convert to a {@code BigDecimal}.
1288     * @return a {@code BigDecimal} whose value is equal to or approximately
1289     *         equal to the value of {@code val}.
1290     * @throws NumberFormatException if {@code val} is infinite or NaN.
1291     * @since  1.5
1292     */
1293    public static BigDecimal valueOf(double val) {
1294        // Reminder: a zero double returns '0.0', so we cannot fastpath
1295        // to use the constant ZERO.  This might be important enough to
1296        // justify a factory approach, a cache, or a few private
1297        // constants, later.
1298        return new BigDecimal(Double.toString(val));
1299    }
1300
1301    // Arithmetic Operations
1302    /**
1303     * Returns a {@code BigDecimal} whose value is {@code (this +
1304     * augend)}, and whose scale is {@code max(this.scale(),
1305     * augend.scale())}.
1306     *
1307     * @param  augend value to be added to this {@code BigDecimal}.
1308     * @return {@code this + augend}
1309     */
1310    public BigDecimal add(BigDecimal augend) {
1311        if (this.intCompact != INFLATED) {
1312            if ((augend.intCompact != INFLATED)) {
1313                return add(this.intCompact, this.scale, augend.intCompact, augend.scale);
1314            } else {
1315                return add(this.intCompact, this.scale, augend.intVal, augend.scale);
1316            }
1317        } else {
1318            if ((augend.intCompact != INFLATED)) {
1319                return add(augend.intCompact, augend.scale, this.intVal, this.scale);
1320            } else {
1321                return add(this.intVal, this.scale, augend.intVal, augend.scale);
1322            }
1323        }
1324    }
1325
1326    /**
1327     * Returns a {@code BigDecimal} whose value is {@code (this + augend)},
1328     * with rounding according to the context settings.
1329     *
1330     * If either number is zero and the precision setting is nonzero then
1331     * the other number, rounded if necessary, is used as the result.
1332     *
1333     * @param  augend value to be added to this {@code BigDecimal}.
1334     * @param  mc the context to use.
1335     * @return {@code this + augend}, rounded as necessary.
1336     * @throws ArithmeticException if the result is inexact but the
1337     *         rounding mode is {@code UNNECESSARY}.
1338     * @since  1.5
1339     */
1340    public BigDecimal add(BigDecimal augend, MathContext mc) {
1341        if (mc.precision == 0)
1342            return add(augend);
1343        BigDecimal lhs = this;
1344
1345        // If either number is zero then the other number, rounded and
1346        // scaled if necessary, is used as the result.
1347        {
1348            boolean lhsIsZero = lhs.signum() == 0;
1349            boolean augendIsZero = augend.signum() == 0;
1350
1351            if (lhsIsZero || augendIsZero) {
1352                int preferredScale = Math.max(lhs.scale(), augend.scale());
1353                BigDecimal result;
1354
1355                if (lhsIsZero && augendIsZero)
1356                    return zeroValueOf(preferredScale);
1357                result = lhsIsZero ? doRound(augend, mc) : doRound(lhs, mc);
1358
1359                if (result.scale() == preferredScale)
1360                    return result;
1361                else if (result.scale() > preferredScale) {
1362                    return stripZerosToMatchScale(result.intVal, result.intCompact, result.scale, preferredScale);
1363                } else { // result.scale < preferredScale
1364                    int precisionDiff = mc.precision - result.precision();
1365                    int scaleDiff     = preferredScale - result.scale();
1366
1367                    if (precisionDiff >= scaleDiff)
1368                        return result.setScale(preferredScale); // can achieve target scale
1369                    else
1370                        return result.setScale(result.scale() + precisionDiff);
1371                }
1372            }
1373        }
1374
1375        long padding = (long) lhs.scale - augend.scale;
1376        if (padding != 0) { // scales differ; alignment needed
1377            BigDecimal arg[] = preAlign(lhs, augend, padding, mc);
1378            matchScale(arg);
1379            lhs = arg[0];
1380            augend = arg[1];
1381        }
1382        return doRound(lhs.inflated().add(augend.inflated()), lhs.scale, mc);
1383    }
1384
1385    /**
1386     * Returns an array of length two, the sum of whose entries is
1387     * equal to the rounded sum of the {@code BigDecimal} arguments.
1388     *
1389     * <p>If the digit positions of the arguments have a sufficient
1390     * gap between them, the value smaller in magnitude can be
1391     * condensed into a {@literal "sticky bit"} and the end result will
1392     * round the same way <em>if</em> the precision of the final
1393     * result does not include the high order digit of the small
1394     * magnitude operand.
1395     *
1396     * <p>Note that while strictly speaking this is an optimization,
1397     * it makes a much wider range of additions practical.
1398     *
1399     * <p>This corresponds to a pre-shift operation in a fixed
1400     * precision floating-point adder; this method is complicated by
1401     * variable precision of the result as determined by the
1402     * MathContext.  A more nuanced operation could implement a
1403     * {@literal "right shift"} on the smaller magnitude operand so
1404     * that the number of digits of the smaller operand could be
1405     * reduced even though the significands partially overlapped.
1406     */
1407    private BigDecimal[] preAlign(BigDecimal lhs, BigDecimal augend, long padding, MathContext mc) {
1408        assert padding != 0;
1409        BigDecimal big;
1410        BigDecimal small;
1411
1412        if (padding < 0) { // lhs is big; augend is small
1413            big = lhs;
1414            small = augend;
1415        } else { // lhs is small; augend is big
1416            big = augend;
1417            small = lhs;
1418        }
1419
1420        /*
1421         * This is the estimated scale of an ulp of the result; it assumes that
1422         * the result doesn't have a carry-out on a true add (e.g. 999 + 1 =>
1423         * 1000) or any subtractive cancellation on borrowing (e.g. 100 - 1.2 =>
1424         * 98.8)
1425         */
1426        long estResultUlpScale = (long) big.scale - big.precision() + mc.precision;
1427
1428        /*
1429         * The low-order digit position of big is big.scale().  This
1430         * is true regardless of whether big has a positive or
1431         * negative scale.  The high-order digit position of small is
1432         * small.scale - (small.precision() - 1).  To do the full
1433         * condensation, the digit positions of big and small must be
1434         * disjoint *and* the digit positions of small should not be
1435         * directly visible in the result.
1436         */
1437        long smallHighDigitPos = (long) small.scale - small.precision() + 1;
1438        if (smallHighDigitPos > big.scale + 2 && // big and small disjoint
1439            smallHighDigitPos > estResultUlpScale + 2) { // small digits not visible
1440            small = BigDecimal.valueOf(small.signum(), this.checkScale(Math.max(big.scale, estResultUlpScale) + 3));
1441        }
1442
1443        // Since addition is symmetric, preserving input order in
1444        // returned operands doesn't matter
1445        BigDecimal[] result = {big, small};
1446        return result;
1447    }
1448
1449    /**
1450     * Returns a {@code BigDecimal} whose value is {@code (this -
1451     * subtrahend)}, and whose scale is {@code max(this.scale(),
1452     * subtrahend.scale())}.
1453     *
1454     * @param  subtrahend value to be subtracted from this {@code BigDecimal}.
1455     * @return {@code this - subtrahend}
1456     */
1457    public BigDecimal subtract(BigDecimal subtrahend) {
1458        if (this.intCompact != INFLATED) {
1459            if ((subtrahend.intCompact != INFLATED)) {
1460                return add(this.intCompact, this.scale, -subtrahend.intCompact, subtrahend.scale);
1461            } else {
1462                return add(this.intCompact, this.scale, subtrahend.intVal.negate(), subtrahend.scale);
1463            }
1464        } else {
1465            if ((subtrahend.intCompact != INFLATED)) {
1466                // Pair of subtrahend values given before pair of
1467                // values from this BigDecimal to avoid need for
1468                // method overloading on the specialized add method
1469                return add(-subtrahend.intCompact, subtrahend.scale, this.intVal, this.scale);
1470            } else {
1471                return add(this.intVal, this.scale, subtrahend.intVal.negate(), subtrahend.scale);
1472            }
1473        }
1474    }
1475
1476    /**
1477     * Returns a {@code BigDecimal} whose value is {@code (this - subtrahend)},
1478     * with rounding according to the context settings.
1479     *
1480     * If {@code subtrahend} is zero then this, rounded if necessary, is used as the
1481     * result.  If this is zero then the result is {@code subtrahend.negate(mc)}.
1482     *
1483     * @param  subtrahend value to be subtracted from this {@code BigDecimal}.
1484     * @param  mc the context to use.
1485     * @return {@code this - subtrahend}, rounded as necessary.
1486     * @throws ArithmeticException if the result is inexact but the
1487     *         rounding mode is {@code UNNECESSARY}.
1488     * @since  1.5
1489     */
1490    public BigDecimal subtract(BigDecimal subtrahend, MathContext mc) {
1491        if (mc.precision == 0)
1492            return subtract(subtrahend);
1493        // share the special rounding code in add()
1494        return add(subtrahend.negate(), mc);
1495    }
1496
1497    /**
1498     * Returns a {@code BigDecimal} whose value is <code>(this &times;
1499     * multiplicand)</code>, and whose scale is {@code (this.scale() +
1500     * multiplicand.scale())}.
1501     *
1502     * @param  multiplicand value to be multiplied by this {@code BigDecimal}.
1503     * @return {@code this * multiplicand}
1504     */
1505    public BigDecimal multiply(BigDecimal multiplicand) {
1506        int productScale = checkScale((long) scale + multiplicand.scale);
1507        if (this.intCompact != INFLATED) {
1508            if ((multiplicand.intCompact != INFLATED)) {
1509                return multiply(this.intCompact, multiplicand.intCompact, productScale);
1510            } else {
1511                return multiply(this.intCompact, multiplicand.intVal, productScale);
1512            }
1513        } else {
1514            if ((multiplicand.intCompact != INFLATED)) {
1515                return multiply(multiplicand.intCompact, this.intVal, productScale);
1516            } else {
1517                return multiply(this.intVal, multiplicand.intVal, productScale);
1518            }
1519        }
1520    }
1521
1522    /**
1523     * Returns a {@code BigDecimal} whose value is <code>(this &times;
1524     * multiplicand)</code>, with rounding according to the context settings.
1525     *
1526     * @param  multiplicand value to be multiplied by this {@code BigDecimal}.
1527     * @param  mc the context to use.
1528     * @return {@code this * multiplicand}, rounded as necessary.
1529     * @throws ArithmeticException if the result is inexact but the
1530     *         rounding mode is {@code UNNECESSARY}.
1531     * @since  1.5
1532     */
1533    public BigDecimal multiply(BigDecimal multiplicand, MathContext mc) {
1534        if (mc.precision == 0)
1535            return multiply(multiplicand);
1536        int productScale = checkScale((long) scale + multiplicand.scale);
1537        if (this.intCompact != INFLATED) {
1538            if ((multiplicand.intCompact != INFLATED)) {
1539                return multiplyAndRound(this.intCompact, multiplicand.intCompact, productScale, mc);
1540            } else {
1541                return multiplyAndRound(this.intCompact, multiplicand.intVal, productScale, mc);
1542            }
1543        } else {
1544            if ((multiplicand.intCompact != INFLATED)) {
1545                return multiplyAndRound(multiplicand.intCompact, this.intVal, productScale, mc);
1546            } else {
1547                return multiplyAndRound(this.intVal, multiplicand.intVal, productScale, mc);
1548            }
1549        }
1550    }
1551
1552    /**
1553     * Returns a {@code BigDecimal} whose value is {@code (this /
1554     * divisor)}, and whose scale is as specified.  If rounding must
1555     * be performed to generate a result with the specified scale, the
1556     * specified rounding mode is applied.
1557     *
1558     * @deprecated The method {@link #divide(BigDecimal, int, RoundingMode)}
1559     * should be used in preference to this legacy method.
1560     *
1561     * @param  divisor value by which this {@code BigDecimal} is to be divided.
1562     * @param  scale scale of the {@code BigDecimal} quotient to be returned.
1563     * @param  roundingMode rounding mode to apply.
1564     * @return {@code this / divisor}
1565     * @throws ArithmeticException if {@code divisor} is zero,
1566     *         {@code roundingMode==ROUND_UNNECESSARY} and
1567     *         the specified scale is insufficient to represent the result
1568     *         of the division exactly.
1569     * @throws IllegalArgumentException if {@code roundingMode} does not
1570     *         represent a valid rounding mode.
1571     * @see    #ROUND_UP
1572     * @see    #ROUND_DOWN
1573     * @see    #ROUND_CEILING
1574     * @see    #ROUND_FLOOR
1575     * @see    #ROUND_HALF_UP
1576     * @see    #ROUND_HALF_DOWN
1577     * @see    #ROUND_HALF_EVEN
1578     * @see    #ROUND_UNNECESSARY
1579     */
1580    @Deprecated(since="9")
1581    public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) {
1582        if (roundingMode < ROUND_UP || roundingMode > ROUND_UNNECESSARY)
1583            throw new IllegalArgumentException("Invalid rounding mode");
1584        if (this.intCompact != INFLATED) {
1585            if ((divisor.intCompact != INFLATED)) {
1586                return divide(this.intCompact, this.scale, divisor.intCompact, divisor.scale, scale, roundingMode);
1587            } else {
1588                return divide(this.intCompact, this.scale, divisor.intVal, divisor.scale, scale, roundingMode);
1589            }
1590        } else {
1591            if ((divisor.intCompact != INFLATED)) {
1592                return divide(this.intVal, this.scale, divisor.intCompact, divisor.scale, scale, roundingMode);
1593            } else {
1594                return divide(this.intVal, this.scale, divisor.intVal, divisor.scale, scale, roundingMode);
1595            }
1596        }
1597    }
1598
1599    /**
1600     * Returns a {@code BigDecimal} whose value is {@code (this /
1601     * divisor)}, and whose scale is as specified.  If rounding must
1602     * be performed to generate a result with the specified scale, the
1603     * specified rounding mode is applied.
1604     *
1605     * @param  divisor value by which this {@code BigDecimal} is to be divided.
1606     * @param  scale scale of the {@code BigDecimal} quotient to be returned.
1607     * @param  roundingMode rounding mode to apply.
1608     * @return {@code this / divisor}
1609     * @throws ArithmeticException if {@code divisor} is zero,
1610     *         {@code roundingMode==RoundingMode.UNNECESSARY} and
1611     *         the specified scale is insufficient to represent the result
1612     *         of the division exactly.
1613     * @since 1.5
1614     */
1615    public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) {
1616        return divide(divisor, scale, roundingMode.oldMode);
1617    }
1618
1619    /**
1620     * Returns a {@code BigDecimal} whose value is {@code (this /
1621     * divisor)}, and whose scale is {@code this.scale()}.  If
1622     * rounding must be performed to generate a result with the given
1623     * scale, the specified rounding mode is applied.
1624     *
1625     * @deprecated The method {@link #divide(BigDecimal, RoundingMode)}
1626     * should be used in preference to this legacy method.
1627     *
1628     * @param  divisor value by which this {@code BigDecimal} is to be divided.
1629     * @param  roundingMode rounding mode to apply.
1630     * @return {@code this / divisor}
1631     * @throws ArithmeticException if {@code divisor==0}, or
1632     *         {@code roundingMode==ROUND_UNNECESSARY} and
1633     *         {@code this.scale()} is insufficient to represent the result
1634     *         of the division exactly.
1635     * @throws IllegalArgumentException if {@code roundingMode} does not
1636     *         represent a valid rounding mode.
1637     * @see    #ROUND_UP
1638     * @see    #ROUND_DOWN
1639     * @see    #ROUND_CEILING
1640     * @see    #ROUND_FLOOR
1641     * @see    #ROUND_HALF_UP
1642     * @see    #ROUND_HALF_DOWN
1643     * @see    #ROUND_HALF_EVEN
1644     * @see    #ROUND_UNNECESSARY
1645     */
1646    @Deprecated(since="9")
1647    public BigDecimal divide(BigDecimal divisor, int roundingMode) {
1648        return this.divide(divisor, scale, roundingMode);
1649    }
1650
1651    /**
1652     * Returns a {@code BigDecimal} whose value is {@code (this /
1653     * divisor)}, and whose scale is {@code this.scale()}.  If
1654     * rounding must be performed to generate a result with the given
1655     * scale, the specified rounding mode is applied.
1656     *
1657     * @param  divisor value by which this {@code BigDecimal} is to be divided.
1658     * @param  roundingMode rounding mode to apply.
1659     * @return {@code this / divisor}
1660     * @throws ArithmeticException if {@code divisor==0}, or
1661     *         {@code roundingMode==RoundingMode.UNNECESSARY} and
1662     *         {@code this.scale()} is insufficient to represent the result
1663     *         of the division exactly.
1664     * @since 1.5
1665     */
1666    public BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode) {
1667        return this.divide(divisor, scale, roundingMode.oldMode);
1668    }
1669
1670    /**
1671     * Returns a {@code BigDecimal} whose value is {@code (this /
1672     * divisor)}, and whose preferred scale is {@code (this.scale() -
1673     * divisor.scale())}; if the exact quotient cannot be
1674     * represented (because it has a non-terminating decimal
1675     * expansion) an {@code ArithmeticException} is thrown.
1676     *
1677     * @param  divisor value by which this {@code BigDecimal} is to be divided.
1678     * @throws ArithmeticException if the exact quotient does not have a
1679     *         terminating decimal expansion
1680     * @return {@code this / divisor}
1681     * @since 1.5
1682     * @author Joseph D. Darcy
1683     */
1684    public BigDecimal divide(BigDecimal divisor) {
1685        /*
1686         * Handle zero cases first.
1687         */
1688        if (divisor.signum() == 0) {   // x/0
1689            if (this.signum() == 0)    // 0/0
1690                throw new ArithmeticException("Division undefined");  // NaN
1691            throw new ArithmeticException("Division by zero");
1692        }
1693
1694        // Calculate preferred scale
1695        int preferredScale = saturateLong((long) this.scale - divisor.scale);
1696
1697        if (this.signum() == 0) // 0/y
1698            return zeroValueOf(preferredScale);
1699        else {
1700            /*
1701             * If the quotient this/divisor has a terminating decimal
1702             * expansion, the expansion can have no more than
1703             * (a.precision() + ceil(10*b.precision)/3) digits.
1704             * Therefore, create a MathContext object with this
1705             * precision and do a divide with the UNNECESSARY rounding
1706             * mode.
1707             */
1708            MathContext mc = new MathContext( (int)Math.min(this.precision() +
1709                                                            (long)Math.ceil(10.0*divisor.precision()/3.0),
1710                                                            Integer.MAX_VALUE),
1711                                              RoundingMode.UNNECESSARY);
1712            BigDecimal quotient;
1713            try {
1714                quotient = this.divide(divisor, mc);
1715            } catch (ArithmeticException e) {
1716                throw new ArithmeticException("Non-terminating decimal expansion; " +
1717                                              "no exact representable decimal result.");
1718            }
1719
1720            int quotientScale = quotient.scale();
1721
1722            // divide(BigDecimal, mc) tries to adjust the quotient to
1723            // the desired one by removing trailing zeros; since the
1724            // exact divide method does not have an explicit digit
1725            // limit, we can add zeros too.
1726            if (preferredScale > quotientScale)
1727                return quotient.setScale(preferredScale, ROUND_UNNECESSARY);
1728
1729            return quotient;
1730        }
1731    }
1732
1733    /**
1734     * Returns a {@code BigDecimal} whose value is {@code (this /
1735     * divisor)}, with rounding according to the context settings.
1736     *
1737     * @param  divisor value by which this {@code BigDecimal} is to be divided.
1738     * @param  mc the context to use.
1739     * @return {@code this / divisor}, rounded as necessary.
1740     * @throws ArithmeticException if the result is inexact but the
1741     *         rounding mode is {@code UNNECESSARY} or
1742     *         {@code mc.precision == 0} and the quotient has a
1743     *         non-terminating decimal expansion.
1744     * @since  1.5
1745     */
1746    public BigDecimal divide(BigDecimal divisor, MathContext mc) {
1747        int mcp = mc.precision;
1748        if (mcp == 0)
1749            return divide(divisor);
1750
1751        BigDecimal dividend = this;
1752        long preferredScale = (long)dividend.scale - divisor.scale;
1753        // Now calculate the answer.  We use the existing
1754        // divide-and-round method, but as this rounds to scale we have
1755        // to normalize the values here to achieve the desired result.
1756        // For x/y we first handle y=0 and x=0, and then normalize x and
1757        // y to give x' and y' with the following constraints:
1758        //   (a) 0.1 <= x' < 1
1759        //   (b)  x' <= y' < 10*x'
1760        // Dividing x'/y' with the required scale set to mc.precision then
1761        // will give a result in the range 0.1 to 1 rounded to exactly
1762        // the right number of digits (except in the case of a result of
1763        // 1.000... which can arise when x=y, or when rounding overflows
1764        // The 1.000... case will reduce properly to 1.
1765        if (divisor.signum() == 0) {      // x/0
1766            if (dividend.signum() == 0)    // 0/0
1767                throw new ArithmeticException("Division undefined");  // NaN
1768            throw new ArithmeticException("Division by zero");
1769        }
1770        if (dividend.signum() == 0) // 0/y
1771            return zeroValueOf(saturateLong(preferredScale));
1772        int xscale = dividend.precision();
1773        int yscale = divisor.precision();
1774        if(dividend.intCompact!=INFLATED) {
1775            if(divisor.intCompact!=INFLATED) {
1776                return divide(dividend.intCompact, xscale, divisor.intCompact, yscale, preferredScale, mc);
1777            } else {
1778                return divide(dividend.intCompact, xscale, divisor.intVal, yscale, preferredScale, mc);
1779            }
1780        } else {
1781            if(divisor.intCompact!=INFLATED) {
1782                return divide(dividend.intVal, xscale, divisor.intCompact, yscale, preferredScale, mc);
1783            } else {
1784                return divide(dividend.intVal, xscale, divisor.intVal, yscale, preferredScale, mc);
1785            }
1786        }
1787    }
1788
1789    /**
1790     * Returns a {@code BigDecimal} whose value is the integer part
1791     * of the quotient {@code (this / divisor)} rounded down.  The
1792     * preferred scale of the result is {@code (this.scale() -
1793     * divisor.scale())}.
1794     *
1795     * @param  divisor value by which this {@code BigDecimal} is to be divided.
1796     * @return The integer part of {@code this / divisor}.
1797     * @throws ArithmeticException if {@code divisor==0}
1798     * @since  1.5
1799     */
1800    public BigDecimal divideToIntegralValue(BigDecimal divisor) {
1801        // Calculate preferred scale
1802        int preferredScale = saturateLong((long) this.scale - divisor.scale);
1803        if (this.compareMagnitude(divisor) < 0) {
1804            // much faster when this << divisor
1805            return zeroValueOf(preferredScale);
1806        }
1807
1808        if (this.signum() == 0 && divisor.signum() != 0)
1809            return this.setScale(preferredScale, ROUND_UNNECESSARY);
1810
1811        // Perform a divide with enough digits to round to a correct
1812        // integer value; then remove any fractional digits
1813
1814        int maxDigits = (int)Math.min(this.precision() +
1815                                      (long)Math.ceil(10.0*divisor.precision()/3.0) +
1816                                      Math.abs((long)this.scale() - divisor.scale()) + 2,
1817                                      Integer.MAX_VALUE);
1818        BigDecimal quotient = this.divide(divisor, new MathContext(maxDigits,
1819                                                                   RoundingMode.DOWN));
1820        if (quotient.scale > 0) {
1821            quotient = quotient.setScale(0, RoundingMode.DOWN);
1822            quotient = stripZerosToMatchScale(quotient.intVal, quotient.intCompact, quotient.scale, preferredScale);
1823        }
1824
1825        if (quotient.scale < preferredScale) {
1826            // pad with zeros if necessary
1827            quotient = quotient.setScale(preferredScale, ROUND_UNNECESSARY);
1828        }
1829
1830        return quotient;
1831    }
1832
1833    /**
1834     * Returns a {@code BigDecimal} whose value is the integer part
1835     * of {@code (this / divisor)}.  Since the integer part of the
1836     * exact quotient does not depend on the rounding mode, the
1837     * rounding mode does not affect the values returned by this
1838     * method.  The preferred scale of the result is
1839     * {@code (this.scale() - divisor.scale())}.  An
1840     * {@code ArithmeticException} is thrown if the integer part of
1841     * the exact quotient needs more than {@code mc.precision}
1842     * digits.
1843     *
1844     * @param  divisor value by which this {@code BigDecimal} is to be divided.
1845     * @param  mc the context to use.
1846     * @return The integer part of {@code this / divisor}.
1847     * @throws ArithmeticException if {@code divisor==0}
1848     * @throws ArithmeticException if {@code mc.precision} {@literal >} 0 and the result
1849     *         requires a precision of more than {@code mc.precision} digits.
1850     * @since  1.5
1851     * @author Joseph D. Darcy
1852     */
1853    public BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext mc) {
1854        if (mc.precision == 0 || // exact result
1855            (this.compareMagnitude(divisor) < 0)) // zero result
1856            return divideToIntegralValue(divisor);
1857
1858        // Calculate preferred scale
1859        int preferredScale = saturateLong((long)this.scale - divisor.scale);
1860
1861        /*
1862         * Perform a normal divide to mc.precision digits.  If the
1863         * remainder has absolute value less than the divisor, the
1864         * integer portion of the quotient fits into mc.precision
1865         * digits.  Next, remove any fractional digits from the
1866         * quotient and adjust the scale to the preferred value.
1867         */
1868        BigDecimal result = this.divide(divisor, new MathContext(mc.precision, RoundingMode.DOWN));
1869
1870        if (result.scale() < 0) {
1871            /*
1872             * Result is an integer. See if quotient represents the
1873             * full integer portion of the exact quotient; if it does,
1874             * the computed remainder will be less than the divisor.
1875             */
1876            BigDecimal product = result.multiply(divisor);
1877            // If the quotient is the full integer value,
1878            // |dividend-product| < |divisor|.
1879            if (this.subtract(product).compareMagnitude(divisor) >= 0) {
1880                throw new ArithmeticException("Division impossible");
1881            }
1882        } else if (result.scale() > 0) {
1883            /*
1884             * Integer portion of quotient will fit into precision
1885             * digits; recompute quotient to scale 0 to avoid double
1886             * rounding and then try to adjust, if necessary.
1887             */
1888            result = result.setScale(0, RoundingMode.DOWN);
1889        }
1890        // else result.scale() == 0;
1891
1892        int precisionDiff;
1893        if ((preferredScale > result.scale()) &&
1894            (precisionDiff = mc.precision - result.precision()) > 0) {
1895            return result.setScale(result.scale() +
1896                                   Math.min(precisionDiff, preferredScale - result.scale) );
1897        } else {
1898            return stripZerosToMatchScale(result.intVal,result.intCompact,result.scale,preferredScale);
1899        }
1900    }
1901
1902    /**
1903     * Returns a {@code BigDecimal} whose value is {@code (this % divisor)}.
1904     *
1905     * <p>The remainder is given by
1906     * {@code this.subtract(this.divideToIntegralValue(divisor).multiply(divisor))}.
1907     * Note that this is <em>not</em> the modulo operation (the result can be
1908     * negative).
1909     *
1910     * @param  divisor value by which this {@code BigDecimal} is to be divided.
1911     * @return {@code this % divisor}.
1912     * @throws ArithmeticException if {@code divisor==0}
1913     * @since  1.5
1914     */
1915    public BigDecimal remainder(BigDecimal divisor) {
1916        BigDecimal divrem[] = this.divideAndRemainder(divisor);
1917        return divrem[1];
1918    }
1919
1920
1921    /**
1922     * Returns a {@code BigDecimal} whose value is {@code (this %
1923     * divisor)}, with rounding according to the context settings.
1924     * The {@code MathContext} settings affect the implicit divide
1925     * used to compute the remainder.  The remainder computation
1926     * itself is by definition exact.  Therefore, the remainder may
1927     * contain more than {@code mc.getPrecision()} digits.
1928     *
1929     * <p>The remainder is given by
1930     * {@code this.subtract(this.divideToIntegralValue(divisor,
1931     * mc).multiply(divisor))}.  Note that this is not the modulo
1932     * operation (the result can be negative).
1933     *
1934     * @param  divisor value by which this {@code BigDecimal} is to be divided.
1935     * @param  mc the context to use.
1936     * @return {@code this % divisor}, rounded as necessary.
1937     * @throws ArithmeticException if {@code divisor==0}
1938     * @throws ArithmeticException if the result is inexact but the
1939     *         rounding mode is {@code UNNECESSARY}, or {@code mc.precision}
1940     *         {@literal >} 0 and the result of {@code this.divideToIntgralValue(divisor)} would
1941     *         require a precision of more than {@code mc.precision} digits.
1942     * @see    #divideToIntegralValue(java.math.BigDecimal, java.math.MathContext)
1943     * @since  1.5
1944     */
1945    public BigDecimal remainder(BigDecimal divisor, MathContext mc) {
1946        BigDecimal divrem[] = this.divideAndRemainder(divisor, mc);
1947        return divrem[1];
1948    }
1949
1950    /**
1951     * Returns a two-element {@code BigDecimal} array containing the
1952     * result of {@code divideToIntegralValue} followed by the result of
1953     * {@code remainder} on the two operands.
1954     *
1955     * <p>Note that if both the integer quotient and remainder are
1956     * needed, this method is faster than using the
1957     * {@code divideToIntegralValue} and {@code remainder} methods
1958     * separately because the division need only be carried out once.
1959     *
1960     * @param  divisor value by which this {@code BigDecimal} is to be divided,
1961     *         and the remainder computed.
1962     * @return a two element {@code BigDecimal} array: the quotient
1963     *         (the result of {@code divideToIntegralValue}) is the initial element
1964     *         and the remainder is the final element.
1965     * @throws ArithmeticException if {@code divisor==0}
1966     * @see    #divideToIntegralValue(java.math.BigDecimal, java.math.MathContext)
1967     * @see    #remainder(java.math.BigDecimal, java.math.MathContext)
1968     * @since  1.5
1969     */
1970    public BigDecimal[] divideAndRemainder(BigDecimal divisor) {
1971        // we use the identity  x = i * y + r to determine r
1972        BigDecimal[] result = new BigDecimal[2];
1973
1974        result[0] = this.divideToIntegralValue(divisor);
1975        result[1] = this.subtract(result[0].multiply(divisor));
1976        return result;
1977    }
1978
1979    /**
1980     * Returns a two-element {@code BigDecimal} array containing the
1981     * result of {@code divideToIntegralValue} followed by the result of
1982     * {@code remainder} on the two operands calculated with rounding
1983     * according to the context settings.
1984     *
1985     * <p>Note that if both the integer quotient and remainder are
1986     * needed, this method is faster than using the
1987     * {@code divideToIntegralValue} and {@code remainder} methods
1988     * separately because the division need only be carried out once.
1989     *
1990     * @param  divisor value by which this {@code BigDecimal} is to be divided,
1991     *         and the remainder computed.
1992     * @param  mc the context to use.
1993     * @return a two element {@code BigDecimal} array: the quotient
1994     *         (the result of {@code divideToIntegralValue}) is the
1995     *         initial element and the remainder is the final element.
1996     * @throws ArithmeticException if {@code divisor==0}
1997     * @throws ArithmeticException if the result is inexact but the
1998     *         rounding mode is {@code UNNECESSARY}, or {@code mc.precision}
1999     *         {@literal >} 0 and the result of {@code this.divideToIntgralValue(divisor)} would
2000     *         require a precision of more than {@code mc.precision} digits.
2001     * @see    #divideToIntegralValue(java.math.BigDecimal, java.math.MathContext)
2002     * @see    #remainder(java.math.BigDecimal, java.math.MathContext)
2003     * @since  1.5
2004     */
2005    public BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc) {
2006        if (mc.precision == 0)
2007            return divideAndRemainder(divisor);
2008
2009        BigDecimal[] result = new BigDecimal[2];
2010        BigDecimal lhs = this;
2011
2012        result[0] = lhs.divideToIntegralValue(divisor, mc);
2013        result[1] = lhs.subtract(result[0].multiply(divisor));
2014        return result;
2015    }
2016
2017    /**
2018     * Returns an approximation to the square root of {@code this}
2019     * with rounding according to the context settings.
2020     *
2021     * <p>The preferred scale of the returned result is equal to
2022     * {@code this.scale()/2}. The value of the returned result is
2023     * always within one ulp of the exact decimal value for the
2024     * precision in question.  If the rounding mode is {@link
2025     * RoundingMode#HALF_UP HALF_UP}, {@link RoundingMode#HALF_DOWN
2026     * HALF_DOWN}, or {@link RoundingMode#HALF_EVEN HALF_EVEN}, the
2027     * result is within one half an ulp of the exact decimal value.
2028     *
2029     * <p>Special case:
2030     * <ul>
2031     * <li> The square root of a number numerically equal to {@code
2032     * ZERO} is numerically equal to {@code ZERO} with a preferred
2033     * scale according to the general rule above. In particular, for
2034     * {@code ZERO}, {@code ZERO.sqrt(mc).equals(ZERO)} is true with
2035     * any {@code MathContext} as an argument.
2036     * </ul>
2037     *
2038     * @param mc the context to use.
2039     * @return the square root of {@code this}.
2040     * @throws ArithmeticException if {@code this} is less than zero.
2041     * @throws ArithmeticException if an exact result is requested
2042     * ({@code mc.getPrecision()==0}) and there is no finite decimal
2043     * expansion of the exact result
2044     * @throws ArithmeticException if
2045     * {@code (mc.getRoundingMode()==RoundingMode.UNNECESSARY}) and
2046     * the exact result cannot fit in {@code mc.getPrecision()}
2047     * digits.
2048     * @see BigInteger#sqrt()
2049     * @since  9
2050     */
2051    public BigDecimal sqrt(MathContext mc) {
2052        int signum = signum();
2053        if (signum == 1) {
2054            /*
2055             * The following code draws on the algorithm presented in
2056             * "Properly Rounded Variable Precision Square Root," Hull and
2057             * Abrham, ACM Transactions on Mathematical Software, Vol 11,
2058             * No. 3, September 1985, Pages 229-237.
2059             *
2060             * The BigDecimal computational model differs from the one
2061             * presented in the paper in several ways: first BigDecimal
2062             * numbers aren't necessarily normalized, second many more
2063             * rounding modes are supported, including UNNECESSARY, and
2064             * exact results can be requested.
2065             *
2066             * The main steps of the algorithm below are as follows,
2067             * first argument reduce the value to the numerical range
2068             * [1, 10) using the following relations:
2069             *
2070             * x = y * 10 ^ exp
2071             * sqrt(x) = sqrt(y) * 10^(exp / 2) if exp is even
2072             * sqrt(x) = sqrt(y/10) * 10 ^((exp+1)/2) is exp is odd
2073             *
2074             * Then use Newton's iteration on the reduced value to compute
2075             * the numerical digits of the desired result.
2076             *
2077             * Finally, scale back to the desired exponent range and
2078             * perform any adjustment to get the preferred scale in the
2079             * representation.
2080             */
2081
2082            // The code below favors relative simplicity over checking
2083            // for special cases that could run faster.
2084
2085            int preferredScale = this.scale()/2;
2086            BigDecimal zeroWithFinalPreferredScale = valueOf(0L, preferredScale);
2087
2088            // First phase of numerical normalization, strip trailing
2089            // zeros and check for even powers of 10.
2090            BigDecimal stripped = this.stripTrailingZeros();
2091            int strippedScale = stripped.scale();
2092
2093            // Numerically sqrt(10^2N) = 10^N
2094            if (stripped.isPowerOfTen() &&
2095                strippedScale % 2 == 0) {
2096                BigDecimal result = valueOf(1L, strippedScale/2);
2097                if (result.scale() != preferredScale) {
2098                    // Adjust to requested precision and preferred
2099                    // scale as appropriate.
2100                    result = result.add(zeroWithFinalPreferredScale, mc);
2101                }
2102                return result;
2103            }
2104
2105            // After stripTrailingZeros, the representation is normalized as
2106            //
2107            // unscaledValue * 10^(-scale)
2108            //
2109            // where unscaledValue is an integer with the mimimum
2110            // precision for the cohort of the numerical value. To
2111            // allow binary floating-point hardware to be used to get
2112            // approximately a 15 digit approximation to the square
2113            // root, it is helpful to instead normalize this so that
2114            // the significand portion is to right of the decimal
2115            // point by roughly (scale() - precision() +1).
2116
2117            // Now the precision / scale adjustment
2118            int scaleAdjust = 0;
2119            int scale = stripped.scale() - stripped.precision() + 1;
2120            if (scale % 2 == 0) {
2121                scaleAdjust = scale;
2122            } else {
2123                scaleAdjust = scale - 1;
2124            }
2125
2126            BigDecimal working = stripped.scaleByPowerOfTen(scaleAdjust);
2127
2128            assert  // Verify 0.1 <= working < 10
2129                ONE_TENTH.compareTo(working) <= 0 && working.compareTo(TEN) < 0;
2130
2131            // Use good ole' Math.sqrt to get the initial guess for
2132            // the Newton iteration, good to at least 15 decimal
2133            // digits. This approach does incur the cost of a
2134            //
2135            // BigDecimal -> double -> BigDecimal
2136            //
2137            // conversion cycle, but it avoids the need for several
2138            // Newton iterations in BigDecimal arithmetic to get the
2139            // working answer to 15 digits of precision. If many fewer
2140            // than 15 digits were needed, it might be faster to do
2141            // the loop entirely in BigDecimal arithmetic.
2142            //
2143            // (A double value might have as much many as 17 decimal
2144            // digits of precision; it depends on the relative density
2145            // of binary and decimal numbers at different regions of
2146            // the number line.)
2147            //
2148            // (It would be possible to check for certain special
2149            // cases to avoid doing any Newton iterations. For
2150            // example, if the BigDecimal -> double conversion was
2151            // known to be exact and the rounding mode had a
2152            // low-enough precision, the post-Newton rounding logic
2153            // could be applied directly.)
2154
2155            BigDecimal guess = new BigDecimal(Math.sqrt(working.doubleValue()));
2156            int guessPrecision = 15;
2157            int originalPrecision = mc.getPrecision();
2158            int targetPrecision;
2159
2160            // If an exact value is requested, it must only need about
2161            // half of the input digits to represent since multiplying
2162            // an N digit number by itself yield a 2N-1 digit or 2N
2163            // digit result.
2164            if (originalPrecision == 0) {
2165                targetPrecision = stripped.precision()/2 + 1;
2166            } else {
2167                targetPrecision = originalPrecision;
2168            }
2169
2170            // When setting the precision to use inside the Newton
2171            // iteration loop, take care to avoid the case where the
2172            // precision of the input exceeds the requested precision
2173            // and rounding the input value too soon.
2174            BigDecimal approx = guess;
2175            int workingPrecision = working.precision();
2176            do {
2177                int tmpPrecision = Math.max(Math.max(guessPrecision, targetPrecision + 2),
2178                                           workingPrecision);
2179                MathContext mcTmp = new MathContext(tmpPrecision, RoundingMode.HALF_EVEN);
2180                // approx = 0.5 * (approx + fraction / approx)
2181                approx = ONE_HALF.multiply(approx.add(working.divide(approx, mcTmp), mcTmp));
2182                guessPrecision *= 2;
2183            } while (guessPrecision < targetPrecision + 2);
2184
2185            BigDecimal result;
2186            RoundingMode targetRm = mc.getRoundingMode();
2187            if (targetRm == RoundingMode.UNNECESSARY || originalPrecision == 0) {
2188                RoundingMode tmpRm =
2189                    (targetRm == RoundingMode.UNNECESSARY) ? RoundingMode.DOWN : targetRm;
2190                MathContext mcTmp = new MathContext(targetPrecision, tmpRm);
2191                result = approx.scaleByPowerOfTen(-scaleAdjust/2).round(mcTmp);
2192
2193                // If result*result != this numerically, the square
2194                // root isn't exact
2195                if (this.subtract(result.multiply(result)).compareTo(ZERO) != 0) {
2196                    throw new ArithmeticException("Computed square root not exact.");
2197                }
2198            } else {
2199                result = approx.scaleByPowerOfTen(-scaleAdjust/2).round(mc);
2200            }
2201
2202            if (result.scale() != preferredScale) {
2203                // The preferred scale of an add is
2204                // max(addend.scale(), augend.scale()). Therefore, if
2205                // the scale of the result is first minimized using
2206                // stripTrailingZeros(), adding a zero of the
2207                // preferred scale rounding the correct precision will
2208                // perform the proper scale vs precision tradeoffs.
2209                result = result.stripTrailingZeros().
2210                    add(zeroWithFinalPreferredScale,
2211                        new MathContext(originalPrecision, RoundingMode.UNNECESSARY));
2212            }
2213            assert squareRootResultAssertions(result, mc);
2214            return result;
2215        } else {
2216            switch (signum) {
2217            case -1:
2218                throw new ArithmeticException("Attempted square root " +
2219                                              "of negative BigDecimal");
2220            case 0:
2221                return valueOf(0L, scale()/2);
2222
2223            default:
2224                throw new AssertionError("Bad value from signum");
2225            }
2226        }
2227    }
2228
2229    private boolean isPowerOfTen() {
2230        return BigInteger.ONE.equals(this.unscaledValue());
2231    }
2232
2233    /**
2234     * For nonzero values, check numerical correctness properties of
2235     * the computed result for the chosen rounding mode.
2236     *
2237     * For the directed roundings, for DOWN and FLOOR, result^2 must
2238     * be {@code <=} the input and (result+ulp)^2 must be {@code >} the
2239     * input. Conversely, for UP and CEIL, result^2 must be {@code >=} the
2240     * input and (result-ulp)^2 must be {@code <} the input.
2241     */
2242    private boolean squareRootResultAssertions(BigDecimal result, MathContext mc) {
2243        if (result.signum() == 0) {
2244            return squareRootZeroResultAssertions(result, mc);
2245        } else {
2246            RoundingMode rm = mc.getRoundingMode();
2247            BigDecimal ulp = result.ulp();
2248            BigDecimal neighborUp   = result.add(ulp);
2249            // Make neighbor down accurate even for powers of ten
2250            if (this.isPowerOfTen()) {
2251                ulp = ulp.divide(TEN);
2252            }
2253            BigDecimal neighborDown = result.subtract(ulp);
2254
2255            // Both the starting value and result should be nonzero and positive.
2256            if (result.signum() != 1 ||
2257                this.signum() != 1) {
2258                return false;
2259            }
2260
2261            switch (rm) {
2262            case DOWN:
2263            case FLOOR:
2264                return
2265                    result.multiply(result).compareTo(this)         <= 0 &&
2266                    neighborUp.multiply(neighborUp).compareTo(this) > 0;
2267
2268            case UP:
2269            case CEILING:
2270                return
2271                    result.multiply(result).compareTo(this)             >= 0 &&
2272                    neighborDown.multiply(neighborDown).compareTo(this) < 0;
2273
2274            case HALF_DOWN:
2275            case HALF_EVEN:
2276            case HALF_UP:
2277                BigDecimal err = result.multiply(result).subtract(this).abs();
2278                BigDecimal errUp = neighborUp.multiply(neighborUp).subtract(this);
2279                BigDecimal errDown =  this.subtract(neighborDown.multiply(neighborDown));
2280                // All error values should be positive so don't need to
2281                // compare absolute values.
2282
2283                int err_comp_errUp = err.compareTo(errUp);
2284                int err_comp_errDown = err.compareTo(errDown);
2285
2286                return
2287                    errUp.signum()   == 1 &&
2288                    errDown.signum() == 1 &&
2289
2290                    err_comp_errUp   <= 0 &&
2291                    err_comp_errDown <= 0 &&
2292
2293                    ((err_comp_errUp   == 0 ) ? err_comp_errDown < 0 : true) &&
2294                    ((err_comp_errDown == 0 ) ? err_comp_errUp   < 0 : true);
2295                // && could check for digit conditions for ties too
2296
2297            default: // Definition of UNNECESSARY already verified.
2298                return true;
2299            }
2300        }
2301    }
2302
2303    private boolean squareRootZeroResultAssertions(BigDecimal result, MathContext mc) {
2304        return this.compareTo(ZERO) == 0;
2305    }
2306
2307    /**
2308     * Returns a {@code BigDecimal} whose value is
2309     * <code>(this<sup>n</sup>)</code>, The power is computed exactly, to
2310     * unlimited precision.
2311     *
2312     * <p>The parameter {@code n} must be in the range 0 through
2313     * 999999999, inclusive.  {@code ZERO.pow(0)} returns {@link
2314     * #ONE}.
2315     *
2316     * Note that future releases may expand the allowable exponent
2317     * range of this method.
2318     *
2319     * @param  n power to raise this {@code BigDecimal} to.
2320     * @return <code>this<sup>n</sup></code>
2321     * @throws ArithmeticException if {@code n} is out of range.
2322     * @since  1.5
2323     */
2324    public BigDecimal pow(int n) {
2325        if (n < 0 || n > 999999999)
2326            throw new ArithmeticException("Invalid operation");
2327        // No need to calculate pow(n) if result will over/underflow.
2328        // Don't attempt to support "supernormal" numbers.
2329        int newScale = checkScale((long)scale * n);
2330        return new BigDecimal(this.inflated().pow(n), newScale);
2331    }
2332
2333
2334    /**
2335     * Returns a {@code BigDecimal} whose value is
2336     * <code>(this<sup>n</sup>)</code>.  The current implementation uses
2337     * the core algorithm defined in ANSI standard X3.274-1996 with
2338     * rounding according to the context settings.  In general, the
2339     * returned numerical value is within two ulps of the exact
2340     * numerical value for the chosen precision.  Note that future
2341     * releases may use a different algorithm with a decreased
2342     * allowable error bound and increased allowable exponent range.
2343     *
2344     * <p>The X3.274-1996 algorithm is:
2345     *
2346     * <ul>
2347     * <li> An {@code ArithmeticException} exception is thrown if
2348     *  <ul>
2349     *    <li>{@code abs(n) > 999999999}
2350     *    <li>{@code mc.precision == 0} and {@code n < 0}
2351     *    <li>{@code mc.precision > 0} and {@code n} has more than
2352     *    {@code mc.precision} decimal digits
2353     *  </ul>
2354     *
2355     * <li> if {@code n} is zero, {@link #ONE} is returned even if
2356     * {@code this} is zero, otherwise
2357     * <ul>
2358     *   <li> if {@code n} is positive, the result is calculated via
2359     *   the repeated squaring technique into a single accumulator.
2360     *   The individual multiplications with the accumulator use the
2361     *   same math context settings as in {@code mc} except for a
2362     *   precision increased to {@code mc.precision + elength + 1}
2363     *   where {@code elength} is the number of decimal digits in
2364     *   {@code n}.
2365     *
2366     *   <li> if {@code n} is negative, the result is calculated as if
2367     *   {@code n} were positive; this value is then divided into one
2368     *   using the working precision specified above.
2369     *
2370     *   <li> The final value from either the positive or negative case
2371     *   is then rounded to the destination precision.
2372     *   </ul>
2373     * </ul>
2374     *
2375     * @param  n power to raise this {@code BigDecimal} to.
2376     * @param  mc the context to use.
2377     * @return <code>this<sup>n</sup></code> using the ANSI standard X3.274-1996
2378     *         algorithm
2379     * @throws ArithmeticException if the result is inexact but the
2380     *         rounding mode is {@code UNNECESSARY}, or {@code n} is out
2381     *         of range.
2382     * @since  1.5
2383     */
2384    public BigDecimal pow(int n, MathContext mc) {
2385        if (mc.precision == 0)
2386            return pow(n);
2387        if (n < -999999999 || n > 999999999)
2388            throw new ArithmeticException("Invalid operation");
2389        if (n == 0)
2390            return ONE;                      // x**0 == 1 in X3.274
2391        BigDecimal lhs = this;
2392        MathContext workmc = mc;           // working settings
2393        int mag = Math.abs(n);               // magnitude of n
2394        if (mc.precision > 0) {
2395            int elength = longDigitLength(mag); // length of n in digits
2396            if (elength > mc.precision)        // X3.274 rule
2397                throw new ArithmeticException("Invalid operation");
2398            workmc = new MathContext(mc.precision + elength + 1,
2399                                      mc.roundingMode);
2400        }
2401        // ready to carry out power calculation...
2402        BigDecimal acc = ONE;           // accumulator
2403        boolean seenbit = false;        // set once we've seen a 1-bit
2404        for (int i=1;;i++) {            // for each bit [top bit ignored]
2405            mag += mag;                 // shift left 1 bit
2406            if (mag < 0) {              // top bit is set
2407                seenbit = true;         // OK, we're off
2408                acc = acc.multiply(lhs, workmc); // acc=acc*x
2409            }
2410            if (i == 31)
2411                break;                  // that was the last bit
2412            if (seenbit)
2413                acc=acc.multiply(acc, workmc);   // acc=acc*acc [square]
2414                // else (!seenbit) no point in squaring ONE
2415        }
2416        // if negative n, calculate the reciprocal using working precision
2417        if (n < 0) // [hence mc.precision>0]
2418            acc=ONE.divide(acc, workmc);
2419        // round to final precision and strip zeros
2420        return doRound(acc, mc);
2421    }
2422
2423    /**
2424     * Returns a {@code BigDecimal} whose value is the absolute value
2425     * of this {@code BigDecimal}, and whose scale is
2426     * {@code this.scale()}.
2427     *
2428     * @return {@code abs(this)}
2429     */
2430    public BigDecimal abs() {
2431        return (signum() < 0 ? negate() : this);
2432    }
2433
2434    /**
2435     * Returns a {@code BigDecimal} whose value is the absolute value
2436     * of this {@code BigDecimal}, with rounding according to the
2437     * context settings.
2438     *
2439     * @param mc the context to use.
2440     * @return {@code abs(this)}, rounded as necessary.
2441     * @throws ArithmeticException if the result is inexact but the
2442     *         rounding mode is {@code UNNECESSARY}.
2443     * @since 1.5
2444     */
2445    public BigDecimal abs(MathContext mc) {
2446        return (signum() < 0 ? negate(mc) : plus(mc));
2447    }
2448
2449    /**
2450     * Returns a {@code BigDecimal} whose value is {@code (-this)},
2451     * and whose scale is {@code this.scale()}.
2452     *
2453     * @return {@code -this}.
2454     */
2455    public BigDecimal negate() {
2456        if (intCompact == INFLATED) {
2457            return new BigDecimal(intVal.negate(), INFLATED, scale, precision);
2458        } else {
2459            return valueOf(-intCompact, scale, precision);
2460        }
2461    }
2462
2463    /**
2464     * Returns a {@code BigDecimal} whose value is {@code (-this)},
2465     * with rounding according to the context settings.
2466     *
2467     * @param mc the context to use.
2468     * @return {@code -this}, rounded as necessary.
2469     * @throws ArithmeticException if the result is inexact but the
2470     *         rounding mode is {@code UNNECESSARY}.
2471     * @since  1.5
2472     */
2473    public BigDecimal negate(MathContext mc) {
2474        return negate().plus(mc);
2475    }
2476
2477    /**
2478     * Returns a {@code BigDecimal} whose value is {@code (+this)}, and whose
2479     * scale is {@code this.scale()}.
2480     *
2481     * <p>This method, which simply returns this {@code BigDecimal}
2482     * is included for symmetry with the unary minus method {@link
2483     * #negate()}.
2484     *
2485     * @return {@code this}.
2486     * @see #negate()
2487     * @since  1.5
2488     */
2489    public BigDecimal plus() {
2490        return this;
2491    }
2492
2493    /**
2494     * Returns a {@code BigDecimal} whose value is {@code (+this)},
2495     * with rounding according to the context settings.
2496     *
2497     * <p>The effect of this method is identical to that of the {@link
2498     * #round(MathContext)} method.
2499     *
2500     * @param mc the context to use.
2501     * @return {@code this}, rounded as necessary.  A zero result will
2502     *         have a scale of 0.
2503     * @throws ArithmeticException if the result is inexact but the
2504     *         rounding mode is {@code UNNECESSARY}.
2505     * @see    #round(MathContext)
2506     * @since  1.5
2507     */
2508    public BigDecimal plus(MathContext mc) {
2509        if (mc.precision == 0)                 // no rounding please
2510            return this;
2511        return doRound(this, mc);
2512    }
2513
2514    /**
2515     * Returns the signum function of this {@code BigDecimal}.
2516     *
2517     * @return -1, 0, or 1 as the value of this {@code BigDecimal}
2518     *         is negative, zero, or positive.
2519     */
2520    public int signum() {
2521        return (intCompact != INFLATED)?
2522            Long.signum(intCompact):
2523            intVal.signum();
2524    }
2525
2526    /**
2527     * Returns the <i>scale</i> of this {@code BigDecimal}.  If zero
2528     * or positive, the scale is the number of digits to the right of
2529     * the decimal point.  If negative, the unscaled value of the
2530     * number is multiplied by ten to the power of the negation of the
2531     * scale.  For example, a scale of {@code -3} means the unscaled
2532     * value is multiplied by 1000.
2533     *
2534     * @return the scale of this {@code BigDecimal}.
2535     */
2536    public int scale() {
2537        return scale;
2538    }
2539
2540    /**
2541     * Returns the <i>precision</i> of this {@code BigDecimal}.  (The
2542     * precision is the number of digits in the unscaled value.)
2543     *
2544     * <p>The precision of a zero value is 1.
2545     *
2546     * @return the precision of this {@code BigDecimal}.
2547     * @since  1.5
2548     */
2549    public int precision() {
2550        int result = precision;
2551        if (result == 0) {
2552            long s = intCompact;
2553            if (s != INFLATED)
2554                result = longDigitLength(s);
2555            else
2556                result = bigDigitLength(intVal);
2557            precision = result;
2558        }
2559        return result;
2560    }
2561
2562
2563    /**
2564     * Returns a {@code BigInteger} whose value is the <i>unscaled
2565     * value</i> of this {@code BigDecimal}.  (Computes <code>(this *
2566     * 10<sup>this.scale()</sup>)</code>.)
2567     *
2568     * @return the unscaled value of this {@code BigDecimal}.
2569     * @since  1.2
2570     */
2571    public BigInteger unscaledValue() {
2572        return this.inflated();
2573    }
2574
2575    // Rounding Modes
2576
2577    /**
2578     * Rounding mode to round away from zero.  Always increments the
2579     * digit prior to a nonzero discarded fraction.  Note that this rounding
2580     * mode never decreases the magnitude of the calculated value.
2581     *
2582     * @deprecated Use {@link RoundingMode#UP} instead.
2583     */
2584    @Deprecated(since="9")
2585    public static final int ROUND_UP =           0;
2586
2587    /**
2588     * Rounding mode to round towards zero.  Never increments the digit
2589     * prior to a discarded fraction (i.e., truncates).  Note that this
2590     * rounding mode never increases the magnitude of the calculated value.
2591     *
2592     * @deprecated Use {@link RoundingMode#DOWN} instead.
2593     */
2594    @Deprecated(since="9")
2595    public static final int ROUND_DOWN =         1;
2596
2597    /**
2598     * Rounding mode to round towards positive infinity.  If the
2599     * {@code BigDecimal} is positive, behaves as for
2600     * {@code ROUND_UP}; if negative, behaves as for
2601     * {@code ROUND_DOWN}.  Note that this rounding mode never
2602     * decreases the calculated value.
2603     *
2604     * @deprecated Use {@link RoundingMode#CEILING} instead.
2605     */
2606    @Deprecated(since="9")
2607    public static final int ROUND_CEILING =      2;
2608
2609    /**
2610     * Rounding mode to round towards negative infinity.  If the
2611     * {@code BigDecimal} is positive, behave as for
2612     * {@code ROUND_DOWN}; if negative, behave as for
2613     * {@code ROUND_UP}.  Note that this rounding mode never
2614     * increases the calculated value.
2615     *
2616     * @deprecated Use {@link RoundingMode#FLOOR} instead.
2617     */
2618    @Deprecated(since="9")
2619    public static final int ROUND_FLOOR =        3;
2620
2621    /**
2622     * Rounding mode to round towards {@literal "nearest neighbor"}
2623     * unless both neighbors are equidistant, in which case round up.
2624     * Behaves as for {@code ROUND_UP} if the discarded fraction is
2625     * &ge; 0.5; otherwise, behaves as for {@code ROUND_DOWN}.  Note
2626     * that this is the rounding mode that most of us were taught in
2627     * grade school.
2628     *
2629     * @deprecated Use {@link RoundingMode#HALF_UP} instead.
2630     */
2631    @Deprecated(since="9")
2632    public static final int ROUND_HALF_UP =      4;
2633
2634    /**
2635     * Rounding mode to round towards {@literal "nearest neighbor"}
2636     * unless both neighbors are equidistant, in which case round
2637     * down.  Behaves as for {@code ROUND_UP} if the discarded
2638     * fraction is {@literal >} 0.5; otherwise, behaves as for
2639     * {@code ROUND_DOWN}.
2640     *
2641     * @deprecated Use {@link RoundingMode#HALF_DOWN} instead.
2642     */
2643    @Deprecated(since="9")
2644    public static final int ROUND_HALF_DOWN =    5;
2645
2646    /**
2647     * Rounding mode to round towards the {@literal "nearest neighbor"}
2648     * unless both neighbors are equidistant, in which case, round
2649     * towards the even neighbor.  Behaves as for
2650     * {@code ROUND_HALF_UP} if the digit to the left of the
2651     * discarded fraction is odd; behaves as for
2652     * {@code ROUND_HALF_DOWN} if it's even.  Note that this is the
2653     * rounding mode that minimizes cumulative error when applied
2654     * repeatedly over a sequence of calculations.
2655     *
2656     * @deprecated Use {@link RoundingMode#HALF_EVEN} instead.
2657     */
2658    @Deprecated(since="9")
2659    public static final int ROUND_HALF_EVEN =    6;
2660
2661    /**
2662     * Rounding mode to assert that the requested operation has an exact
2663     * result, hence no rounding is necessary.  If this rounding mode is
2664     * specified on an operation that yields an inexact result, an
2665     * {@code ArithmeticException} is thrown.
2666     *
2667     * @deprecated Use {@link RoundingMode#UNNECESSARY} instead.
2668     */
2669    @Deprecated(since="9")
2670    public static final int ROUND_UNNECESSARY =  7;
2671
2672
2673    // Scaling/Rounding Operations
2674
2675    /**
2676     * Returns a {@code BigDecimal} rounded according to the
2677     * {@code MathContext} settings.  If the precision setting is 0 then
2678     * no rounding takes place.
2679     *
2680     * <p>The effect of this method is identical to that of the
2681     * {@link #plus(MathContext)} method.
2682     *
2683     * @param mc the context to use.
2684     * @return a {@code BigDecimal} rounded according to the
2685     *         {@code MathContext} settings.
2686     * @throws ArithmeticException if the rounding mode is
2687     *         {@code UNNECESSARY} and the
2688     *         {@code BigDecimal}  operation would require rounding.
2689     * @see    #plus(MathContext)
2690     * @since  1.5
2691     */
2692    public BigDecimal round(MathContext mc) {
2693        return plus(mc);
2694    }
2695
2696    /**
2697     * Returns a {@code BigDecimal} whose scale is the specified
2698     * value, and whose unscaled value is determined by multiplying or
2699     * dividing this {@code BigDecimal}'s unscaled value by the
2700     * appropriate power of ten to maintain its overall value.  If the
2701     * scale is reduced by the operation, the unscaled value must be
2702     * divided (rather than multiplied), and the value may be changed;
2703     * in this case, the specified rounding mode is applied to the
2704     * division.
2705     *
2706     * @apiNote Since BigDecimal objects are immutable, calls of
2707     * this method do <em>not</em> result in the original object being
2708     * modified, contrary to the usual convention of having methods
2709     * named <code>set<i>X</i></code> mutate field <i>{@code X}</i>.
2710     * Instead, {@code setScale} returns an object with the proper
2711     * scale; the returned object may or may not be newly allocated.
2712     *
2713     * @param  newScale scale of the {@code BigDecimal} value to be returned.
2714     * @param  roundingMode The rounding mode to apply.
2715     * @return a {@code BigDecimal} whose scale is the specified value,
2716     *         and whose unscaled value is determined by multiplying or
2717     *         dividing this {@code BigDecimal}'s unscaled value by the
2718     *         appropriate power of ten to maintain its overall value.
2719     * @throws ArithmeticException if {@code roundingMode==UNNECESSARY}
2720     *         and the specified scaling operation would require
2721     *         rounding.
2722     * @see    RoundingMode
2723     * @since  1.5
2724     */
2725    public BigDecimal setScale(int newScale, RoundingMode roundingMode) {
2726        return setScale(newScale, roundingMode.oldMode);
2727    }
2728
2729    /**
2730     * Returns a {@code BigDecimal} whose scale is the specified
2731     * value, and whose unscaled value is determined by multiplying or
2732     * dividing this {@code BigDecimal}'s unscaled value by the
2733     * appropriate power of ten to maintain its overall value.  If the
2734     * scale is reduced by the operation, the unscaled value must be
2735     * divided (rather than multiplied), and the value may be changed;
2736     * in this case, the specified rounding mode is applied to the
2737     * division.
2738     *
2739     * @apiNote Since BigDecimal objects are immutable, calls of
2740     * this method do <em>not</em> result in the original object being
2741     * modified, contrary to the usual convention of having methods
2742     * named <code>set<i>X</i></code> mutate field <i>{@code X}</i>.
2743     * Instead, {@code setScale} returns an object with the proper
2744     * scale; the returned object may or may not be newly allocated.
2745     *
2746     * @deprecated The method {@link #setScale(int, RoundingMode)} should
2747     * be used in preference to this legacy method.
2748     *
2749     * @param  newScale scale of the {@code BigDecimal} value to be returned.
2750     * @param  roundingMode The rounding mode to apply.
2751     * @return a {@code BigDecimal} whose scale is the specified value,
2752     *         and whose unscaled value is determined by multiplying or
2753     *         dividing this {@code BigDecimal}'s unscaled value by the
2754     *         appropriate power of ten to maintain its overall value.
2755     * @throws ArithmeticException if {@code roundingMode==ROUND_UNNECESSARY}
2756     *         and the specified scaling operation would require
2757     *         rounding.
2758     * @throws IllegalArgumentException if {@code roundingMode} does not
2759     *         represent a valid rounding mode.
2760     * @see    #ROUND_UP
2761     * @see    #ROUND_DOWN
2762     * @see    #ROUND_CEILING
2763     * @see    #ROUND_FLOOR
2764     * @see    #ROUND_HALF_UP
2765     * @see    #ROUND_HALF_DOWN
2766     * @see    #ROUND_HALF_EVEN
2767     * @see    #ROUND_UNNECESSARY
2768     */
2769    @Deprecated(since="9")
2770    public BigDecimal setScale(int newScale, int roundingMode) {
2771        if (roundingMode < ROUND_UP || roundingMode > ROUND_UNNECESSARY)
2772            throw new IllegalArgumentException("Invalid rounding mode");
2773
2774        int oldScale = this.scale;
2775        if (newScale == oldScale)        // easy case
2776            return this;
2777        if (this.signum() == 0)            // zero can have any scale
2778            return zeroValueOf(newScale);
2779        if(this.intCompact!=INFLATED) {
2780            long rs = this.intCompact;
2781            if (newScale > oldScale) {
2782                int raise = checkScale((long) newScale - oldScale);
2783                if ((rs = longMultiplyPowerTen(rs, raise)) != INFLATED) {
2784                    return valueOf(rs,newScale);
2785                }
2786                BigInteger rb = bigMultiplyPowerTen(raise);
2787                return new BigDecimal(rb, INFLATED, newScale, (precision > 0) ? precision + raise : 0);
2788            } else {
2789                // newScale < oldScale -- drop some digits
2790                // Can't predict the precision due to the effect of rounding.
2791                int drop = checkScale((long) oldScale - newScale);
2792                if (drop < LONG_TEN_POWERS_TABLE.length) {
2793                    return divideAndRound(rs, LONG_TEN_POWERS_TABLE[drop], newScale, roundingMode, newScale);
2794                } else {
2795                    return divideAndRound(this.inflated(), bigTenToThe(drop), newScale, roundingMode, newScale);
2796                }
2797            }
2798        } else {
2799            if (newScale > oldScale) {
2800                int raise = checkScale((long) newScale - oldScale);
2801                BigInteger rb = bigMultiplyPowerTen(this.intVal,raise);
2802                return new BigDecimal(rb, INFLATED, newScale, (precision > 0) ? precision + raise : 0);
2803            } else {
2804                // newScale < oldScale -- drop some digits
2805                // Can't predict the precision due to the effect of rounding.
2806                int drop = checkScale((long) oldScale - newScale);
2807                if (drop < LONG_TEN_POWERS_TABLE.length)
2808                    return divideAndRound(this.intVal, LONG_TEN_POWERS_TABLE[drop], newScale, roundingMode,
2809                                          newScale);
2810                else
2811                    return divideAndRound(this.intVal,  bigTenToThe(drop), newScale, roundingMode, newScale);
2812            }
2813        }
2814    }
2815
2816    /**
2817     * Returns a {@code BigDecimal} whose scale is the specified
2818     * value, and whose value is numerically equal to this
2819     * {@code BigDecimal}'s.  Throws an {@code ArithmeticException}
2820     * if this is not possible.
2821     *
2822     * <p>This call is typically used to increase the scale, in which
2823     * case it is guaranteed that there exists a {@code BigDecimal}
2824     * of the specified scale and the correct value.  The call can
2825     * also be used to reduce the scale if the caller knows that the
2826     * {@code BigDecimal} has sufficiently many zeros at the end of
2827     * its fractional part (i.e., factors of ten in its integer value)
2828     * to allow for the rescaling without changing its value.
2829     *
2830     * <p>This method returns the same result as the two-argument
2831     * versions of {@code setScale}, but saves the caller the trouble
2832     * of specifying a rounding mode in cases where it is irrelevant.
2833     *
2834     * @apiNote Since {@code BigDecimal} objects are immutable,
2835     * calls of this method do <em>not</em> result in the original
2836     * object being modified, contrary to the usual convention of
2837     * having methods named <code>set<i>X</i></code> mutate field
2838     * <i>{@code X}</i>.  Instead, {@code setScale} returns an
2839     * object with the proper scale; the returned object may or may
2840     * not be newly allocated.
2841     *
2842     * @param  newScale scale of the {@code BigDecimal} value to be returned.
2843     * @return a {@code BigDecimal} whose scale is the specified value, and
2844     *         whose unscaled value is determined by multiplying or dividing
2845     *         this {@code BigDecimal}'s unscaled value by the appropriate
2846     *         power of ten to maintain its overall value.
2847     * @throws ArithmeticException if the specified scaling operation would
2848     *         require rounding.
2849     * @see    #setScale(int, int)
2850     * @see    #setScale(int, RoundingMode)
2851     */
2852    public BigDecimal setScale(int newScale) {
2853        return setScale(newScale, ROUND_UNNECESSARY);
2854    }
2855
2856    // Decimal Point Motion Operations
2857
2858    /**
2859     * Returns a {@code BigDecimal} which is equivalent to this one
2860     * with the decimal point moved {@code n} places to the left.  If
2861     * {@code n} is non-negative, the call merely adds {@code n} to
2862     * the scale.  If {@code n} is negative, the call is equivalent
2863     * to {@code movePointRight(-n)}.  The {@code BigDecimal}
2864     * returned by this call has value <code>(this &times;
2865     * 10<sup>-n</sup>)</code> and scale {@code max(this.scale()+n,
2866     * 0)}.
2867     *
2868     * @param  n number of places to move the decimal point to the left.
2869     * @return a {@code BigDecimal} which is equivalent to this one with the
2870     *         decimal point moved {@code n} places to the left.
2871     * @throws ArithmeticException if scale overflows.
2872     */
2873    public BigDecimal movePointLeft(int n) {
2874        // Cannot use movePointRight(-n) in case of n==Integer.MIN_VALUE
2875        int newScale = checkScale((long)scale + n);
2876        BigDecimal num = new BigDecimal(intVal, intCompact, newScale, 0);
2877        return num.scale < 0 ? num.setScale(0, ROUND_UNNECESSARY) : num;
2878    }
2879
2880    /**
2881     * Returns a {@code BigDecimal} which is equivalent to this one
2882     * with the decimal point moved {@code n} places to the right.
2883     * If {@code n} is non-negative, the call merely subtracts
2884     * {@code n} from the scale.  If {@code n} is negative, the call
2885     * is equivalent to {@code movePointLeft(-n)}.  The
2886     * {@code BigDecimal} returned by this call has value <code>(this
2887     * &times; 10<sup>n</sup>)</code> and scale {@code max(this.scale()-n,
2888     * 0)}.
2889     *
2890     * @param  n number of places to move the decimal point to the right.
2891     * @return a {@code BigDecimal} which is equivalent to this one
2892     *         with the decimal point moved {@code n} places to the right.
2893     * @throws ArithmeticException if scale overflows.
2894     */
2895    public BigDecimal movePointRight(int n) {
2896        // Cannot use movePointLeft(-n) in case of n==Integer.MIN_VALUE
2897        int newScale = checkScale((long)scale - n);
2898        BigDecimal num = new BigDecimal(intVal, intCompact, newScale, 0);
2899        return num.scale < 0 ? num.setScale(0, ROUND_UNNECESSARY) : num;
2900    }
2901
2902    /**
2903     * Returns a BigDecimal whose numerical value is equal to
2904     * ({@code this} * 10<sup>n</sup>).  The scale of
2905     * the result is {@code (this.scale() - n)}.
2906     *
2907     * @param n the exponent power of ten to scale by
2908     * @return a BigDecimal whose numerical value is equal to
2909     * ({@code this} * 10<sup>n</sup>)
2910     * @throws ArithmeticException if the scale would be
2911     *         outside the range of a 32-bit integer.
2912     *
2913     * @since 1.5
2914     */
2915    public BigDecimal scaleByPowerOfTen(int n) {
2916        return new BigDecimal(intVal, intCompact,
2917                              checkScale((long)scale - n), precision);
2918    }
2919
2920    /**
2921     * Returns a {@code BigDecimal} which is numerically equal to
2922     * this one but with any trailing zeros removed from the
2923     * representation.  For example, stripping the trailing zeros from
2924     * the {@code BigDecimal} value {@code 600.0}, which has
2925     * [{@code BigInteger}, {@code scale}] components equals to
2926     * [6000, 1], yields {@code 6E2} with [{@code BigInteger},
2927     * {@code scale}] components equals to [6, -2].  If
2928     * this BigDecimal is numerically equal to zero, then
2929     * {@code BigDecimal.ZERO} is returned.
2930     *
2931     * @return a numerically equal {@code BigDecimal} with any
2932     * trailing zeros removed.
2933     * @since 1.5
2934     */
2935    public BigDecimal stripTrailingZeros() {
2936        if (intCompact == 0 || (intVal != null && intVal.signum() == 0)) {
2937            return BigDecimal.ZERO;
2938        } else if (intCompact != INFLATED) {
2939            return createAndStripZerosToMatchScale(intCompact, scale, Long.MIN_VALUE);
2940        } else {
2941            return createAndStripZerosToMatchScale(intVal, scale, Long.MIN_VALUE);
2942        }
2943    }
2944
2945    // Comparison Operations
2946
2947    /**
2948     * Compares this {@code BigDecimal} with the specified
2949     * {@code BigDecimal}.  Two {@code BigDecimal} objects that are
2950     * equal in value but have a different scale (like 2.0 and 2.00)
2951     * are considered equal by this method.  This method is provided
2952     * in preference to individual methods for each of the six boolean
2953     * comparison operators ({@literal <}, ==,
2954     * {@literal >}, {@literal >=}, !=, {@literal <=}).  The
2955     * suggested idiom for performing these comparisons is:
2956     * {@code (x.compareTo(y)} &lt;<i>op</i>&gt; {@code 0)}, where
2957     * &lt;<i>op</i>&gt; is one of the six comparison operators.
2958     *
2959     * @param  val {@code BigDecimal} to which this {@code BigDecimal} is
2960     *         to be compared.
2961     * @return -1, 0, or 1 as this {@code BigDecimal} is numerically
2962     *          less than, equal to, or greater than {@code val}.
2963     */
2964    @Override
2965    public int compareTo(BigDecimal val) {
2966        // Quick path for equal scale and non-inflated case.
2967        if (scale == val.scale) {
2968            long xs = intCompact;
2969            long ys = val.intCompact;
2970            if (xs != INFLATED && ys != INFLATED)
2971                return xs != ys ? ((xs > ys) ? 1 : -1) : 0;
2972        }
2973        int xsign = this.signum();
2974        int ysign = val.signum();
2975        if (xsign != ysign)
2976            return (xsign > ysign) ? 1 : -1;
2977        if (xsign == 0)
2978            return 0;
2979        int cmp = compareMagnitude(val);
2980        return (xsign > 0) ? cmp : -cmp;
2981    }
2982
2983    /**
2984     * Version of compareTo that ignores sign.
2985     */
2986    private int compareMagnitude(BigDecimal val) {
2987        // Match scales, avoid unnecessary inflation
2988        long ys = val.intCompact;
2989        long xs = this.intCompact;
2990        if (xs == 0)
2991            return (ys == 0) ? 0 : -1;
2992        if (ys == 0)
2993            return 1;
2994
2995        long sdiff = (long)this.scale - val.scale;
2996        if (sdiff != 0) {
2997            // Avoid matching scales if the (adjusted) exponents differ
2998            long xae = (long)this.precision() - this.scale;   // [-1]
2999            long yae = (long)val.precision() - val.scale;     // [-1]
3000            if (xae < yae)
3001                return -1;
3002            if (xae > yae)
3003                return 1;
3004            if (sdiff < 0) {
3005                // The cases sdiff <= Integer.MIN_VALUE intentionally fall through.
3006                if ( sdiff > Integer.MIN_VALUE &&
3007                      (xs == INFLATED ||
3008                      (xs = longMultiplyPowerTen(xs, (int)-sdiff)) == INFLATED) &&
3009                     ys == INFLATED) {
3010                    BigInteger rb = bigMultiplyPowerTen((int)-sdiff);
3011                    return rb.compareMagnitude(val.intVal);
3012                }
3013            } else { // sdiff > 0
3014                // The cases sdiff > Integer.MAX_VALUE intentionally fall through.
3015                if ( sdiff <= Integer.MAX_VALUE &&
3016                      (ys == INFLATED ||
3017                      (ys = longMultiplyPowerTen(ys, (int)sdiff)) == INFLATED) &&
3018                     xs == INFLATED) {
3019                    BigInteger rb = val.bigMultiplyPowerTen((int)sdiff);
3020                    return this.intVal.compareMagnitude(rb);
3021                }
3022            }
3023        }
3024        if (xs != INFLATED)
3025            return (ys != INFLATED) ? longCompareMagnitude(xs, ys) : -1;
3026        else if (ys != INFLATED)
3027            return 1;
3028        else
3029            return this.intVal.compareMagnitude(val.intVal);
3030    }
3031
3032    /**
3033     * Compares this {@code BigDecimal} with the specified
3034     * {@code Object} for equality.  Unlike {@link
3035     * #compareTo(BigDecimal) compareTo}, this method considers two
3036     * {@code BigDecimal} objects equal only if they are equal in
3037     * value and scale (thus 2.0 is not equal to 2.00 when compared by
3038     * this method).
3039     *
3040     * @param  x {@code Object} to which this {@code BigDecimal} is
3041     *         to be compared.
3042     * @return {@code true} if and only if the specified {@code Object} is a
3043     *         {@code BigDecimal} whose value and scale are equal to this
3044     *         {@code BigDecimal}'s.
3045     * @see    #compareTo(java.math.BigDecimal)
3046     * @see    #hashCode
3047     */
3048    @Override
3049    public boolean equals(Object x) {
3050        if (!(x instanceof BigDecimal))
3051            return false;
3052        BigDecimal xDec = (BigDecimal) x;
3053        if (x == this)
3054            return true;
3055        if (scale != xDec.scale)
3056            return false;
3057        long s = this.intCompact;
3058        long xs = xDec.intCompact;
3059        if (s != INFLATED) {
3060            if (xs == INFLATED)
3061                xs = compactValFor(xDec.intVal);
3062            return xs == s;
3063        } else if (xs != INFLATED)
3064            return xs == compactValFor(this.intVal);
3065
3066        return this.inflated().equals(xDec.inflated());
3067    }
3068
3069    /**
3070     * Returns the minimum of this {@code BigDecimal} and
3071     * {@code val}.
3072     *
3073     * @param  val value with which the minimum is to be computed.
3074     * @return the {@code BigDecimal} whose value is the lesser of this
3075     *         {@code BigDecimal} and {@code val}.  If they are equal,
3076     *         as defined by the {@link #compareTo(BigDecimal) compareTo}
3077     *         method, {@code this} is returned.
3078     * @see    #compareTo(java.math.BigDecimal)
3079     */
3080    public BigDecimal min(BigDecimal val) {
3081        return (compareTo(val) <= 0 ? this : val);
3082    }
3083
3084    /**
3085     * Returns the maximum of this {@code BigDecimal} and {@code val}.
3086     *
3087     * @param  val value with which the maximum is to be computed.
3088     * @return the {@code BigDecimal} whose value is the greater of this
3089     *         {@code BigDecimal} and {@code val}.  If they are equal,
3090     *         as defined by the {@link #compareTo(BigDecimal) compareTo}
3091     *         method, {@code this} is returned.
3092     * @see    #compareTo(java.math.BigDecimal)
3093     */
3094    public BigDecimal max(BigDecimal val) {
3095        return (compareTo(val) >= 0 ? this : val);
3096    }
3097
3098    // Hash Function
3099
3100    /**
3101     * Returns the hash code for this {@code BigDecimal}.  Note that
3102     * two {@code BigDecimal} objects that are numerically equal but
3103     * differ in scale (like 2.0 and 2.00) will generally <em>not</em>
3104     * have the same hash code.
3105     *
3106     * @return hash code for this {@code BigDecimal}.
3107     * @see #equals(Object)
3108     */
3109    @Override
3110    public int hashCode() {
3111        if (intCompact != INFLATED) {
3112            long val2 = (intCompact < 0)? -intCompact : intCompact;
3113            int temp = (int)( ((int)(val2 >>> 32)) * 31  +
3114                              (val2 & LONG_MASK));
3115            return 31*((intCompact < 0) ?-temp:temp) + scale;
3116        } else
3117            return 31*intVal.hashCode() + scale;
3118    }
3119
3120    // Format Converters
3121
3122    /**
3123     * Returns the string representation of this {@code BigDecimal},
3124     * using scientific notation if an exponent is needed.
3125     *
3126     * <p>A standard canonical string form of the {@code BigDecimal}
3127     * is created as though by the following steps: first, the
3128     * absolute value of the unscaled value of the {@code BigDecimal}
3129     * is converted to a string in base ten using the characters
3130     * {@code '0'} through {@code '9'} with no leading zeros (except
3131     * if its value is zero, in which case a single {@code '0'}
3132     * character is used).
3133     *
3134     * <p>Next, an <i>adjusted exponent</i> is calculated; this is the
3135     * negated scale, plus the number of characters in the converted
3136     * unscaled value, less one.  That is,
3137     * {@code -scale+(ulength-1)}, where {@code ulength} is the
3138     * length of the absolute value of the unscaled value in decimal
3139     * digits (its <i>precision</i>).
3140     *
3141     * <p>If the scale is greater than or equal to zero and the
3142     * adjusted exponent is greater than or equal to {@code -6}, the
3143     * number will be converted to a character form without using
3144     * exponential notation.  In this case, if the scale is zero then
3145     * no decimal point is added and if the scale is positive a
3146     * decimal point will be inserted with the scale specifying the
3147     * number of characters to the right of the decimal point.
3148     * {@code '0'} characters are added to the left of the converted
3149     * unscaled value as necessary.  If no character precedes the
3150     * decimal point after this insertion then a conventional
3151     * {@code '0'} character is prefixed.
3152     *
3153     * <p>Otherwise (that is, if the scale is negative, or the
3154     * adjusted exponent is less than {@code -6}), the number will be
3155     * converted to a character form using exponential notation.  In
3156     * this case, if the converted {@code BigInteger} has more than
3157     * one digit a decimal point is inserted after the first digit.
3158     * An exponent in character form is then suffixed to the converted
3159     * unscaled value (perhaps with inserted decimal point); this
3160     * comprises the letter {@code 'E'} followed immediately by the
3161     * adjusted exponent converted to a character form.  The latter is
3162     * in base ten, using the characters {@code '0'} through
3163     * {@code '9'} with no leading zeros, and is always prefixed by a
3164     * sign character {@code '-'} (<code>'&#92;u002D'</code>) if the
3165     * adjusted exponent is negative, {@code '+'}
3166     * (<code>'&#92;u002B'</code>) otherwise).
3167     *
3168     * <p>Finally, the entire string is prefixed by a minus sign
3169     * character {@code '-'} (<code>'&#92;u002D'</code>) if the unscaled
3170     * value is less than zero.  No sign character is prefixed if the
3171     * unscaled value is zero or positive.
3172     *
3173     * <p><b>Examples:</b>
3174     * <p>For each representation [<i>unscaled value</i>, <i>scale</i>]
3175     * on the left, the resulting string is shown on the right.
3176     * <pre>
3177     * [123,0]      "123"
3178     * [-123,0]     "-123"
3179     * [123,-1]     "1.23E+3"
3180     * [123,-3]     "1.23E+5"
3181     * [123,1]      "12.3"
3182     * [123,5]      "0.00123"
3183     * [123,10]     "1.23E-8"
3184     * [-123,12]    "-1.23E-10"
3185     * </pre>
3186     *
3187     * <b>Notes:</b>
3188     * <ol>
3189     *
3190     * <li>There is a one-to-one mapping between the distinguishable
3191     * {@code BigDecimal} values and the result of this conversion.
3192     * That is, every distinguishable {@code BigDecimal} value
3193     * (unscaled value and scale) has a unique string representation
3194     * as a result of using {@code toString}.  If that string
3195     * representation is converted back to a {@code BigDecimal} using
3196     * the {@link #BigDecimal(String)} constructor, then the original
3197     * value will be recovered.
3198     *
3199     * <li>The string produced for a given number is always the same;
3200     * it is not affected by locale.  This means that it can be used
3201     * as a canonical string representation for exchanging decimal
3202     * data, or as a key for a Hashtable, etc.  Locale-sensitive
3203     * number formatting and parsing is handled by the {@link
3204     * java.text.NumberFormat} class and its subclasses.
3205     *
3206     * <li>The {@link #toEngineeringString} method may be used for
3207     * presenting numbers with exponents in engineering notation, and the
3208     * {@link #setScale(int,RoundingMode) setScale} method may be used for
3209     * rounding a {@code BigDecimal} so it has a known number of digits after
3210     * the decimal point.
3211     *
3212     * <li>The digit-to-character mapping provided by
3213     * {@code Character.forDigit} is used.
3214     *
3215     * </ol>
3216     *
3217     * @return string representation of this {@code BigDecimal}.
3218     * @see    Character#forDigit
3219     * @see    #BigDecimal(java.lang.String)
3220     */
3221    @Override
3222    public String toString() {
3223        String sc = stringCache;
3224        if (sc == null) {
3225            stringCache = sc = layoutChars(true);
3226        }
3227        return sc;
3228    }
3229
3230    /**
3231     * Returns a string representation of this {@code BigDecimal},
3232     * using engineering notation if an exponent is needed.
3233     *
3234     * <p>Returns a string that represents the {@code BigDecimal} as
3235     * described in the {@link #toString()} method, except that if
3236     * exponential notation is used, the power of ten is adjusted to
3237     * be a multiple of three (engineering notation) such that the
3238     * integer part of nonzero values will be in the range 1 through
3239     * 999.  If exponential notation is used for zero values, a
3240     * decimal point and one or two fractional zero digits are used so
3241     * that the scale of the zero value is preserved.  Note that
3242     * unlike the output of {@link #toString()}, the output of this
3243     * method is <em>not</em> guaranteed to recover the same [integer,
3244     * scale] pair of this {@code BigDecimal} if the output string is
3245     * converting back to a {@code BigDecimal} using the {@linkplain
3246     * #BigDecimal(String) string constructor}.  The result of this method meets
3247     * the weaker constraint of always producing a numerically equal
3248     * result from applying the string constructor to the method's output.
3249     *
3250     * @return string representation of this {@code BigDecimal}, using
3251     *         engineering notation if an exponent is needed.
3252     * @since  1.5
3253     */
3254    public String toEngineeringString() {
3255        return layoutChars(false);
3256    }
3257
3258    /**
3259     * Returns a string representation of this {@code BigDecimal}
3260     * without an exponent field.  For values with a positive scale,
3261     * the number of digits to the right of the decimal point is used
3262     * to indicate scale.  For values with a zero or negative scale,
3263     * the resulting string is generated as if the value were
3264     * converted to a numerically equal value with zero scale and as
3265     * if all the trailing zeros of the zero scale value were present
3266     * in the result.
3267     *
3268     * The entire string is prefixed by a minus sign character '-'
3269     * (<code>'&#92;u002D'</code>) if the unscaled value is less than
3270     * zero. No sign character is prefixed if the unscaled value is
3271     * zero or positive.
3272     *
3273     * Note that if the result of this method is passed to the
3274     * {@linkplain #BigDecimal(String) string constructor}, only the
3275     * numerical value of this {@code BigDecimal} will necessarily be
3276     * recovered; the representation of the new {@code BigDecimal}
3277     * may have a different scale.  In particular, if this
3278     * {@code BigDecimal} has a negative scale, the string resulting
3279     * from this method will have a scale of zero when processed by
3280     * the string constructor.
3281     *
3282     * (This method behaves analogously to the {@code toString}
3283     * method in 1.4 and earlier releases.)
3284     *
3285     * @return a string representation of this {@code BigDecimal}
3286     * without an exponent field.
3287     * @since 1.5
3288     * @see #toString()
3289     * @see #toEngineeringString()
3290     */
3291    public String toPlainString() {
3292        if(scale==0) {
3293            if(intCompact!=INFLATED) {
3294                return Long.toString(intCompact);
3295            } else {
3296                return intVal.toString();
3297            }
3298        }
3299        if(this.scale<0) { // No decimal point
3300            if(signum()==0) {
3301                return "0";
3302            }
3303            int trailingZeros = checkScaleNonZero((-(long)scale));
3304            StringBuilder buf;
3305            if(intCompact!=INFLATED) {
3306                buf = new StringBuilder(20+trailingZeros);
3307                buf.append(intCompact);
3308            } else {
3309                String str = intVal.toString();
3310                buf = new StringBuilder(str.length()+trailingZeros);
3311                buf.append(str);
3312            }
3313            for (int i = 0; i < trailingZeros; i++) {
3314                buf.append('0');
3315            }
3316            return buf.toString();
3317        }
3318        String str ;
3319        if(intCompact!=INFLATED) {
3320            str = Long.toString(Math.abs(intCompact));
3321        } else {
3322            str = intVal.abs().toString();
3323        }
3324        return getValueString(signum(), str, scale);
3325    }
3326
3327    /* Returns a digit.digit string */
3328    private String getValueString(int signum, String intString, int scale) {
3329        /* Insert decimal point */
3330        StringBuilder buf;
3331        int insertionPoint = intString.length() - scale;
3332        if (insertionPoint == 0) {  /* Point goes right before intVal */
3333            return (signum<0 ? "-0." : "0.") + intString;
3334        } else if (insertionPoint > 0) { /* Point goes inside intVal */
3335            buf = new StringBuilder(intString);
3336            buf.insert(insertionPoint, '.');
3337            if (signum < 0)
3338                buf.insert(0, '-');
3339        } else { /* We must insert zeros between point and intVal */
3340            buf = new StringBuilder(3-insertionPoint + intString.length());
3341            buf.append(signum<0 ? "-0." : "0.");
3342            for (int i=0; i<-insertionPoint; i++) {
3343                buf.append('0');
3344            }
3345            buf.append(intString);
3346        }
3347        return buf.toString();
3348    }
3349
3350    /**
3351     * Converts this {@code BigDecimal} to a {@code BigInteger}.
3352     * This conversion is analogous to the
3353     * <i>narrowing primitive conversion</i> from {@code double} to
3354     * {@code long} as defined in
3355     * <cite>The Java&trade; Language Specification</cite>:
3356     * any fractional part of this
3357     * {@code BigDecimal} will be discarded.  Note that this
3358     * conversion can lose information about the precision of the
3359     * {@code BigDecimal} value.
3360     * <p>
3361     * To have an exception thrown if the conversion is inexact (in
3362     * other words if a nonzero fractional part is discarded), use the
3363     * {@link #toBigIntegerExact()} method.
3364     *
3365     * @return this {@code BigDecimal} converted to a {@code BigInteger}.
3366     * @jls 5.1.3 Narrowing Primitive Conversion
3367     */
3368    public BigInteger toBigInteger() {
3369        // force to an integer, quietly
3370        return this.setScale(0, ROUND_DOWN).inflated();
3371    }
3372
3373    /**
3374     * Converts this {@code BigDecimal} to a {@code BigInteger},
3375     * checking for lost information.  An exception is thrown if this
3376     * {@code BigDecimal} has a nonzero fractional part.
3377     *
3378     * @return this {@code BigDecimal} converted to a {@code BigInteger}.
3379     * @throws ArithmeticException if {@code this} has a nonzero
3380     *         fractional part.
3381     * @since  1.5
3382     */
3383    public BigInteger toBigIntegerExact() {
3384        // round to an integer, with Exception if decimal part non-0
3385        return this.setScale(0, ROUND_UNNECESSARY).inflated();
3386    }
3387
3388    /**
3389     * Converts this {@code BigDecimal} to a {@code long}.
3390     * This conversion is analogous to the
3391     * <i>narrowing primitive conversion</i> from {@code double} to
3392     * {@code short} as defined in
3393     * <cite>The Java&trade; Language Specification</cite>:
3394     * any fractional part of this
3395     * {@code BigDecimal} will be discarded, and if the resulting
3396     * "{@code BigInteger}" is too big to fit in a
3397     * {@code long}, only the low-order 64 bits are returned.
3398     * Note that this conversion can lose information about the
3399     * overall magnitude and precision of this {@code BigDecimal} value as well
3400     * as return a result with the opposite sign.
3401     *
3402     * @return this {@code BigDecimal} converted to a {@code long}.
3403     * @jls 5.1.3 Narrowing Primitive Conversion
3404     */
3405    @Override
3406    public long longValue(){
3407        return (intCompact != INFLATED && scale == 0) ?
3408            intCompact:
3409            toBigInteger().longValue();
3410    }
3411
3412    /**
3413     * Converts this {@code BigDecimal} to a {@code long}, checking
3414     * for lost information.  If this {@code BigDecimal} has a
3415     * nonzero fractional part or is out of the possible range for a
3416     * {@code long} result then an {@code ArithmeticException} is
3417     * thrown.
3418     *
3419     * @return this {@code BigDecimal} converted to a {@code long}.
3420     * @throws ArithmeticException if {@code this} has a nonzero
3421     *         fractional part, or will not fit in a {@code long}.
3422     * @since  1.5
3423     */
3424    public long longValueExact() {
3425        if (intCompact != INFLATED && scale == 0)
3426            return intCompact;
3427        // If more than 19 digits in integer part it cannot possibly fit
3428        if ((precision() - scale) > 19) // [OK for negative scale too]
3429            throw new java.lang.ArithmeticException("Overflow");
3430        // Fastpath zero and < 1.0 numbers (the latter can be very slow
3431        // to round if very small)
3432        if (this.signum() == 0)
3433            return 0;
3434        if ((this.precision() - this.scale) <= 0)
3435            throw new ArithmeticException("Rounding necessary");
3436        // round to an integer, with Exception if decimal part non-0
3437        BigDecimal num = this.setScale(0, ROUND_UNNECESSARY);
3438        if (num.precision() >= 19) // need to check carefully
3439            LongOverflow.check(num);
3440        return num.inflated().longValue();
3441    }
3442
3443    private static class LongOverflow {
3444        /** BigInteger equal to Long.MIN_VALUE. */
3445        private static final BigInteger LONGMIN = BigInteger.valueOf(Long.MIN_VALUE);
3446
3447        /** BigInteger equal to Long.MAX_VALUE. */
3448        private static final BigInteger LONGMAX = BigInteger.valueOf(Long.MAX_VALUE);
3449
3450        public static void check(BigDecimal num) {
3451            BigInteger intVal = num.inflated();
3452            if (intVal.compareTo(LONGMIN) < 0 ||
3453                intVal.compareTo(LONGMAX) > 0)
3454                throw new java.lang.ArithmeticException("Overflow");
3455        }
3456    }
3457
3458    /**
3459     * Converts this {@code BigDecimal} to an {@code int}.
3460     * This conversion is analogous to the
3461     * <i>narrowing primitive conversion</i> from {@code double} to
3462     * {@code short} as defined in
3463     * <cite>The Java&trade; Language Specification</cite>:
3464     * any fractional part of this
3465     * {@code BigDecimal} will be discarded, and if the resulting
3466     * "{@code BigInteger}" is too big to fit in an
3467     * {@code int}, only the low-order 32 bits are returned.
3468     * Note that this conversion can lose information about the
3469     * overall magnitude and precision of this {@code BigDecimal}
3470     * value as well as return a result with the opposite sign.
3471     *
3472     * @return this {@code BigDecimal} converted to an {@code int}.
3473     * @jls 5.1.3 Narrowing Primitive Conversion
3474     */
3475    @Override
3476    public int intValue() {
3477        return  (intCompact != INFLATED && scale == 0) ?
3478            (int)intCompact :
3479            toBigInteger().intValue();
3480    }
3481
3482    /**
3483     * Converts this {@code BigDecimal} to an {@code int}, checking
3484     * for lost information.  If this {@code BigDecimal} has a
3485     * nonzero fractional part or is out of the possible range for an
3486     * {@code int} result then an {@code ArithmeticException} is
3487     * thrown.
3488     *
3489     * @return this {@code BigDecimal} converted to an {@code int}.
3490     * @throws ArithmeticException if {@code this} has a nonzero
3491     *         fractional part, or will not fit in an {@code int}.
3492     * @since  1.5
3493     */
3494    public int intValueExact() {
3495       long num;
3496       num = this.longValueExact();     // will check decimal part
3497       if ((int)num != num)
3498           throw new java.lang.ArithmeticException("Overflow");
3499       return (int)num;
3500    }
3501
3502    /**
3503     * Converts this {@code BigDecimal} to a {@code short}, checking
3504     * for lost information.  If this {@code BigDecimal} has a
3505     * nonzero fractional part or is out of the possible range for a
3506     * {@code short} result then an {@code ArithmeticException} is
3507     * thrown.
3508     *
3509     * @return this {@code BigDecimal} converted to a {@code short}.
3510     * @throws ArithmeticException if {@code this} has a nonzero
3511     *         fractional part, or will not fit in a {@code short}.
3512     * @since  1.5
3513     */
3514    public short shortValueExact() {
3515       long num;
3516       num = this.longValueExact();     // will check decimal part
3517       if ((short)num != num)
3518           throw new java.lang.ArithmeticException("Overflow");
3519       return (short)num;
3520    }
3521
3522    /**
3523     * Converts this {@code BigDecimal} to a {@code byte}, checking
3524     * for lost information.  If this {@code BigDecimal} has a
3525     * nonzero fractional part or is out of the possible range for a
3526     * {@code byte} result then an {@code ArithmeticException} is
3527     * thrown.
3528     *
3529     * @return this {@code BigDecimal} converted to a {@code byte}.
3530     * @throws ArithmeticException if {@code this} has a nonzero
3531     *         fractional part, or will not fit in a {@code byte}.
3532     * @since  1.5
3533     */
3534    public byte byteValueExact() {
3535       long num;
3536       num = this.longValueExact();     // will check decimal part
3537       if ((byte)num != num)
3538           throw new java.lang.ArithmeticException("Overflow");
3539       return (byte)num;
3540    }
3541
3542    /**
3543     * Converts this {@code BigDecimal} to a {@code float}.
3544     * This conversion is similar to the
3545     * <i>narrowing primitive conversion</i> from {@code double} to
3546     * {@code float} as defined in
3547     * <cite>The Java&trade; Language Specification</cite>:
3548     * if this {@code BigDecimal} has too great a
3549     * magnitude to represent as a {@code float}, it will be
3550     * converted to {@link Float#NEGATIVE_INFINITY} or {@link
3551     * Float#POSITIVE_INFINITY} as appropriate.  Note that even when
3552     * the return value is finite, this conversion can lose
3553     * information about the precision of the {@code BigDecimal}
3554     * value.
3555     *
3556     * @return this {@code BigDecimal} converted to a {@code float}.
3557     * @jls 5.1.3 Narrowing Primitive Conversion
3558     */
3559    @Override
3560    public float floatValue(){
3561        if(intCompact != INFLATED) {
3562            if (scale == 0) {
3563                return (float)intCompact;
3564            } else {
3565                /*
3566                 * If both intCompact and the scale can be exactly
3567                 * represented as float values, perform a single float
3568                 * multiply or divide to compute the (properly
3569                 * rounded) result.
3570                 */
3571                if (Math.abs(intCompact) < 1L<<22 ) {
3572                    // Don't have too guard against
3573                    // Math.abs(MIN_VALUE) because of outer check
3574                    // against INFLATED.
3575                    if (scale > 0 && scale < FLOAT_10_POW.length) {
3576                        return (float)intCompact / FLOAT_10_POW[scale];
3577                    } else if (scale < 0 && scale > -FLOAT_10_POW.length) {
3578                        return (float)intCompact * FLOAT_10_POW[-scale];
3579                    }
3580                }
3581            }
3582        }
3583        // Somewhat inefficient, but guaranteed to work.
3584        return Float.parseFloat(this.toString());
3585    }
3586
3587    /**
3588     * Converts this {@code BigDecimal} to a {@code double}.
3589     * This conversion is similar to the
3590     * <i>narrowing primitive conversion</i> from {@code double} to
3591     * {@code float} as defined in
3592     * <cite>The Java&trade; Language Specification</cite>:
3593     * if this {@code BigDecimal} has too great a
3594     * magnitude represent as a {@code double}, it will be
3595     * converted to {@link Double#NEGATIVE_INFINITY} or {@link
3596     * Double#POSITIVE_INFINITY} as appropriate.  Note that even when
3597     * the return value is finite, this conversion can lose
3598     * information about the precision of the {@code BigDecimal}
3599     * value.
3600     *
3601     * @return this {@code BigDecimal} converted to a {@code double}.
3602     * @jls 5.1.3 Narrowing Primitive Conversion
3603     */
3604    @Override
3605    public double doubleValue(){
3606        if(intCompact != INFLATED) {
3607            if (scale == 0) {
3608                return (double)intCompact;
3609            } else {
3610                /*
3611                 * If both intCompact and the scale can be exactly
3612                 * represented as double values, perform a single
3613                 * double multiply or divide to compute the (properly
3614                 * rounded) result.
3615                 */
3616                if (Math.abs(intCompact) < 1L<<52 ) {
3617                    // Don't have too guard against
3618                    // Math.abs(MIN_VALUE) because of outer check
3619                    // against INFLATED.
3620                    if (scale > 0 && scale < DOUBLE_10_POW.length) {
3621                        return (double)intCompact / DOUBLE_10_POW[scale];
3622                    } else if (scale < 0 && scale > -DOUBLE_10_POW.length) {
3623                        return (double)intCompact * DOUBLE_10_POW[-scale];
3624                    }
3625                }
3626            }
3627        }
3628        // Somewhat inefficient, but guaranteed to work.
3629        return Double.parseDouble(this.toString());
3630    }
3631
3632    /**
3633     * Powers of 10 which can be represented exactly in {@code
3634     * double}.
3635     */
3636    private static final double DOUBLE_10_POW[] = {
3637        1.0e0,  1.0e1,  1.0e2,  1.0e3,  1.0e4,  1.0e5,
3638        1.0e6,  1.0e7,  1.0e8,  1.0e9,  1.0e10, 1.0e11,
3639        1.0e12, 1.0e13, 1.0e14, 1.0e15, 1.0e16, 1.0e17,
3640        1.0e18, 1.0e19, 1.0e20, 1.0e21, 1.0e22
3641    };
3642
3643    /**
3644     * Powers of 10 which can be represented exactly in {@code
3645     * float}.
3646     */
3647    private static final float FLOAT_10_POW[] = {
3648        1.0e0f, 1.0e1f, 1.0e2f, 1.0e3f, 1.0e4f, 1.0e5f,
3649        1.0e6f, 1.0e7f, 1.0e8f, 1.0e9f, 1.0e10f
3650    };
3651
3652    /**
3653     * Returns the size of an ulp, a unit in the last place, of this
3654     * {@code BigDecimal}.  An ulp of a nonzero {@code BigDecimal}
3655     * value is the positive distance between this value and the
3656     * {@code BigDecimal} value next larger in magnitude with the
3657     * same number of digits.  An ulp of a zero value is numerically
3658     * equal to 1 with the scale of {@code this}.  The result is
3659     * stored with the same scale as {@code this} so the result
3660     * for zero and nonzero values is equal to {@code [1,
3661     * this.scale()]}.
3662     *
3663     * @return the size of an ulp of {@code this}
3664     * @since 1.5
3665     */
3666    public BigDecimal ulp() {
3667        return BigDecimal.valueOf(1, this.scale(), 1);
3668    }
3669
3670    // Private class to build a string representation for BigDecimal object.
3671    // "StringBuilderHelper" is constructed as a thread local variable so it is
3672    // thread safe. The StringBuilder field acts as a buffer to hold the temporary
3673    // representation of BigDecimal. The cmpCharArray holds all the characters for
3674    // the compact representation of BigDecimal (except for '-' sign' if it is
3675    // negative) if its intCompact field is not INFLATED. It is shared by all
3676    // calls to toString() and its variants in that particular thread.
3677    static class StringBuilderHelper {
3678        final StringBuilder sb;    // Placeholder for BigDecimal string
3679        final char[] cmpCharArray; // character array to place the intCompact
3680
3681        StringBuilderHelper() {
3682            sb = new StringBuilder();
3683            // All non negative longs can be made to fit into 19 character array.
3684            cmpCharArray = new char[19];
3685        }
3686
3687        // Accessors.
3688        StringBuilder getStringBuilder() {
3689            sb.setLength(0);
3690            return sb;
3691        }
3692
3693        char[] getCompactCharArray() {
3694            return cmpCharArray;
3695        }
3696
3697        /**
3698         * Places characters representing the intCompact in {@code long} into
3699         * cmpCharArray and returns the offset to the array where the
3700         * representation starts.
3701         *
3702         * @param intCompact the number to put into the cmpCharArray.
3703         * @return offset to the array where the representation starts.
3704         * Note: intCompact must be greater or equal to zero.
3705         */
3706        int putIntCompact(long intCompact) {
3707            assert intCompact >= 0;
3708
3709            long q;
3710            int r;
3711            // since we start from the least significant digit, charPos points to
3712            // the last character in cmpCharArray.
3713            int charPos = cmpCharArray.length;
3714
3715            // Get 2 digits/iteration using longs until quotient fits into an int
3716            while (intCompact > Integer.MAX_VALUE) {
3717                q = intCompact / 100;
3718                r = (int)(intCompact - q * 100);
3719                intCompact = q;
3720                cmpCharArray[--charPos] = DIGIT_ONES[r];
3721                cmpCharArray[--charPos] = DIGIT_TENS[r];
3722            }
3723
3724            // Get 2 digits/iteration using ints when i2 >= 100
3725            int q2;
3726            int i2 = (int)intCompact;
3727            while (i2 >= 100) {
3728                q2 = i2 / 100;
3729                r  = i2 - q2 * 100;
3730                i2 = q2;
3731                cmpCharArray[--charPos] = DIGIT_ONES[r];
3732                cmpCharArray[--charPos] = DIGIT_TENS[r];
3733            }
3734
3735            cmpCharArray[--charPos] = DIGIT_ONES[i2];
3736            if (i2 >= 10)
3737                cmpCharArray[--charPos] = DIGIT_TENS[i2];
3738
3739            return charPos;
3740        }
3741
3742        static final char[] DIGIT_TENS = {
3743            '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
3744            '1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
3745            '2', '2', '2', '2', '2', '2', '2', '2', '2', '2',
3746            '3', '3', '3', '3', '3', '3', '3', '3', '3', '3',
3747            '4', '4', '4', '4', '4', '4', '4', '4', '4', '4',
3748            '5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
3749            '6', '6', '6', '6', '6', '6', '6', '6', '6', '6',
3750            '7', '7', '7', '7', '7', '7', '7', '7', '7', '7',
3751            '8', '8', '8', '8', '8', '8', '8', '8', '8', '8',
3752            '9', '9', '9', '9', '9', '9', '9', '9', '9', '9',
3753        };
3754
3755        static final char[] DIGIT_ONES = {
3756            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3757            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3758            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3759            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3760            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3761            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3762            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3763            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3764            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3765            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3766        };
3767    }
3768
3769    /**
3770     * Lay out this {@code BigDecimal} into a {@code char[]} array.
3771     * The Java 1.2 equivalent to this was called {@code getValueString}.
3772     *
3773     * @param  sci {@code true} for Scientific exponential notation;
3774     *          {@code false} for Engineering
3775     * @return string with canonical string representation of this
3776     *         {@code BigDecimal}
3777     */
3778    private String layoutChars(boolean sci) {
3779        if (scale == 0)                      // zero scale is trivial
3780            return (intCompact != INFLATED) ?
3781                Long.toString(intCompact):
3782                intVal.toString();
3783        if (scale == 2  &&
3784            intCompact >= 0 && intCompact < Integer.MAX_VALUE) {
3785            // currency fast path
3786            int lowInt = (int)intCompact % 100;
3787            int highInt = (int)intCompact / 100;
3788            return (Integer.toString(highInt) + '.' +
3789                    StringBuilderHelper.DIGIT_TENS[lowInt] +
3790                    StringBuilderHelper.DIGIT_ONES[lowInt]) ;
3791        }
3792
3793        StringBuilderHelper sbHelper = threadLocalStringBuilderHelper.get();
3794        char[] coeff;
3795        int offset;  // offset is the starting index for coeff array
3796        // Get the significand as an absolute value
3797        if (intCompact != INFLATED) {
3798            offset = sbHelper.putIntCompact(Math.abs(intCompact));
3799            coeff  = sbHelper.getCompactCharArray();
3800        } else {
3801            offset = 0;
3802            coeff  = intVal.abs().toString().toCharArray();
3803        }
3804
3805        // Construct a buffer, with sufficient capacity for all cases.
3806        // If E-notation is needed, length will be: +1 if negative, +1
3807        // if '.' needed, +2 for "E+", + up to 10 for adjusted exponent.
3808        // Otherwise it could have +1 if negative, plus leading "0.00000"
3809        StringBuilder buf = sbHelper.getStringBuilder();
3810        if (signum() < 0)             // prefix '-' if negative
3811            buf.append('-');
3812        int coeffLen = coeff.length - offset;
3813        long adjusted = -(long)scale + (coeffLen -1);
3814        if ((scale >= 0) && (adjusted >= -6)) { // plain number
3815            int pad = scale - coeffLen;         // count of padding zeros
3816            if (pad >= 0) {                     // 0.xxx form
3817                buf.append('0');
3818                buf.append('.');
3819                for (; pad>0; pad--) {
3820                    buf.append('0');
3821                }
3822                buf.append(coeff, offset, coeffLen);
3823            } else {                         // xx.xx form
3824                buf.append(coeff, offset, -pad);
3825                buf.append('.');
3826                buf.append(coeff, -pad + offset, scale);
3827            }
3828        } else { // E-notation is needed
3829            if (sci) {                       // Scientific notation
3830                buf.append(coeff[offset]);   // first character
3831                if (coeffLen > 1) {          // more to come
3832                    buf.append('.');
3833                    buf.append(coeff, offset + 1, coeffLen - 1);
3834                }
3835            } else {                         // Engineering notation
3836                int sig = (int)(adjusted % 3);
3837                if (sig < 0)
3838                    sig += 3;                // [adjusted was negative]
3839                adjusted -= sig;             // now a multiple of 3
3840                sig++;
3841                if (signum() == 0) {
3842                    switch (sig) {
3843                    case 1:
3844                        buf.append('0'); // exponent is a multiple of three
3845                        break;
3846                    case 2:
3847                        buf.append("0.00");
3848                        adjusted += 3;
3849                        break;
3850                    case 3:
3851                        buf.append("0.0");
3852                        adjusted += 3;
3853                        break;
3854                    default:
3855                        throw new AssertionError("Unexpected sig value " + sig);
3856                    }
3857                } else if (sig >= coeffLen) {   // significand all in integer
3858                    buf.append(coeff, offset, coeffLen);
3859                    // may need some zeros, too
3860                    for (int i = sig - coeffLen; i > 0; i--) {
3861                        buf.append('0');
3862                    }
3863                } else {                     // xx.xxE form
3864                    buf.append(coeff, offset, sig);
3865                    buf.append('.');
3866                    buf.append(coeff, offset + sig, coeffLen - sig);
3867                }
3868            }
3869            if (adjusted != 0) {             // [!sci could have made 0]
3870                buf.append('E');
3871                if (adjusted > 0)            // force sign for positive
3872                    buf.append('+');
3873                buf.append(adjusted);
3874            }
3875        }
3876        return buf.toString();
3877    }
3878
3879    /**
3880     * Return 10 to the power n, as a {@code BigInteger}.
3881     *
3882     * @param  n the power of ten to be returned (>=0)
3883     * @return a {@code BigInteger} with the value (10<sup>n</sup>)
3884     */
3885    private static BigInteger bigTenToThe(int n) {
3886        if (n < 0)
3887            return BigInteger.ZERO;
3888
3889        if (n < BIG_TEN_POWERS_TABLE_MAX) {
3890            BigInteger[] pows = BIG_TEN_POWERS_TABLE;
3891            if (n < pows.length)
3892                return pows[n];
3893            else
3894                return expandBigIntegerTenPowers(n);
3895        }
3896
3897        return BigInteger.TEN.pow(n);
3898    }
3899
3900    /**
3901     * Expand the BIG_TEN_POWERS_TABLE array to contain at least 10**n.
3902     *
3903     * @param n the power of ten to be returned (>=0)
3904     * @return a {@code BigDecimal} with the value (10<sup>n</sup>) and
3905     *         in the meantime, the BIG_TEN_POWERS_TABLE array gets
3906     *         expanded to the size greater than n.
3907     */
3908    private static BigInteger expandBigIntegerTenPowers(int n) {
3909        synchronized(BigDecimal.class) {
3910            BigInteger[] pows = BIG_TEN_POWERS_TABLE;
3911            int curLen = pows.length;
3912            // The following comparison and the above synchronized statement is
3913            // to prevent multiple threads from expanding the same array.
3914            if (curLen <= n) {
3915                int newLen = curLen << 1;
3916                while (newLen <= n) {
3917                    newLen <<= 1;
3918                }
3919                pows = Arrays.copyOf(pows, newLen);
3920                for (int i = curLen; i < newLen; i++) {
3921                    pows[i] = pows[i - 1].multiply(BigInteger.TEN);
3922                }
3923                // Based on the following facts:
3924                // 1. pows is a private local varible;
3925                // 2. the following store is a volatile store.
3926                // the newly created array elements can be safely published.
3927                BIG_TEN_POWERS_TABLE = pows;
3928            }
3929            return pows[n];
3930        }
3931    }
3932
3933    private static final long[] LONG_TEN_POWERS_TABLE = {
3934        1,                     // 0 / 10^0
3935        10,                    // 1 / 10^1
3936        100,                   // 2 / 10^2
3937        1000,                  // 3 / 10^3
3938        10000,                 // 4 / 10^4
3939        100000,                // 5 / 10^5
3940        1000000,               // 6 / 10^6
3941        10000000,              // 7 / 10^7
3942        100000000,             // 8 / 10^8
3943        1000000000,            // 9 / 10^9
3944        10000000000L,          // 10 / 10^10
3945        100000000000L,         // 11 / 10^11
3946        1000000000000L,        // 12 / 10^12
3947        10000000000000L,       // 13 / 10^13
3948        100000000000000L,      // 14 / 10^14
3949        1000000000000000L,     // 15 / 10^15
3950        10000000000000000L,    // 16 / 10^16
3951        100000000000000000L,   // 17 / 10^17
3952        1000000000000000000L   // 18 / 10^18
3953    };
3954
3955    private static volatile BigInteger BIG_TEN_POWERS_TABLE[] = {
3956        BigInteger.ONE,
3957        BigInteger.valueOf(10),
3958        BigInteger.valueOf(100),
3959        BigInteger.valueOf(1000),
3960        BigInteger.valueOf(10000),
3961        BigInteger.valueOf(100000),
3962        BigInteger.valueOf(1000000),
3963        BigInteger.valueOf(10000000),
3964        BigInteger.valueOf(100000000),
3965        BigInteger.valueOf(1000000000),
3966        BigInteger.valueOf(10000000000L),
3967        BigInteger.valueOf(100000000000L),
3968        BigInteger.valueOf(1000000000000L),
3969        BigInteger.valueOf(10000000000000L),
3970        BigInteger.valueOf(100000000000000L),
3971        BigInteger.valueOf(1000000000000000L),
3972        BigInteger.valueOf(10000000000000000L),
3973        BigInteger.valueOf(100000000000000000L),
3974        BigInteger.valueOf(1000000000000000000L)
3975    };
3976
3977    private static final int BIG_TEN_POWERS_TABLE_INITLEN =
3978        BIG_TEN_POWERS_TABLE.length;
3979    private static final int BIG_TEN_POWERS_TABLE_MAX =
3980        16 * BIG_TEN_POWERS_TABLE_INITLEN;
3981
3982    private static final long THRESHOLDS_TABLE[] = {
3983        Long.MAX_VALUE,                     // 0
3984        Long.MAX_VALUE/10L,                 // 1
3985        Long.MAX_VALUE/100L,                // 2
3986        Long.MAX_VALUE/1000L,               // 3
3987        Long.MAX_VALUE/10000L,              // 4
3988        Long.MAX_VALUE/100000L,             // 5
3989        Long.MAX_VALUE/1000000L,            // 6
3990        Long.MAX_VALUE/10000000L,           // 7
3991        Long.MAX_VALUE/100000000L,          // 8
3992        Long.MAX_VALUE/1000000000L,         // 9
3993        Long.MAX_VALUE/10000000000L,        // 10
3994        Long.MAX_VALUE/100000000000L,       // 11
3995        Long.MAX_VALUE/1000000000000L,      // 12
3996        Long.MAX_VALUE/10000000000000L,     // 13
3997        Long.MAX_VALUE/100000000000000L,    // 14
3998        Long.MAX_VALUE/1000000000000000L,   // 15
3999        Long.MAX_VALUE/10000000000000000L,  // 16
4000        Long.MAX_VALUE/100000000000000000L, // 17
4001        Long.MAX_VALUE/1000000000000000000L // 18
4002    };
4003
4004    /**
4005     * Compute val * 10 ^ n; return this product if it is
4006     * representable as a long, INFLATED otherwise.
4007     */
4008    private static long longMultiplyPowerTen(long val, int n) {
4009        if (val == 0 || n <= 0)
4010            return val;
4011        long[] tab = LONG_TEN_POWERS_TABLE;
4012        long[] bounds = THRESHOLDS_TABLE;
4013        if (n < tab.length && n < bounds.length) {
4014            long tenpower = tab[n];
4015            if (val == 1)
4016                return tenpower;
4017            if (Math.abs(val) <= bounds[n])
4018                return val * tenpower;
4019        }
4020        return INFLATED;
4021    }
4022
4023    /**
4024     * Compute this * 10 ^ n.
4025     * Needed mainly to allow special casing to trap zero value
4026     */
4027    private BigInteger bigMultiplyPowerTen(int n) {
4028        if (n <= 0)
4029            return this.inflated();
4030
4031        if (intCompact != INFLATED)
4032            return bigTenToThe(n).multiply(intCompact);
4033        else
4034            return intVal.multiply(bigTenToThe(n));
4035    }
4036
4037    /**
4038     * Returns appropriate BigInteger from intVal field if intVal is
4039     * null, i.e. the compact representation is in use.
4040     */
4041    private BigInteger inflated() {
4042        if (intVal == null) {
4043            return BigInteger.valueOf(intCompact);
4044        }
4045        return intVal;
4046    }
4047
4048    /**
4049     * Match the scales of two {@code BigDecimal}s to align their
4050     * least significant digits.
4051     *
4052     * <p>If the scales of val[0] and val[1] differ, rescale
4053     * (non-destructively) the lower-scaled {@code BigDecimal} so
4054     * they match.  That is, the lower-scaled reference will be
4055     * replaced by a reference to a new object with the same scale as
4056     * the other {@code BigDecimal}.
4057     *
4058     * @param  val array of two elements referring to the two
4059     *         {@code BigDecimal}s to be aligned.
4060     */
4061    private static void matchScale(BigDecimal[] val) {
4062        if (val[0].scale < val[1].scale) {
4063            val[0] = val[0].setScale(val[1].scale, ROUND_UNNECESSARY);
4064        } else if (val[1].scale < val[0].scale) {
4065            val[1] = val[1].setScale(val[0].scale, ROUND_UNNECESSARY);
4066        }
4067    }
4068
4069    private static class UnsafeHolder {
4070        private static final jdk.internal.misc.Unsafe unsafe;
4071        private static final long intCompactOffset;
4072        private static final long intValOffset;
4073        static {
4074            try {
4075                unsafe = jdk.internal.misc.Unsafe.getUnsafe();
4076                intCompactOffset = unsafe.objectFieldOffset
4077                    (BigDecimal.class.getDeclaredField("intCompact"));
4078                intValOffset = unsafe.objectFieldOffset
4079                    (BigDecimal.class.getDeclaredField("intVal"));
4080            } catch (Exception ex) {
4081                throw new ExceptionInInitializerError(ex);
4082            }
4083        }
4084        static void setIntCompact(BigDecimal bd, long val) {
4085            unsafe.putLong(bd, intCompactOffset, val);
4086        }
4087
4088        static void setIntValVolatile(BigDecimal bd, BigInteger val) {
4089            unsafe.putObjectVolatile(bd, intValOffset, val);
4090        }
4091    }
4092
4093    /**
4094     * Reconstitute the {@code BigDecimal} instance from a stream (that is,
4095     * deserialize it).
4096     *
4097     * @param s the stream being read.
4098     */
4099    private void readObject(java.io.ObjectInputStream s)
4100        throws java.io.IOException, ClassNotFoundException {
4101        // Read in all fields
4102        s.defaultReadObject();
4103        // validate possibly bad fields
4104        if (intVal == null) {
4105            String message = "BigDecimal: null intVal in stream";
4106            throw new java.io.StreamCorruptedException(message);
4107        // [all values of scale are now allowed]
4108        }
4109        UnsafeHolder.setIntCompact(this, compactValFor(intVal));
4110    }
4111
4112   /**
4113    * Serialize this {@code BigDecimal} to the stream in question
4114    *
4115    * @param s the stream to serialize to.
4116    */
4117   private void writeObject(java.io.ObjectOutputStream s)
4118       throws java.io.IOException {
4119       // Must inflate to maintain compatible serial form.
4120       if (this.intVal == null)
4121           UnsafeHolder.setIntValVolatile(this, BigInteger.valueOf(this.intCompact));
4122       // Could reset intVal back to null if it has to be set.
4123       s.defaultWriteObject();
4124   }
4125
4126    /**
4127     * Returns the length of the absolute value of a {@code long}, in decimal
4128     * digits.
4129     *
4130     * @param x the {@code long}
4131     * @return the length of the unscaled value, in deciaml digits.
4132     */
4133    static int longDigitLength(long x) {
4134        /*
4135         * As described in "Bit Twiddling Hacks" by Sean Anderson,
4136         * (http://graphics.stanford.edu/~seander/bithacks.html)
4137         * integer log 10 of x is within 1 of (1233/4096)* (1 +
4138         * integer log 2 of x). The fraction 1233/4096 approximates
4139         * log10(2). So we first do a version of log2 (a variant of
4140         * Long class with pre-checks and opposite directionality) and
4141         * then scale and check against powers table. This is a little
4142         * simpler in present context than the version in Hacker's
4143         * Delight sec 11-4. Adding one to bit length allows comparing
4144         * downward from the LONG_TEN_POWERS_TABLE that we need
4145         * anyway.
4146         */
4147        assert x != BigDecimal.INFLATED;
4148        if (x < 0)
4149            x = -x;
4150        if (x < 10) // must screen for 0, might as well 10
4151            return 1;
4152        int r = ((64 - Long.numberOfLeadingZeros(x) + 1) * 1233) >>> 12;
4153        long[] tab = LONG_TEN_POWERS_TABLE;
4154        // if r >= length, must have max possible digits for long
4155        return (r >= tab.length || x < tab[r]) ? r : r + 1;
4156    }
4157
4158    /**
4159     * Returns the length of the absolute value of a BigInteger, in
4160     * decimal digits.
4161     *
4162     * @param b the BigInteger
4163     * @return the length of the unscaled value, in decimal digits
4164     */
4165    private static int bigDigitLength(BigInteger b) {
4166        /*
4167         * Same idea as the long version, but we need a better
4168         * approximation of log10(2). Using 646456993/2^31
4169         * is accurate up to max possible reported bitLength.
4170         */
4171        if (b.signum == 0)
4172            return 1;
4173        int r = (int)((((long)b.bitLength() + 1) * 646456993) >>> 31);
4174        return b.compareMagnitude(bigTenToThe(r)) < 0? r : r+1;
4175    }
4176
4177    /**
4178     * Check a scale for Underflow or Overflow.  If this BigDecimal is
4179     * nonzero, throw an exception if the scale is outof range. If this
4180     * is zero, saturate the scale to the extreme value of the right
4181     * sign if the scale is out of range.
4182     *
4183     * @param val The new scale.
4184     * @throws ArithmeticException (overflow or underflow) if the new
4185     *         scale is out of range.
4186     * @return validated scale as an int.
4187     */
4188    private int checkScale(long val) {
4189        int asInt = (int)val;
4190        if (asInt != val) {
4191            asInt = val>Integer.MAX_VALUE ? Integer.MAX_VALUE : Integer.MIN_VALUE;
4192            BigInteger b;
4193            if (intCompact != 0 &&
4194                ((b = intVal) == null || b.signum() != 0))
4195                throw new ArithmeticException(asInt>0 ? "Underflow":"Overflow");
4196        }
4197        return asInt;
4198    }
4199
4200   /**
4201     * Returns the compact value for given {@code BigInteger}, or
4202     * INFLATED if too big. Relies on internal representation of
4203     * {@code BigInteger}.
4204     */
4205    private static long compactValFor(BigInteger b) {
4206        int[] m = b.mag;
4207        int len = m.length;
4208        if (len == 0)
4209            return 0;
4210        int d = m[0];
4211        if (len > 2 || (len == 2 && d < 0))
4212            return INFLATED;
4213
4214        long u = (len == 2)?
4215            (((long) m[1] & LONG_MASK) + (((long)d) << 32)) :
4216            (((long)d)   & LONG_MASK);
4217        return (b.signum < 0)? -u : u;
4218    }
4219
4220    private static int longCompareMagnitude(long x, long y) {
4221        if (x < 0)
4222            x = -x;
4223        if (y < 0)
4224            y = -y;
4225        return (x < y) ? -1 : ((x == y) ? 0 : 1);
4226    }
4227
4228    private static int saturateLong(long s) {
4229        int i = (int)s;
4230        return (s == i) ? i : (s < 0 ? Integer.MIN_VALUE : Integer.MAX_VALUE);
4231    }
4232
4233    /*
4234     * Internal printing routine
4235     */
4236    private static void print(String name, BigDecimal bd) {
4237        System.err.format("%s:\tintCompact %d\tintVal %d\tscale %d\tprecision %d%n",
4238                          name,
4239                          bd.intCompact,
4240                          bd.intVal,
4241                          bd.scale,
4242                          bd.precision);
4243    }
4244
4245    /**
4246     * Check internal invariants of this BigDecimal.  These invariants
4247     * include:
4248     *
4249     * <ul>
4250     *
4251     * <li>The object must be initialized; either intCompact must not be
4252     * INFLATED or intVal is non-null.  Both of these conditions may
4253     * be true.
4254     *
4255     * <li>If both intCompact and intVal and set, their values must be
4256     * consistent.
4257     *
4258     * <li>If precision is nonzero, it must have the right value.
4259     * </ul>
4260     *
4261     * Note: Since this is an audit method, we are not supposed to change the
4262     * state of this BigDecimal object.
4263     */
4264    private BigDecimal audit() {
4265        if (intCompact == INFLATED) {
4266            if (intVal == null) {
4267                print("audit", this);
4268                throw new AssertionError("null intVal");
4269            }
4270            // Check precision
4271            if (precision > 0 && precision != bigDigitLength(intVal)) {
4272                print("audit", this);
4273                throw new AssertionError("precision mismatch");
4274            }
4275        } else {
4276            if (intVal != null) {
4277                long val = intVal.longValue();
4278                if (val != intCompact) {
4279                    print("audit", this);
4280                    throw new AssertionError("Inconsistent state, intCompact=" +
4281                                             intCompact + "\t intVal=" + val);
4282                }
4283            }
4284            // Check precision
4285            if (precision > 0 && precision != longDigitLength(intCompact)) {
4286                print("audit", this);
4287                throw new AssertionError("precision mismatch");
4288            }
4289        }
4290        return this;
4291    }
4292
4293    /* the same as checkScale where value!=0 */
4294    private static int checkScaleNonZero(long val) {
4295        int asInt = (int)val;
4296        if (asInt != val) {
4297            throw new ArithmeticException(asInt>0 ? "Underflow":"Overflow");
4298        }
4299        return asInt;
4300    }
4301
4302    private static int checkScale(long intCompact, long val) {
4303        int asInt = (int)val;
4304        if (asInt != val) {
4305            asInt = val>Integer.MAX_VALUE ? Integer.MAX_VALUE : Integer.MIN_VALUE;
4306            if (intCompact != 0)
4307                throw new ArithmeticException(asInt>0 ? "Underflow":"Overflow");
4308        }
4309        return asInt;
4310    }
4311
4312    private static int checkScale(BigInteger intVal, long val) {
4313        int asInt = (int)val;
4314        if (asInt != val) {
4315            asInt = val>Integer.MAX_VALUE ? Integer.MAX_VALUE : Integer.MIN_VALUE;
4316            if (intVal.signum() != 0)
4317                throw new ArithmeticException(asInt>0 ? "Underflow":"Overflow");
4318        }
4319        return asInt;
4320    }
4321
4322    /**
4323     * Returns a {@code BigDecimal} rounded according to the MathContext
4324     * settings;
4325     * If rounding is needed a new {@code BigDecimal} is created and returned.
4326     *
4327     * @param val the value to be rounded
4328     * @param mc the context to use.
4329     * @return a {@code BigDecimal} rounded according to the MathContext
4330     *         settings.  May return {@code value}, if no rounding needed.
4331     * @throws ArithmeticException if the rounding mode is
4332     *         {@code RoundingMode.UNNECESSARY} and the
4333     *         result is inexact.
4334     */
4335    private static BigDecimal doRound(BigDecimal val, MathContext mc) {
4336        int mcp = mc.precision;
4337        boolean wasDivided = false;
4338        if (mcp > 0) {
4339            BigInteger intVal = val.intVal;
4340            long compactVal = val.intCompact;
4341            int scale = val.scale;
4342            int prec = val.precision();
4343            int mode = mc.roundingMode.oldMode;
4344            int drop;
4345            if (compactVal == INFLATED) {
4346                drop = prec - mcp;
4347                while (drop > 0) {
4348                    scale = checkScaleNonZero((long) scale - drop);
4349                    intVal = divideAndRoundByTenPow(intVal, drop, mode);
4350                    wasDivided = true;
4351                    compactVal = compactValFor(intVal);
4352                    if (compactVal != INFLATED) {
4353                        prec = longDigitLength(compactVal);
4354                        break;
4355                    }
4356                    prec = bigDigitLength(intVal);
4357                    drop = prec - mcp;
4358                }
4359            }
4360            if (compactVal != INFLATED) {
4361                drop = prec - mcp;  // drop can't be more than 18
4362                while (drop > 0) {
4363                    scale = checkScaleNonZero((long) scale - drop);
4364                    compactVal = divideAndRound(compactVal, LONG_TEN_POWERS_TABLE[drop], mc.roundingMode.oldMode);
4365                    wasDivided = true;
4366                    prec = longDigitLength(compactVal);
4367                    drop = prec - mcp;
4368                    intVal = null;
4369                }
4370            }
4371            return wasDivided ? new BigDecimal(intVal,compactVal,scale,prec) : val;
4372        }
4373        return val;
4374    }
4375
4376    /*
4377     * Returns a {@code BigDecimal} created from {@code long} value with
4378     * given scale rounded according to the MathContext settings
4379     */
4380    private static BigDecimal doRound(long compactVal, int scale, MathContext mc) {
4381        int mcp = mc.precision;
4382        if (mcp > 0 && mcp < 19) {
4383            int prec = longDigitLength(compactVal);
4384            int drop = prec - mcp;  // drop can't be more than 18
4385            while (drop > 0) {
4386                scale = checkScaleNonZero((long) scale - drop);
4387                compactVal = divideAndRound(compactVal, LONG_TEN_POWERS_TABLE[drop], mc.roundingMode.oldMode);
4388                prec = longDigitLength(compactVal);
4389                drop = prec - mcp;
4390            }
4391            return valueOf(compactVal, scale, prec);
4392        }
4393        return valueOf(compactVal, scale);
4394    }
4395
4396    /*
4397     * Returns a {@code BigDecimal} created from {@code BigInteger} value with
4398     * given scale rounded according to the MathContext settings
4399     */
4400    private static BigDecimal doRound(BigInteger intVal, int scale, MathContext mc) {
4401        int mcp = mc.precision;
4402        int prec = 0;
4403        if (mcp > 0) {
4404            long compactVal = compactValFor(intVal);
4405            int mode = mc.roundingMode.oldMode;
4406            int drop;
4407            if (compactVal == INFLATED) {
4408                prec = bigDigitLength(intVal);
4409                drop = prec - mcp;
4410                while (drop > 0) {
4411                    scale = checkScaleNonZero((long) scale - drop);
4412                    intVal = divideAndRoundByTenPow(intVal, drop, mode);
4413                    compactVal = compactValFor(intVal);
4414                    if (compactVal != INFLATED) {
4415                        break;
4416                    }
4417                    prec = bigDigitLength(intVal);
4418                    drop = prec - mcp;
4419                }
4420            }
4421            if (compactVal != INFLATED) {
4422                prec = longDigitLength(compactVal);
4423                drop = prec - mcp;     // drop can't be more than 18
4424                while (drop > 0) {
4425                    scale = checkScaleNonZero((long) scale - drop);
4426                    compactVal = divideAndRound(compactVal, LONG_TEN_POWERS_TABLE[drop], mc.roundingMode.oldMode);
4427                    prec = longDigitLength(compactVal);
4428                    drop = prec - mcp;
4429                }
4430                return valueOf(compactVal,scale,prec);
4431            }
4432        }
4433        return new BigDecimal(intVal,INFLATED,scale,prec);
4434    }
4435
4436    /*
4437     * Divides {@code BigInteger} value by ten power.
4438     */
4439    private static BigInteger divideAndRoundByTenPow(BigInteger intVal, int tenPow, int roundingMode) {
4440        if (tenPow < LONG_TEN_POWERS_TABLE.length)
4441            intVal = divideAndRound(intVal, LONG_TEN_POWERS_TABLE[tenPow], roundingMode);
4442        else
4443            intVal = divideAndRound(intVal, bigTenToThe(tenPow), roundingMode);
4444        return intVal;
4445    }
4446
4447    /**
4448     * Internally used for division operation for division {@code long} by
4449     * {@code long}.
4450     * The returned {@code BigDecimal} object is the quotient whose scale is set
4451     * to the passed in scale. If the remainder is not zero, it will be rounded
4452     * based on the passed in roundingMode. Also, if the remainder is zero and
4453     * the last parameter, i.e. preferredScale is NOT equal to scale, the
4454     * trailing zeros of the result is stripped to match the preferredScale.
4455     */
4456    private static BigDecimal divideAndRound(long ldividend, long ldivisor, int scale, int roundingMode,
4457                                             int preferredScale) {
4458
4459        int qsign; // quotient sign
4460        long q = ldividend / ldivisor; // store quotient in long
4461        if (roundingMode == ROUND_DOWN && scale == preferredScale)
4462            return valueOf(q, scale);
4463        long r = ldividend % ldivisor; // store remainder in long
4464        qsign = ((ldividend < 0) == (ldivisor < 0)) ? 1 : -1;
4465        if (r != 0) {
4466            boolean increment = needIncrement(ldivisor, roundingMode, qsign, q, r);
4467            return valueOf((increment ? q + qsign : q), scale);
4468        } else {
4469            if (preferredScale != scale)
4470                return createAndStripZerosToMatchScale(q, scale, preferredScale);
4471            else
4472                return valueOf(q, scale);
4473        }
4474    }
4475
4476    /**
4477     * Divides {@code long} by {@code long} and do rounding based on the
4478     * passed in roundingMode.
4479     */
4480    private static long divideAndRound(long ldividend, long ldivisor, int roundingMode) {
4481        int qsign; // quotient sign
4482        long q = ldividend / ldivisor; // store quotient in long
4483        if (roundingMode == ROUND_DOWN)
4484            return q;
4485        long r = ldividend % ldivisor; // store remainder in long
4486        qsign = ((ldividend < 0) == (ldivisor < 0)) ? 1 : -1;
4487        if (r != 0) {
4488            boolean increment = needIncrement(ldivisor, roundingMode, qsign, q,     r);
4489            return increment ? q + qsign : q;
4490        } else {
4491            return q;
4492        }
4493    }
4494
4495    /**
4496     * Shared logic of need increment computation.
4497     */
4498    private static boolean commonNeedIncrement(int roundingMode, int qsign,
4499                                        int cmpFracHalf, boolean oddQuot) {
4500        switch(roundingMode) {
4501        case ROUND_UNNECESSARY:
4502            throw new ArithmeticException("Rounding necessary");
4503
4504        case ROUND_UP: // Away from zero
4505            return true;
4506
4507        case ROUND_DOWN: // Towards zero
4508            return false;
4509
4510        case ROUND_CEILING: // Towards +infinity
4511            return qsign > 0;
4512
4513        case ROUND_FLOOR: // Towards -infinity
4514            return qsign < 0;
4515
4516        default: // Some kind of half-way rounding
4517            assert roundingMode >= ROUND_HALF_UP &&
4518                roundingMode <= ROUND_HALF_EVEN: "Unexpected rounding mode" + RoundingMode.valueOf(roundingMode);
4519
4520            if (cmpFracHalf < 0 ) // We're closer to higher digit
4521                return false;
4522            else if (cmpFracHalf > 0 ) // We're closer to lower digit
4523                return true;
4524            else { // half-way
4525                assert cmpFracHalf == 0;
4526
4527                switch(roundingMode) {
4528                case ROUND_HALF_DOWN:
4529                    return false;
4530
4531                case ROUND_HALF_UP:
4532                    return true;
4533
4534                case ROUND_HALF_EVEN:
4535                    return oddQuot;
4536
4537                default:
4538                    throw new AssertionError("Unexpected rounding mode" + roundingMode);
4539                }
4540            }
4541        }
4542    }
4543
4544    /**
4545     * Tests if quotient has to be incremented according the roundingMode
4546     */
4547    private static boolean needIncrement(long ldivisor, int roundingMode,
4548                                         int qsign, long q, long r) {
4549        assert r != 0L;
4550
4551        int cmpFracHalf;
4552        if (r <= HALF_LONG_MIN_VALUE || r > HALF_LONG_MAX_VALUE) {
4553            cmpFracHalf = 1; // 2 * r can't fit into long
4554        } else {
4555            cmpFracHalf = longCompareMagnitude(2 * r, ldivisor);
4556        }
4557
4558        return commonNeedIncrement(roundingMode, qsign, cmpFracHalf, (q & 1L) != 0L);
4559    }
4560
4561    /**
4562     * Divides {@code BigInteger} value by {@code long} value and
4563     * do rounding based on the passed in roundingMode.
4564     */
4565    private static BigInteger divideAndRound(BigInteger bdividend, long ldivisor, int roundingMode) {
4566        // Descend into mutables for faster remainder checks
4567        MutableBigInteger mdividend = new MutableBigInteger(bdividend.mag);
4568        // store quotient
4569        MutableBigInteger mq = new MutableBigInteger();
4570        // store quotient & remainder in long
4571        long r = mdividend.divide(ldivisor, mq);
4572        // record remainder is zero or not
4573        boolean isRemainderZero = (r == 0);
4574        // quotient sign
4575        int qsign = (ldivisor < 0) ? -bdividend.signum : bdividend.signum;
4576        if (!isRemainderZero) {
4577            if(needIncrement(ldivisor, roundingMode, qsign, mq, r)) {
4578                mq.add(MutableBigInteger.ONE);
4579            }
4580        }
4581        return mq.toBigInteger(qsign);
4582    }
4583
4584    /**
4585     * Internally used for division operation for division {@code BigInteger}
4586     * by {@code long}.
4587     * The returned {@code BigDecimal} object is the quotient whose scale is set
4588     * to the passed in scale. If the remainder is not zero, it will be rounded
4589     * based on the passed in roundingMode. Also, if the remainder is zero and
4590     * the last parameter, i.e. preferredScale is NOT equal to scale, the
4591     * trailing zeros of the result is stripped to match the preferredScale.
4592     */
4593    private static BigDecimal divideAndRound(BigInteger bdividend,
4594                                             long ldivisor, int scale, int roundingMode, int preferredScale) {
4595        // Descend into mutables for faster remainder checks
4596        MutableBigInteger mdividend = new MutableBigInteger(bdividend.mag);
4597        // store quotient
4598        MutableBigInteger mq = new MutableBigInteger();
4599        // store quotient & remainder in long
4600        long r = mdividend.divide(ldivisor, mq);
4601        // record remainder is zero or not
4602        boolean isRemainderZero = (r == 0);
4603        // quotient sign
4604        int qsign = (ldivisor < 0) ? -bdividend.signum : bdividend.signum;
4605        if (!isRemainderZero) {
4606            if(needIncrement(ldivisor, roundingMode, qsign, mq, r)) {
4607                mq.add(MutableBigInteger.ONE);
4608            }
4609            return mq.toBigDecimal(qsign, scale);
4610        } else {
4611            if (preferredScale != scale) {
4612                long compactVal = mq.toCompactValue(qsign);
4613                if(compactVal!=INFLATED) {
4614                    return createAndStripZerosToMatchScale(compactVal, scale, preferredScale);
4615                }
4616                BigInteger intVal =  mq.toBigInteger(qsign);
4617                return createAndStripZerosToMatchScale(intVal,scale, preferredScale);
4618            } else {
4619                return mq.toBigDecimal(qsign, scale);
4620            }
4621        }
4622    }
4623
4624    /**
4625     * Tests if quotient has to be incremented according the roundingMode
4626     */
4627    private static boolean needIncrement(long ldivisor, int roundingMode,
4628                                         int qsign, MutableBigInteger mq, long r) {
4629        assert r != 0L;
4630
4631        int cmpFracHalf;
4632        if (r <= HALF_LONG_MIN_VALUE || r > HALF_LONG_MAX_VALUE) {
4633            cmpFracHalf = 1; // 2 * r can't fit into long
4634        } else {
4635            cmpFracHalf = longCompareMagnitude(2 * r, ldivisor);
4636        }
4637
4638        return commonNeedIncrement(roundingMode, qsign, cmpFracHalf, mq.isOdd());
4639    }
4640
4641    /**
4642     * Divides {@code BigInteger} value by {@code BigInteger} value and
4643     * do rounding based on the passed in roundingMode.
4644     */
4645    private static BigInteger divideAndRound(BigInteger bdividend, BigInteger bdivisor, int roundingMode) {
4646        boolean isRemainderZero; // record remainder is zero or not
4647        int qsign; // quotient sign
4648        // Descend into mutables for faster remainder checks
4649        MutableBigInteger mdividend = new MutableBigInteger(bdividend.mag);
4650        MutableBigInteger mq = new MutableBigInteger();
4651        MutableBigInteger mdivisor = new MutableBigInteger(bdivisor.mag);
4652        MutableBigInteger mr = mdividend.divide(mdivisor, mq);
4653        isRemainderZero = mr.isZero();
4654        qsign = (bdividend.signum != bdivisor.signum) ? -1 : 1;
4655        if (!isRemainderZero) {
4656            if (needIncrement(mdivisor, roundingMode, qsign, mq, mr)) {
4657                mq.add(MutableBigInteger.ONE);
4658            }
4659        }
4660        return mq.toBigInteger(qsign);
4661    }
4662
4663    /**
4664     * Internally used for division operation for division {@code BigInteger}
4665     * by {@code BigInteger}.
4666     * The returned {@code BigDecimal} object is the quotient whose scale is set
4667     * to the passed in scale. If the remainder is not zero, it will be rounded
4668     * based on the passed in roundingMode. Also, if the remainder is zero and
4669     * the last parameter, i.e. preferredScale is NOT equal to scale, the
4670     * trailing zeros of the result is stripped to match the preferredScale.
4671     */
4672    private static BigDecimal divideAndRound(BigInteger bdividend, BigInteger bdivisor, int scale, int roundingMode,
4673                                             int preferredScale) {
4674        boolean isRemainderZero; // record remainder is zero or not
4675        int qsign; // quotient sign
4676        // Descend into mutables for faster remainder checks
4677        MutableBigInteger mdividend = new MutableBigInteger(bdividend.mag);
4678        MutableBigInteger mq = new MutableBigInteger();
4679        MutableBigInteger mdivisor = new MutableBigInteger(bdivisor.mag);
4680        MutableBigInteger mr = mdividend.divide(mdivisor, mq);
4681        isRemainderZero = mr.isZero();
4682        qsign = (bdividend.signum != bdivisor.signum) ? -1 : 1;
4683        if (!isRemainderZero) {
4684            if (needIncrement(mdivisor, roundingMode, qsign, mq, mr)) {
4685                mq.add(MutableBigInteger.ONE);
4686            }
4687            return mq.toBigDecimal(qsign, scale);
4688        } else {
4689            if (preferredScale != scale) {
4690                long compactVal = mq.toCompactValue(qsign);
4691                if (compactVal != INFLATED) {
4692                    return createAndStripZerosToMatchScale(compactVal, scale, preferredScale);
4693                }
4694                BigInteger intVal = mq.toBigInteger(qsign);
4695                return createAndStripZerosToMatchScale(intVal, scale, preferredScale);
4696            } else {
4697                return mq.toBigDecimal(qsign, scale);
4698            }
4699        }
4700    }
4701
4702    /**
4703     * Tests if quotient has to be incremented according the roundingMode
4704     */
4705    private static boolean needIncrement(MutableBigInteger mdivisor, int roundingMode,
4706                                         int qsign, MutableBigInteger mq, MutableBigInteger mr) {
4707        assert !mr.isZero();
4708        int cmpFracHalf = mr.compareHalf(mdivisor);
4709        return commonNeedIncrement(roundingMode, qsign, cmpFracHalf, mq.isOdd());
4710    }
4711
4712    /**
4713     * Remove insignificant trailing zeros from this
4714     * {@code BigInteger} value until the preferred scale is reached or no
4715     * more zeros can be removed.  If the preferred scale is less than
4716     * Integer.MIN_VALUE, all the trailing zeros will be removed.
4717     *
4718     * @return new {@code BigDecimal} with a scale possibly reduced
4719     * to be closed to the preferred scale.
4720     */
4721    private static BigDecimal createAndStripZerosToMatchScale(BigInteger intVal, int scale, long preferredScale) {
4722        BigInteger qr[]; // quotient-remainder pair
4723        while (intVal.compareMagnitude(BigInteger.TEN) >= 0
4724               && scale > preferredScale) {
4725            if (intVal.testBit(0))
4726                break; // odd number cannot end in 0
4727            qr = intVal.divideAndRemainder(BigInteger.TEN);
4728            if (qr[1].signum() != 0)
4729                break; // non-0 remainder
4730            intVal = qr[0];
4731            scale = checkScale(intVal,(long) scale - 1); // could Overflow
4732        }
4733        return valueOf(intVal, scale, 0);
4734    }
4735
4736    /**
4737     * Remove insignificant trailing zeros from this
4738     * {@code long} value until the preferred scale is reached or no
4739     * more zeros can be removed.  If the preferred scale is less than
4740     * Integer.MIN_VALUE, all the trailing zeros will be removed.
4741     *
4742     * @return new {@code BigDecimal} with a scale possibly reduced
4743     * to be closed to the preferred scale.
4744     */
4745    private static BigDecimal createAndStripZerosToMatchScale(long compactVal, int scale, long preferredScale) {
4746        while (Math.abs(compactVal) >= 10L && scale > preferredScale) {
4747            if ((compactVal & 1L) != 0L)
4748                break; // odd number cannot end in 0
4749            long r = compactVal % 10L;
4750            if (r != 0L)
4751                break; // non-0 remainder
4752            compactVal /= 10;
4753            scale = checkScale(compactVal, (long) scale - 1); // could Overflow
4754        }
4755        return valueOf(compactVal, scale);
4756    }
4757
4758    private static BigDecimal stripZerosToMatchScale(BigInteger intVal, long intCompact, int scale, int preferredScale) {
4759        if(intCompact!=INFLATED) {
4760            return createAndStripZerosToMatchScale(intCompact, scale, preferredScale);
4761        } else {
4762            return createAndStripZerosToMatchScale(intVal==null ? INFLATED_BIGINT : intVal,
4763                                                   scale, preferredScale);
4764        }
4765    }
4766
4767    /*
4768     * returns INFLATED if oveflow
4769     */
4770    private static long add(long xs, long ys){
4771        long sum = xs + ys;
4772        // See "Hacker's Delight" section 2-12 for explanation of
4773        // the overflow test.
4774        if ( (((sum ^ xs) & (sum ^ ys))) >= 0L) { // not overflowed
4775            return sum;
4776        }
4777        return INFLATED;
4778    }
4779
4780    private static BigDecimal add(long xs, long ys, int scale){
4781        long sum = add(xs, ys);
4782        if (sum!=INFLATED)
4783            return BigDecimal.valueOf(sum, scale);
4784        return new BigDecimal(BigInteger.valueOf(xs).add(ys), scale);
4785    }
4786
4787    private static BigDecimal add(final long xs, int scale1, final long ys, int scale2) {
4788        long sdiff = (long) scale1 - scale2;
4789        if (sdiff == 0) {
4790            return add(xs, ys, scale1);
4791        } else if (sdiff < 0) {
4792            int raise = checkScale(xs,-sdiff);
4793            long scaledX = longMultiplyPowerTen(xs, raise);
4794            if (scaledX != INFLATED) {
4795                return add(scaledX, ys, scale2);
4796            } else {
4797                BigInteger bigsum = bigMultiplyPowerTen(xs,raise).add(ys);
4798                return ((xs^ys)>=0) ? // same sign test
4799                    new BigDecimal(bigsum, INFLATED, scale2, 0)
4800                    : valueOf(bigsum, scale2, 0);
4801            }
4802        } else {
4803            int raise = checkScale(ys,sdiff);
4804            long scaledY = longMultiplyPowerTen(ys, raise);
4805            if (scaledY != INFLATED) {
4806                return add(xs, scaledY, scale1);
4807            } else {
4808                BigInteger bigsum = bigMultiplyPowerTen(ys,raise).add(xs);
4809                return ((xs^ys)>=0) ?
4810                    new BigDecimal(bigsum, INFLATED, scale1, 0)
4811                    : valueOf(bigsum, scale1, 0);
4812            }
4813        }
4814    }
4815
4816    private static BigDecimal add(final long xs, int scale1, BigInteger snd, int scale2) {
4817        int rscale = scale1;
4818        long sdiff = (long)rscale - scale2;
4819        boolean sameSigns =  (Long.signum(xs) == snd.signum);
4820        BigInteger sum;
4821        if (sdiff < 0) {
4822            int raise = checkScale(xs,-sdiff);
4823            rscale = scale2;
4824            long scaledX = longMultiplyPowerTen(xs, raise);
4825            if (scaledX == INFLATED) {
4826                sum = snd.add(bigMultiplyPowerTen(xs,raise));
4827            } else {
4828                sum = snd.add(scaledX);
4829            }
4830        } else { //if (sdiff > 0) {
4831            int raise = checkScale(snd,sdiff);
4832            snd = bigMultiplyPowerTen(snd,raise);
4833            sum = snd.add(xs);
4834        }
4835        return (sameSigns) ?
4836            new BigDecimal(sum, INFLATED, rscale, 0) :
4837            valueOf(sum, rscale, 0);
4838    }
4839
4840    private static BigDecimal add(BigInteger fst, int scale1, BigInteger snd, int scale2) {
4841        int rscale = scale1;
4842        long sdiff = (long)rscale - scale2;
4843        if (sdiff != 0) {
4844            if (sdiff < 0) {
4845                int raise = checkScale(fst,-sdiff);
4846                rscale = scale2;
4847                fst = bigMultiplyPowerTen(fst,raise);
4848            } else {
4849                int raise = checkScale(snd,sdiff);
4850                snd = bigMultiplyPowerTen(snd,raise);
4851            }
4852        }
4853        BigInteger sum = fst.add(snd);
4854        return (fst.signum == snd.signum) ?
4855                new BigDecimal(sum, INFLATED, rscale, 0) :
4856                valueOf(sum, rscale, 0);
4857    }
4858
4859    private static BigInteger bigMultiplyPowerTen(long value, int n) {
4860        if (n <= 0)
4861            return BigInteger.valueOf(value);
4862        return bigTenToThe(n).multiply(value);
4863    }
4864
4865    private static BigInteger bigMultiplyPowerTen(BigInteger value, int n) {
4866        if (n <= 0)
4867            return value;
4868        if(n<LONG_TEN_POWERS_TABLE.length) {
4869                return value.multiply(LONG_TEN_POWERS_TABLE[n]);
4870        }
4871        return value.multiply(bigTenToThe(n));
4872    }
4873
4874    /**
4875     * Returns a {@code BigDecimal} whose value is {@code (xs /
4876     * ys)}, with rounding according to the context settings.
4877     *
4878     * Fast path - used only when (xscale <= yscale && yscale < 18
4879     *  && mc.presision<18) {
4880     */
4881    private static BigDecimal divideSmallFastPath(final long xs, int xscale,
4882                                                  final long ys, int yscale,
4883                                                  long preferredScale, MathContext mc) {
4884        int mcp = mc.precision;
4885        int roundingMode = mc.roundingMode.oldMode;
4886
4887        assert (xscale <= yscale) && (yscale < 18) && (mcp < 18);
4888        int xraise = yscale - xscale; // xraise >=0
4889        long scaledX = (xraise==0) ? xs :
4890            longMultiplyPowerTen(xs, xraise); // can't overflow here!
4891        BigDecimal quotient;
4892
4893        int cmp = longCompareMagnitude(scaledX, ys);
4894        if(cmp > 0) { // satisfy constraint (b)
4895            yscale -= 1; // [that is, divisor *= 10]
4896            int scl = checkScaleNonZero(preferredScale + yscale - xscale + mcp);
4897            if (checkScaleNonZero((long) mcp + yscale - xscale) > 0) {
4898                // assert newScale >= xscale
4899                int raise = checkScaleNonZero((long) mcp + yscale - xscale);
4900                long scaledXs;
4901                if ((scaledXs = longMultiplyPowerTen(xs, raise)) == INFLATED) {
4902                    quotient = null;
4903                    if((mcp-1) >=0 && (mcp-1)<LONG_TEN_POWERS_TABLE.length) {
4904                        quotient = multiplyDivideAndRound(LONG_TEN_POWERS_TABLE[mcp-1], scaledX, ys, scl, roundingMode, checkScaleNonZero(preferredScale));
4905                    }
4906                    if(quotient==null) {
4907                        BigInteger rb = bigMultiplyPowerTen(scaledX,mcp-1);
4908                        quotient = divideAndRound(rb, ys,
4909                                                  scl, roundingMode, checkScaleNonZero(preferredScale));
4910                    }
4911                } else {
4912                    quotient = divideAndRound(scaledXs, ys, scl, roundingMode, checkScaleNonZero(preferredScale));
4913                }
4914            } else {
4915                int newScale = checkScaleNonZero((long) xscale - mcp);
4916                // assert newScale >= yscale
4917                if (newScale == yscale) { // easy case
4918                    quotient = divideAndRound(xs, ys, scl, roundingMode,checkScaleNonZero(preferredScale));
4919                } else {
4920                    int raise = checkScaleNonZero((long) newScale - yscale);
4921                    long scaledYs;
4922                    if ((scaledYs = longMultiplyPowerTen(ys, raise)) == INFLATED) {
4923                        BigInteger rb = bigMultiplyPowerTen(ys,raise);
4924                        quotient = divideAndRound(BigInteger.valueOf(xs),
4925                                                  rb, scl, roundingMode,checkScaleNonZero(preferredScale));
4926                    } else {
4927                        quotient = divideAndRound(xs, scaledYs, scl, roundingMode,checkScaleNonZero(preferredScale));
4928                    }
4929                }
4930            }
4931        } else {
4932            // abs(scaledX) <= abs(ys)
4933            // result is "scaledX * 10^msp / ys"
4934            int scl = checkScaleNonZero(preferredScale + yscale - xscale + mcp);
4935            if(cmp==0) {
4936                // abs(scaleX)== abs(ys) => result will be scaled 10^mcp + correct sign
4937                quotient = roundedTenPower(((scaledX < 0) == (ys < 0)) ? 1 : -1, mcp, scl, checkScaleNonZero(preferredScale));
4938            } else {
4939                // abs(scaledX) < abs(ys)
4940                long scaledXs;
4941                if ((scaledXs = longMultiplyPowerTen(scaledX, mcp)) == INFLATED) {
4942                    quotient = null;
4943                    if(mcp<LONG_TEN_POWERS_TABLE.length) {
4944                        quotient = multiplyDivideAndRound(LONG_TEN_POWERS_TABLE[mcp], scaledX, ys, scl, roundingMode, checkScaleNonZero(preferredScale));
4945                    }
4946                    if(quotient==null) {
4947                        BigInteger rb = bigMultiplyPowerTen(scaledX,mcp);
4948                        quotient = divideAndRound(rb, ys,
4949                                                  scl, roundingMode, checkScaleNonZero(preferredScale));
4950                    }
4951                } else {
4952                    quotient = divideAndRound(scaledXs, ys, scl, roundingMode, checkScaleNonZero(preferredScale));
4953                }
4954            }
4955        }
4956        // doRound, here, only affects 1000000000 case.
4957        return doRound(quotient,mc);
4958    }
4959
4960    /**
4961     * Returns a {@code BigDecimal} whose value is {@code (xs /
4962     * ys)}, with rounding according to the context settings.
4963     */
4964    private static BigDecimal divide(final long xs, int xscale, final long ys, int yscale, long preferredScale, MathContext mc) {
4965        int mcp = mc.precision;
4966        if(xscale <= yscale && yscale < 18 && mcp<18) {
4967            return divideSmallFastPath(xs, xscale, ys, yscale, preferredScale, mc);
4968        }
4969        if (compareMagnitudeNormalized(xs, xscale, ys, yscale) > 0) {// satisfy constraint (b)
4970            yscale -= 1; // [that is, divisor *= 10]
4971        }
4972        int roundingMode = mc.roundingMode.oldMode;
4973        // In order to find out whether the divide generates the exact result,
4974        // we avoid calling the above divide method. 'quotient' holds the
4975        // return BigDecimal object whose scale will be set to 'scl'.
4976        int scl = checkScaleNonZero(preferredScale + yscale - xscale + mcp);
4977        BigDecimal quotient;
4978        if (checkScaleNonZero((long) mcp + yscale - xscale) > 0) {
4979            int raise = checkScaleNonZero((long) mcp + yscale - xscale);
4980            long scaledXs;
4981            if ((scaledXs = longMultiplyPowerTen(xs, raise)) == INFLATED) {
4982                BigInteger rb = bigMultiplyPowerTen(xs,raise);
4983                quotient = divideAndRound(rb, ys, scl, roundingMode, checkScaleNonZero(preferredScale));
4984            } else {
4985                quotient = divideAndRound(scaledXs, ys, scl, roundingMode, checkScaleNonZero(preferredScale));
4986            }
4987        } else {
4988            int newScale = checkScaleNonZero((long) xscale - mcp);
4989            // assert newScale >= yscale
4990            if (newScale == yscale) { // easy case
4991                quotient = divideAndRound(xs, ys, scl, roundingMode,checkScaleNonZero(preferredScale));
4992            } else {
4993                int raise = checkScaleNonZero((long) newScale - yscale);
4994                long scaledYs;
4995                if ((scaledYs = longMultiplyPowerTen(ys, raise)) == INFLATED) {
4996                    BigInteger rb = bigMultiplyPowerTen(ys,raise);
4997                    quotient = divideAndRound(BigInteger.valueOf(xs),
4998                                              rb, scl, roundingMode,checkScaleNonZero(preferredScale));
4999                } else {
5000                    quotient = divideAndRound(xs, scaledYs, scl, roundingMode,checkScaleNonZero(preferredScale));
5001                }
5002            }
5003        }
5004        // doRound, here, only affects 1000000000 case.
5005        return doRound(quotient,mc);
5006    }
5007
5008    /**
5009     * Returns a {@code BigDecimal} whose value is {@code (xs /
5010     * ys)}, with rounding according to the context settings.
5011     */
5012    private static BigDecimal divide(BigInteger xs, int xscale, long ys, int yscale, long preferredScale, MathContext mc) {
5013        // Normalize dividend & divisor so that both fall into [0.1, 0.999...]
5014        if ((-compareMagnitudeNormalized(ys, yscale, xs, xscale)) > 0) {// satisfy constraint (b)
5015            yscale -= 1; // [that is, divisor *= 10]
5016        }
5017        int mcp = mc.precision;
5018        int roundingMode = mc.roundingMode.oldMode;
5019
5020        // In order to find out whether the divide generates the exact result,
5021        // we avoid calling the above divide method. 'quotient' holds the
5022        // return BigDecimal object whose scale will be set to 'scl'.
5023        BigDecimal quotient;
5024        int scl = checkScaleNonZero(preferredScale + yscale - xscale + mcp);
5025        if (checkScaleNonZero((long) mcp + yscale - xscale) > 0) {
5026            int raise = checkScaleNonZero((long) mcp + yscale - xscale);
5027            BigInteger rb = bigMultiplyPowerTen(xs,raise);
5028            quotient = divideAndRound(rb, ys, scl, roundingMode, checkScaleNonZero(preferredScale));
5029        } else {
5030            int newScale = checkScaleNonZero((long) xscale - mcp);
5031            // assert newScale >= yscale
5032            if (newScale == yscale) { // easy case
5033                quotient = divideAndRound(xs, ys, scl, roundingMode,checkScaleNonZero(preferredScale));
5034            } else {
5035                int raise = checkScaleNonZero((long) newScale - yscale);
5036                long scaledYs;
5037                if ((scaledYs = longMultiplyPowerTen(ys, raise)) == INFLATED) {
5038                    BigInteger rb = bigMultiplyPowerTen(ys,raise);
5039                    quotient = divideAndRound(xs, rb, scl, roundingMode,checkScaleNonZero(preferredScale));
5040                } else {
5041                    quotient = divideAndRound(xs, scaledYs, scl, roundingMode,checkScaleNonZero(preferredScale));
5042                }
5043            }
5044        }
5045        // doRound, here, only affects 1000000000 case.
5046        return doRound(quotient, mc);
5047    }
5048
5049    /**
5050     * Returns a {@code BigDecimal} whose value is {@code (xs /
5051     * ys)}, with rounding according to the context settings.
5052     */
5053    private static BigDecimal divide(long xs, int xscale, BigInteger ys, int yscale, long preferredScale, MathContext mc) {
5054        // Normalize dividend & divisor so that both fall into [0.1, 0.999...]
5055        if (compareMagnitudeNormalized(xs, xscale, ys, yscale) > 0) {// satisfy constraint (b)
5056            yscale -= 1; // [that is, divisor *= 10]
5057        }
5058        int mcp = mc.precision;
5059        int roundingMode = mc.roundingMode.oldMode;
5060
5061        // In order to find out whether the divide generates the exact result,
5062        // we avoid calling the above divide method. 'quotient' holds the
5063        // return BigDecimal object whose scale will be set to 'scl'.
5064        BigDecimal quotient;
5065        int scl = checkScaleNonZero(preferredScale + yscale - xscale + mcp);
5066        if (checkScaleNonZero((long) mcp + yscale - xscale) > 0) {
5067            int raise = checkScaleNonZero((long) mcp + yscale - xscale);
5068            BigInteger rb = bigMultiplyPowerTen(xs,raise);
5069            quotient = divideAndRound(rb, ys, scl, roundingMode, checkScaleNonZero(preferredScale));
5070        } else {
5071            int newScale = checkScaleNonZero((long) xscale - mcp);
5072            int raise = checkScaleNonZero((long) newScale - yscale);
5073            BigInteger rb = bigMultiplyPowerTen(ys,raise);
5074            quotient = divideAndRound(BigInteger.valueOf(xs), rb, scl, roundingMode,checkScaleNonZero(preferredScale));
5075        }
5076        // doRound, here, only affects 1000000000 case.
5077        return doRound(quotient, mc);
5078    }
5079
5080    /**
5081     * Returns a {@code BigDecimal} whose value is {@code (xs /
5082     * ys)}, with rounding according to the context settings.
5083     */
5084    private static BigDecimal divide(BigInteger xs, int xscale, BigInteger ys, int yscale, long preferredScale, MathContext mc) {
5085        // Normalize dividend & divisor so that both fall into [0.1, 0.999...]
5086        if (compareMagnitudeNormalized(xs, xscale, ys, yscale) > 0) {// satisfy constraint (b)
5087            yscale -= 1; // [that is, divisor *= 10]
5088        }
5089        int mcp = mc.precision;
5090        int roundingMode = mc.roundingMode.oldMode;
5091
5092        // In order to find out whether the divide generates the exact result,
5093        // we avoid calling the above divide method. 'quotient' holds the
5094        // return BigDecimal object whose scale will be set to 'scl'.
5095        BigDecimal quotient;
5096        int scl = checkScaleNonZero(preferredScale + yscale - xscale + mcp);
5097        if (checkScaleNonZero((long) mcp + yscale - xscale) > 0) {
5098            int raise = checkScaleNonZero((long) mcp + yscale - xscale);
5099            BigInteger rb = bigMultiplyPowerTen(xs,raise);
5100            quotient = divideAndRound(rb, ys, scl, roundingMode, checkScaleNonZero(preferredScale));
5101        } else {
5102            int newScale = checkScaleNonZero((long) xscale - mcp);
5103            int raise = checkScaleNonZero((long) newScale - yscale);
5104            BigInteger rb = bigMultiplyPowerTen(ys,raise);
5105            quotient = divideAndRound(xs, rb, scl, roundingMode,checkScaleNonZero(preferredScale));
5106        }
5107        // doRound, here, only affects 1000000000 case.
5108        return doRound(quotient, mc);
5109    }
5110
5111    /*
5112     * performs divideAndRound for (dividend0*dividend1, divisor)
5113     * returns null if quotient can't fit into long value;
5114     */
5115    private static BigDecimal multiplyDivideAndRound(long dividend0, long dividend1, long divisor, int scale, int roundingMode,
5116                                                     int preferredScale) {
5117        int qsign = Long.signum(dividend0)*Long.signum(dividend1)*Long.signum(divisor);
5118        dividend0 = Math.abs(dividend0);
5119        dividend1 = Math.abs(dividend1);
5120        divisor = Math.abs(divisor);
5121        // multiply dividend0 * dividend1
5122        long d0_hi = dividend0 >>> 32;
5123        long d0_lo = dividend0 & LONG_MASK;
5124        long d1_hi = dividend1 >>> 32;
5125        long d1_lo = dividend1 & LONG_MASK;
5126        long product = d0_lo * d1_lo;
5127        long d0 = product & LONG_MASK;
5128        long d1 = product >>> 32;
5129        product = d0_hi * d1_lo + d1;
5130        d1 = product & LONG_MASK;
5131        long d2 = product >>> 32;
5132        product = d0_lo * d1_hi + d1;
5133        d1 = product & LONG_MASK;
5134        d2 += product >>> 32;
5135        long d3 = d2>>>32;
5136        d2 &= LONG_MASK;
5137        product = d0_hi*d1_hi + d2;
5138        d2 = product & LONG_MASK;
5139        d3 = ((product>>>32) + d3) & LONG_MASK;
5140        final long dividendHi = make64(d3,d2);
5141        final long dividendLo = make64(d1,d0);
5142        // divide
5143        return divideAndRound128(dividendHi, dividendLo, divisor, qsign, scale, roundingMode, preferredScale);
5144    }
5145
5146    private static final long DIV_NUM_BASE = (1L<<32); // Number base (32 bits).
5147
5148    /*
5149     * divideAndRound 128-bit value by long divisor.
5150     * returns null if quotient can't fit into long value;
5151     * Specialized version of Knuth's division
5152     */
5153    private static BigDecimal divideAndRound128(final long dividendHi, final long dividendLo, long divisor, int sign,
5154                                                int scale, int roundingMode, int preferredScale) {
5155        if (dividendHi >= divisor) {
5156            return null;
5157        }
5158
5159        final int shift = Long.numberOfLeadingZeros(divisor);
5160        divisor <<= shift;
5161
5162        final long v1 = divisor >>> 32;
5163        final long v0 = divisor & LONG_MASK;
5164
5165        long tmp = dividendLo << shift;
5166        long u1 = tmp >>> 32;
5167        long u0 = tmp & LONG_MASK;
5168
5169        tmp = (dividendHi << shift) | (dividendLo >>> 64 - shift);
5170        long u2 = tmp & LONG_MASK;
5171        long q1, r_tmp;
5172        if (v1 == 1) {
5173            q1 = tmp;
5174            r_tmp = 0;
5175        } else if (tmp >= 0) {
5176            q1 = tmp / v1;
5177            r_tmp = tmp - q1 * v1;
5178        } else {
5179            long[] rq = divRemNegativeLong(tmp, v1);
5180            q1 = rq[1];
5181            r_tmp = rq[0];
5182        }
5183
5184        while(q1 >= DIV_NUM_BASE || unsignedLongCompare(q1*v0, make64(r_tmp, u1))) {
5185            q1--;
5186            r_tmp += v1;
5187            if (r_tmp >= DIV_NUM_BASE)
5188                break;
5189        }
5190
5191        tmp = mulsub(u2,u1,v1,v0,q1);
5192        u1 = tmp & LONG_MASK;
5193        long q0;
5194        if (v1 == 1) {
5195            q0 = tmp;
5196            r_tmp = 0;
5197        } else if (tmp >= 0) {
5198            q0 = tmp / v1;
5199            r_tmp = tmp - q0 * v1;
5200        } else {
5201            long[] rq = divRemNegativeLong(tmp, v1);
5202            q0 = rq[1];
5203            r_tmp = rq[0];
5204        }
5205
5206        while(q0 >= DIV_NUM_BASE || unsignedLongCompare(q0*v0,make64(r_tmp,u0))) {
5207            q0--;
5208            r_tmp += v1;
5209            if (r_tmp >= DIV_NUM_BASE)
5210                break;
5211        }
5212
5213        if((int)q1 < 0) {
5214            // result (which is positive and unsigned here)
5215            // can't fit into long due to sign bit is used for value
5216            MutableBigInteger mq = new MutableBigInteger(new int[]{(int)q1, (int)q0});
5217            if (roundingMode == ROUND_DOWN && scale == preferredScale) {
5218                return mq.toBigDecimal(sign, scale);
5219            }
5220            long r = mulsub(u1, u0, v1, v0, q0) >>> shift;
5221            if (r != 0) {
5222                if(needIncrement(divisor >>> shift, roundingMode, sign, mq, r)){
5223                    mq.add(MutableBigInteger.ONE);
5224                }
5225                return mq.toBigDecimal(sign, scale);
5226            } else {
5227                if (preferredScale != scale) {
5228                    BigInteger intVal =  mq.toBigInteger(sign);
5229                    return createAndStripZerosToMatchScale(intVal,scale, preferredScale);
5230                } else {
5231                    return mq.toBigDecimal(sign, scale);
5232                }
5233            }
5234        }
5235
5236        long q = make64(q1,q0);
5237        q*=sign;
5238
5239        if (roundingMode == ROUND_DOWN && scale == preferredScale)
5240            return valueOf(q, scale);
5241
5242        long r = mulsub(u1, u0, v1, v0, q0) >>> shift;
5243        if (r != 0) {
5244            boolean increment = needIncrement(divisor >>> shift, roundingMode, sign, q, r);
5245            return valueOf((increment ? q + sign : q), scale);
5246        } else {
5247            if (preferredScale != scale) {
5248                return createAndStripZerosToMatchScale(q, scale, preferredScale);
5249            } else {
5250                return valueOf(q, scale);
5251            }
5252        }
5253    }
5254
5255    /*
5256     * calculate divideAndRound for ldividend*10^raise / divisor
5257     * when abs(dividend)==abs(divisor);
5258     */
5259    private static BigDecimal roundedTenPower(int qsign, int raise, int scale, int preferredScale) {
5260        if (scale > preferredScale) {
5261            int diff = scale - preferredScale;
5262            if(diff < raise) {
5263                return scaledTenPow(raise - diff, qsign, preferredScale);
5264            } else {
5265                return valueOf(qsign,scale-raise);
5266            }
5267        } else {
5268            return scaledTenPow(raise, qsign, scale);
5269        }
5270    }
5271
5272    static BigDecimal scaledTenPow(int n, int sign, int scale) {
5273        if (n < LONG_TEN_POWERS_TABLE.length)
5274            return valueOf(sign*LONG_TEN_POWERS_TABLE[n],scale);
5275        else {
5276            BigInteger unscaledVal = bigTenToThe(n);
5277            if(sign==-1) {
5278                unscaledVal = unscaledVal.negate();
5279            }
5280            return new BigDecimal(unscaledVal, INFLATED, scale, n+1);
5281        }
5282    }
5283
5284    /**
5285     * Calculate the quotient and remainder of dividing a negative long by
5286     * another long.
5287     *
5288     * @param n the numerator; must be negative
5289     * @param d the denominator; must not be unity
5290     * @return a two-element {@long} array with the remainder and quotient in
5291     *         the initial and final elements, respectively
5292     */
5293    private static long[] divRemNegativeLong(long n, long d) {
5294        assert n < 0 : "Non-negative numerator " + n;
5295        assert d != 1 : "Unity denominator";
5296
5297        // Approximate the quotient and remainder
5298        long q = (n >>> 1) / (d >>> 1);
5299        long r = n - q * d;
5300
5301        // Correct the approximation
5302        while (r < 0) {
5303            r += d;
5304            q--;
5305        }
5306        while (r >= d) {
5307            r -= d;
5308            q++;
5309        }
5310
5311        // n - q*d == r && 0 <= r < d, hence we're done.
5312        return new long[] {r, q};
5313    }
5314
5315    private static long make64(long hi, long lo) {
5316        return hi<<32 | lo;
5317    }
5318
5319    private static long mulsub(long u1, long u0, final long v1, final long v0, long q0) {
5320        long tmp = u0 - q0*v0;
5321        return make64(u1 + (tmp>>>32) - q0*v1,tmp & LONG_MASK);
5322    }
5323
5324    private static boolean unsignedLongCompare(long one, long two) {
5325        return (one+Long.MIN_VALUE) > (two+Long.MIN_VALUE);
5326    }
5327
5328    private static boolean unsignedLongCompareEq(long one, long two) {
5329        return (one+Long.MIN_VALUE) >= (two+Long.MIN_VALUE);
5330    }
5331
5332
5333    // Compare Normalize dividend & divisor so that both fall into [0.1, 0.999...]
5334    private static int compareMagnitudeNormalized(long xs, int xscale, long ys, int yscale) {
5335        // assert xs!=0 && ys!=0
5336        int sdiff = xscale - yscale;
5337        if (sdiff != 0) {
5338            if (sdiff < 0) {
5339                xs = longMultiplyPowerTen(xs, -sdiff);
5340            } else { // sdiff > 0
5341                ys = longMultiplyPowerTen(ys, sdiff);
5342            }
5343        }
5344        if (xs != INFLATED)
5345            return (ys != INFLATED) ? longCompareMagnitude(xs, ys) : -1;
5346        else
5347            return 1;
5348    }
5349
5350    // Compare Normalize dividend & divisor so that both fall into [0.1, 0.999...]
5351    private static int compareMagnitudeNormalized(long xs, int xscale, BigInteger ys, int yscale) {
5352        // assert "ys can't be represented as long"
5353        if (xs == 0)
5354            return -1;
5355        int sdiff = xscale - yscale;
5356        if (sdiff < 0) {
5357            if (longMultiplyPowerTen(xs, -sdiff) == INFLATED ) {
5358                return bigMultiplyPowerTen(xs, -sdiff).compareMagnitude(ys);
5359            }
5360        }
5361        return -1;
5362    }
5363
5364    // Compare Normalize dividend & divisor so that both fall into [0.1, 0.999...]
5365    private static int compareMagnitudeNormalized(BigInteger xs, int xscale, BigInteger ys, int yscale) {
5366        int sdiff = xscale - yscale;
5367        if (sdiff < 0) {
5368            return bigMultiplyPowerTen(xs, -sdiff).compareMagnitude(ys);
5369        } else { // sdiff >= 0
5370            return xs.compareMagnitude(bigMultiplyPowerTen(ys, sdiff));
5371        }
5372    }
5373
5374    private static long multiply(long x, long y){
5375                long product = x * y;
5376        long ax = Math.abs(x);
5377        long ay = Math.abs(y);
5378        if (((ax | ay) >>> 31 == 0) || (y == 0) || (product / y == x)){
5379                        return product;
5380                }
5381        return INFLATED;
5382    }
5383
5384    private static BigDecimal multiply(long x, long y, int scale) {
5385        long product = multiply(x, y);
5386        if(product!=INFLATED) {
5387            return valueOf(product,scale);
5388        }
5389        return new BigDecimal(BigInteger.valueOf(x).multiply(y),INFLATED,scale,0);
5390    }
5391
5392    private static BigDecimal multiply(long x, BigInteger y, int scale) {
5393        if(x==0) {
5394            return zeroValueOf(scale);
5395        }
5396        return new BigDecimal(y.multiply(x),INFLATED,scale,0);
5397    }
5398
5399    private static BigDecimal multiply(BigInteger x, BigInteger y, int scale) {
5400        return new BigDecimal(x.multiply(y),INFLATED,scale,0);
5401    }
5402
5403    /**
5404     * Multiplies two long values and rounds according {@code MathContext}
5405     */
5406    private static BigDecimal multiplyAndRound(long x, long y, int scale, MathContext mc) {
5407        long product = multiply(x, y);
5408        if(product!=INFLATED) {
5409            return doRound(product, scale, mc);
5410        }
5411        // attempt to do it in 128 bits
5412        int rsign = 1;
5413        if(x < 0) {
5414            x = -x;
5415            rsign = -1;
5416        }
5417        if(y < 0) {
5418            y = -y;
5419            rsign *= -1;
5420        }
5421        // multiply dividend0 * dividend1
5422        long m0_hi = x >>> 32;
5423        long m0_lo = x & LONG_MASK;
5424        long m1_hi = y >>> 32;
5425        long m1_lo = y & LONG_MASK;
5426        product = m0_lo * m1_lo;
5427        long m0 = product & LONG_MASK;
5428        long m1 = product >>> 32;
5429        product = m0_hi * m1_lo + m1;
5430        m1 = product & LONG_MASK;
5431        long m2 = product >>> 32;
5432        product = m0_lo * m1_hi + m1;
5433        m1 = product & LONG_MASK;
5434        m2 += product >>> 32;
5435        long m3 = m2>>>32;
5436        m2 &= LONG_MASK;
5437        product = m0_hi*m1_hi + m2;
5438        m2 = product & LONG_MASK;
5439        m3 = ((product>>>32) + m3) & LONG_MASK;
5440        final long mHi = make64(m3,m2);
5441        final long mLo = make64(m1,m0);
5442        BigDecimal res = doRound128(mHi, mLo, rsign, scale, mc);
5443        if(res!=null) {
5444            return res;
5445        }
5446        res = new BigDecimal(BigInteger.valueOf(x).multiply(y*rsign), INFLATED, scale, 0);
5447        return doRound(res,mc);
5448    }
5449
5450    private static BigDecimal multiplyAndRound(long x, BigInteger y, int scale, MathContext mc) {
5451        if(x==0) {
5452            return zeroValueOf(scale);
5453        }
5454        return doRound(y.multiply(x), scale, mc);
5455    }
5456
5457    private static BigDecimal multiplyAndRound(BigInteger x, BigInteger y, int scale, MathContext mc) {
5458        return doRound(x.multiply(y), scale, mc);
5459    }
5460
5461    /**
5462     * rounds 128-bit value according {@code MathContext}
5463     * returns null if result can't be repsented as compact BigDecimal.
5464     */
5465    private static BigDecimal doRound128(long hi, long lo, int sign, int scale, MathContext mc) {
5466        int mcp = mc.precision;
5467        int drop;
5468        BigDecimal res = null;
5469        if(((drop = precision(hi, lo) - mcp) > 0)&&(drop<LONG_TEN_POWERS_TABLE.length)) {
5470            scale = checkScaleNonZero((long)scale - drop);
5471            res = divideAndRound128(hi, lo, LONG_TEN_POWERS_TABLE[drop], sign, scale, mc.roundingMode.oldMode, scale);
5472        }
5473        if(res!=null) {
5474            return doRound(res,mc);
5475        }
5476        return null;
5477    }
5478
5479    private static final long[][] LONGLONG_TEN_POWERS_TABLE = {
5480        {   0L, 0x8AC7230489E80000L },  //10^19
5481        {       0x5L, 0x6bc75e2d63100000L },  //10^20
5482        {       0x36L, 0x35c9adc5dea00000L },  //10^21
5483        {       0x21eL, 0x19e0c9bab2400000L  },  //10^22
5484        {       0x152dL, 0x02c7e14af6800000L  },  //10^23
5485        {       0xd3c2L, 0x1bcecceda1000000L  },  //10^24
5486        {       0x84595L, 0x161401484a000000L  },  //10^25
5487        {       0x52b7d2L, 0xdcc80cd2e4000000L  },  //10^26
5488        {       0x33b2e3cL, 0x9fd0803ce8000000L  },  //10^27
5489        {       0x204fce5eL, 0x3e25026110000000L  },  //10^28
5490        {       0x1431e0faeL, 0x6d7217caa0000000L  },  //10^29
5491        {       0xc9f2c9cd0L, 0x4674edea40000000L  },  //10^30
5492        {       0x7e37be2022L, 0xc0914b2680000000L  },  //10^31
5493        {       0x4ee2d6d415bL, 0x85acef8100000000L  },  //10^32
5494        {       0x314dc6448d93L, 0x38c15b0a00000000L  },  //10^33
5495        {       0x1ed09bead87c0L, 0x378d8e6400000000L  },  //10^34
5496        {       0x13426172c74d82L, 0x2b878fe800000000L  },  //10^35
5497        {       0xc097ce7bc90715L, 0xb34b9f1000000000L  },  //10^36
5498        {       0x785ee10d5da46d9L, 0x00f436a000000000L  },  //10^37
5499        {       0x4b3b4ca85a86c47aL, 0x098a224000000000L  },  //10^38
5500    };
5501
5502    /*
5503     * returns precision of 128-bit value
5504     */
5505    private static int precision(long hi, long lo){
5506        if(hi==0) {
5507            if(lo>=0) {
5508                return longDigitLength(lo);
5509            }
5510            return (unsignedLongCompareEq(lo, LONGLONG_TEN_POWERS_TABLE[0][1])) ? 20 : 19;
5511            // 0x8AC7230489E80000L  = unsigned 2^19
5512        }
5513        int r = ((128 - Long.numberOfLeadingZeros(hi) + 1) * 1233) >>> 12;
5514        int idx = r-19;
5515        return (idx >= LONGLONG_TEN_POWERS_TABLE.length || longLongCompareMagnitude(hi, lo,
5516                                                                                    LONGLONG_TEN_POWERS_TABLE[idx][0], LONGLONG_TEN_POWERS_TABLE[idx][1])) ? r : r + 1;
5517    }
5518
5519    /*
5520     * returns true if 128 bit number <hi0,lo0> is less than <hi1,lo1>
5521     * hi0 & hi1 should be non-negative
5522     */
5523    private static boolean longLongCompareMagnitude(long hi0, long lo0, long hi1, long lo1) {
5524        if(hi0!=hi1) {
5525            return hi0<hi1;
5526        }
5527        return (lo0+Long.MIN_VALUE) <(lo1+Long.MIN_VALUE);
5528    }
5529
5530    private static BigDecimal divide(long dividend, int dividendScale, long divisor, int divisorScale, int scale, int roundingMode) {
5531        if (checkScale(dividend,(long)scale + divisorScale) > dividendScale) {
5532            int newScale = scale + divisorScale;
5533            int raise = newScale - dividendScale;
5534            if(raise<LONG_TEN_POWERS_TABLE.length) {
5535                long xs = dividend;
5536                if ((xs = longMultiplyPowerTen(xs, raise)) != INFLATED) {
5537                    return divideAndRound(xs, divisor, scale, roundingMode, scale);
5538                }
5539                BigDecimal q = multiplyDivideAndRound(LONG_TEN_POWERS_TABLE[raise], dividend, divisor, scale, roundingMode, scale);
5540                if(q!=null) {
5541                    return q;
5542                }
5543            }
5544            BigInteger scaledDividend = bigMultiplyPowerTen(dividend, raise);
5545            return divideAndRound(scaledDividend, divisor, scale, roundingMode, scale);
5546        } else {
5547            int newScale = checkScale(divisor,(long)dividendScale - scale);
5548            int raise = newScale - divisorScale;
5549            if(raise<LONG_TEN_POWERS_TABLE.length) {
5550                long ys = divisor;
5551                if ((ys = longMultiplyPowerTen(ys, raise)) != INFLATED) {
5552                    return divideAndRound(dividend, ys, scale, roundingMode, scale);
5553                }
5554            }
5555            BigInteger scaledDivisor = bigMultiplyPowerTen(divisor, raise);
5556            return divideAndRound(BigInteger.valueOf(dividend), scaledDivisor, scale, roundingMode, scale);
5557        }
5558    }
5559
5560    private static BigDecimal divide(BigInteger dividend, int dividendScale, long divisor, int divisorScale, int scale, int roundingMode) {
5561        if (checkScale(dividend,(long)scale + divisorScale) > dividendScale) {
5562            int newScale = scale + divisorScale;
5563            int raise = newScale - dividendScale;
5564            BigInteger scaledDividend = bigMultiplyPowerTen(dividend, raise);
5565            return divideAndRound(scaledDividend, divisor, scale, roundingMode, scale);
5566        } else {
5567            int newScale = checkScale(divisor,(long)dividendScale - scale);
5568            int raise = newScale - divisorScale;
5569            if(raise<LONG_TEN_POWERS_TABLE.length) {
5570                long ys = divisor;
5571                if ((ys = longMultiplyPowerTen(ys, raise)) != INFLATED) {
5572                    return divideAndRound(dividend, ys, scale, roundingMode, scale);
5573                }
5574            }
5575            BigInteger scaledDivisor = bigMultiplyPowerTen(divisor, raise);
5576            return divideAndRound(dividend, scaledDivisor, scale, roundingMode, scale);
5577        }
5578    }
5579
5580    private static BigDecimal divide(long dividend, int dividendScale, BigInteger divisor, int divisorScale, int scale, int roundingMode) {
5581        if (checkScale(dividend,(long)scale + divisorScale) > dividendScale) {
5582            int newScale = scale + divisorScale;
5583            int raise = newScale - dividendScale;
5584            BigInteger scaledDividend = bigMultiplyPowerTen(dividend, raise);
5585            return divideAndRound(scaledDividend, divisor, scale, roundingMode, scale);
5586        } else {
5587            int newScale = checkScale(divisor,(long)dividendScale - scale);
5588            int raise = newScale - divisorScale;
5589            BigInteger scaledDivisor = bigMultiplyPowerTen(divisor, raise);
5590            return divideAndRound(BigInteger.valueOf(dividend), scaledDivisor, scale, roundingMode, scale);
5591        }
5592    }
5593
5594    private static BigDecimal divide(BigInteger dividend, int dividendScale, BigInteger divisor, int divisorScale, int scale, int roundingMode) {
5595        if (checkScale(dividend,(long)scale + divisorScale) > dividendScale) {
5596            int newScale = scale + divisorScale;
5597            int raise = newScale - dividendScale;
5598            BigInteger scaledDividend = bigMultiplyPowerTen(dividend, raise);
5599            return divideAndRound(scaledDividend, divisor, scale, roundingMode, scale);
5600        } else {
5601            int newScale = checkScale(divisor,(long)dividendScale - scale);
5602            int raise = newScale - divisorScale;
5603            BigInteger scaledDivisor = bigMultiplyPowerTen(divisor, raise);
5604            return divideAndRound(dividend, scaledDivisor, scale, roundingMode, scale);
5605        }
5606    }
5607
5608}
5609