The following loop in the java.math.BigDecimal(double val, MathContext mc) 
constructor is inefficient:
        while ((significand & 1) == 0) { // i.e., significand is even
            significand >>= 1;
            exponent++;
        }

Here is a more efficient alternative using Long.numberOfTrailingZeros:
        final int numOfTrailingZerosInSignificand =
            Long.numberOfTrailingZeros(significand);
        significand >>= numOfTrailingZerosInSignificand;
        exponent += numOfTrailingZerosInSignificand;

Reply via email to