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