Home | History | Annotate | Download | only in math
      1 /*
      2  *  Licensed to the Apache Software Foundation (ASF) under one or more
      3  *  contributor license agreements.  See the NOTICE file distributed with
      4  *  this work for additional information regarding copyright ownership.
      5  *  The ASF licenses this file to You under the Apache License, Version 2.0
      6  *  (the "License"); you may not use this file except in compliance with
      7  *  the License.  You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  */
     17 
     18 package java.math;
     19 
     20 import java.io.IOException;
     21 import java.io.ObjectInputStream;
     22 import java.io.ObjectOutputStream;
     23 import java.io.Serializable;
     24 import java.util.Arrays;
     25 import libcore.math.MathUtils;
     26 
     27 /**
     28  * This class represents immutable integer numbers of arbitrary length. Large
     29  * numbers are typically used in security applications and therefore BigIntegers
     30  * offer dedicated functionality like the generation of large prime numbers or
     31  * the computation of modular inverse.
     32  * <p>
     33  * Since the class was modeled to offer all the functionality as the {@link Integer}
     34  * class does, it provides even methods that operate bitwise on a two's
     35  * complement representation of large integers. Note however that the
     36  * implementations favors an internal representation where magnitude and sign
     37  * are treated separately. Hence such operations are inefficient and should be
     38  * discouraged. In simple words: Do NOT implement any bit fields based on
     39  * BigInteger.
     40  */
     41 public class BigDecimal extends Number implements Comparable<BigDecimal>, Serializable {
     42 
     43     /**
     44      * Rounding mode where positive values are rounded towards positive infinity
     45      * and negative values towards negative infinity.
     46      *
     47      * @see RoundingMode#UP
     48      */
     49     public static final int ROUND_UP = 0;
     50 
     51     /**
     52      * Rounding mode where the values are rounded towards zero.
     53      *
     54      * @see RoundingMode#DOWN
     55      */
     56     public static final int ROUND_DOWN = 1;
     57 
     58     /**
     59      * Rounding mode to round towards positive infinity. For positive values
     60      * this rounding mode behaves as {@link #ROUND_UP}, for negative values as
     61      * {@link #ROUND_DOWN}.
     62      *
     63      * @see RoundingMode#CEILING
     64      */
     65     public static final int ROUND_CEILING = 2;
     66 
     67     /**
     68      * Rounding mode to round towards negative infinity. For positive values
     69      * this rounding mode behaves as {@link #ROUND_DOWN}, for negative values as
     70      * {@link #ROUND_UP}.
     71      *
     72      * @see RoundingMode#FLOOR
     73      */
     74     public static final int ROUND_FLOOR = 3;
     75 
     76     /**
     77      * Rounding mode where values are rounded towards the nearest neighbor.
     78      * Ties are broken by rounding up.
     79      *
     80      * @see RoundingMode#HALF_UP
     81      */
     82     public static final int ROUND_HALF_UP = 4;
     83 
     84     /**
     85      * Rounding mode where values are rounded towards the nearest neighbor.
     86      * Ties are broken by rounding down.
     87      *
     88      * @see RoundingMode#HALF_DOWN
     89      */
     90     public static final int ROUND_HALF_DOWN = 5;
     91 
     92     /**
     93      * Rounding mode where values are rounded towards the nearest neighbor.
     94      * Ties are broken by rounding to the even neighbor.
     95      *
     96      * @see RoundingMode#HALF_EVEN
     97      */
     98     public static final int ROUND_HALF_EVEN = 6;
     99 
    100     /**
    101      * Rounding mode where the rounding operations throws an {@code
    102      * ArithmeticException} for the case that rounding is necessary, i.e. for
    103      * the case that the value cannot be represented exactly.
    104      *
    105      * @see RoundingMode#UNNECESSARY
    106      */
    107     public static final int ROUND_UNNECESSARY = 7;
    108 
    109     /** This is the serialVersionUID used by the sun implementation. */
    110     private static final long serialVersionUID = 6108874887143696463L;
    111 
    112     /** The double closest to {@code Log10(2)}. */
    113     private static final double LOG10_2 = 0.3010299956639812;
    114 
    115     /** The <code>String</code> representation is cached. */
    116     private transient String toStringImage = null;
    117 
    118     /** Cache for the hash code. */
    119     private transient int hashCode = 0;
    120 
    121     /**
    122      * An array with powers of five that fit in the type <code>long</code>
    123      * (<code>5^0,5^1,...,5^27</code>).
    124      */
    125     private static final BigInteger[] FIVE_POW;
    126 
    127     /**
    128      * An array with powers of ten that fit in the type <code>long</code>
    129      * (<code>10^0,10^1,...,10^18</code>).
    130      */
    131     private static final BigInteger[] TEN_POW;
    132 
    133     private static final long[] LONG_FIVE_POW = new long[]
    134     {   1L,
    135         5L,
    136         25L,
    137         125L,
    138         625L,
    139         3125L,
    140         15625L,
    141         78125L,
    142         390625L,
    143         1953125L,
    144         9765625L,
    145         48828125L,
    146         244140625L,
    147         1220703125L,
    148         6103515625L,
    149         30517578125L,
    150         152587890625L,
    151         762939453125L,
    152         3814697265625L,
    153         19073486328125L,
    154         95367431640625L,
    155         476837158203125L,
    156         2384185791015625L,
    157         11920928955078125L,
    158         59604644775390625L,
    159         298023223876953125L,
    160         1490116119384765625L,
    161         7450580596923828125L, };
    162 
    163     private static final int[] LONG_FIVE_POW_BIT_LENGTH = new int[LONG_FIVE_POW.length];
    164     private static final int[] LONG_POWERS_OF_TEN_BIT_LENGTH = new int[MathUtils.LONG_POWERS_OF_TEN.length];
    165 
    166     private static final int BI_SCALED_BY_ZERO_LENGTH = 11;
    167 
    168     /**
    169      * An array with the first <code>BigInteger</code> scaled by zero.
    170      * (<code>[0,0],[1,0],...,[10,0]</code>).
    171      */
    172     private static final BigDecimal[] BI_SCALED_BY_ZERO = new BigDecimal[BI_SCALED_BY_ZERO_LENGTH];
    173 
    174     /**
    175      * An array with the zero number scaled by the first positive scales.
    176      * (<code>0*10^0, 0*10^1, ..., 0*10^10</code>).
    177      */
    178     private static final BigDecimal[] ZERO_SCALED_BY = new BigDecimal[11];
    179 
    180     /** An array filled with characters <code>'0'</code>. */
    181     private static final char[] CH_ZEROS = new char[100];
    182 
    183     static {
    184         Arrays.fill(CH_ZEROS, '0');
    185 
    186         for (int i = 0; i < ZERO_SCALED_BY.length; ++i) {
    187             BI_SCALED_BY_ZERO[i] = new BigDecimal(i, 0);
    188             ZERO_SCALED_BY[i] = new BigDecimal(0, i);
    189         }
    190         for (int i = 0; i < LONG_FIVE_POW_BIT_LENGTH.length; ++i) {
    191             LONG_FIVE_POW_BIT_LENGTH[i] = bitLength(LONG_FIVE_POW[i]);
    192         }
    193         for (int i = 0; i < LONG_POWERS_OF_TEN_BIT_LENGTH.length; ++i) {
    194             LONG_POWERS_OF_TEN_BIT_LENGTH[i] = bitLength(MathUtils.LONG_POWERS_OF_TEN[i]);
    195         }
    196 
    197         // Taking the references of useful powers.
    198         TEN_POW = Multiplication.bigTenPows;
    199         FIVE_POW = Multiplication.bigFivePows;
    200     }
    201 
    202     /**
    203      * The constant zero as a {@code BigDecimal}.
    204      */
    205     public static final BigDecimal ZERO = new BigDecimal(0, 0);
    206 
    207     /**
    208      * The constant one as a {@code BigDecimal}.
    209      */
    210     public static final BigDecimal ONE = new BigDecimal(1, 0);
    211 
    212     /**
    213      * The constant ten as a {@code BigDecimal}.
    214      */
    215     public static final BigDecimal TEN = new BigDecimal(10, 0);
    216 
    217     /**
    218      * The arbitrary precision integer (unscaled value) in the internal
    219      * representation of {@code BigDecimal}.
    220      */
    221     private BigInteger intVal;
    222 
    223     private transient int bitLength;
    224 
    225     private transient long smallValue;
    226 
    227     /**
    228      * The 32-bit integer scale in the internal representation of {@code BigDecimal}.
    229      */
    230     private int scale;
    231 
    232     /**
    233      * Represent the number of decimal digits in the unscaled value. This
    234      * precision is calculated the first time, and used in the following calls
    235      * of method <code>precision()</code>. Note that some call to the private
    236      * method <code>inplaceRound()</code> could update this field.
    237      *
    238      * @see #precision()
    239      * @see #inplaceRound(MathContext)
    240      */
    241     private transient int precision = 0;
    242 
    243     private BigDecimal(long smallValue, int scale){
    244         this.smallValue = smallValue;
    245         this.scale = scale;
    246         this.bitLength = bitLength(smallValue);
    247     }
    248 
    249     private BigDecimal(int smallValue, int scale){
    250         this.smallValue = smallValue;
    251         this.scale = scale;
    252         this.bitLength = bitLength(smallValue);
    253     }
    254 
    255     /**
    256      * Constructs a new {@code BigDecimal} instance from a string representation
    257      * given as a character array.
    258      *
    259      * @param in
    260      *            array of characters containing the string representation of
    261      *            this {@code BigDecimal}.
    262      * @param offset
    263      *            first index to be copied.
    264      * @param len
    265      *            number of characters to be used.
    266      * @throws NumberFormatException
    267      *             if {@code offset < 0 || len <= 0 || offset+len-1 < 0 ||
    268      *             offset+len-1 >= in.length}, or if {@code in} does not
    269      *             contain a valid string representation of a big decimal.
    270      */
    271     public BigDecimal(char[] in, int offset, int len) {
    272         int begin = offset; // first index to be copied
    273         int last = offset + (len - 1); // last index to be copied
    274         String scaleString; // buffer for scale
    275         StringBuilder unscaledBuffer; // buffer for unscaled value
    276         long newScale; // the new scale
    277 
    278         if (in == null) {
    279             throw new NullPointerException();
    280         }
    281         if ((last >= in.length) || (offset < 0) || (len <= 0) || (last < 0)) {
    282             throw new NumberFormatException("Bad offset/length: offset=" + offset +
    283                     " len=" + len + " in.length=" + in.length);
    284         }
    285         unscaledBuffer = new StringBuilder(len);
    286         int bufLength = 0;
    287         // To skip a possible '+' symbol
    288         if ((offset <= last) && (in[offset] == '+')) {
    289             offset++;
    290             begin++;
    291         }
    292         int counter = 0;
    293         boolean wasNonZero = false;
    294         // Accumulating all digits until a possible decimal point
    295         for (; (offset <= last) && (in[offset] != '.') && (in[offset] != 'e') && (in[offset] != 'E'); offset++) {
    296             if (!wasNonZero) {
    297                 if (in[offset] == '0') {
    298                     counter++;
    299                 } else {
    300                     wasNonZero = true;
    301                 }
    302             }
    303 
    304         }
    305         unscaledBuffer.append(in, begin, offset - begin);
    306         bufLength += offset - begin;
    307         // A decimal point was found
    308         if ((offset <= last) && (in[offset] == '.')) {
    309             offset++;
    310             // Accumulating all digits until a possible exponent
    311             begin = offset;
    312             for (; (offset <= last) && (in[offset] != 'e')
    313             && (in[offset] != 'E'); offset++) {
    314                 if (!wasNonZero) {
    315                     if (in[offset] == '0') {
    316                         counter++;
    317                     } else {
    318                         wasNonZero = true;
    319                     }
    320                 }
    321             }
    322             scale = offset - begin;
    323             bufLength +=scale;
    324             unscaledBuffer.append(in, begin, scale);
    325         } else {
    326             scale = 0;
    327         }
    328         // An exponent was found
    329         if ((offset <= last) && ((in[offset] == 'e') || (in[offset] == 'E'))) {
    330             offset++;
    331             // Checking for a possible sign of scale
    332             begin = offset;
    333             if ((offset <= last) && (in[offset] == '+')) {
    334                 offset++;
    335                 if ((offset <= last) && (in[offset] != '-')) {
    336                     begin++;
    337                 }
    338             }
    339             // Accumulating all remaining digits
    340             scaleString = String.valueOf(in, begin, last + 1 - begin);
    341             // Checking if the scale is defined
    342             newScale = (long)scale - Integer.parseInt(scaleString);
    343             scale = (int)newScale;
    344             if (newScale != scale) {
    345                 throw new NumberFormatException("Scale out of range");
    346             }
    347         }
    348         // Parsing the unscaled value
    349         if (bufLength < 19) {
    350             smallValue = Long.parseLong(unscaledBuffer.toString());
    351             bitLength = bitLength(smallValue);
    352         } else {
    353             setUnscaledValue(new BigInteger(unscaledBuffer.toString()));
    354         }
    355         precision = unscaledBuffer.length() - counter;
    356         if (unscaledBuffer.charAt(0) == '-') {
    357             precision --;
    358         }
    359     }
    360 
    361     /**
    362      * Constructs a new {@code BigDecimal} instance from a string representation
    363      * given as a character array.
    364      *
    365      * @param in
    366      *            array of characters containing the string representation of
    367      *            this {@code BigDecimal}.
    368      * @param offset
    369      *            first index to be copied.
    370      * @param len
    371      *            number of characters to be used.
    372      * @param mc
    373      *            rounding mode and precision for the result of this operation.
    374      * @throws NumberFormatException
    375      *             if {@code offset < 0 || len <= 0 || offset+len-1 < 0 ||
    376      *             offset+len-1 >= in.length}, or if {@code in} does not
    377      *             contain a valid string representation of a big decimal.
    378      * @throws ArithmeticException
    379      *             if {@code mc.precision > 0} and {@code mc.roundingMode ==
    380      *             UNNECESSARY} and the new big decimal cannot be represented
    381      *             within the given precision without rounding.
    382      */
    383     public BigDecimal(char[] in, int offset, int len, MathContext mc) {
    384         this(in, offset, len);
    385         inplaceRound(mc);
    386     }
    387 
    388     /**
    389      * Constructs a new {@code BigDecimal} instance from a string representation
    390      * given as a character array.
    391      *
    392      * @param in
    393      *            array of characters containing the string representation of
    394      *            this {@code BigDecimal}.
    395      * @throws NumberFormatException
    396      *             if {@code in} does not contain a valid string representation
    397      *             of a big decimal.
    398      */
    399     public BigDecimal(char[] in) {
    400         this(in, 0, in.length);
    401     }
    402 
    403     /**
    404      * Constructs a new {@code BigDecimal} instance from a string representation
    405      * given as a character array. The result is rounded according to the
    406      * specified math context.
    407      *
    408      * @param in
    409      *            array of characters containing the string representation of
    410      *            this {@code BigDecimal}.
    411      * @param mc
    412      *            rounding mode and precision for the result of this operation.
    413      * @throws NumberFormatException
    414      *             if {@code in} does not contain a valid string representation
    415      *             of a big decimal.
    416      * @throws ArithmeticException
    417      *             if {@code mc.precision > 0} and {@code mc.roundingMode ==
    418      *             UNNECESSARY} and the new big decimal cannot be represented
    419      *             within the given precision without rounding.
    420      */
    421     public BigDecimal(char[] in, MathContext mc) {
    422         this(in, 0, in.length);
    423         inplaceRound(mc);
    424     }
    425 
    426     /**
    427      * Constructs a new {@code BigDecimal} instance from a string
    428      * representation.
    429      *
    430      * @param val
    431      *            string containing the string representation of this {@code
    432      *            BigDecimal}.
    433      * @throws NumberFormatException
    434      *             if {@code val} does not contain a valid string representation
    435      *             of a big decimal.
    436      */
    437     public BigDecimal(String val) {
    438         this(val.toCharArray(), 0, val.length());
    439     }
    440 
    441     /**
    442      * Constructs a new {@code BigDecimal} instance from a string
    443      * representation. The result is rounded according to the specified math
    444      * context.
    445      *
    446      * @param val
    447      *            string containing the string representation of this {@code
    448      *            BigDecimal}.
    449      * @param mc
    450      *            rounding mode and precision for the result of this operation.
    451      * @throws NumberFormatException
    452      *             if {@code val} does not contain a valid string representation
    453      *             of a big decimal.
    454      * @throws ArithmeticException
    455      *             if {@code mc.precision > 0} and {@code mc.roundingMode ==
    456      *             UNNECESSARY} and the new big decimal cannot be represented
    457      *             within the given precision without rounding.
    458      */
    459     public BigDecimal(String val, MathContext mc) {
    460         this(val.toCharArray(), 0, val.length());
    461         inplaceRound(mc);
    462     }
    463 
    464     /**
    465      * Constructs a new {@code BigDecimal} instance from the 64bit double
    466      * {@code val}. The constructed big decimal is equivalent to the given
    467      * double. For example, {@code new BigDecimal(0.1)} is equal to {@code
    468      * 0.1000000000000000055511151231257827021181583404541015625}. This happens
    469      * as {@code 0.1} cannot be represented exactly in binary.
    470      * <p>
    471      * To generate a big decimal instance which is equivalent to {@code 0.1} use
    472      * the {@code BigDecimal(String)} constructor.
    473      *
    474      * @param val
    475      *            double value to be converted to a {@code BigDecimal} instance.
    476      * @throws NumberFormatException
    477      *             if {@code val} is infinity or not a number.
    478      */
    479     public BigDecimal(double val) {
    480         if (Double.isInfinite(val) || Double.isNaN(val)) {
    481             throw new NumberFormatException("Infinity or NaN: " + val);
    482         }
    483         long bits = Double.doubleToLongBits(val); // IEEE-754
    484         long mantissa;
    485         int trailingZeros;
    486         // Extracting the exponent, note that the bias is 1023
    487         scale = 1075 - (int)((bits >> 52) & 0x7FFL);
    488         // Extracting the 52 bits of the mantissa.
    489         mantissa = (scale == 1075) ? (bits & 0xFFFFFFFFFFFFFL) << 1
    490                 : (bits & 0xFFFFFFFFFFFFFL) | 0x10000000000000L;
    491         if (mantissa == 0) {
    492             scale = 0;
    493             precision = 1;
    494         }
    495         // To simplify all factors '2' in the mantissa
    496         if (scale > 0) {
    497             trailingZeros = Math.min(scale, Long.numberOfTrailingZeros(mantissa));
    498             mantissa >>>= trailingZeros;
    499             scale -= trailingZeros;
    500         }
    501         // Calculating the new unscaled value and the new scale
    502         if((bits >> 63) != 0) {
    503             mantissa = -mantissa;
    504         }
    505         int mantissaBits = bitLength(mantissa);
    506         if (scale < 0) {
    507             bitLength = mantissaBits == 0 ? 0 : mantissaBits - scale;
    508             if(bitLength < 64) {
    509                 smallValue = mantissa << (-scale);
    510             } else {
    511                 BigInt bi = new BigInt();
    512                 bi.putLongInt(mantissa);
    513                 bi.shift(-scale);
    514                 intVal = new BigInteger(bi);
    515             }
    516             scale = 0;
    517         } else if (scale > 0) {
    518             // m * 2^e =  (m * 5^(-e)) * 10^e
    519             if(scale < LONG_FIVE_POW.length
    520                     && mantissaBits+LONG_FIVE_POW_BIT_LENGTH[scale] < 64) {
    521                 smallValue = mantissa * LONG_FIVE_POW[scale];
    522                 bitLength = bitLength(smallValue);
    523             } else {
    524                 setUnscaledValue(Multiplication.multiplyByFivePow(BigInteger.valueOf(mantissa), scale));
    525             }
    526         } else { // scale == 0
    527             smallValue = mantissa;
    528             bitLength = mantissaBits;
    529         }
    530     }
    531 
    532     /**
    533      * Constructs a new {@code BigDecimal} instance from the 64bit double
    534      * {@code val}. The constructed big decimal is equivalent to the given
    535      * double. For example, {@code new BigDecimal(0.1)} is equal to {@code
    536      * 0.1000000000000000055511151231257827021181583404541015625}. This happens
    537      * as {@code 0.1} cannot be represented exactly in binary.
    538      * <p>
    539      * To generate a big decimal instance which is equivalent to {@code 0.1} use
    540      * the {@code BigDecimal(String)} constructor.
    541      *
    542      * @param val
    543      *            double value to be converted to a {@code BigDecimal} instance.
    544      * @param mc
    545      *            rounding mode and precision for the result of this operation.
    546      * @throws NumberFormatException
    547      *             if {@code val} is infinity or not a number.
    548      * @throws ArithmeticException
    549      *             if {@code mc.precision > 0} and {@code mc.roundingMode ==
    550      *             UNNECESSARY} and the new big decimal cannot be represented
    551      *             within the given precision without rounding.
    552      */
    553     public BigDecimal(double val, MathContext mc) {
    554         this(val);
    555         inplaceRound(mc);
    556     }
    557 
    558     /**
    559      * Constructs a new {@code BigDecimal} instance from the given big integer
    560      * {@code val}. The scale of the result is {@code 0}.
    561      *
    562      * @param val
    563      *            {@code BigInteger} value to be converted to a {@code
    564      *            BigDecimal} instance.
    565      */
    566     public BigDecimal(BigInteger val) {
    567         this(val, 0);
    568     }
    569 
    570     /**
    571      * Constructs a new {@code BigDecimal} instance from the given big integer
    572      * {@code val}. The scale of the result is {@code 0}.
    573      *
    574      * @param val
    575      *            {@code BigInteger} value to be converted to a {@code
    576      *            BigDecimal} instance.
    577      * @param mc
    578      *            rounding mode and precision for the result of this operation.
    579      * @throws ArithmeticException
    580      *             if {@code mc.precision > 0} and {@code mc.roundingMode ==
    581      *             UNNECESSARY} and the new big decimal cannot be represented
    582      *             within the given precision without rounding.
    583      */
    584     public BigDecimal(BigInteger val, MathContext mc) {
    585         this(val);
    586         inplaceRound(mc);
    587     }
    588 
    589     /**
    590      * Constructs a new {@code BigDecimal} instance from a given unscaled value
    591      * {@code unscaledVal} and a given scale. The value of this instance is
    592      * {@code unscaledVal} 10^(-{@code scale}).
    593      *
    594      * @param unscaledVal
    595      *            {@code BigInteger} representing the unscaled value of this
    596      *            {@code BigDecimal} instance.
    597      * @param scale
    598      *            scale of this {@code BigDecimal} instance.
    599      * @throws NullPointerException
    600      *             if {@code unscaledVal == null}.
    601      */
    602     public BigDecimal(BigInteger unscaledVal, int scale) {
    603         if (unscaledVal == null) {
    604             throw new NullPointerException();
    605         }
    606         this.scale = scale;
    607         setUnscaledValue(unscaledVal);
    608     }
    609 
    610     /**
    611      * Constructs a new {@code BigDecimal} instance from a given unscaled value
    612      * {@code unscaledVal} and a given scale. The value of this instance is
    613      * {@code unscaledVal} 10^(-{@code scale}). The result is rounded according
    614      * to the specified math context.
    615      *
    616      * @param unscaledVal
    617      *            {@code BigInteger} representing the unscaled value of this
    618      *            {@code BigDecimal} instance.
    619      * @param scale
    620      *            scale of this {@code BigDecimal} instance.
    621      * @param mc
    622      *            rounding mode and precision for the result of this operation.
    623      * @throws ArithmeticException
    624      *             if {@code mc.precision > 0} and {@code mc.roundingMode ==
    625      *             UNNECESSARY} and the new big decimal cannot be represented
    626      *             within the given precision without rounding.
    627      * @throws NullPointerException
    628      *             if {@code unscaledVal == null}.
    629      */
    630     public BigDecimal(BigInteger unscaledVal, int scale, MathContext mc) {
    631         this(unscaledVal, scale);
    632         inplaceRound(mc);
    633     }
    634 
    635     /**
    636      * Constructs a new {@code BigDecimal} instance from the given int
    637      * {@code val}. The scale of the result is 0.
    638      *
    639      * @param val
    640      *            int value to be converted to a {@code BigDecimal} instance.
    641      */
    642     public BigDecimal(int val) {
    643         this(val,0);
    644     }
    645 
    646     /**
    647      * Constructs a new {@code BigDecimal} instance from the given int {@code
    648      * val}. The scale of the result is {@code 0}. The result is rounded
    649      * according to the specified math context.
    650      *
    651      * @param val
    652      *            int value to be converted to a {@code BigDecimal} instance.
    653      * @param mc
    654      *            rounding mode and precision for the result of this operation.
    655      * @throws ArithmeticException
    656      *             if {@code mc.precision > 0} and {@code c.roundingMode ==
    657      *             UNNECESSARY} and the new big decimal cannot be represented
    658      *             within the given precision without rounding.
    659      */
    660     public BigDecimal(int val, MathContext mc) {
    661         this(val,0);
    662         inplaceRound(mc);
    663     }
    664 
    665     /**
    666      * Constructs a new {@code BigDecimal} instance from the given long {@code
    667      * val}. The scale of the result is {@code 0}.
    668      *
    669      * @param val
    670      *            long value to be converted to a {@code BigDecimal} instance.
    671      */
    672     public BigDecimal(long val) {
    673         this(val,0);
    674     }
    675 
    676     /**
    677      * Constructs a new {@code BigDecimal} instance from the given long {@code
    678      * val}. The scale of the result is {@code 0}. The result is rounded
    679      * according to the specified math context.
    680      *
    681      * @param val
    682      *            long value to be converted to a {@code BigDecimal} instance.
    683      * @param mc
    684      *            rounding mode and precision for the result of this operation.
    685      * @throws ArithmeticException
    686      *             if {@code mc.precision > 0} and {@code mc.roundingMode ==
    687      *             UNNECESSARY} and the new big decimal cannot be represented
    688      *             within the given precision without rounding.
    689      */
    690     public BigDecimal(long val, MathContext mc) {
    691         this(val);
    692         inplaceRound(mc);
    693     }
    694 
    695     /* Public Methods */
    696 
    697     /**
    698      * Returns a new {@code BigDecimal} instance whose value is equal to {@code
    699      * unscaledVal} 10^(-{@code scale}). The scale of the result is {@code
    700      * scale}, and its unscaled value is {@code unscaledVal}.
    701      *
    702      * @param unscaledVal
    703      *            unscaled value to be used to construct the new {@code
    704      *            BigDecimal}.
    705      * @param scale
    706      *            scale to be used to construct the new {@code BigDecimal}.
    707      * @return {@code BigDecimal} instance with the value {@code unscaledVal}*
    708      *         10^(-{@code unscaledVal}).
    709      */
    710     public static BigDecimal valueOf(long unscaledVal, int scale) {
    711         if (scale == 0) {
    712             return valueOf(unscaledVal);
    713         }
    714         if ((unscaledVal == 0) && (scale >= 0)
    715                 && (scale < ZERO_SCALED_BY.length)) {
    716             return ZERO_SCALED_BY[scale];
    717         }
    718         return new BigDecimal(unscaledVal, scale);
    719     }
    720 
    721     /**
    722      * Returns a new {@code BigDecimal} instance whose value is equal to {@code
    723      * unscaledVal}. The scale of the result is {@code 0}, and its unscaled
    724      * value is {@code unscaledVal}.
    725      *
    726      * @param unscaledVal
    727      *            value to be converted to a {@code BigDecimal}.
    728      * @return {@code BigDecimal} instance with the value {@code unscaledVal}.
    729      */
    730     public static BigDecimal valueOf(long unscaledVal) {
    731         if ((unscaledVal >= 0) && (unscaledVal < BI_SCALED_BY_ZERO_LENGTH)) {
    732             return BI_SCALED_BY_ZERO[(int)unscaledVal];
    733         }
    734         return new BigDecimal(unscaledVal,0);
    735     }
    736 
    737     /**
    738      * Returns a new {@code BigDecimal} instance whose value is equal to {@code
    739      * val}. The new decimal is constructed as if the {@code BigDecimal(String)}
    740      * constructor is called with an argument which is equal to {@code
    741      * Double.toString(val)}. For example, {@code valueOf("0.1")} is converted to
    742      * (unscaled=1, scale=1), although the double {@code 0.1} cannot be
    743      * represented exactly as a double value. In contrast to that, a new {@code
    744      * BigDecimal(0.1)} instance has the value {@code
    745      * 0.1000000000000000055511151231257827021181583404541015625} with an
    746      * unscaled value {@code 1000000000000000055511151231257827021181583404541015625}
    747      * and the scale {@code 55}.
    748      *
    749      * @param val
    750      *            double value to be converted to a {@code BigDecimal}.
    751      * @return {@code BigDecimal} instance with the value {@code val}.
    752      * @throws NumberFormatException
    753      *             if {@code val} is infinite or {@code val} is not a number
    754      */
    755     public static BigDecimal valueOf(double val) {
    756         if (Double.isInfinite(val) || Double.isNaN(val)) {
    757             throw new NumberFormatException("Infinity or NaN: " + val);
    758         }
    759         return new BigDecimal(Double.toString(val));
    760     }
    761 
    762     /**
    763      * Returns a new {@code BigDecimal} whose value is {@code this + augend}.
    764      * The scale of the result is the maximum of the scales of the two
    765      * arguments.
    766      *
    767      * @param augend
    768      *            value to be added to {@code this}.
    769      * @return {@code this + augend}.
    770      * @throws NullPointerException
    771      *             if {@code augend == null}.
    772      */
    773     public BigDecimal add(BigDecimal augend) {
    774         int diffScale = this.scale - augend.scale;
    775         // Fast return when some operand is zero
    776         if (this.isZero()) {
    777             if (diffScale <= 0) {
    778                 return augend;
    779             }
    780             if (augend.isZero()) {
    781                 return this;
    782             }
    783         } else if (augend.isZero()) {
    784             if (diffScale >= 0) {
    785                 return this;
    786             }
    787         }
    788         // Let be:  this = [u1,s1]  and  augend = [u2,s2]
    789         if (diffScale == 0) {
    790             // case s1 == s2: [u1 + u2 , s1]
    791             if (Math.max(this.bitLength, augend.bitLength) + 1 < 64) {
    792                 return valueOf(this.smallValue + augend.smallValue, this.scale);
    793             }
    794             return new BigDecimal(this.getUnscaledValue().add(augend.getUnscaledValue()), this.scale);
    795         } else if (diffScale > 0) {
    796             // case s1 > s2 : [(u1 + u2) * 10 ^ (s1 - s2) , s1]
    797             return addAndMult10(this, augend, diffScale);
    798         } else {// case s2 > s1 : [(u2 + u1) * 10 ^ (s2 - s1) , s2]
    799             return addAndMult10(augend, this, -diffScale);
    800         }
    801     }
    802 
    803     private static BigDecimal addAndMult10(BigDecimal thisValue,BigDecimal augend, int diffScale) {
    804         if(diffScale < MathUtils.LONG_POWERS_OF_TEN.length &&
    805                 Math.max(thisValue.bitLength,augend.bitLength+LONG_POWERS_OF_TEN_BIT_LENGTH[diffScale])+1<64) {
    806             return valueOf(thisValue.smallValue+augend.smallValue*MathUtils.LONG_POWERS_OF_TEN[diffScale],thisValue.scale);
    807         } else {
    808             BigInt bi = Multiplication.multiplyByTenPow(augend.getUnscaledValue(),diffScale).getBigInt();
    809             bi.add(thisValue.getUnscaledValue().getBigInt());
    810             return new BigDecimal(new BigInteger(bi), thisValue.scale);
    811         }
    812     }
    813 
    814     /**
    815      * Returns a new {@code BigDecimal} whose value is {@code this + augend}.
    816      * The result is rounded according to the passed context {@code mc}.
    817      *
    818      * @param augend
    819      *            value to be added to {@code this}.
    820      * @param mc
    821      *            rounding mode and precision for the result of this operation.
    822      * @return {@code this + augend}.
    823      * @throws NullPointerException
    824      *             if {@code augend == null} or {@code mc == null}.
    825      */
    826     public BigDecimal add(BigDecimal augend, MathContext mc) {
    827         BigDecimal larger; // operand with the largest unscaled value
    828         BigDecimal smaller; // operand with the smallest unscaled value
    829         BigInteger tempBI;
    830         long diffScale = (long)this.scale - augend.scale;
    831         int largerSignum;
    832         // Some operand is zero or the precision is infinity
    833         if ((augend.isZero()) || (this.isZero())
    834                 || (mc.getPrecision() == 0)) {
    835             return add(augend).round(mc);
    836         }
    837         // Cases where there is room for optimizations
    838         if (this.approxPrecision() < diffScale - 1) {
    839             larger = augend;
    840             smaller = this;
    841         } else if (augend.approxPrecision() < -diffScale - 1) {
    842             larger = this;
    843             smaller = augend;
    844         } else {// No optimization is done
    845             return add(augend).round(mc);
    846         }
    847         if (mc.getPrecision() >= larger.approxPrecision()) {
    848             // No optimization is done
    849             return add(augend).round(mc);
    850         }
    851         // Cases where it's unnecessary to add two numbers with very different scales
    852         largerSignum = larger.signum();
    853         if (largerSignum == smaller.signum()) {
    854             tempBI = Multiplication.multiplyByPositiveInt(larger.getUnscaledValue(),10)
    855             .add(BigInteger.valueOf(largerSignum));
    856         } else {
    857             tempBI = larger.getUnscaledValue().subtract(
    858                     BigInteger.valueOf(largerSignum));
    859             tempBI = Multiplication.multiplyByPositiveInt(tempBI,10)
    860             .add(BigInteger.valueOf(largerSignum * 9));
    861         }
    862         // Rounding the improved adding
    863         larger = new BigDecimal(tempBI, larger.scale + 1);
    864         return larger.round(mc);
    865     }
    866 
    867     /**
    868      * Returns a new {@code BigDecimal} whose value is {@code this - subtrahend}.
    869      * The scale of the result is the maximum of the scales of the two arguments.
    870      *
    871      * @param subtrahend
    872      *            value to be subtracted from {@code this}.
    873      * @return {@code this - subtrahend}.
    874      * @throws NullPointerException
    875      *             if {@code subtrahend == null}.
    876      */
    877     public BigDecimal subtract(BigDecimal subtrahend) {
    878         int diffScale = this.scale - subtrahend.scale;
    879         // Fast return when some operand is zero
    880         if (this.isZero()) {
    881             if (diffScale <= 0) {
    882                 return subtrahend.negate();
    883             }
    884             if (subtrahend.isZero()) {
    885                 return this;
    886             }
    887         } else if (subtrahend.isZero()) {
    888             if (diffScale >= 0) {
    889                 return this;
    890             }
    891         }
    892         // Let be: this = [u1,s1] and subtrahend = [u2,s2] so:
    893         if (diffScale == 0) {
    894             // case s1 = s2 : [u1 - u2 , s1]
    895             if (Math.max(this.bitLength, subtrahend.bitLength) + 1 < 64) {
    896                 return valueOf(this.smallValue - subtrahend.smallValue,this.scale);
    897             }
    898             return new BigDecimal(this.getUnscaledValue().subtract(subtrahend.getUnscaledValue()), this.scale);
    899         } else if (diffScale > 0) {
    900             // case s1 > s2 : [ u1 - u2 * 10 ^ (s1 - s2) , s1 ]
    901             if(diffScale < MathUtils.LONG_POWERS_OF_TEN.length &&
    902                     Math.max(this.bitLength,subtrahend.bitLength+LONG_POWERS_OF_TEN_BIT_LENGTH[diffScale])+1<64) {
    903                 return valueOf(this.smallValue-subtrahend.smallValue*MathUtils.LONG_POWERS_OF_TEN[diffScale],this.scale);
    904             }
    905             return new BigDecimal(this.getUnscaledValue().subtract(
    906                     Multiplication.multiplyByTenPow(subtrahend.getUnscaledValue(),diffScale)), this.scale);
    907         } else {// case s2 > s1 : [ u1 * 10 ^ (s2 - s1) - u2 , s2 ]
    908             diffScale = -diffScale;
    909             if(diffScale < MathUtils.LONG_POWERS_OF_TEN.length &&
    910                     Math.max(this.bitLength+LONG_POWERS_OF_TEN_BIT_LENGTH[diffScale],subtrahend.bitLength)+1<64) {
    911                 return valueOf(this.smallValue*MathUtils.LONG_POWERS_OF_TEN[diffScale]-subtrahend.smallValue,subtrahend.scale);
    912             }
    913             return new BigDecimal(Multiplication.multiplyByTenPow(this.getUnscaledValue(),diffScale)
    914             .subtract(subtrahend.getUnscaledValue()), subtrahend.scale);
    915         }
    916     }
    917 
    918     /**
    919      * Returns a new {@code BigDecimal} whose value is {@code this - subtrahend}.
    920      * The result is rounded according to the passed context {@code mc}.
    921      *
    922      * @param subtrahend
    923      *            value to be subtracted from {@code this}.
    924      * @param mc
    925      *            rounding mode and precision for the result of this operation.
    926      * @return {@code this - subtrahend}.
    927      * @throws NullPointerException
    928      *             if {@code subtrahend == null} or {@code mc == null}.
    929      */
    930     public BigDecimal subtract(BigDecimal subtrahend, MathContext mc) {
    931         long diffScale = subtrahend.scale - (long)this.scale;
    932         int thisSignum;
    933         BigDecimal leftOperand; // it will be only the left operand (this)
    934         BigInteger tempBI;
    935         // Some operand is zero or the precision is infinity
    936         if ((subtrahend.isZero()) || (this.isZero())
    937                 || (mc.getPrecision() == 0)) {
    938             return subtract(subtrahend).round(mc);
    939         }
    940         // Now:   this != 0   and   subtrahend != 0
    941         if (subtrahend.approxPrecision() < diffScale - 1) {
    942             // Cases where it is unnecessary to subtract two numbers with very different scales
    943             if (mc.getPrecision() < this.approxPrecision()) {
    944                 thisSignum = this.signum();
    945                 if (thisSignum != subtrahend.signum()) {
    946                     tempBI = Multiplication.multiplyByPositiveInt(this.getUnscaledValue(), 10)
    947                     .add(BigInteger.valueOf(thisSignum));
    948                 } else {
    949                     tempBI = this.getUnscaledValue().subtract(BigInteger.valueOf(thisSignum));
    950                     tempBI = Multiplication.multiplyByPositiveInt(tempBI, 10)
    951                     .add(BigInteger.valueOf(thisSignum * 9));
    952                 }
    953                 // Rounding the improved subtracting
    954                 leftOperand = new BigDecimal(tempBI, this.scale + 1);
    955                 return leftOperand.round(mc);
    956             }
    957         }
    958         // No optimization is done
    959         return subtract(subtrahend).round(mc);
    960     }
    961 
    962     /**
    963      * Returns a new {@code BigDecimal} whose value is {@code this *
    964      * multiplicand}. The scale of the result is the sum of the scales of the
    965      * two arguments.
    966      *
    967      * @param multiplicand
    968      *            value to be multiplied with {@code this}.
    969      * @return {@code this * multiplicand}.
    970      * @throws NullPointerException
    971      *             if {@code multiplicand == null}.
    972      */
    973     public BigDecimal multiply(BigDecimal multiplicand) {
    974         long newScale = (long)this.scale + multiplicand.scale;
    975 
    976         if ((this.isZero()) || (multiplicand.isZero())) {
    977             return zeroScaledBy(newScale);
    978         }
    979         /* Let be: this = [u1,s1] and multiplicand = [u2,s2] so:
    980          * this x multiplicand = [ s1 * s2 , s1 + s2 ] */
    981         if(this.bitLength + multiplicand.bitLength < 64) {
    982             return valueOf(this.smallValue*multiplicand.smallValue, safeLongToInt(newScale));
    983         }
    984         return new BigDecimal(this.getUnscaledValue().multiply(
    985                 multiplicand.getUnscaledValue()), safeLongToInt(newScale));
    986     }
    987 
    988     /**
    989      * Returns a new {@code BigDecimal} whose value is {@code this *
    990      * multiplicand}. The result is rounded according to the passed context
    991      * {@code mc}.
    992      *
    993      * @param multiplicand
    994      *            value to be multiplied with {@code this}.
    995      * @param mc
    996      *            rounding mode and precision for the result of this operation.
    997      * @return {@code this * multiplicand}.
    998      * @throws NullPointerException
    999      *             if {@code multiplicand == null} or {@code mc == null}.
   1000      */
   1001     public BigDecimal multiply(BigDecimal multiplicand, MathContext mc) {
   1002         BigDecimal result = multiply(multiplicand);
   1003 
   1004         result.inplaceRound(mc);
   1005         return result;
   1006     }
   1007 
   1008     /**
   1009      * Returns a new {@code BigDecimal} whose value is {@code this / divisor}.
   1010      * As scale of the result the parameter {@code scale} is used. If rounding
   1011      * is required to meet the specified scale, then the specified rounding mode
   1012      * {@code roundingMode} is applied.
   1013      *
   1014      * @param divisor
   1015      *            value by which {@code this} is divided.
   1016      * @param scale
   1017      *            the scale of the result returned.
   1018      * @param roundingMode
   1019      *            rounding mode to be used to round the result.
   1020      * @return {@code this / divisor} rounded according to the given rounding
   1021      *         mode.
   1022      * @throws NullPointerException
   1023      *             if {@code divisor == null}.
   1024      * @throws IllegalArgumentException
   1025      *             if {@code roundingMode} is not a valid rounding mode.
   1026      * @throws ArithmeticException
   1027      *             if {@code divisor == 0}.
   1028      * @throws ArithmeticException
   1029      *             if {@code roundingMode == ROUND_UNNECESSARY} and rounding is
   1030      *             necessary according to the given scale.
   1031      */
   1032     public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) {
   1033         return divide(divisor, scale, RoundingMode.valueOf(roundingMode));
   1034     }
   1035 
   1036     /**
   1037      * Returns a new {@code BigDecimal} whose value is {@code this / divisor}.
   1038      * As scale of the result the parameter {@code scale} is used. If rounding
   1039      * is required to meet the specified scale, then the specified rounding mode
   1040      * {@code roundingMode} is applied.
   1041      *
   1042      * @param divisor
   1043      *            value by which {@code this} is divided.
   1044      * @param scale
   1045      *            the scale of the result returned.
   1046      * @param roundingMode
   1047      *            rounding mode to be used to round the result.
   1048      * @return {@code this / divisor} rounded according to the given rounding
   1049      *         mode.
   1050      * @throws NullPointerException
   1051      *             if {@code divisor == null} or {@code roundingMode == null}.
   1052      * @throws ArithmeticException
   1053      *             if {@code divisor == 0}.
   1054      * @throws ArithmeticException
   1055      *             if {@code roundingMode == RoundingMode.UNNECESSAR}Y and
   1056      *             rounding is necessary according to the given scale and given
   1057      *             precision.
   1058      */
   1059     public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) {
   1060         // Let be: this = [u1,s1]  and  divisor = [u2,s2]
   1061         if (roundingMode == null) {
   1062             throw new NullPointerException();
   1063         }
   1064         if (divisor.isZero()) {
   1065             throw new ArithmeticException("Division by zero");
   1066         }
   1067 
   1068         long diffScale = ((long)this.scale - divisor.scale) - scale;
   1069         if(this.bitLength < 64 && divisor.bitLength < 64 ) {
   1070             if(diffScale == 0) {
   1071                 return dividePrimitiveLongs(this.smallValue,
   1072                         divisor.smallValue,
   1073                         scale,
   1074                         roundingMode );
   1075             } else if(diffScale > 0) {
   1076                 if(diffScale < MathUtils.LONG_POWERS_OF_TEN.length &&
   1077                         divisor.bitLength + LONG_POWERS_OF_TEN_BIT_LENGTH[(int)diffScale] < 64) {
   1078                     return dividePrimitiveLongs(this.smallValue,
   1079                             divisor.smallValue*MathUtils.LONG_POWERS_OF_TEN[(int)diffScale],
   1080                             scale,
   1081                             roundingMode);
   1082                 }
   1083             } else { // diffScale < 0
   1084                 if(-diffScale < MathUtils.LONG_POWERS_OF_TEN.length &&
   1085                         this.bitLength + LONG_POWERS_OF_TEN_BIT_LENGTH[(int)-diffScale] < 64) {
   1086                     return dividePrimitiveLongs(this.smallValue*MathUtils.LONG_POWERS_OF_TEN[(int)-diffScale],
   1087                             divisor.smallValue,
   1088                             scale,
   1089                             roundingMode);
   1090                 }
   1091 
   1092             }
   1093         }
   1094         BigInteger scaledDividend = this.getUnscaledValue();
   1095         BigInteger scaledDivisor = divisor.getUnscaledValue(); // for scaling of 'u2'
   1096 
   1097         if (diffScale > 0) {
   1098             // Multiply 'u2'  by:  10^((s1 - s2) - scale)
   1099             scaledDivisor = Multiplication.multiplyByTenPow(scaledDivisor, (int)diffScale);
   1100         } else if (diffScale < 0) {
   1101             // Multiply 'u1'  by:  10^(scale - (s1 - s2))
   1102             scaledDividend  = Multiplication.multiplyByTenPow(scaledDividend, (int)-diffScale);
   1103         }
   1104         return divideBigIntegers(scaledDividend, scaledDivisor, scale, roundingMode);
   1105         }
   1106 
   1107     private static BigDecimal divideBigIntegers(BigInteger scaledDividend, BigInteger scaledDivisor, int scale, RoundingMode roundingMode) {
   1108 
   1109         BigInteger[] quotAndRem = scaledDividend.divideAndRemainder(scaledDivisor);  // quotient and remainder
   1110         // If after division there is a remainder...
   1111         BigInteger quotient = quotAndRem[0];
   1112         BigInteger remainder = quotAndRem[1];
   1113         if (remainder.signum() == 0) {
   1114             return new BigDecimal(quotient, scale);
   1115         }
   1116         int sign = scaledDividend.signum() * scaledDivisor.signum();
   1117         int compRem;                                      // 'compare to remainder'
   1118         if(scaledDivisor.bitLength() < 63) { // 63 in order to avoid out of long after *2
   1119             long rem = remainder.longValue();
   1120             long divisor = scaledDivisor.longValue();
   1121             compRem = longCompareTo(Math.abs(rem) * 2,Math.abs(divisor));
   1122             // To look if there is a carry
   1123             compRem = roundingBehavior(quotient.testBit(0) ? 1 : 0,
   1124                     sign * (5 + compRem), roundingMode);
   1125 
   1126         } else {
   1127             // Checking if:  remainder * 2 >= scaledDivisor
   1128             compRem = remainder.abs().shiftLeftOneBit().compareTo(scaledDivisor.abs());
   1129             compRem = roundingBehavior(quotient.testBit(0) ? 1 : 0,
   1130                     sign * (5 + compRem), roundingMode);
   1131         }
   1132             if (compRem != 0) {
   1133             if(quotient.bitLength() < 63) {
   1134                 return valueOf(quotient.longValue() + compRem,scale);
   1135             }
   1136             quotient = quotient.add(BigInteger.valueOf(compRem));
   1137             return new BigDecimal(quotient, scale);
   1138         }
   1139         // Constructing the result with the appropriate unscaled value
   1140         return new BigDecimal(quotient, scale);
   1141     }
   1142 
   1143     private static BigDecimal dividePrimitiveLongs(long scaledDividend, long scaledDivisor, int scale, RoundingMode roundingMode) {
   1144         long quotient = scaledDividend / scaledDivisor;
   1145         long remainder = scaledDividend % scaledDivisor;
   1146         int sign = Long.signum( scaledDividend ) * Long.signum( scaledDivisor );
   1147         if (remainder != 0) {
   1148             // Checking if:  remainder * 2 >= scaledDivisor
   1149             int compRem;                                      // 'compare to remainder'
   1150             compRem = longCompareTo(Math.abs(remainder) * 2,Math.abs(scaledDivisor));
   1151             // To look if there is a carry
   1152             quotient += roundingBehavior(((int)quotient) & 1,
   1153                     sign * (5 + compRem),
   1154                     roundingMode);
   1155         }
   1156         // Constructing the result with the appropriate unscaled value
   1157         return valueOf(quotient, scale);
   1158     }
   1159 
   1160     /**
   1161      * Returns a new {@code BigDecimal} whose value is {@code this / divisor}.
   1162      * The scale of the result is the scale of {@code this}. If rounding is
   1163      * required to meet the specified scale, then the specified rounding mode
   1164      * {@code roundingMode} is applied.
   1165      *
   1166      * @param divisor
   1167      *            value by which {@code this} is divided.
   1168      * @param roundingMode
   1169      *            rounding mode to be used to round the result.
   1170      * @return {@code this / divisor} rounded according to the given rounding
   1171      *         mode.
   1172      * @throws NullPointerException
   1173      *             if {@code divisor == null}.
   1174      * @throws IllegalArgumentException
   1175      *             if {@code roundingMode} is not a valid rounding mode.
   1176      * @throws ArithmeticException
   1177      *             if {@code divisor == 0}.
   1178      * @throws ArithmeticException
   1179      *             if {@code roundingMode == ROUND_UNNECESSARY} and rounding is
   1180      *             necessary according to the scale of this.
   1181      */
   1182     public BigDecimal divide(BigDecimal divisor, int roundingMode) {
   1183         return divide(divisor, scale, RoundingMode.valueOf(roundingMode));
   1184     }
   1185 
   1186     /**
   1187      * Returns a new {@code BigDecimal} whose value is {@code this / divisor}.
   1188      * The scale of the result is the scale of {@code this}. If rounding is
   1189      * required to meet the specified scale, then the specified rounding mode
   1190      * {@code roundingMode} is applied.
   1191      *
   1192      * @param divisor
   1193      *            value by which {@code this} is divided.
   1194      * @param roundingMode
   1195      *            rounding mode to be used to round the result.
   1196      * @return {@code this / divisor} rounded according to the given rounding
   1197      *         mode.
   1198      * @throws NullPointerException
   1199      *             if {@code divisor == null} or {@code roundingMode == null}.
   1200      * @throws ArithmeticException
   1201      *             if {@code divisor == 0}.
   1202      * @throws ArithmeticException
   1203      *             if {@code roundingMode == RoundingMode.UNNECESSARY} and
   1204      *             rounding is necessary according to the scale of this.
   1205      */
   1206     public BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode) {
   1207         return divide(divisor, scale, roundingMode);
   1208     }
   1209 
   1210     /**
   1211      * Returns a new {@code BigDecimal} whose value is {@code this / divisor}.
   1212      * The scale of the result is the difference of the scales of {@code this}
   1213      * and {@code divisor}. If the exact result requires more digits, then the
   1214      * scale is adjusted accordingly. For example, {@code 1/128 = 0.0078125}
   1215      * which has a scale of {@code 7} and precision {@code 5}.
   1216      *
   1217      * @param divisor
   1218      *            value by which {@code this} is divided.
   1219      * @return {@code this / divisor}.
   1220      * @throws NullPointerException
   1221      *             if {@code divisor == null}.
   1222      * @throws ArithmeticException
   1223      *             if {@code divisor == 0}.
   1224      * @throws ArithmeticException
   1225      *             if the result cannot be represented exactly.
   1226      */
   1227     public BigDecimal divide(BigDecimal divisor) {
   1228         BigInteger p = this.getUnscaledValue();
   1229         BigInteger q = divisor.getUnscaledValue();
   1230         BigInteger gcd; // greatest common divisor between 'p' and 'q'
   1231         BigInteger quotAndRem[];
   1232         long diffScale = (long)scale - divisor.scale;
   1233         int newScale; // the new scale for final quotient
   1234         int k; // number of factors "2" in 'q'
   1235         int l = 0; // number of factors "5" in 'q'
   1236         int i = 1;
   1237         int lastPow = FIVE_POW.length - 1;
   1238 
   1239         if (divisor.isZero()) {
   1240             throw new ArithmeticException("Division by zero");
   1241         }
   1242         if (p.signum() == 0) {
   1243             return zeroScaledBy(diffScale);
   1244         }
   1245         // To divide both by the GCD
   1246         gcd = p.gcd(q);
   1247         p = p.divide(gcd);
   1248         q = q.divide(gcd);
   1249         // To simplify all "2" factors of q, dividing by 2^k
   1250         k = q.getLowestSetBit();
   1251         q = q.shiftRight(k);
   1252         // To simplify all "5" factors of q, dividing by 5^l
   1253         do {
   1254             quotAndRem = q.divideAndRemainder(FIVE_POW[i]);
   1255             if (quotAndRem[1].signum() == 0) {
   1256                 l += i;
   1257                 if (i < lastPow) {
   1258                     i++;
   1259                 }
   1260                 q = quotAndRem[0];
   1261             } else {
   1262                 if (i == 1) {
   1263                     break;
   1264                 }
   1265                 i = 1;
   1266             }
   1267         } while (true);
   1268         // If  abs(q) != 1  then the quotient is periodic
   1269         if (!q.abs().equals(BigInteger.ONE)) {
   1270             throw new ArithmeticException("Non-terminating decimal expansion; no exact representable decimal result");
   1271         }
   1272         // The sign of the is fixed and the quotient will be saved in 'p'
   1273         if (q.signum() < 0) {
   1274             p = p.negate();
   1275         }
   1276         // Checking if the new scale is out of range
   1277         newScale = safeLongToInt(diffScale + Math.max(k, l));
   1278         // k >= 0  and  l >= 0  implies that  k - l  is in the 32-bit range
   1279         i = k - l;
   1280 
   1281         p = (i > 0) ? Multiplication.multiplyByFivePow(p, i)
   1282         : p.shiftLeft(-i);
   1283         return new BigDecimal(p, newScale);
   1284     }
   1285 
   1286     /**
   1287      * Returns a new {@code BigDecimal} whose value is {@code this / divisor}.
   1288      * The result is rounded according to the passed context {@code mc}. If the
   1289      * passed math context specifies precision {@code 0}, then this call is
   1290      * equivalent to {@code this.divide(divisor)}.
   1291      *
   1292      * @param divisor
   1293      *            value by which {@code this} is divided.
   1294      * @param mc
   1295      *            rounding mode and precision for the result of this operation.
   1296      * @return {@code this / divisor}.
   1297      * @throws NullPointerException
   1298      *             if {@code divisor == null} or {@code mc == null}.
   1299      * @throws ArithmeticException
   1300      *             if {@code divisor == 0}.
   1301      * @throws ArithmeticException
   1302      *             if {@code mc.getRoundingMode() == UNNECESSARY} and rounding
   1303      *             is necessary according {@code mc.getPrecision()}.
   1304      */
   1305     public BigDecimal divide(BigDecimal divisor, MathContext mc) {
   1306         /* Calculating how many zeros must be append to 'dividend'
   1307          * to obtain a  quotient with at least 'mc.precision()' digits */
   1308         long trailingZeros = mc.getPrecision() + 2L
   1309                 + divisor.approxPrecision() - approxPrecision();
   1310         long diffScale = (long)scale - divisor.scale;
   1311         long newScale = diffScale; // scale of the final quotient
   1312         int compRem; // to compare the remainder
   1313         int i = 1; // index
   1314         int lastPow = TEN_POW.length - 1; // last power of ten
   1315         BigInteger integerQuot; // for temporal results
   1316         BigInteger quotAndRem[] = {getUnscaledValue()};
   1317         // In special cases it reduces the problem to call the dual method
   1318         if ((mc.getPrecision() == 0) || (this.isZero())
   1319         || (divisor.isZero())) {
   1320             return this.divide(divisor);
   1321         }
   1322         if (trailingZeros > 0) {
   1323             // To append trailing zeros at end of dividend
   1324             quotAndRem[0] = getUnscaledValue().multiply( Multiplication.powerOf10(trailingZeros) );
   1325             newScale += trailingZeros;
   1326         }
   1327         quotAndRem = quotAndRem[0].divideAndRemainder( divisor.getUnscaledValue() );
   1328         integerQuot = quotAndRem[0];
   1329         // Calculating the exact quotient with at least 'mc.precision()' digits
   1330         if (quotAndRem[1].signum() != 0) {
   1331             // Checking if:   2 * remainder >= divisor ?
   1332             compRem = quotAndRem[1].shiftLeftOneBit().compareTo( divisor.getUnscaledValue() );
   1333             // quot := quot * 10 + r;     with 'r' in {-6,-5,-4, 0,+4,+5,+6}
   1334             integerQuot = integerQuot.multiply(BigInteger.TEN)
   1335             .add(BigInteger.valueOf(quotAndRem[0].signum() * (5 + compRem)));
   1336             newScale++;
   1337         } else {
   1338             // To strip trailing zeros until the preferred scale is reached
   1339             while (!integerQuot.testBit(0)) {
   1340                 quotAndRem = integerQuot.divideAndRemainder(TEN_POW[i]);
   1341                 if ((quotAndRem[1].signum() == 0)
   1342                         && (newScale - i >= diffScale)) {
   1343                     newScale -= i;
   1344                     if (i < lastPow) {
   1345                         i++;
   1346                     }
   1347                     integerQuot = quotAndRem[0];
   1348                 } else {
   1349                     if (i == 1) {
   1350                         break;
   1351                     }
   1352                     i = 1;
   1353                 }
   1354             }
   1355         }
   1356         // To perform rounding
   1357         return new BigDecimal(integerQuot, safeLongToInt(newScale), mc);
   1358     }
   1359 
   1360     /**
   1361      * Returns a new {@code BigDecimal} whose value is the integral part of
   1362      * {@code this / divisor}. The quotient is rounded down towards zero to the
   1363      * next integer. For example, {@code 0.5/0.2 = 2}.
   1364      *
   1365      * @param divisor
   1366      *            value by which {@code this} is divided.
   1367      * @return integral part of {@code this / divisor}.
   1368      * @throws NullPointerException
   1369      *             if {@code divisor == null}.
   1370      * @throws ArithmeticException
   1371      *             if {@code divisor == 0}.
   1372      */
   1373     public BigDecimal divideToIntegralValue(BigDecimal divisor) {
   1374         BigInteger integralValue; // the integer of result
   1375         BigInteger powerOfTen; // some power of ten
   1376         BigInteger quotAndRem[] = {getUnscaledValue()};
   1377         long newScale = (long)this.scale - divisor.scale;
   1378         long tempScale = 0;
   1379         int i = 1;
   1380         int lastPow = TEN_POW.length - 1;
   1381 
   1382         if (divisor.isZero()) {
   1383             throw new ArithmeticException("Division by zero");
   1384         }
   1385         if ((divisor.approxPrecision() + newScale > this.approxPrecision() + 1L)
   1386         || (this.isZero())) {
   1387             /* If the divisor's integer part is greater than this's integer part,
   1388              * the result must be zero with the appropriate scale */
   1389             integralValue = BigInteger.ZERO;
   1390         } else if (newScale == 0) {
   1391             integralValue = getUnscaledValue().divide( divisor.getUnscaledValue() );
   1392         } else if (newScale > 0) {
   1393             powerOfTen = Multiplication.powerOf10(newScale);
   1394             integralValue = getUnscaledValue().divide( divisor.getUnscaledValue().multiply(powerOfTen) );
   1395             integralValue = integralValue.multiply(powerOfTen);
   1396         } else {// (newScale < 0)
   1397             powerOfTen = Multiplication.powerOf10(-newScale);
   1398             integralValue = getUnscaledValue().multiply(powerOfTen).divide( divisor.getUnscaledValue() );
   1399             // To strip trailing zeros approximating to the preferred scale
   1400             while (!integralValue.testBit(0)) {
   1401                 quotAndRem = integralValue.divideAndRemainder(TEN_POW[i]);
   1402                 if ((quotAndRem[1].signum() == 0)
   1403                         && (tempScale - i >= newScale)) {
   1404                     tempScale -= i;
   1405                     if (i < lastPow) {
   1406                         i++;
   1407                     }
   1408                     integralValue = quotAndRem[0];
   1409                 } else {
   1410                     if (i == 1) {
   1411                         break;
   1412                     }
   1413                     i = 1;
   1414                 }
   1415             }
   1416             newScale = tempScale;
   1417         }
   1418         return ((integralValue.signum() == 0)
   1419         ? zeroScaledBy(newScale)
   1420                 : new BigDecimal(integralValue, safeLongToInt(newScale)));
   1421     }
   1422 
   1423     /**
   1424      * Returns a new {@code BigDecimal} whose value is the integral part of
   1425      * {@code this / divisor}. The quotient is rounded down towards zero to the
   1426      * next integer. The rounding mode passed with the parameter {@code mc} is
   1427      * not considered. But if the precision of {@code mc > 0} and the integral
   1428      * part requires more digits, then an {@code ArithmeticException} is thrown.
   1429      *
   1430      * @param divisor
   1431      *            value by which {@code this} is divided.
   1432      * @param mc
   1433      *            math context which determines the maximal precision of the
   1434      *            result.
   1435      * @return integral part of {@code this / divisor}.
   1436      * @throws NullPointerException
   1437      *             if {@code divisor == null} or {@code mc == null}.
   1438      * @throws ArithmeticException
   1439      *             if {@code divisor == 0}.
   1440      * @throws ArithmeticException
   1441      *             if {@code mc.getPrecision() > 0} and the result requires more
   1442      *             digits to be represented.
   1443      */
   1444     public BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext mc) {
   1445         int mcPrecision = mc.getPrecision();
   1446         int diffPrecision = this.precision() - divisor.precision();
   1447         int lastPow = TEN_POW.length - 1;
   1448         long diffScale = (long)this.scale - divisor.scale;
   1449         long newScale = diffScale;
   1450         long quotPrecision = diffPrecision - diffScale + 1;
   1451         BigInteger quotAndRem[] = new BigInteger[2];
   1452         // In special cases it call the dual method
   1453         if ((mcPrecision == 0) || (this.isZero()) || (divisor.isZero())) {
   1454             return this.divideToIntegralValue(divisor);
   1455         }
   1456         // Let be:   this = [u1,s1]   and   divisor = [u2,s2]
   1457         if (quotPrecision <= 0) {
   1458             quotAndRem[0] = BigInteger.ZERO;
   1459         } else if (diffScale == 0) {
   1460             // CASE s1 == s2:  to calculate   u1 / u2
   1461             quotAndRem[0] = this.getUnscaledValue().divide( divisor.getUnscaledValue() );
   1462         } else if (diffScale > 0) {
   1463             // CASE s1 >= s2:  to calculate   u1 / (u2 * 10^(s1-s2)
   1464             quotAndRem[0] = this.getUnscaledValue().divide(
   1465                     divisor.getUnscaledValue().multiply(Multiplication.powerOf10(diffScale)) );
   1466             // To chose  10^newScale  to get a quotient with at least 'mc.precision()' digits
   1467             newScale = Math.min(diffScale, Math.max(mcPrecision - quotPrecision + 1, 0));
   1468             // To calculate: (u1 / (u2 * 10^(s1-s2)) * 10^newScale
   1469             quotAndRem[0] = quotAndRem[0].multiply(Multiplication.powerOf10(newScale));
   1470         } else {// CASE s2 > s1:
   1471             /* To calculate the minimum power of ten, such that the quotient
   1472              *   (u1 * 10^exp) / u2   has at least 'mc.precision()' digits. */
   1473             long exp = Math.min(-diffScale, Math.max((long)mcPrecision - diffPrecision, 0));
   1474             long compRemDiv;
   1475             // Let be:   (u1 * 10^exp) / u2 = [q,r]
   1476             quotAndRem = this.getUnscaledValue().multiply(Multiplication.powerOf10(exp)).
   1477                     divideAndRemainder(divisor.getUnscaledValue());
   1478             newScale += exp; // To fix the scale
   1479             exp = -newScale; // The remaining power of ten
   1480             // If after division there is a remainder...
   1481             if ((quotAndRem[1].signum() != 0) && (exp > 0)) {
   1482                 // Log10(r) + ((s2 - s1) - exp) > mc.precision ?
   1483                 compRemDiv = (new BigDecimal(quotAndRem[1])).precision()
   1484                 + exp - divisor.precision();
   1485                 if (compRemDiv == 0) {
   1486                     // To calculate:  (r * 10^exp2) / u2
   1487                     quotAndRem[1] = quotAndRem[1].multiply(Multiplication.powerOf10(exp)).
   1488                             divide(divisor.getUnscaledValue());
   1489                     compRemDiv = Math.abs(quotAndRem[1].signum());
   1490                 }
   1491                 if (compRemDiv > 0) {
   1492                     throw new ArithmeticException("Division impossible");
   1493                 }
   1494             }
   1495         }
   1496         // Fast return if the quotient is zero
   1497         if (quotAndRem[0].signum() == 0) {
   1498             return zeroScaledBy(diffScale);
   1499         }
   1500         BigInteger strippedBI = quotAndRem[0];
   1501         BigDecimal integralValue = new BigDecimal(quotAndRem[0]);
   1502         long resultPrecision = integralValue.precision();
   1503         int i = 1;
   1504         // To strip trailing zeros until the specified precision is reached
   1505         while (!strippedBI.testBit(0)) {
   1506             quotAndRem = strippedBI.divideAndRemainder(TEN_POW[i]);
   1507             if ((quotAndRem[1].signum() == 0) &&
   1508                     ((resultPrecision - i >= mcPrecision)
   1509                     || (newScale - i >= diffScale)) ) {
   1510                 resultPrecision -= i;
   1511                 newScale -= i;
   1512                 if (i < lastPow) {
   1513                     i++;
   1514                 }
   1515                 strippedBI = quotAndRem[0];
   1516             } else {
   1517                 if (i == 1) {
   1518                     break;
   1519                 }
   1520                 i = 1;
   1521             }
   1522         }
   1523         // To check if the result fit in 'mc.precision()' digits
   1524         if (resultPrecision > mcPrecision) {
   1525             throw new ArithmeticException("Division impossible");
   1526         }
   1527         integralValue.scale = safeLongToInt(newScale);
   1528         integralValue.setUnscaledValue(strippedBI);
   1529         return integralValue;
   1530     }
   1531 
   1532     /**
   1533      * Returns a new {@code BigDecimal} whose value is {@code this % divisor}.
   1534      * <p>
   1535      * The remainder is defined as {@code this -
   1536      * this.divideToIntegralValue(divisor) * divisor}.
   1537      *
   1538      * @param divisor
   1539      *            value by which {@code this} is divided.
   1540      * @return {@code this % divisor}.
   1541      * @throws NullPointerException
   1542      *             if {@code divisor == null}.
   1543      * @throws ArithmeticException
   1544      *             if {@code divisor == 0}.
   1545      */
   1546     public BigDecimal remainder(BigDecimal divisor) {
   1547         return divideAndRemainder(divisor)[1];
   1548     }
   1549 
   1550     /**
   1551      * Returns a new {@code BigDecimal} whose value is {@code this % divisor}.
   1552      * <p>
   1553      * The remainder is defined as {@code this -
   1554      * this.divideToIntegralValue(divisor) * divisor}.
   1555      * <p>
   1556      * The specified rounding mode {@code mc} is used for the division only.
   1557      *
   1558      * @param divisor
   1559      *            value by which {@code this} is divided.
   1560      * @param mc
   1561      *            rounding mode and precision to be used.
   1562      * @return {@code this % divisor}.
   1563      * @throws NullPointerException
   1564      *             if {@code divisor == null}.
   1565      * @throws ArithmeticException
   1566      *             if {@code divisor == 0}.
   1567      * @throws ArithmeticException
   1568      *             if {@code mc.getPrecision() > 0} and the result of {@code
   1569      *             this.divideToIntegralValue(divisor, mc)} requires more digits
   1570      *             to be represented.
   1571      */
   1572     public BigDecimal remainder(BigDecimal divisor, MathContext mc) {
   1573         return divideAndRemainder(divisor, mc)[1];
   1574     }
   1575 
   1576     /**
   1577      * Returns a {@code BigDecimal} array which contains the integral part of
   1578      * {@code this / divisor} at index 0 and the remainder {@code this %
   1579      * divisor} at index 1. The quotient is rounded down towards zero to the
   1580      * next integer.
   1581      *
   1582      * @param divisor
   1583      *            value by which {@code this} is divided.
   1584      * @return {@code [this.divideToIntegralValue(divisor),
   1585      *         this.remainder(divisor)]}.
   1586      * @throws NullPointerException
   1587      *             if {@code divisor == null}.
   1588      * @throws ArithmeticException
   1589      *             if {@code divisor == 0}.
   1590      * @see #divideToIntegralValue
   1591      * @see #remainder
   1592      */
   1593     public BigDecimal[] divideAndRemainder(BigDecimal divisor) {
   1594         BigDecimal quotAndRem[] = new BigDecimal[2];
   1595 
   1596         quotAndRem[0] = this.divideToIntegralValue(divisor);
   1597         quotAndRem[1] = this.subtract( quotAndRem[0].multiply(divisor) );
   1598         return quotAndRem;
   1599     }
   1600 
   1601     /**
   1602      * Returns a {@code BigDecimal} array which contains the integral part of
   1603      * {@code this / divisor} at index 0 and the remainder {@code this %
   1604      * divisor} at index 1. The quotient is rounded down towards zero to the
   1605      * next integer. The rounding mode passed with the parameter {@code mc} is
   1606      * not considered. But if the precision of {@code mc > 0} and the integral
   1607      * part requires more digits, then an {@code ArithmeticException} is thrown.
   1608      *
   1609      * @param divisor
   1610      *            value by which {@code this} is divided.
   1611      * @param mc
   1612      *            math context which determines the maximal precision of the
   1613      *            result.
   1614      * @return {@code [this.divideToIntegralValue(divisor),
   1615      *         this.remainder(divisor)]}.
   1616      * @throws NullPointerException
   1617      *             if {@code divisor == null}.
   1618      * @throws ArithmeticException
   1619      *             if {@code divisor == 0}.
   1620      * @see #divideToIntegralValue
   1621      * @see #remainder
   1622      */
   1623     public BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc) {
   1624         BigDecimal quotAndRem[] = new BigDecimal[2];
   1625 
   1626         quotAndRem[0] = this.divideToIntegralValue(divisor, mc);
   1627         quotAndRem[1] = this.subtract( quotAndRem[0].multiply(divisor) );
   1628         return quotAndRem;
   1629     }
   1630 
   1631     /**
   1632      * Returns a new {@code BigDecimal} whose value is {@code this ^ n}. The
   1633      * scale of the result is {@code n} times the scales of {@code this}.
   1634      * <p>
   1635      * {@code x.pow(0)} returns {@code 1}, even if {@code x == 0}.
   1636      * <p>
   1637      * Implementation Note: The implementation is based on the ANSI standard
   1638      * X3.274-1996 algorithm.
   1639      *
   1640      * @param n
   1641      *            exponent to which {@code this} is raised.
   1642      * @return {@code this ^ n}.
   1643      * @throws ArithmeticException
   1644      *             if {@code n < 0} or {@code n > 999999999}.
   1645      */
   1646     public BigDecimal pow(int n) {
   1647         if (n == 0) {
   1648             return ONE;
   1649         }
   1650         if ((n < 0) || (n > 999999999)) {
   1651             throw new ArithmeticException("Invalid operation");
   1652         }
   1653         long newScale = scale * (long)n;
   1654         // Let be: this = [u,s]   so:  this^n = [u^n, s*n]
   1655         return isZero() ? zeroScaledBy(newScale)
   1656                 : new BigDecimal(getUnscaledValue().pow(n), safeLongToInt(newScale));
   1657     }
   1658 
   1659     /**
   1660      * Returns a new {@code BigDecimal} whose value is {@code this ^ n}. The
   1661      * result is rounded according to the passed context {@code mc}.
   1662      * <p>
   1663      * Implementation Note: The implementation is based on the ANSI standard
   1664      * X3.274-1996 algorithm.
   1665      *
   1666      * @param n
   1667      *            exponent to which {@code this} is raised.
   1668      * @param mc
   1669      *            rounding mode and precision for the result of this operation.
   1670      * @return {@code this ^ n}.
   1671      * @throws ArithmeticException
   1672      *             if {@code n < 0} or {@code n > 999999999}.
   1673      */
   1674     public BigDecimal pow(int n, MathContext mc) {
   1675         // The ANSI standard X3.274-1996 algorithm
   1676         int m = Math.abs(n);
   1677         int mcPrecision = mc.getPrecision();
   1678         int elength = (int)Math.log10(m) + 1;   // decimal digits in 'n'
   1679         int oneBitMask; // mask of bits
   1680         BigDecimal accum; // the single accumulator
   1681         MathContext newPrecision = mc; // MathContext by default
   1682 
   1683         // In particular cases, it reduces the problem to call the other 'pow()'
   1684         if ((n == 0) || ((isZero()) && (n > 0))) {
   1685             return pow(n);
   1686         }
   1687         if ((m > 999999999) || ((mcPrecision == 0) && (n < 0))
   1688                 || ((mcPrecision > 0) && (elength > mcPrecision))) {
   1689             throw new ArithmeticException("Invalid operation");
   1690         }
   1691         if (mcPrecision > 0) {
   1692             newPrecision = new MathContext( mcPrecision + elength + 1,
   1693                     mc.getRoundingMode());
   1694         }
   1695         // The result is calculated as if 'n' were positive
   1696         accum = round(newPrecision);
   1697         oneBitMask = Integer.highestOneBit(m) >> 1;
   1698 
   1699         while (oneBitMask > 0) {
   1700             accum = accum.multiply(accum, newPrecision);
   1701             if ((m & oneBitMask) == oneBitMask) {
   1702                 accum = accum.multiply(this, newPrecision);
   1703             }
   1704             oneBitMask >>= 1;
   1705         }
   1706         // If 'n' is negative, the value is divided into 'ONE'
   1707         if (n < 0) {
   1708             accum = ONE.divide(accum, newPrecision);
   1709         }
   1710         // The final value is rounded to the destination precision
   1711         accum.inplaceRound(mc);
   1712         return accum;
   1713     }
   1714 
   1715     /**
   1716      * Returns a new {@code BigDecimal} whose value is the absolute value of
   1717      * {@code this}. The scale of the result is the same as the scale of this.
   1718      *
   1719      * @return {@code abs(this)}
   1720      */
   1721     public BigDecimal abs() {
   1722         return ((signum() < 0) ? negate() : this);
   1723     }
   1724 
   1725     /**
   1726      * Returns a new {@code BigDecimal} whose value is the absolute value of
   1727      * {@code this}. The result is rounded according to the passed context
   1728      * {@code mc}.
   1729      *
   1730      * @param mc
   1731      *            rounding mode and precision for the result of this operation.
   1732      * @return {@code abs(this)}
   1733      */
   1734     public BigDecimal abs(MathContext mc) {
   1735         BigDecimal result = abs();
   1736         result.inplaceRound(mc);
   1737         return result;
   1738     }
   1739 
   1740     /**
   1741      * Returns a new {@code BigDecimal} whose value is the {@code -this}. The
   1742      * scale of the result is the same as the scale of this.
   1743      *
   1744      * @return {@code -this}
   1745      */
   1746     public BigDecimal negate() {
   1747         if(bitLength < 63 || (bitLength == 63 && smallValue!=Long.MIN_VALUE)) {
   1748             return valueOf(-smallValue,scale);
   1749         }
   1750         return new BigDecimal(getUnscaledValue().negate(), scale);
   1751     }
   1752 
   1753     /**
   1754      * Returns a new {@code BigDecimal} whose value is the {@code -this}. The
   1755      * result is rounded according to the passed context {@code mc}.
   1756      *
   1757      * @param mc
   1758      *            rounding mode and precision for the result of this operation.
   1759      * @return {@code -this}
   1760      */
   1761     public BigDecimal negate(MathContext mc) {
   1762         BigDecimal result = negate();
   1763         result.inplaceRound(mc);
   1764         return result;
   1765     }
   1766 
   1767     /**
   1768      * Returns a new {@code BigDecimal} whose value is {@code +this}. The scale
   1769      * of the result is the same as the scale of this.
   1770      *
   1771      * @return {@code this}
   1772      */
   1773     public BigDecimal plus() {
   1774         return this;
   1775     }
   1776 
   1777     /**
   1778      * Returns a new {@code BigDecimal} whose value is {@code +this}. The result
   1779      * is rounded according to the passed context {@code mc}.
   1780      *
   1781      * @param mc
   1782      *            rounding mode and precision for the result of this operation.
   1783      * @return {@code this}, rounded
   1784      */
   1785     public BigDecimal plus(MathContext mc) {
   1786         return round(mc);
   1787     }
   1788 
   1789     /**
   1790      * Returns the sign of this {@code BigDecimal}.
   1791      *
   1792      * @return {@code -1} if {@code this < 0},
   1793      *         {@code 0} if {@code this == 0},
   1794      *         {@code 1} if {@code this > 0}.     */
   1795     public int signum() {
   1796         if( bitLength < 64) {
   1797             return Long.signum( this.smallValue );
   1798         }
   1799         return getUnscaledValue().signum();
   1800     }
   1801 
   1802     private boolean isZero() {
   1803         //Watch out: -1 has a bitLength=0
   1804         return bitLength == 0 && this.smallValue != -1;
   1805     }
   1806 
   1807     /**
   1808      * Returns the scale of this {@code BigDecimal}. The scale is the number of
   1809      * digits behind the decimal point. The value of this {@code BigDecimal} is
   1810      * the unsignedValue * 10^(-scale). If the scale is negative, then this
   1811      * {@code BigDecimal} represents a big integer.
   1812      *
   1813      * @return the scale of this {@code BigDecimal}.
   1814      */
   1815     public int scale() {
   1816         return scale;
   1817     }
   1818 
   1819     /**
   1820      * Returns the precision of this {@code BigDecimal}. The precision is the
   1821      * number of decimal digits used to represent this decimal. It is equivalent
   1822      * to the number of digits of the unscaled value. The precision of {@code 0}
   1823      * is {@code 1} (independent of the scale).
   1824      *
   1825      * @return the precision of this {@code BigDecimal}.
   1826      */
   1827     public int precision() {
   1828         // Checking if the precision already was calculated
   1829         if (precision > 0) {
   1830             return precision;
   1831         }
   1832 
   1833         int bitLength = this.bitLength;
   1834 
   1835         if (bitLength == 0) {
   1836             precision = 1;
   1837         } else if (bitLength < 64) {
   1838             precision = decimalDigitsInLong(smallValue);
   1839         } else {
   1840             int decimalDigits = 1 + (int) ((bitLength - 1) * LOG10_2);
   1841             // If after division the number isn't zero, there exists an additional digit
   1842             if (getUnscaledValue().divide(Multiplication.powerOf10(decimalDigits)).signum() != 0) {
   1843                 decimalDigits++;
   1844             }
   1845             precision = decimalDigits;
   1846         }
   1847         return precision;
   1848     }
   1849 
   1850     private int decimalDigitsInLong(long value) {
   1851         if (value == Long.MIN_VALUE) {
   1852             return 19; // special case required because abs(MIN_VALUE) == MIN_VALUE
   1853         } else {
   1854             int index = Arrays.binarySearch(MathUtils.LONG_POWERS_OF_TEN, Math.abs(value));
   1855             return (index < 0) ? (-index - 1) : (index + 1);
   1856         }
   1857     }
   1858 
   1859     /**
   1860      * Returns the unscaled value (mantissa) of this {@code BigDecimal} instance
   1861      * as a {@code BigInteger}. The unscaled value can be computed as {@code
   1862      * this} 10^(scale).
   1863      *
   1864      * @return unscaled value (this * 10^(scale)).
   1865      */
   1866     public BigInteger unscaledValue() {
   1867         return getUnscaledValue();
   1868     }
   1869 
   1870     /**
   1871      * Returns a new {@code BigDecimal} whose value is {@code this}, rounded
   1872      * according to the passed context {@code mc}.
   1873      * <p>
   1874      * If {@code mc.precision = 0}, then no rounding is performed.
   1875      * <p>
   1876      * If {@code mc.precision > 0} and {@code mc.roundingMode == UNNECESSARY},
   1877      * then an {@code ArithmeticException} is thrown if the result cannot be
   1878      * represented exactly within the given precision.
   1879      *
   1880      * @param mc
   1881      *            rounding mode and precision for the result of this operation.
   1882      * @return {@code this} rounded according to the passed context.
   1883      * @throws ArithmeticException
   1884      *             if {@code mc.precision > 0} and {@code mc.roundingMode ==
   1885      *             UNNECESSARY} and this cannot be represented within the given
   1886      *             precision.
   1887      */
   1888     public BigDecimal round(MathContext mc) {
   1889         BigDecimal thisBD = new BigDecimal(getUnscaledValue(), scale);
   1890 
   1891         thisBD.inplaceRound(mc);
   1892         return thisBD;
   1893     }
   1894 
   1895     /**
   1896      * Returns a new {@code BigDecimal} instance with the specified scale.
   1897      * <p>
   1898      * If the new scale is greater than the old scale, then additional zeros are
   1899      * added to the unscaled value. In this case no rounding is necessary.
   1900      * <p>
   1901      * If the new scale is smaller than the old scale, then trailing digits are
   1902      * removed. If these trailing digits are not zero, then the remaining
   1903      * unscaled value has to be rounded. For this rounding operation the
   1904      * specified rounding mode is used.
   1905      *
   1906      * @param newScale
   1907      *            scale of the result returned.
   1908      * @param roundingMode
   1909      *            rounding mode to be used to round the result.
   1910      * @return a new {@code BigDecimal} instance with the specified scale.
   1911      * @throws NullPointerException
   1912      *             if {@code roundingMode == null}.
   1913      * @throws ArithmeticException
   1914      *             if {@code roundingMode == ROUND_UNNECESSARY} and rounding is
   1915      *             necessary according to the given scale.
   1916      */
   1917     public BigDecimal setScale(int newScale, RoundingMode roundingMode) {
   1918         if (roundingMode == null) {
   1919             throw new NullPointerException();
   1920         }
   1921         long diffScale = newScale - (long)scale;
   1922         // Let be:  'this' = [u,s]
   1923         if(diffScale == 0) {
   1924             return this;
   1925         }
   1926         if(diffScale > 0) {
   1927         // return  [u * 10^(s2 - s), newScale]
   1928             if(diffScale < MathUtils.LONG_POWERS_OF_TEN.length &&
   1929                     (this.bitLength + LONG_POWERS_OF_TEN_BIT_LENGTH[(int)diffScale]) < 64 ) {
   1930                 return valueOf(this.smallValue*MathUtils.LONG_POWERS_OF_TEN[(int)diffScale],newScale);
   1931             }
   1932             return new BigDecimal(Multiplication.multiplyByTenPow(getUnscaledValue(),(int)diffScale), newScale);
   1933         }
   1934         // diffScale < 0
   1935         // return  [u,s] / [1,newScale]  with the appropriate scale and rounding
   1936         if(this.bitLength < 64 && -diffScale < MathUtils.LONG_POWERS_OF_TEN.length) {
   1937             return dividePrimitiveLongs(this.smallValue, MathUtils.LONG_POWERS_OF_TEN[(int)-diffScale], newScale,roundingMode);
   1938         }
   1939         return divideBigIntegers(this.getUnscaledValue(),Multiplication.powerOf10(-diffScale),newScale,roundingMode);
   1940     }
   1941 
   1942     /**
   1943      * Returns a new {@code BigDecimal} instance with the specified scale.
   1944      * <p>
   1945      * If the new scale is greater than the old scale, then additional zeros are
   1946      * added to the unscaled value. In this case no rounding is necessary.
   1947      * <p>
   1948      * If the new scale is smaller than the old scale, then trailing digits are
   1949      * removed. If these trailing digits are not zero, then the remaining
   1950      * unscaled value has to be rounded. For this rounding operation the
   1951      * specified rounding mode is used.
   1952      *
   1953      * @param newScale
   1954      *            scale of the result returned.
   1955      * @param roundingMode
   1956      *            rounding mode to be used to round the result.
   1957      * @return a new {@code BigDecimal} instance with the specified scale.
   1958      * @throws IllegalArgumentException
   1959      *             if {@code roundingMode} is not a valid rounding mode.
   1960      * @throws ArithmeticException
   1961      *             if {@code roundingMode == ROUND_UNNECESSARY} and rounding is
   1962      *             necessary according to the given scale.
   1963      */
   1964     public BigDecimal setScale(int newScale, int roundingMode) {
   1965         return setScale(newScale, RoundingMode.valueOf(roundingMode));
   1966     }
   1967 
   1968     /**
   1969      * Returns a new {@code BigDecimal} instance with the specified scale. If
   1970      * the new scale is greater than the old scale, then additional zeros are
   1971      * added to the unscaled value. If the new scale is smaller than the old
   1972      * scale, then trailing zeros are removed. If the trailing digits are not
   1973      * zeros then an ArithmeticException is thrown.
   1974      * <p>
   1975      * If no exception is thrown, then the following equation holds: {@code
   1976      * x.setScale(s).compareTo(x) == 0}.
   1977      *
   1978      * @param newScale
   1979      *            scale of the result returned.
   1980      * @return a new {@code BigDecimal} instance with the specified scale.
   1981      * @throws ArithmeticException
   1982      *             if rounding would be necessary.
   1983      */
   1984     public BigDecimal setScale(int newScale) {
   1985         return setScale(newScale, RoundingMode.UNNECESSARY);
   1986     }
   1987 
   1988     /**
   1989      * Returns a new {@code BigDecimal} instance where the decimal point has
   1990      * been moved {@code n} places to the left. If {@code n < 0} then the
   1991      * decimal point is moved {@code -n} places to the right.
   1992      * <p>
   1993      * The result is obtained by changing its scale. If the scale of the result
   1994      * becomes negative, then its precision is increased such that the scale is
   1995      * zero.
   1996      * <p>
   1997      * Note, that {@code movePointLeft(0)} returns a result which is
   1998      * mathematically equivalent, but which has {@code scale >= 0}.
   1999      *
   2000      * @param n
   2001      *            number of placed the decimal point has to be moved.
   2002      * @return {@code this * 10^(-n}).
   2003      */
   2004     public BigDecimal movePointLeft(int n) {
   2005         return movePoint(scale + (long)n);
   2006     }
   2007 
   2008     private BigDecimal movePoint(long newScale) {
   2009         if (isZero()) {
   2010             return zeroScaledBy(Math.max(newScale, 0));
   2011         }
   2012         /*
   2013          * When: 'n'== Integer.MIN_VALUE isn't possible to call to
   2014          * movePointRight(-n) since -Integer.MIN_VALUE == Integer.MIN_VALUE
   2015          */
   2016         if(newScale >= 0) {
   2017             if(bitLength < 64) {
   2018                 return valueOf(smallValue, safeLongToInt(newScale));
   2019             }
   2020             return new BigDecimal(getUnscaledValue(), safeLongToInt(newScale));
   2021         }
   2022         if(-newScale < MathUtils.LONG_POWERS_OF_TEN.length &&
   2023                 bitLength + LONG_POWERS_OF_TEN_BIT_LENGTH[(int)-newScale] < 64 ) {
   2024             return valueOf(smallValue*MathUtils.LONG_POWERS_OF_TEN[(int)-newScale],0);
   2025         }
   2026         return new BigDecimal(Multiplication.multiplyByTenPow(
   2027                 getUnscaledValue(), safeLongToInt(-newScale)), 0);
   2028     }
   2029 
   2030     /**
   2031      * Returns a new {@code BigDecimal} instance where the decimal point has
   2032      * been moved {@code n} places to the right. If {@code n < 0} then the
   2033      * decimal point is moved {@code -n} places to the left.
   2034      * <p>
   2035      * The result is obtained by changing its scale. If the scale of the result
   2036      * becomes negative, then its precision is increased such that the scale is
   2037      * zero.
   2038      * <p>
   2039      * Note, that {@code movePointRight(0)} returns a result which is
   2040      * mathematically equivalent, but which has scale >= 0.
   2041      *
   2042      * @param n
   2043      *            number of placed the decimal point has to be moved.
   2044      * @return {@code this * 10^n}.
   2045      */
   2046     public BigDecimal movePointRight(int n) {
   2047         return movePoint(scale - (long)n);
   2048     }
   2049 
   2050     /**
   2051      * Returns a new {@code BigDecimal} whose value is {@code this} 10^{@code n}.
   2052      * The scale of the result is {@code this.scale()} - {@code n}.
   2053      * The precision of the result is the precision of {@code this}.
   2054      * <p>
   2055      * This method has the same effect as {@link #movePointRight}, except that
   2056      * the precision is not changed.
   2057      *
   2058      * @param n
   2059      *            number of places the decimal point has to be moved.
   2060      * @return {@code this * 10^n}
   2061      */
   2062     public BigDecimal scaleByPowerOfTen(int n) {
   2063         long newScale = scale - (long)n;
   2064         if(bitLength < 64) {
   2065             //Taking care when a 0 is to be scaled
   2066             if( smallValue==0  ){
   2067                 return zeroScaledBy( newScale );
   2068             }
   2069             return valueOf(smallValue, safeLongToInt(newScale));
   2070         }
   2071         return new BigDecimal(getUnscaledValue(), safeLongToInt(newScale));
   2072     }
   2073 
   2074     /**
   2075      * Returns a new {@code BigDecimal} instance with the same value as {@code
   2076      * this} but with a unscaled value where the trailing zeros have been
   2077      * removed. If the unscaled value of {@code this} has n trailing zeros, then
   2078      * the scale and the precision of the result has been reduced by n.
   2079      *
   2080      * @return a new {@code BigDecimal} instance equivalent to this where the
   2081      *         trailing zeros of the unscaled value have been removed.
   2082      */
   2083     public BigDecimal stripTrailingZeros() {
   2084         int i = 1; // 1 <= i <= 18
   2085         int lastPow = TEN_POW.length - 1;
   2086         long newScale = scale;
   2087 
   2088         if (isZero()) {
   2089             // Preserve RI compatibility, so BigDecimal.equals (which checks
   2090             // value *and* scale) continues to work.
   2091             return this;
   2092         }
   2093         BigInteger strippedBI = getUnscaledValue();
   2094         BigInteger[] quotAndRem;
   2095 
   2096         // while the number is even...
   2097         while (!strippedBI.testBit(0)) {
   2098             // To divide by 10^i
   2099             quotAndRem = strippedBI.divideAndRemainder(TEN_POW[i]);
   2100             // To look the remainder
   2101             if (quotAndRem[1].signum() == 0) {
   2102                 // To adjust the scale
   2103                 newScale -= i;
   2104                 if (i < lastPow) {
   2105                     // To set to the next power
   2106                     i++;
   2107                 }
   2108                 strippedBI = quotAndRem[0];
   2109             } else {
   2110                 if (i == 1) {
   2111                     // 'this' has no more trailing zeros
   2112                     break;
   2113                 }
   2114                 // To set to the smallest power of ten
   2115                 i = 1;
   2116             }
   2117         }
   2118         return new BigDecimal(strippedBI, safeLongToInt(newScale));
   2119     }
   2120 
   2121     /**
   2122      * Compares this {@code BigDecimal} with {@code val}. Returns one of the
   2123      * three values {@code 1}, {@code 0}, or {@code -1}. The method behaves as
   2124      * if {@code this.subtract(val)} is computed. If this difference is > 0 then
   2125      * 1 is returned, if the difference is < 0 then -1 is returned, and if the
   2126      * difference is 0 then 0 is returned. This means, that if two decimal
   2127      * instances are compared which are equal in value but differ in scale, then
   2128      * these two instances are considered as equal.
   2129      *
   2130      * @param val
   2131      *            value to be compared with {@code this}.
   2132      * @return {@code 1} if {@code this > val}, {@code -1} if {@code this < val},
   2133      *         {@code 0} if {@code this == val}.
   2134      * @throws NullPointerException
   2135      *             if {@code val == null}.
   2136      */
   2137     public int compareTo(BigDecimal val) {
   2138         int thisSign = signum();
   2139         int valueSign = val.signum();
   2140 
   2141         if( thisSign == valueSign) {
   2142             if(this.scale == val.scale && this.bitLength<64 && val.bitLength<64 ) {
   2143                 return (smallValue < val.smallValue) ? -1 : (smallValue > val.smallValue) ? 1 : 0;
   2144             }
   2145             long diffScale = (long)this.scale - val.scale;
   2146             int diffPrecision = this.approxPrecision() - val.approxPrecision();
   2147             if (diffPrecision > diffScale + 1) {
   2148                 return thisSign;
   2149             } else if (diffPrecision < diffScale - 1) {
   2150                 return -thisSign;
   2151             } else {// thisSign == val.signum()  and  diffPrecision is aprox. diffScale
   2152                 BigInteger thisUnscaled = this.getUnscaledValue();
   2153                 BigInteger valUnscaled = val.getUnscaledValue();
   2154                 // If any of both precision is bigger, append zeros to the shorter one
   2155                 if (diffScale < 0) {
   2156                     thisUnscaled = thisUnscaled.multiply(Multiplication.powerOf10(-diffScale));
   2157                 } else if (diffScale > 0) {
   2158                     valUnscaled = valUnscaled.multiply(Multiplication.powerOf10(diffScale));
   2159                 }
   2160                 return thisUnscaled.compareTo(valUnscaled);
   2161             }
   2162         } else if (thisSign < valueSign) {
   2163             return -1;
   2164         } else  {
   2165             return 1;
   2166         }
   2167     }
   2168 
   2169     /**
   2170      * Returns {@code true} if {@code x} is a {@code BigDecimal} instance and if
   2171      * this instance is equal to this big decimal. Two big decimals are equal if
   2172      * their unscaled value and their scale is equal. For example, 1.0
   2173      * (10*10^(-1)) is not equal to 1.00 (100*10^(-2)). Similarly, zero
   2174      * instances are not equal if their scale differs.
   2175      *
   2176      * @param x
   2177      *            object to be compared with {@code this}.
   2178      * @return true if {@code x} is a {@code BigDecimal} and {@code this == x}.
   2179      */
   2180     @Override
   2181     public boolean equals(Object x) {
   2182         if (this == x) {
   2183             return true;
   2184         }
   2185         if (x instanceof BigDecimal) {
   2186             BigDecimal x1 = (BigDecimal) x;
   2187             return x1.scale == scale
   2188                    && (bitLength < 64 ? (x1.smallValue == smallValue)
   2189                     : intVal.equals(x1.intVal));
   2190 
   2191 
   2192         }
   2193         return false;
   2194     }
   2195 
   2196     /**
   2197      * Returns the minimum of this {@code BigDecimal} and {@code val}.
   2198      *
   2199      * @param val
   2200      *            value to be used to compute the minimum with this.
   2201      * @return {@code min(this, val}.
   2202      * @throws NullPointerException
   2203      *             if {@code val == null}.
   2204      */
   2205     public BigDecimal min(BigDecimal val) {
   2206         return ((compareTo(val) <= 0) ? this : val);
   2207     }
   2208 
   2209     /**
   2210      * Returns the maximum of this {@code BigDecimal} and {@code val}.
   2211      *
   2212      * @param val
   2213      *            value to be used to compute the maximum with this.
   2214      * @return {@code max(this, val}.
   2215      * @throws NullPointerException
   2216      *             if {@code val == null}.
   2217      */
   2218     public BigDecimal max(BigDecimal val) {
   2219         return ((compareTo(val) >= 0) ? this : val);
   2220     }
   2221 
   2222     /**
   2223      * Returns a hash code for this {@code BigDecimal}.
   2224      *
   2225      * @return hash code for {@code this}.
   2226      */
   2227     @Override
   2228     public int hashCode() {
   2229         if (hashCode != 0) {
   2230             return hashCode;
   2231         }
   2232         if (bitLength < 64) {
   2233             hashCode = (int)(smallValue & 0xffffffff);
   2234             hashCode = 33 * hashCode +  (int)((smallValue >> 32) & 0xffffffff);
   2235             hashCode = 17 * hashCode + scale;
   2236             return hashCode;
   2237         }
   2238         hashCode = 17 * intVal.hashCode() + scale;
   2239         return hashCode;
   2240     }
   2241 
   2242     /**
   2243      * Returns a canonical string representation of this {@code BigDecimal}. If
   2244      * necessary, scientific notation is used. This representation always prints
   2245      * all significant digits of this value.
   2246      * <p>
   2247      * If the scale is negative or if {@code scale - precision >= 6} then
   2248      * scientific notation is used.
   2249      *
   2250      * @return a string representation of {@code this} in scientific notation if
   2251      *         necessary.
   2252      */
   2253     @Override
   2254     public String toString() {
   2255         if (toStringImage != null) {
   2256             return toStringImage;
   2257         }
   2258         if(bitLength < 32) {
   2259             toStringImage = Conversion.toDecimalScaledString(smallValue,scale);
   2260             return toStringImage;
   2261         }
   2262         String intString = getUnscaledValue().toString();
   2263         if (scale == 0) {
   2264             return intString;
   2265         }
   2266         int begin = (getUnscaledValue().signum() < 0) ? 2 : 1;
   2267         int end = intString.length();
   2268         long exponent = -(long)scale + end - begin;
   2269         StringBuilder result = new StringBuilder();
   2270 
   2271         result.append(intString);
   2272         if ((scale > 0) && (exponent >= -6)) {
   2273             if (exponent >= 0) {
   2274                 result.insert(end - scale, '.');
   2275             } else {
   2276                 result.insert(begin - 1, "0.");
   2277                 result.insert(begin + 1, CH_ZEROS, 0, -(int)exponent - 1);
   2278             }
   2279         } else {
   2280             if (end - begin >= 1) {
   2281                 result.insert(begin, '.');
   2282                 end++;
   2283             }
   2284             result.insert(end, 'E');
   2285             if (exponent > 0) {
   2286                 result.insert(++end, '+');
   2287             }
   2288             result.insert(++end, Long.toString(exponent));
   2289         }
   2290         toStringImage = result.toString();
   2291         return toStringImage;
   2292     }
   2293 
   2294     /**
   2295      * Returns a string representation of this {@code BigDecimal}. This
   2296      * representation always prints all significant digits of this value.
   2297      * <p>
   2298      * If the scale is negative or if {@code scale - precision >= 6} then
   2299      * engineering notation is used. Engineering notation is similar to the
   2300      * scientific notation except that the exponent is made to be a multiple of
   2301      * 3 such that the integer part is >= 1 and < 1000.
   2302      *
   2303      * @return a string representation of {@code this} in engineering notation
   2304      *         if necessary.
   2305      */
   2306     public String toEngineeringString() {
   2307         String intString = getUnscaledValue().toString();
   2308         if (scale == 0) {
   2309             return intString;
   2310         }
   2311         int begin = (getUnscaledValue().signum() < 0) ? 2 : 1;
   2312         int end = intString.length();
   2313         long exponent = -(long)scale + end - begin;
   2314         StringBuilder result = new StringBuilder(intString);
   2315 
   2316         if ((scale > 0) && (exponent >= -6)) {
   2317             if (exponent >= 0) {
   2318                 result.insert(end - scale, '.');
   2319             } else {
   2320                 result.insert(begin - 1, "0.");
   2321                 result.insert(begin + 1, CH_ZEROS, 0, -(int)exponent - 1);
   2322             }
   2323         } else {
   2324             int delta = end - begin;
   2325             int rem = (int)(exponent % 3);
   2326 
   2327             if (rem != 0) {
   2328                 // adjust exponent so it is a multiple of three
   2329                 if (getUnscaledValue().signum() == 0) {
   2330                     // zero value
   2331                     rem = (rem < 0) ? -rem : 3 - rem;
   2332                     exponent += rem;
   2333                 } else {
   2334                     // nonzero value
   2335                     rem = (rem < 0) ? rem + 3 : rem;
   2336                     exponent -= rem;
   2337                     begin += rem;
   2338                 }
   2339                 if (delta < 3) {
   2340                     for (int i = rem - delta; i > 0; i--) {
   2341                         result.insert(end++, '0');
   2342                     }
   2343                 }
   2344             }
   2345             if (end - begin >= 1) {
   2346                 result.insert(begin, '.');
   2347                 end++;
   2348             }
   2349             if (exponent != 0) {
   2350                 result.insert(end, 'E');
   2351                 if (exponent > 0) {
   2352                     result.insert(++end, '+');
   2353                 }
   2354                 result.insert(++end, Long.toString(exponent));
   2355             }
   2356         }
   2357         return result.toString();
   2358     }
   2359 
   2360     /**
   2361      * Returns a string representation of this {@code BigDecimal}. No scientific
   2362      * notation is used. This methods adds zeros where necessary.
   2363      * <p>
   2364      * If this string representation is used to create a new instance, this
   2365      * instance is generally not identical to {@code this} as the precision
   2366      * changes.
   2367      * <p>
   2368      * {@code x.equals(new BigDecimal(x.toPlainString())} usually returns
   2369      * {@code false}.
   2370      * <p>
   2371      * {@code x.compareTo(new BigDecimal(x.toPlainString())} returns {@code 0}.
   2372      *
   2373      * @return a string representation of {@code this} without exponent part.
   2374      */
   2375     public String toPlainString() {
   2376         String intStr = getUnscaledValue().toString();
   2377         if ((scale == 0) || ((isZero()) && (scale < 0))) {
   2378             return intStr;
   2379         }
   2380         int begin = (signum() < 0) ? 1 : 0;
   2381         int delta = scale;
   2382         // We take space for all digits, plus a possible decimal point, plus 'scale'
   2383         StringBuilder result = new StringBuilder(intStr.length() + 1 + Math.abs(scale));
   2384 
   2385         if (begin == 1) {
   2386             // If the number is negative, we insert a '-' character at front
   2387             result.append('-');
   2388         }
   2389         if (scale > 0) {
   2390             delta -= (intStr.length() - begin);
   2391             if (delta >= 0) {
   2392                 result.append("0.");
   2393                 // To append zeros after the decimal point
   2394                 for (; delta > CH_ZEROS.length; delta -= CH_ZEROS.length) {
   2395                     result.append(CH_ZEROS);
   2396                 }
   2397                 result.append(CH_ZEROS, 0, delta);
   2398                 result.append(intStr.substring(begin));
   2399             } else {
   2400                 delta = begin - delta;
   2401                 result.append(intStr.substring(begin, delta));
   2402                 result.append('.');
   2403                 result.append(intStr.substring(delta));
   2404             }
   2405         } else {// (scale <= 0)
   2406             result.append(intStr.substring(begin));
   2407             // To append trailing zeros
   2408             for (; delta < -CH_ZEROS.length; delta += CH_ZEROS.length) {
   2409                 result.append(CH_ZEROS);
   2410             }
   2411             result.append(CH_ZEROS, 0, -delta);
   2412         }
   2413         return result.toString();
   2414     }
   2415 
   2416     /**
   2417      * Returns this {@code BigDecimal} as a big integer instance. A fractional
   2418      * part is discarded.
   2419      *
   2420      * @return this {@code BigDecimal} as a big integer instance.
   2421      */
   2422     public BigInteger toBigInteger() {
   2423         if ((scale == 0) || (isZero())) {
   2424             return getUnscaledValue();
   2425         } else if (scale < 0) {
   2426             return getUnscaledValue().multiply(Multiplication.powerOf10(-(long)scale));
   2427         } else {// (scale > 0)
   2428             return getUnscaledValue().divide(Multiplication.powerOf10(scale));
   2429         }
   2430     }
   2431 
   2432     /**
   2433      * Returns this {@code BigDecimal} as a big integer instance if it has no
   2434      * fractional part. If this {@code BigDecimal} has a fractional part, i.e.
   2435      * if rounding would be necessary, an {@code ArithmeticException} is thrown.
   2436      *
   2437      * @return this {@code BigDecimal} as a big integer value.
   2438      * @throws ArithmeticException
   2439      *             if rounding is necessary.
   2440      */
   2441     public BigInteger toBigIntegerExact() {
   2442         if ((scale == 0) || (isZero())) {
   2443             return getUnscaledValue();
   2444         } else if (scale < 0) {
   2445             return getUnscaledValue().multiply(Multiplication.powerOf10(-(long)scale));
   2446         } else {// (scale > 0)
   2447             BigInteger[] integerAndFraction;
   2448             // An optimization before do a heavy division
   2449             if ((scale > approxPrecision()) || (scale > getUnscaledValue().getLowestSetBit())) {
   2450                 throw new ArithmeticException("Rounding necessary");
   2451             }
   2452             integerAndFraction = getUnscaledValue().divideAndRemainder(Multiplication.powerOf10(scale));
   2453             if (integerAndFraction[1].signum() != 0) {
   2454                 // It exists a non-zero fractional part
   2455                 throw new ArithmeticException("Rounding necessary");
   2456             }
   2457             return integerAndFraction[0];
   2458         }
   2459     }
   2460 
   2461     /**
   2462      * Returns this {@code BigDecimal} as an long value. Any fractional part is
   2463      * discarded. If the integral part of {@code this} is too big to be
   2464      * represented as an long, then {@code this} % 2^64 is returned.
   2465      *
   2466      * @return this {@code BigDecimal} as a long value.
   2467      */
   2468     @Override
   2469     public long longValue() {
   2470         /*
   2471          * If scale <= -64 there are at least 64 trailing bits zero in
   2472          * 10^(-scale). If the scale is positive and very large the long value
   2473          * could be zero.
   2474          */
   2475         return ((scale <= -64) || (scale > approxPrecision()) ? 0L
   2476                 : toBigInteger().longValue());
   2477     }
   2478 
   2479     /**
   2480      * Returns this {@code BigDecimal} as a long value if it has no fractional
   2481      * part and if its value fits to the int range ([-2^{63}..2^{63}-1]). If
   2482      * these conditions are not met, an {@code ArithmeticException} is thrown.
   2483      *
   2484      * @return this {@code BigDecimal} as a long value.
   2485      * @throws ArithmeticException
   2486      *             if rounding is necessary or the number doesn't fit in a long.
   2487      */
   2488     public long longValueExact() {
   2489         return valueExact(64);
   2490     }
   2491 
   2492     /**
   2493      * Returns this {@code BigDecimal} as an int value. Any fractional part is
   2494      * discarded. If the integral part of {@code this} is too big to be
   2495      * represented as an int, then {@code this} % 2^32 is returned.
   2496      *
   2497      * @return this {@code BigDecimal} as a int value.
   2498      */
   2499     @Override
   2500     public int intValue() {
   2501         /*
   2502          * If scale <= -32 there are at least 32 trailing bits zero in
   2503          * 10^(-scale). If the scale is positive and very large the long value
   2504          * could be zero.
   2505          */
   2506         return ((scale <= -32) || (scale > approxPrecision())
   2507         ? 0
   2508                 : toBigInteger().intValue());
   2509     }
   2510 
   2511     /**
   2512      * Returns this {@code BigDecimal} as a int value if it has no fractional
   2513      * part and if its value fits to the int range ([-2^{31}..2^{31}-1]). If
   2514      * these conditions are not met, an {@code ArithmeticException} is thrown.
   2515      *
   2516      * @return this {@code BigDecimal} as a int value.
   2517      * @throws ArithmeticException
   2518      *             if rounding is necessary or the number doesn't fit in a int.
   2519      */
   2520     public int intValueExact() {
   2521         return (int)valueExact(32);
   2522     }
   2523 
   2524     /**
   2525      * Returns this {@code BigDecimal} as a short value if it has no fractional
   2526      * part and if its value fits to the short range ([-2^{15}..2^{15}-1]). If
   2527      * these conditions are not met, an {@code ArithmeticException} is thrown.
   2528      *
   2529      * @return this {@code BigDecimal} as a short value.
   2530      * @throws ArithmeticException
   2531      *             if rounding is necessary of the number doesn't fit in a
   2532      *             short.
   2533      */
   2534     public short shortValueExact() {
   2535         return (short)valueExact(16);
   2536     }
   2537 
   2538     /**
   2539      * Returns this {@code BigDecimal} as a byte value if it has no fractional
   2540      * part and if its value fits to the byte range ([-128..127]). If these
   2541      * conditions are not met, an {@code ArithmeticException} is thrown.
   2542      *
   2543      * @return this {@code BigDecimal} as a byte value.
   2544      * @throws ArithmeticException
   2545      *             if rounding is necessary or the number doesn't fit in a byte.
   2546      */
   2547     public byte byteValueExact() {
   2548         return (byte)valueExact(8);
   2549     }
   2550 
   2551     /**
   2552      * Returns this {@code BigDecimal} as a float value. If {@code this} is too
   2553      * big to be represented as an float, then {@code Float.POSITIVE_INFINITY}
   2554      * or {@code Float.NEGATIVE_INFINITY} is returned.
   2555      * <p>
   2556      * Note, that if the unscaled value has more than 24 significant digits,
   2557      * then this decimal cannot be represented exactly in a float variable. In
   2558      * this case the result is rounded.
   2559      * <p>
   2560      * For example, if the instance {@code x1 = new BigDecimal("0.1")} cannot be
   2561      * represented exactly as a float, and thus {@code x1.equals(new
   2562      * BigDecimal(x1.folatValue())} returns {@code false} for this case.
   2563      * <p>
   2564      * Similarly, if the instance {@code new BigDecimal(16777217)} is converted
   2565      * to a float, the result is {@code 1.6777216E}7.
   2566      *
   2567      * @return this {@code BigDecimal} as a float value.
   2568      */
   2569     @Override
   2570     public float floatValue() {
   2571         /* A similar code like in doubleValue() could be repeated here,
   2572          * but this simple implementation is quite efficient. */
   2573         float floatResult = signum();
   2574         long powerOfTwo = this.bitLength - (long)(scale / LOG10_2);
   2575         if ((powerOfTwo < -149) || (floatResult == 0.0f)) {
   2576             // Cases which 'this' is very small
   2577             floatResult *= 0.0f;
   2578         } else if (powerOfTwo > 129) {
   2579             // Cases which 'this' is very large
   2580             floatResult *= Float.POSITIVE_INFINITY;
   2581         } else {
   2582             floatResult = (float)doubleValue();
   2583         }
   2584         return floatResult;
   2585     }
   2586 
   2587     /**
   2588      * Returns this {@code BigDecimal} as a double value. If {@code this} is too
   2589      * big to be represented as an float, then {@code Double.POSITIVE_INFINITY}
   2590      * or {@code Double.NEGATIVE_INFINITY} is returned.
   2591      * <p>
   2592      * Note, that if the unscaled value has more than 53 significant digits,
   2593      * then this decimal cannot be represented exactly in a double variable. In
   2594      * this case the result is rounded.
   2595      * <p>
   2596      * For example, if the instance {@code x1 = new BigDecimal("0.1")} cannot be
   2597      * represented exactly as a double, and thus {@code x1.equals(new
   2598      * BigDecimal(x1.doubleValue())} returns {@code false} for this case.
   2599      * <p>
   2600      * Similarly, if the instance {@code new BigDecimal(9007199254740993L)} is
   2601      * converted to a double, the result is {@code 9.007199254740992E15}.
   2602      * <p>
   2603      *
   2604      * @return this {@code BigDecimal} as a double value.
   2605      */
   2606     @Override
   2607     public double doubleValue() {
   2608         int sign = signum();
   2609         int exponent = 1076; // bias + 53
   2610         int lowestSetBit;
   2611         int discardedSize;
   2612         long powerOfTwo = this.bitLength - (long)(scale / LOG10_2);
   2613         long bits; // IEEE-754 Standard
   2614         long tempBits; // for temporal calculations
   2615         BigInteger mantissa;
   2616 
   2617         if ((powerOfTwo < -1074) || (sign == 0)) {
   2618             // Cases which 'this' is very small
   2619             return (sign * 0.0d);
   2620         } else if (powerOfTwo > 1025) {
   2621             // Cases which 'this' is very large
   2622             return (sign * Double.POSITIVE_INFINITY);
   2623         }
   2624         mantissa = getUnscaledValue().abs();
   2625         // Let be:  this = [u,s], with s > 0
   2626         if (scale <= 0) {
   2627             // mantissa = abs(u) * 10^s
   2628             mantissa = mantissa.multiply(Multiplication.powerOf10(-scale));
   2629         } else {// (scale > 0)
   2630             BigInteger quotAndRem[];
   2631             BigInteger powerOfTen = Multiplication.powerOf10(scale);
   2632             int k = 100 - (int)powerOfTwo;
   2633             int compRem;
   2634 
   2635             if (k > 0) {
   2636                 /* Computing (mantissa * 2^k) , where 'k' is a enough big
   2637                  * power of '2' to can divide by 10^s */
   2638                 mantissa = mantissa.shiftLeft(k);
   2639                 exponent -= k;
   2640             }
   2641             // Computing (mantissa * 2^k) / 10^s
   2642             quotAndRem = mantissa.divideAndRemainder(powerOfTen);
   2643             // To check if the fractional part >= 0.5
   2644             compRem = quotAndRem[1].shiftLeftOneBit().compareTo(powerOfTen);
   2645             // To add two rounded bits at end of mantissa
   2646             mantissa = quotAndRem[0].shiftLeft(2).add(
   2647                     BigInteger.valueOf((compRem * (compRem + 3)) / 2 + 1));
   2648             exponent -= 2;
   2649         }
   2650         lowestSetBit = mantissa.getLowestSetBit();
   2651         discardedSize = mantissa.bitLength() - 54;
   2652         if (discardedSize > 0) {// (n > 54)
   2653             // mantissa = (abs(u) * 10^s) >> (n - 54)
   2654             bits = mantissa.shiftRight(discardedSize).longValue();
   2655             tempBits = bits;
   2656             // #bits = 54, to check if the discarded fraction produces a carry
   2657             if ((((bits & 1) == 1) && (lowestSetBit < discardedSize))
   2658                     || ((bits & 3) == 3)) {
   2659                 bits += 2;
   2660             }
   2661         } else {// (n <= 54)
   2662             // mantissa = (abs(u) * 10^s) << (54 - n)
   2663             bits = mantissa.longValue() << -discardedSize;
   2664             tempBits = bits;
   2665             // #bits = 54, to check if the discarded fraction produces a carry:
   2666             if ((bits & 3) == 3) {
   2667                 bits += 2;
   2668             }
   2669         }
   2670         // Testing bit 54 to check if the carry creates a new binary digit
   2671         if ((bits & 0x40000000000000L) == 0) {
   2672             // To drop the last bit of mantissa (first discarded)
   2673             bits >>= 1;
   2674             // exponent = 2^(s-n+53+bias)
   2675             exponent += discardedSize;
   2676         } else {// #bits = 54
   2677             bits >>= 2;
   2678             exponent += discardedSize + 1;
   2679         }
   2680         // To test if the 53-bits number fits in 'double'
   2681         if (exponent > 2046) {// (exponent - bias > 1023)
   2682             return (sign * Double.POSITIVE_INFINITY);
   2683         } else if (exponent <= 0) {// (exponent - bias <= -1023)
   2684             // Denormalized numbers (having exponent == 0)
   2685             if (exponent < -53) {// exponent - bias < -1076
   2686                 return (sign * 0.0d);
   2687             }
   2688             // -1076 <= exponent - bias <= -1023
   2689             // To discard '- exponent + 1' bits
   2690             bits = tempBits >> 1;
   2691             tempBits = bits & (-1L >>> (63 + exponent));
   2692             bits >>= (-exponent );
   2693             // To test if after discard bits, a new carry is generated
   2694             if (((bits & 3) == 3) || (((bits & 1) == 1) && (tempBits != 0)
   2695             && (lowestSetBit < discardedSize))) {
   2696                 bits += 1;
   2697             }
   2698             exponent = 0;
   2699             bits >>= 1;
   2700         }
   2701         // Construct the 64 double bits: [sign(1), exponent(11), mantissa(52)]
   2702         bits = (sign & 0x8000000000000000L) | ((long)exponent << 52)
   2703                 | (bits & 0xFFFFFFFFFFFFFL);
   2704         return Double.longBitsToDouble(bits);
   2705     }
   2706 
   2707     /**
   2708      * Returns the unit in the last place (ULP) of this {@code BigDecimal}
   2709      * instance. An ULP is the distance to the nearest big decimal with the same
   2710      * precision.
   2711      * <p>
   2712      * The amount of a rounding error in the evaluation of a floating-point
   2713      * operation is often expressed in ULPs. An error of 1 ULP is often seen as
   2714      * a tolerable error.
   2715      * <p>
   2716      * For class {@code BigDecimal}, the ULP of a number is simply 10^(-scale).
   2717      * <p>
   2718      * For example, {@code new BigDecimal(0.1).ulp()} returns {@code 1E-55}.
   2719      *
   2720      * @return unit in the last place (ULP) of this {@code BigDecimal} instance.
   2721      */
   2722     public BigDecimal ulp() {
   2723         return valueOf(1, scale);
   2724     }
   2725 
   2726     /* Private Methods */
   2727 
   2728     /**
   2729      * It does all rounding work of the public method
   2730      * {@code round(MathContext)}, performing an inplace rounding
   2731      * without creating a new object.
   2732      *
   2733      * @param mc
   2734      *            the {@code MathContext} for perform the rounding.
   2735      * @see #round(MathContext)
   2736      */
   2737     private void inplaceRound(MathContext mc) {
   2738         int mcPrecision = mc.getPrecision();
   2739         if (approxPrecision() < mcPrecision || mcPrecision == 0) {
   2740             return;
   2741         }
   2742         int discardedPrecision = precision() - mcPrecision;
   2743         // If no rounding is necessary it returns immediately
   2744         if ((discardedPrecision <= 0)) {
   2745             return;
   2746         }
   2747         // When the number is small perform an efficient rounding
   2748         if (this.bitLength < 64) {
   2749             smallRound(mc, discardedPrecision);
   2750             return;
   2751         }
   2752         // Getting the integer part and the discarded fraction
   2753         BigInteger sizeOfFraction = Multiplication.powerOf10(discardedPrecision);
   2754         BigInteger[] integerAndFraction = getUnscaledValue().divideAndRemainder(sizeOfFraction);
   2755         long newScale = (long)scale - discardedPrecision;
   2756         int compRem;
   2757         BigDecimal tempBD;
   2758         // If the discarded fraction is non-zero, perform rounding
   2759         if (integerAndFraction[1].signum() != 0) {
   2760             // To check if the discarded fraction >= 0.5
   2761             compRem = (integerAndFraction[1].abs().shiftLeftOneBit().compareTo(sizeOfFraction));
   2762             // To look if there is a carry
   2763             compRem =  roundingBehavior( integerAndFraction[0].testBit(0) ? 1 : 0,
   2764                     integerAndFraction[1].signum() * (5 + compRem),
   2765                     mc.getRoundingMode());
   2766             if (compRem != 0) {
   2767                 integerAndFraction[0] = integerAndFraction[0].add(BigInteger.valueOf(compRem));
   2768             }
   2769             tempBD = new BigDecimal(integerAndFraction[0]);
   2770             // If after to add the increment the precision changed, we normalize the size
   2771             if (tempBD.precision() > mcPrecision) {
   2772                 integerAndFraction[0] = integerAndFraction[0].divide(BigInteger.TEN);
   2773                 newScale--;
   2774             }
   2775         }
   2776         // To update all internal fields
   2777         scale = safeLongToInt(newScale);
   2778         precision = mcPrecision;
   2779         setUnscaledValue(integerAndFraction[0]);
   2780     }
   2781 
   2782     private static int longCompareTo(long value1, long value2) {
   2783         return value1 > value2 ? 1 : (value1 < value2 ? -1 : 0);
   2784     }
   2785     /**
   2786      * This method implements an efficient rounding for numbers which unscaled
   2787      * value fits in the type {@code long}.
   2788      *
   2789      * @param mc
   2790      *            the context to use
   2791      * @param discardedPrecision
   2792      *            the number of decimal digits that are discarded
   2793      * @see #round(MathContext)
   2794      */
   2795     private void smallRound(MathContext mc, int discardedPrecision) {
   2796         long sizeOfFraction = MathUtils.LONG_POWERS_OF_TEN[discardedPrecision];
   2797         long newScale = (long)scale - discardedPrecision;
   2798         long unscaledVal = smallValue;
   2799         // Getting the integer part and the discarded fraction
   2800         long integer = unscaledVal / sizeOfFraction;
   2801         long fraction = unscaledVal % sizeOfFraction;
   2802         int compRem;
   2803         // If the discarded fraction is non-zero perform rounding
   2804         if (fraction != 0) {
   2805             // To check if the discarded fraction >= 0.5
   2806             compRem = longCompareTo(Math.abs(fraction) * 2, sizeOfFraction);
   2807             // To look if there is a carry
   2808             integer += roundingBehavior( ((int)integer) & 1,
   2809                     Long.signum(fraction) * (5 + compRem),
   2810                     mc.getRoundingMode());
   2811             // If after to add the increment the precision changed, we normalize the size
   2812             if (Math.log10(Math.abs(integer)) >= mc.getPrecision()) {
   2813                 integer /= 10;
   2814                 newScale--;
   2815             }
   2816         }
   2817         // To update all internal fields
   2818         scale = safeLongToInt(newScale);
   2819         precision = mc.getPrecision();
   2820         smallValue = integer;
   2821         bitLength = bitLength(integer);
   2822         intVal = null;
   2823     }
   2824 
   2825     /**
   2826      * Return an increment that can be -1,0 or 1, depending of
   2827      * {@code roundingMode}.
   2828      *
   2829      * @param parityBit
   2830      *            can be 0 or 1, it's only used in the case
   2831      *            {@code HALF_EVEN}
   2832      * @param fraction
   2833      *            the mantissa to be analyzed
   2834      * @param roundingMode
   2835      *            the type of rounding
   2836      * @return the carry propagated after rounding
   2837      */
   2838     private static int roundingBehavior(int parityBit, int fraction, RoundingMode roundingMode) {
   2839         int increment = 0; // the carry after rounding
   2840 
   2841         switch (roundingMode) {
   2842             case UNNECESSARY:
   2843                 if (fraction != 0) {
   2844                     throw new ArithmeticException("Rounding necessary");
   2845                 }
   2846                 break;
   2847             case UP:
   2848                 increment = Integer.signum(fraction);
   2849                 break;
   2850             case DOWN:
   2851                 break;
   2852             case CEILING:
   2853                 increment = Math.max(Integer.signum(fraction), 0);
   2854                 break;
   2855             case FLOOR:
   2856                 increment = Math.min(Integer.signum(fraction), 0);
   2857                 break;
   2858             case HALF_UP:
   2859                 if (Math.abs(fraction) >= 5) {
   2860                     increment = Integer.signum(fraction);
   2861                 }
   2862                 break;
   2863             case HALF_DOWN:
   2864                 if (Math.abs(fraction) > 5) {
   2865                     increment = Integer.signum(fraction);
   2866                 }
   2867                 break;
   2868             case HALF_EVEN:
   2869                 if (Math.abs(fraction) + parityBit > 5) {
   2870                     increment = Integer.signum(fraction);
   2871                 }
   2872                 break;
   2873         }
   2874         return increment;
   2875     }
   2876 
   2877     /**
   2878      * If {@code intVal} has a fractional part throws an exception,
   2879      * otherwise it counts the number of bits of value and checks if it's out of
   2880      * the range of the primitive type. If the number fits in the primitive type
   2881      * returns this number as {@code long}, otherwise throws an
   2882      * exception.
   2883      *
   2884      * @param bitLengthOfType
   2885      *            number of bits of the type whose value will be calculated
   2886      *            exactly
   2887      * @return the exact value of the integer part of {@code BigDecimal}
   2888      *         when is possible
   2889      * @throws ArithmeticException when rounding is necessary or the
   2890      *             number don't fit in the primitive type
   2891      */
   2892     private long valueExact(int bitLengthOfType) {
   2893         BigInteger bigInteger = toBigIntegerExact();
   2894 
   2895         if (bigInteger.bitLength() < bitLengthOfType) {
   2896             // It fits in the primitive type
   2897             return bigInteger.longValue();
   2898         }
   2899         throw new ArithmeticException("Rounding necessary");
   2900     }
   2901 
   2902     /**
   2903      * If the precision already was calculated it returns that value, otherwise
   2904      * it calculates a very good approximation efficiently . Note that this
   2905      * value will be {@code precision()} or {@code precision()-1}
   2906      * in the worst case.
   2907      *
   2908      * @return an approximation of {@code precision()} value
   2909      */
   2910     private int approxPrecision() {
   2911         return precision > 0
   2912                 ? precision
   2913                 : (int) ((this.bitLength - 1) * LOG10_2) + 1;
   2914     }
   2915 
   2916     private static int safeLongToInt(long longValue) {
   2917         if (longValue < Integer.MIN_VALUE || longValue > Integer.MAX_VALUE) {
   2918             throw new ArithmeticException("Out of int range: " + longValue);
   2919         }
   2920         return (int) longValue;
   2921     }
   2922 
   2923     /**
   2924      * It returns the value 0 with the most approximated scale of type
   2925      * {@code int}. if {@code longScale > Integer.MAX_VALUE} the
   2926      * scale will be {@code Integer.MAX_VALUE}; if
   2927      * {@code longScale < Integer.MIN_VALUE} the scale will be
   2928      * {@code Integer.MIN_VALUE}; otherwise {@code longScale} is
   2929      * casted to the type {@code int}.
   2930      *
   2931      * @param longScale
   2932      *            the scale to which the value 0 will be scaled.
   2933      * @return the value 0 scaled by the closer scale of type {@code int}.
   2934      * @see #scale
   2935      */
   2936     private static BigDecimal zeroScaledBy(long longScale) {
   2937         if (longScale == (int) longScale) {
   2938             return valueOf(0,(int)longScale);
   2939             }
   2940         if (longScale >= 0) {
   2941             return new BigDecimal( 0, Integer.MAX_VALUE);
   2942         }
   2943         return new BigDecimal( 0, Integer.MIN_VALUE);
   2944     }
   2945 
   2946     /**
   2947      * Assigns all transient fields upon deserialization of a
   2948      * {@code BigDecimal} instance (bitLength and smallValue). The transient
   2949      * field precision is assigned lazily.
   2950      */
   2951     private void readObject(ObjectInputStream in) throws IOException,
   2952             ClassNotFoundException {
   2953         in.defaultReadObject();
   2954 
   2955         this.bitLength = intVal.bitLength();
   2956         if (this.bitLength < 64) {
   2957             this.smallValue = intVal.longValue();
   2958         }
   2959     }
   2960 
   2961     /**
   2962      * Prepares this {@code BigDecimal} for serialization, i.e. the
   2963      * non-transient field {@code intVal} is assigned.
   2964      */
   2965     private void writeObject(ObjectOutputStream out) throws IOException {
   2966         getUnscaledValue();
   2967         out.defaultWriteObject();
   2968     }
   2969 
   2970     private BigInteger getUnscaledValue() {
   2971         if(intVal == null) {
   2972             intVal = BigInteger.valueOf(smallValue);
   2973         }
   2974         return intVal;
   2975     }
   2976 
   2977     private void setUnscaledValue(BigInteger unscaledValue) {
   2978         this.intVal = unscaledValue;
   2979         this.bitLength = unscaledValue.bitLength();
   2980         if(this.bitLength < 64) {
   2981             this.smallValue = unscaledValue.longValue();
   2982         }
   2983     }
   2984 
   2985     private static int bitLength(long smallValue) {
   2986         if(smallValue < 0) {
   2987             smallValue = ~smallValue;
   2988         }
   2989         return 64 - Long.numberOfLeadingZeros(smallValue);
   2990     }
   2991 
   2992     private static int bitLength(int smallValue) {
   2993         if(smallValue < 0) {
   2994             smallValue = ~smallValue;
   2995         }
   2996         return 32 - Integer.numberOfLeadingZeros(smallValue);
   2997     }
   2998 
   2999 }
   3000