Revert r7351 due to test failures.
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7359 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/i18n/client/NumberFormat.java b/user/src/com/google/gwt/i18n/client/NumberFormat.java
index 7f543a4..7b2ba5c 100644
--- a/user/src/com/google/gwt/i18n/client/NumberFormat.java
+++ b/user/src/com/google/gwt/i18n/client/NumberFormat.java
@@ -15,11 +15,9 @@
*/
package com.google.gwt.i18n.client;
+import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.constants.NumberConstants;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
/**
* Formats and parses numbers using locale-sensitive patterns.
*
@@ -351,7 +349,7 @@
public static boolean forcedLatinDigits() {
return defaultNumberConstants != localizedNumberConstants;
}
-
+
/**
* Provides the standard currency format for the default locale.
*
@@ -365,7 +363,7 @@
}
return cachedCurrencyFormat;
}
-
+
/**
* Provides the standard currency format for the default locale using a
* specified currency.
@@ -378,7 +376,7 @@
return new NumberFormat(defaultNumberConstants.currencyPattern(),
currencyData, false);
}
-
+
/**
* Provides the standard currency format for the default locale using a
* specified currency.
@@ -611,47 +609,6 @@
}
/**
- * Appends a scaled string representation to a buffer, returning the scale
- * (which is the number of places to the right of the end of the string the
- * decimal point should be moved -- i.e., 3.5 would be added to the buffer
- * as "35" and a returned scale of -1).
- *
- * @param buf
- * @param val
- * @return scale to apply to the result
- */
- // @VisibleForTesting
- static int toScaledString(StringBuilder buf, double val) {
- int startLen = buf.length();
- buf.append(toPrecision(val, 20));
- int scale = 0;
-
- // remove exponent if present, adjusting scale
- int expIdx = buf.indexOf("e", startLen);
- if (expIdx < 0) {
- expIdx = buf.indexOf("E", startLen);
- }
- if (expIdx >= 0) {
- int expDigits = expIdx + 1;
- if (expDigits < buf.length() && buf.charAt(expDigits) == '+') {
- ++expDigits;
- }
- if (expDigits < buf.length()) {
- scale = Integer.parseInt(buf.substring(expDigits));
- }
- buf.delete(expIdx, buf.length());
- }
-
- // remove decimal point if present, adjusting scale
- int dot = buf.indexOf(".", startLen);
- if (dot >= 0) {
- buf.deleteCharAt(dot);
- scale -= buf.length() - dot;
- }
- return scale;
- }
-
- /**
* Lookup a currency code.
*
* @param currencyCode ISO4217 currency code
@@ -668,43 +625,26 @@
return currencyData;
}
- /**
- * Convert a double to a string with {@code digits} precision. The resulting
- * string may still be in exponential notation.
- *
- * @param d double value
- * @param digits number of digits of precision to include
- * @return non-localized string representation of {@code d}
- */
- private static native String toPrecision(double d, int digits) /*-{
- return d.toPrecision(digits);
+ private static native String toFixed(double d, int digits) /*-{
+ return d.toFixed(digits);
}-*/;
- /**
- * The currency code.
- */
+ // The currency code.
private final String currencyCode;
- /**
- * Currency symbol to use.
- */
+ // Currency setting.
private final String currencySymbol;
- /**
- * Forces the decimal separator to always appear in a formatted number.
- */
+ // Forces the decimal separator to always appear in a formatted number.
private boolean decimalSeparatorAlwaysShown = false;
- /**
- * The number of digits between grouping separators in the integer portion of
- * a number.
- */
+ // The number of digits between grouping separators in the integer
+ // portion of a number.
private int groupingSize = 3;
-
+
private boolean isCurrencyFormat = false;
-
+
private int maximumFractionDigits = 3; // invariant, >= minFractionDigits.
-
private int maximumIntegerDigits = 40;
private int minExponentDigits;
private int minimumFractionDigits = 0;
@@ -731,24 +671,6 @@
private boolean useExponentialNotation = false;
/**
- * Holds the current exponent during one call to
- * {@link #format(boolean, StringBuilder, int)}.
- */
- private transient int exponent;
-
- /**
- * Holds the current decimal position during one call to
- * {@link #format(boolean, StringBuilder, int)}.
- */
- private transient int decimalPosition;
-
- /**
- * Holds the current digits length during one call to
- * {@link #format(boolean, StringBuilder, int)}.
- */
- private transient int digitsLength;
-
- /**
* Constructs a format object based on the specified settings.
*
* @param numberConstants the locale-specific number constants to use for this
@@ -797,75 +719,33 @@
* @return the formatted number string
*/
public String format(double number) {
+ StringBuffer result = new StringBuffer();
+
if (Double.isNaN(number)) {
- return numberConstants.notANumber();
+ result.append(numberConstants.notANumber());
+ return result.toString();
}
- boolean isNegative = ((number < 0.0)
- || (number == 0.0 && 1 / number < 0.0));
- if (isNegative) {
- number = -number;
- }
- StringBuilder buf = new StringBuilder();
+
+ boolean isNegative = ((number < 0.0) || (number == 0.0 && 1 / number < 0.0));
+
+ result.append(isNegative ? negativePrefix : positivePrefix);
if (Double.isInfinite(number)) {
- buf.append(isNegative ? negativePrefix : positivePrefix);
- buf.append(numberConstants.infinity());
- buf.append(isNegative ? negativeSuffix : positiveSuffix);
- return buf.toString();
- }
- number *= multiplier;
- int scale = toScaledString(buf, number);
-
- // pre-round value to deal with .15 being represented as .149999... etc
- // check at 3 more digits than will be required in the output
- int preRound = buf.length() + scale + maximumFractionDigits + 3;
- if (preRound > 0 && preRound < buf.length()
- && buf.charAt(preRound) == '9') {
- propagateCarry(buf, preRound - 1);
- scale += buf.length() - preRound;
- buf.delete(preRound, buf.length());
- }
-
- format(isNegative, buf, scale);
- return buf.toString();
- }
-
- /**
- * This method formats a Number to produce a string.
- * <p>
- * Any {@link Number} which is not a {@link BigDecimal}, {@link BigInteger},
- * or {@link Long} instance is formatted as a {@code double} value.
- *
- * @param number The Number instance to format
- * @return the formatted number string
- */
- public String format(Number number) {
- if (number instanceof BigDecimal) {
- BigDecimal bigDec = (BigDecimal) number;
- boolean isNegative = bigDec.signum() < 0;
- if (isNegative) {
- bigDec = bigDec.negate();
- }
- bigDec = bigDec.multiply(BigDecimal.valueOf(multiplier));
- StringBuilder buf = new StringBuilder();
- buf.append(bigDec.unscaledValue().toString());
- format(isNegative, buf, -bigDec.scale());
- return buf.toString();
- } else if (number instanceof BigInteger) {
- BigInteger bigInt = (BigInteger) number;
- boolean isNegative = bigInt.signum() < 0;
- if (isNegative) {
- bigInt = bigInt.negate();
- }
- bigInt = bigInt.multiply(BigInteger.valueOf(multiplier));
- StringBuilder buf = new StringBuilder();
- buf.append(bigInt.toString());
- format(isNegative, buf, 0);
- return buf.toString();
- } else if (number instanceof Long) {
- return format(number.longValue(), 0);
+ result.append(numberConstants.infinity());
} else {
- return format(number.doubleValue());
+ if (isNegative) {
+ number = -number;
+ }
+ number *= multiplier;
+ if (useExponentialNotation) {
+ subformatExponential(number, result);
+ } else {
+ subformatFixed(number, result, minimumIntegerDigits);
+ }
}
+
+ result.append(isNegative ? negativeSuffix : positiveSuffix);
+
+ return result.toString();
}
/**
@@ -983,294 +863,56 @@
return ret;
}
- /**
- * Format a number with its significant digits already represented in string
- * form. This is done so both double and BigInteger/Decimal formatting can
- * share code without requiring all users to pay the code size penalty for
- * BigDecimal/etc.
- * <p>
- * Example values passed in:
- * <ul>
- * <li>-13e2
- * <br>{@code isNegative=true, digits="13", scale=2}
- * <li>3.14158
- * <br>{@code isNegative=false, digits="314158", scale=-5}
- * <li>.0001
- * <br>{@code isNegative=false, digits="1" ("0001" would be ok), scale=-4}
- * </ul>
- *
- * @param isNegative true if the value to be formatted is negative
- * @param digits a StringBuilder containing just the significant digits in
- * the value to be formatted, the formatted result will be left here
- * @param scale the number of places to the right the decimal point should
- * be moved in the digit string -- negative means the value contains
- * fractional digits
- */
- protected void format(boolean isNegative, StringBuilder digits, int scale) {
- char decimalSeparator;
- char groupingSeparator;
- if (isCurrencyFormat) {
- decimalSeparator = numberConstants.monetarySeparator().charAt(0);
- groupingSeparator = numberConstants.monetaryGroupingSeparator().charAt(0);
- } else {
- decimalSeparator = numberConstants.decimalSeparator().charAt(0);
- groupingSeparator = numberConstants.groupingSeparator().charAt(0);
- }
-
- // Set these transient fields, which will be adjusted/used by the routines
- // called in this method.
- exponent = 0;
- digitsLength = digits.length();
- decimalPosition = digitsLength + scale;
-
- boolean useExponent = this.useExponentialNotation;
- int currentGroupingSize = this.groupingSize;
- if (decimalPosition > 1024) {
- // force really large numbers to be in exponential form
- useExponent = true;
- }
-
- if (useExponent) {
- computeExponent(digits);
- }
- processLeadingZeros(digits);
- roundValue(digits);
- insertGroupingSeparators(digits, groupingSeparator, currentGroupingSize);
- adjustFractionDigits(digits);
- addZeroAndDecimal(digits, decimalSeparator);
- if (useExponent) {
- addExponent(digits);
- // the above call has invalidated digitsLength == digits.length()
- }
- char zeroChar = numberConstants.zeroDigit().charAt(0);
- if (zeroChar != '0') {
- localizeDigits(digits, zeroChar);
- }
-
- // add prefix/suffix
- digits.insert(0, isNegative ? negativePrefix : positivePrefix);
- digits.append(isNegative ? negativeSuffix : positiveSuffix);
- }
-
- /**
- * Parses text to produce a numeric value. A {@link NumberFormatException} is
- * thrown if either the text is empty or if the parse does not consume all
- * characters of the text.
- *
- * param text the string to be parsed
- * return a parsed number value, which may be a Double, BigInteger, or
- * BigDecimal, or {@code Double(0.0)} if the parse fails.
- * throws NumberFormatException if the text segment could not be converted
- * into a number
- */
-// public Number parseBig(String text) throws NumberFormatException {
-// // TODO(jat): implement
-// return Double.valueOf(parse(text));
-// }
-
- /**
- * Parses text to produce a numeric value.
- *
- * <p>
- * The method attempts to parse text starting at the index given by pos. If
- * parsing succeeds, then the index of <code>pos</code> is updated to the
- * index after the last character used (parsing does not necessarily use all
- * characters up to the end of the string), and the parsed number is returned.
- * The updated <code>pos</code> can be used to indicate the starting point
- * for the next call to this method. If an error occurs, then the index of
- * <code>pos</code> is not changed.
- * </p>
- *
- * param text the string to be parsed
- * pparam inOutPos position to pass in and get back
- * return a parsed number value, which may be a Double, BigInteger, or
- * BigDecimal, or {@code Double(0.0)} if the parse fails.
- * throws NumberFormatException if the text segment could not be converted
- * into a number
- */
-// public Number parseBig(String text, int[] inOutPos)
-// throws NumberFormatException {
-// // TODO(jat): implement
-// return Double.valueOf(parse(text, inOutPos));
-// }
-
- /**
- * Format a possibly scaled long value.
- *
- * @param value value to format
- * @param scale the number of places to the right the decimal point should
- * be moved in the digit string -- negative means the value contains
- * fractional digits
- * @return formatted value
- */
- protected String format(long value, int scale) {
- boolean isNegative = value < 0;
- if (isNegative) {
- value = -value;
- }
- value *= multiplier;
- StringBuilder buf = new StringBuilder();
- buf.append(String.valueOf(value));
- format(isNegative, buf, scale);
- return buf.toString();
- }
-
- /**
- * @return the number of digits between grouping separators in the integer
- * portion of a number.
- */
protected int getGroupingSize() {
return groupingSize;
}
- /**
- * @return the prefix to use for negative values.
- */
protected String getNegativePrefix() {
return negativePrefix;
}
- /**
- * @return the suffix to use for negative values.
- */
protected String getNegativeSuffix() {
return negativeSuffix;
}
- /**
- * @return the NumberConstants instance for this formatter.
- */
protected NumberConstants getNumberConstants() {
return numberConstants;
}
- /**
- * @return the prefix to use for positive values.
- */
protected String getPositivePrefix() {
return positivePrefix;
}
- /**
- * @return the suffix to use for positive values.
- */
protected String getPositiveSuffix() {
return positiveSuffix;
}
- /**
- * @return true if the decimal separator should always be shown.
- */
protected boolean isDecimalSeparatorAlwaysShown() {
return decimalSeparatorAlwaysShown;
}
/**
- * Add exponent suffix.
+ * This method formats the exponent part of a double.
*
- * @param digits
+ * @param exponent exponential value
+ * @param result formatted exponential part will be append to it
*/
- private void addExponent(StringBuilder digits) {
- digits.append(numberConstants.exponentialSymbol());
+ private void addExponentPart(int exponent, StringBuffer result) {
+ result.append(numberConstants.exponentialSymbol());
+
if (exponent < 0) {
exponent = -exponent;
- digits.append(numberConstants.minusSign());
+ result.append(numberConstants.minusSign());
}
+
String exponentDigits = String.valueOf(exponent);
- for (int i = exponentDigits.length(); i < minExponentDigits; ++i) {
- digits.append('0');
+ int len = exponentDigits.length();
+ for (int i = len; i < minExponentDigits; ++i) {
+ result.append(numberConstants.zeroDigit());
}
- digits.append(exponentDigits);
- }
-
- /**
- * @param digits
- * @param decimalSeparator
- */
- private void addZeroAndDecimal(StringBuilder digits, char decimalSeparator) {
- // add zero and decimal point if required
- if (digitsLength == 0) {
- digits.insert(0, '0');
- ++decimalPosition;
- ++digitsLength;
- }
- if (decimalPosition < digitsLength || decimalSeparatorAlwaysShown) {
- digits.insert(decimalPosition, decimalSeparator);
- ++digitsLength;
- }
- }
-
- /**
- * Adjust the fraction digits, adding trailing zeroes if necessary or removing
- * excess trailing zeroes.
- *
- * @param digits
- */
- private void adjustFractionDigits(StringBuilder digits) {
- // adjust fraction digits as required
- int requiredDigits = decimalPosition + minimumFractionDigits;
- if (digitsLength < requiredDigits) {
- // add trailing zeros
- while (digitsLength < requiredDigits) {
- digits.append('0');
- ++digitsLength;
- }
- } else {
- // remove excess trailing zeros
- int toRemove = decimalPosition + maximumFractionDigits;
- if (toRemove > digitsLength) {
- toRemove = digitsLength;
- }
- while (toRemove > requiredDigits
- && digits.charAt(toRemove - 1) == '0') {
- --toRemove;
- }
- if (toRemove < digitsLength) {
- digits.delete(toRemove, digitsLength);
- digitsLength = toRemove;
- }
- }
- }
-
- /**
- * Compute the exponent to use and adjust decimal position if we are using
- * exponential notation.
- *
- * @param digits
- */
- private void computeExponent(StringBuilder digits) {
- // always trim leading zeros
- int strip = 0;
- while (strip < digitsLength - 1 && digits.charAt(strip) == '0') {
- ++strip;
- }
- if (strip > 0) {
- digits.delete(0, strip);
- digitsLength -= strip;
- exponent -= strip;
- }
-
- // decimal should wind up between minimum & maximumIntegerDigits
- if (maximumIntegerDigits > minimumIntegerDigits
- && maximumIntegerDigits > 0) {
- // in this case, the exponent should be a multiple of
- // maximumIntegerDigits and 1 <= decimal <= maximumIntegerDigits
- exponent += decimalPosition - 1;
- int remainder = exponent % maximumIntegerDigits;
- if (remainder < 0) {
- remainder += maximumIntegerDigits;
- }
- decimalPosition = remainder + 1;
- exponent -= remainder;
- } else {
- exponent += decimalPosition - minimumIntegerDigits;
- decimalPosition = minimumIntegerDigits;
- }
-
- // special-case 0 to have an exponent of 0
- if (digitsLength == 1 && digits.charAt(0) == '0') {
- exponent = 0;
- decimalPosition = minimumIntegerDigits;
+ int zeroDelta = numberConstants.zeroDigit().charAt(0) - '0';
+ for (int i = 0; i < len; ++i) {
+ result.append((char) (exponentDigits.charAt(i) + zeroDelta));
}
}
@@ -1291,41 +933,47 @@
}
/**
- * Insert grouping separators if needed.
- *
- * @param digits
- * @param groupingSeparator
- * @param g
- */
- private void insertGroupingSeparators(StringBuilder digits,
- char groupingSeparator, int g) {
- if (g > 0) {
- for (int i = g; i < decimalPosition; i += g + 1) {
- digits.insert(decimalPosition - i, groupingSeparator);
- ++decimalPosition;
- ++digitsLength;
- }
- }
- }
-
- /**
- * Replace locale-independent digits with locale-specific ones.
+ * This does the work of String.valueOf(long), but given a double as input
+ * and avoiding our emulated longs. Contrasted with String.valueOf(double),
+ * it ensures (a) there will be no trailing .0, and (b) unwinds E-notation.
*
- * @param digits StringBuilder containing formatted number
- * @param zero locale-specific zero character -- the rest of the digits must
- * be consecutive
+ * @param number the integral value to convert
+ * @return the string representing that integer
*/
- private void localizeDigits(StringBuilder digits, char zero) {
- // don't use digitsLength since we may have added an exponent
- int n = digits.length();
- for (int i = 0; i < n; ++i) {
- char ch = digits.charAt(i);
- if (ch >= '0' && ch <= '9') {
- digits.setCharAt(i, (char) (ch - '0' + zero));
- }
+ private String makeIntString(double number) {
+ String intPart = String.valueOf(number);
+ if (GWT.isScript()) {
+ return intPart; // JavaScript does the right thing for integral doubles
}
- }
+ // ...but bytecode (hosted mode) does not... String.valueOf(double) will
+ // either end in .0 (non internationalized) which we don't want but is
+ // easy, or, for large numbers, it will be E-notation, which is annoying.
+ int digitLen = intPart.length();
+
+ if (intPart.charAt(digitLen - 2) == '.') {
+ return intPart.substring(0, digitLen - 2);
+ }
+ // if we have E notation, (1) the exponent will be positive (else
+ // intValue is 0, which doesn't need E notation), and (2) there will
+ // be a radix dot (String.valueOf() isn't interationalized)
+ int radix = intPart.indexOf('.');
+ int exp = intPart.indexOf('E');
+ int digits = 0;
+ for (int i = exp + 1; i < intPart.length(); i++) {
+ digits = digits * 10 + (intPart.charAt(i) - '0');
+ }
+ digits++; // exp of zero is one int digit...
+ StringBuffer newIntPart = new StringBuffer();
+ newIntPart.append(intPart.substring(0, radix));
+ newIntPart.append(intPart.substring(radix + 1, exp));
+ while (newIntPart.length() < digits) {
+ newIntPart.append('0');
+ }
+ newIntPart.setLength(digits);
+ return newIntPart.toString();
+ }
+
/**
* This method parses affix part of pattern.
*
@@ -1653,87 +1301,141 @@
return pos - start;
}
-
+
/**
- * Remove excess leading zeros or add some if we don't have enough.
+ * This method formats a <code>double</code> in exponential format.
*
- * @param digits
+ * @param number value need to be formated
+ * @param result where the formatted string goes
*/
- private void processLeadingZeros(StringBuilder digits) {
- // make sure we have enough trailing zeros
- if (decimalPosition > digitsLength) {
- while (digitsLength < decimalPosition) {
- digits.append('0');
- ++digitsLength;
- }
+ private void subformatExponential(double number, StringBuffer result) {
+ if (number == 0.0) {
+ subformatFixed(number, result, minimumIntegerDigits);
+ addExponentPart(0, result);
+ return;
}
- if (!useExponentialNotation) {
- // make sure we have the right number of leading zeros
- if (decimalPosition < minimumIntegerDigits) {
- // add leading zeros
- StringBuilder prefix = new StringBuilder();
- while (decimalPosition < minimumIntegerDigits) {
- prefix.append('0');
- ++decimalPosition;
- ++digitsLength;
- }
- digits.insert(0, prefix);
- } else if (decimalPosition > minimumIntegerDigits) {
- // trim excess leading zeros
- int strip = decimalPosition - minimumIntegerDigits;
- for (int i = 0; i < strip; ++i) {
- if (digits.charAt(i) != '0') {
- strip = i;
- break;
- }
- }
- if (strip > 0) {
- digits.delete(0, strip);
- digitsLength -= strip;
- decimalPosition -= strip;
- }
- }
- }
- }
+ int exponent = (int) Math.floor(Math.log(number) / Math.log(10));
+ number /= Math.pow(10, exponent);
- /**
- * Propagate a carry from incrementing the {@code i+1}'th digit.
- *
- * @param digits
- * @param i digit to start incrementing
- */
- private void propagateCarry(StringBuilder digits, int i) {
- boolean carry = true;
- while (carry && i >= 0) {
- char digit = digits.charAt(i);
- if (digit == '9') {
- // set this to zero and keep going
- digits.setCharAt(i--, '0');
+ int minIntDigits = minimumIntegerDigits;
+ if (maximumIntegerDigits > 1 && maximumIntegerDigits > minimumIntegerDigits) {
+ // A repeating range is defined; adjust to it as follows.
+ // If repeat == 3, we have 6,5,4=>3; 3,2,1=>0; 0,-1,-2=>-3;
+ // -3,-4,-5=>-6, etc. This takes into account that the
+ // exponent we have here is off by one from what we expect;
+ // it is for the format 0.MMMMMx10^n.
+ while ((exponent % maximumIntegerDigits) != 0) {
+ number *= 10;
+ exponent--;
+ }
+ minIntDigits = 1;
+ } else {
+ // No repeating range is defined; use minimum integer digits.
+ if (minimumIntegerDigits < 1) {
+ exponent++;
+ number /= 10;
} else {
- digits.setCharAt(i, (char) (digit + 1));
- carry = false;
+ for (int i = 1; i < minimumIntegerDigits; i++) {
+ exponent--;
+ number *= 10;
+ }
}
}
- if (carry) {
- // ran off the front, prepend a 1
- digits.insert(0, '1');
- ++decimalPosition;
- ++digitsLength;
- }
+
+ subformatFixed(number, result, minIntDigits);
+ addExponentPart(exponent, result);
}
/**
- * Round the value at the requested place, propagating any carry backward.
+ * This method formats a <code>double</code> into a fractional
+ * representation.
*
- * @param digits
+ * @param number value need to be formated
+ * @param result result will be written here
+ * @param minIntDigits minimum integer digits
*/
- private void roundValue(StringBuilder digits) {
- // TODO(jat): other rounding modes?
- if (digitsLength > decimalPosition + maximumFractionDigits
- && digits.charAt(decimalPosition + maximumFractionDigits) >= '5') {
- int i = decimalPosition + maximumFractionDigits - 1;
- propagateCarry(digits, i);
+ private void subformatFixed(double number, StringBuffer result,
+ int minIntDigits) {
+ double power = Math.pow(10, maximumFractionDigits);
+ // Use 3 extra digits to allow us to do our own rounding since
+ // Java rounds up on .5 whereas some browsers might use 'round to even'
+ // or other rules.
+
+ // There are cases where more digits would be required to get
+ // guaranteed results, but this at least makes such cases rarer.
+ String fixedString = toFixed(number, maximumFractionDigits + 3);
+
+ double intValue = 0, fracValue = 0;
+ int exponentIndex = fixedString.indexOf('e');
+ if (exponentIndex != -1) {
+ // Large numbers may be returned in exponential notation: such numbers
+ // are integers anyway
+ intValue = Math.floor(number);
+ } else {
+ int decimalIndex = fixedString.indexOf('.');
+ int len = fixedString.length();
+ if (decimalIndex == -1) {
+ decimalIndex = len;
+ }
+ if (decimalIndex > 0) {
+ intValue = Double.parseDouble(fixedString.substring(0, decimalIndex));
+ }
+ if (decimalIndex < len - 1) {
+ fracValue = Double.parseDouble(fixedString.substring(decimalIndex + 1));
+ fracValue = (((int) fracValue) + 500) / 1000;
+ if (fracValue >= power) {
+ fracValue -= power;
+ intValue++;
+ }
+ }
+ }
+
+ boolean fractionPresent = (minimumFractionDigits > 0) || (fracValue > 0);
+
+ String intPart = makeIntString(intValue);
+ String grouping = isCurrencyFormat
+ ? numberConstants.monetaryGroupingSeparator()
+ : numberConstants.groupingSeparator();
+ String decimal = isCurrencyFormat ? numberConstants.monetarySeparator()
+ : numberConstants.decimalSeparator();
+
+ int zeroDelta = numberConstants.zeroDigit().charAt(0) - '0';
+ int digitLen = intPart.length();
+
+ if (intValue > 0 || minIntDigits > 0) {
+ for (int i = digitLen; i < minIntDigits; i++) {
+ result.append(numberConstants.zeroDigit());
+ }
+
+ for (int i = 0; i < digitLen; i++) {
+ result.append((char) (intPart.charAt(i) + zeroDelta));
+
+ if (digitLen - i > 1 && groupingSize > 0
+ && ((digitLen - i) % groupingSize == 1)) {
+ result.append(grouping);
+ }
+ }
+ } else if (!fractionPresent) {
+ // If there is no fraction present, and we haven't printed any
+ // integer digits, then print a zero.
+ result.append(numberConstants.zeroDigit());
+ }
+
+ // Output the decimal separator if we always do so.
+ if (decimalSeparatorAlwaysShown || fractionPresent) {
+ result.append(decimal);
+ }
+
+ // To make sure it lead zero will be kept.
+ String fracPart = makeIntString(Math.floor(fracValue + power + 0.5d));
+ int fracLen = fracPart.length();
+ while (fracPart.charAt(fracLen - 1) == '0' && fracLen > minimumFractionDigits + 1) {
+ fracLen--;
+ }
+
+ for (int i = 1; i < fracLen; i++) {
+ result.append((char) (fracPart.charAt(i) + zeroDelta));
}
}
}
diff --git a/user/src/com/google/gwt/i18n/rebind/MessagesMethodCreator.java b/user/src/com/google/gwt/i18n/rebind/MessagesMethodCreator.java
index 80975fc..a360356 100644
--- a/user/src/com/google/gwt/i18n/rebind/MessagesMethodCreator.java
+++ b/user/src/com/google/gwt/i18n/rebind/MessagesMethodCreator.java
@@ -83,23 +83,7 @@
public String format(StringGenerator out, String subformat, String argName,
JType argType) {
JPrimitiveType argPrimType = argType.isPrimitive();
- if (argPrimType != null) {
- if (argPrimType == JPrimitiveType.BOOLEAN
- || argPrimType == JPrimitiveType.VOID) {
- return "Illegal argument type for number format";
- }
- } else {
- JClassType classType = argType.isClass();
- if (classType == null) {
- return "Unexpected argument type for number format";
- }
- TypeOracle oracle = classType.getOracle();
- JClassType numberType = oracle.findType("java.lang.Number");
- if (!classType.isAssignableTo(numberType)) {
- return "Only Number subclasses may be formatted as a number";
- }
- }
- if (argPrimType == JPrimitiveType.BOOLEAN
+ if (argPrimType == null || argPrimType == JPrimitiveType.BOOLEAN
|| argPrimType == JPrimitiveType.VOID) {
return "Illegal argument type for number format";
}
diff --git a/user/src/com/google/gwt/user/client/rpc/core/java/math/BigDecimal_CustomFieldSerializer.java b/user/src/com/google/gwt/user/client/rpc/core/java/math/BigDecimal_CustomFieldSerializer.java
deleted file mode 100644
index 8bd01ee..0000000
--- a/user/src/com/google/gwt/user/client/rpc/core/java/math/BigDecimal_CustomFieldSerializer.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-/*
- * author Richard Zschech
- */
-package com.google.gwt.user.client.rpc.core.java.math;
-
-import com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-import java.math.BigDecimal;
-
-/**
- * Custom field serializer for BigDecimal.
- */
-public class BigDecimal_CustomFieldSerializer {
-
- public static void deserialize(SerializationStreamReader streamReader,
- BigDecimal instance) {
- }
-
- public static BigDecimal instantiate(SerializationStreamReader streamReader)
- throws SerializationException {
- return new BigDecimal(streamReader.readString());
- }
-
- public static void serialize(SerializationStreamWriter streamWriter,
- BigDecimal instance) throws SerializationException {
- streamWriter.writeString(instance.toString());
- }
-}
diff --git a/user/src/com/google/gwt/user/client/rpc/core/java/math/BigInteger_CustomFieldSerializer.java b/user/src/com/google/gwt/user/client/rpc/core/java/math/BigInteger_CustomFieldSerializer.java
deleted file mode 100644
index 57ed4ba..0000000
--- a/user/src/com/google/gwt/user/client/rpc/core/java/math/BigInteger_CustomFieldSerializer.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-/*
- * author Richard Zschech
- */
-package com.google.gwt.user.client.rpc.core.java.math;
-
-import com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-import java.math.BigInteger;
-
-/**
- * Custom field serializer for BigInteger.
- */
-public class BigInteger_CustomFieldSerializer {
-
- public static void deserialize(SerializationStreamReader streamReader,
- BigInteger instance) {
- }
-
- public static BigInteger instantiate(SerializationStreamReader streamReader)
- throws SerializationException {
- return new BigInteger(streamReader.readString());
- }
-
- public static void serialize(SerializationStreamWriter streamWriter,
- BigInteger instance) throws SerializationException {
- streamWriter.writeString(instance.toString());
- }
-}
diff --git a/user/src/com/google/gwt/user/client/rpc/core/java/math/MathContext_CustomFieldSerializer.java b/user/src/com/google/gwt/user/client/rpc/core/java/math/MathContext_CustomFieldSerializer.java
deleted file mode 100644
index a9b3277..0000000
--- a/user/src/com/google/gwt/user/client/rpc/core/java/math/MathContext_CustomFieldSerializer.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-/*
- * author Richard Zschech
- */
-package com.google.gwt.user.client.rpc.core.java.math;
-
-import com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-import java.math.MathContext;
-import java.math.RoundingMode;
-
-/**
- * Custom field serializer for MathContext.
- */
-public class MathContext_CustomFieldSerializer {
-
- public static void deserialize(SerializationStreamReader streamReader,
- MathContext instance) {
- }
-
- public static MathContext instantiate(SerializationStreamReader streamReader)
- throws SerializationException {
- return new MathContext(streamReader.readInt(),
- RoundingMode.values()[streamReader.readInt()]);
- }
-
- public static void serialize(SerializationStreamWriter streamWriter,
- MathContext instance) throws SerializationException {
- streamWriter.writeInt(instance.getPrecision());
- streamWriter.writeInt(instance.getRoundingMode().ordinal());
- }
-}
diff --git a/user/super/com/google/gwt/emul/java/lang/ArithmeticException.java b/user/super/com/google/gwt/emul/java/lang/ArithmeticException.java
index 235bc2c..faf821e 100644
--- a/user/super/com/google/gwt/emul/java/lang/ArithmeticException.java
+++ b/user/super/com/google/gwt/emul/java/lang/ArithmeticException.java
@@ -16,11 +16,10 @@
package java.lang;
/**
- * NOTE: in GWT this is only thrown for division by zero on longs and
- * BigInteger/BigDecimal.
- * <p>
+ * NOTE: in GWT this is only thrown for division by zero on longs.
+ *
* See <a
- * href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ArithmeticException.html">the
+ * href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ArrayIndexOutOfBoundsException.html">the
* official Java API doc</a> for details.
*/
public class ArithmeticException extends RuntimeException {
diff --git a/user/super/com/google/gwt/emul/java/lang/Float.java b/user/super/com/google/gwt/emul/java/lang/Float.java
index b3c9576..8d9e849 100644
--- a/user/super/com/google/gwt/emul/java/lang/Float.java
+++ b/user/super/com/google/gwt/emul/java/lang/Float.java
@@ -16,7 +16,7 @@
package java.lang;
/**
- * Wraps a primitive <code>float</code> as an object.
+ * Wraps a primitve <code>float</code> as an object.
*/
public final class Float extends Number implements Comparable<Float> {
public static final float MAX_VALUE = 3.4028235e+38f;
@@ -40,9 +40,7 @@
}
/**
- * @skip Here for shared implementation with Arrays.hashCode.
- * @param f
- * @return hash value of float (currently just truncated to int)
+ * @skip Here for shared implementation with Arrays.hashCode
*/
public static int hashCode(float f) {
return (int) f;
@@ -57,13 +55,7 @@
}-*/;
public static float parseFloat(String s) throws NumberFormatException {
- double doubleValue = __parseAndValidateDouble(s);
- if (doubleValue > Float.MAX_VALUE) {
- return Float.POSITIVE_INFINITY;
- } else if (doubleValue < -Float.MAX_VALUE) {
- return Float.NEGATIVE_INFINITY;
- }
- return (float) doubleValue;
+ return (float) __parseAndValidateDouble(s);
}
public static String toString(float b) {
diff --git a/user/super/com/google/gwt/emul/java/math/BigDecimal.java b/user/super/com/google/gwt/emul/java/math/BigDecimal.java
deleted file mode 100644
index 569918e..0000000
--- a/user/super/com/google/gwt/emul/java/math/BigDecimal.java
+++ /dev/null
@@ -1,2979 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY RICHARD ZSCHECH AS WELL AS GOOGLE.
- */
-package java.math;
-
-import com.google.gwt.core.client.JavaScriptObject;
-
-import java.io.Serializable;
-
-/**
- * This class represents immutable arbitrary precision decimal numbers. Each
- * {@code BigDecimal} instance is represented with a unscaled arbitrary
- * precision mantissa (the unscaled value) and a scale. The value of the {@code
- * BigDecimal} is {@code unscaledValue} 10^(-{@code scale}).
- */
-public class BigDecimal extends Number implements Comparable<BigDecimal>,
- Serializable {
-
- /**
- * The constant one as a {@code BigDecimal}.
- */
- public static final BigDecimal ONE = new BigDecimal(1, 0);
-
- /**
- * Rounding mode to round towards positive infinity. For positive values this
- * rounding mode behaves as {@link #ROUND_UP}, for negative values as
- * {@link #ROUND_DOWN}.
- *
- * @see RoundingMode#CEILING
- */
- public static final int ROUND_CEILING = 2;
-
- /**
- * Rounding mode where the values are rounded towards zero.
- *
- * @see RoundingMode#DOWN
- */
- public static final int ROUND_DOWN = 1;
-
- /**
- * Rounding mode to round towards negative infinity. For positive values this
- * rounding mode behaves as {@link #ROUND_DOWN}, for negative values as
- * {@link #ROUND_UP}.
- *
- * @see RoundingMode#FLOOR
- */
- public static final int ROUND_FLOOR = 3;
-
- /**
- * Rounding mode where values are rounded towards the nearest neighbor. Ties
- * are broken by rounding down.
- *
- * @see RoundingMode#HALF_DOWN
- */
- public static final int ROUND_HALF_DOWN = 5;
-
- /**
- * Rounding mode where values are rounded towards the nearest neighbor. Ties
- * are broken by rounding to the even neighbor.
- *
- * @see RoundingMode#HALF_EVEN
- */
- public static final int ROUND_HALF_EVEN = 6;
-
- /**
- * Rounding mode where values are rounded towards the nearest neighbor. Ties
- * are broken by rounding up.
- *
- * @see RoundingMode#HALF_UP
- */
- public static final int ROUND_HALF_UP = 4;
-
- /**
- * Rounding mode where the rounding operations throws an {@code
- * ArithmeticException} for the case that rounding is necessary, i.e. for the
- * case that the value cannot be represented exactly.
- *
- * @see RoundingMode#UNNECESSARY
- */
- public static final int ROUND_UNNECESSARY = 7;
-
- /**
- * Rounding mode where positive values are rounded towards positive infinity
- * and negative values towards negative infinity.
- *
- * @see RoundingMode#UP
- */
- public static final int ROUND_UP = 0;
-
- /**
- * The constant ten as a {@code BigDecimal}.
- */
- public static final BigDecimal TEN = new BigDecimal(10, 0);
-
- /**
- * The constant zero as a {@code BigDecimal}.
- */
- public static final BigDecimal ZERO = new BigDecimal(0, 0);
-
- protected static JavaScriptObject unscaledRegex;
-
- private static final int BI_SCALED_BY_ZERO_LENGTH = 11;
-
- /**
- * An array with the first <code>BigInteger</code> scaled by zero. (
- * <code>[0,0],[1,0],...,[10,0]</code>).
- */
- private static final BigDecimal BI_SCALED_BY_ZERO[] = new BigDecimal[BI_SCALED_BY_ZERO_LENGTH];
-
- /**
- * An array filled with characters <code>'0'</code>.
- */
- private static final char[] CH_ZEROS = new char[100];
-
- private static final double[] DOUBLE_FIVE_POW = new double[] {
- 1D, 5D, 25D, 125D, 625D, 3125D, 15625D, 78125D, 390625D, 1953125D,
- 9765625D, 48828125D, 244140625D, 1220703125D, 6103515625D, 30517578125D,
- 152587890625D, 762939453125D, 3814697265625D, 19073486328125D,
- 95367431640625D, 476837158203125D, 2384185791015625D,};
-
- private static final int[] DOUBLE_FIVE_POW_BIT_LENGTH = new int[DOUBLE_FIVE_POW.length];
-
- /**
- * An array with powers of ten that fit in the type <code>double</code> (
- * <code>10^0,10^1,...,10^18</code>).
- */
- private static final double[] DOUBLE_TEN_POW = new double[] {
- 1D, 10D, 100D, 1000D, 10000D, 100000D, 1000000D, 10000000D, 100000000D,
- 1000000000D, 10000000000D, 100000000000D, 1000000000000D,
- 10000000000000D, 100000000000000D,};
-
- private static final int[] DOUBLE_TEN_POW_BIT_LENGTH = new int[DOUBLE_TEN_POW.length];
-
- /**
- * An array with powers of five that fit in the type <code>double</code> (
- * <code>5^0,5^1,...,5^27</code>).
- */
- private static final BigInteger FIVE_POW[];
- /**
- * The double closer to <code>Log10(2)</code>.
- */
- private static final double LOG10_2 = 0.3010299956639812;
-
- /**
- * This is the serialVersionUID used by the sun implementation.
- */
- private static final long serialVersionUID = 6108874887143696463L;
-
- /**
- * An array with powers of ten that fit in the type <code>double</code> (
- * <code>10^0,10^1,...,10^18</code>).
- */
- private static final BigInteger TEN_POW[];
-
- /**
- * An array with the zero number scaled by the first positive scales. (
- * <code>0*10^0, 0*10^1, ..., 0*10^10</code>).
- */
- private static final BigDecimal ZERO_SCALED_BY[] = new BigDecimal[11];
-
- static {
- // To fill all static arrays.
- int i = 0;
-
- for (; i < ZERO_SCALED_BY.length; i++) {
- BI_SCALED_BY_ZERO[i] = new BigDecimal(i, 0);
- ZERO_SCALED_BY[i] = new BigDecimal(0, i);
- CH_ZEROS[i] = '0';
- }
-
- for (; i < CH_ZEROS.length; i++) {
- CH_ZEROS[i] = '0';
- }
- for (int j = 0; j < DOUBLE_FIVE_POW_BIT_LENGTH.length; j++) {
- DOUBLE_FIVE_POW_BIT_LENGTH[j] = bitLength(DOUBLE_FIVE_POW[j]);
- }
- for (int j = 0; j < DOUBLE_TEN_POW_BIT_LENGTH.length; j++) {
- DOUBLE_TEN_POW_BIT_LENGTH[j] = bitLength(DOUBLE_TEN_POW[j]);
- }
-
- // Taking the references of useful powers.
- TEN_POW = Multiplication.bigTenPows;
- FIVE_POW = Multiplication.bigFivePows;
- }
-
- /**
- * Returns a new {@code BigDecimal} instance whose value is equal to {@code
- * val}. The new decimal is constructed as if the {@code BigDecimal(String)}
- * constructor is called with an argument which is equal to {@code
- * Double.toString(val)}. For example, {@code valueOf("0.1")} is converted to
- * (unscaled=1, scale=1), although the double {@code 0.1} cannot be
- * represented exactly as a double value. In contrast to that, a new {@code
- * BigDecimal(0.1)} instance has the value {@code
- * 0.1000000000000000055511151231257827021181583404541015625} with an unscaled
- * value {@code 1000000000000000055511151231257827021181583404541015625} and
- * the scale {@code 55}.
- *
- * @param val double value to be converted to a {@code BigDecimal}.
- * @return {@code BigDecimal} instance with the value {@code val}.
- * @throws NumberFormatException if {@code val} is infinite or {@code val} is
- * not a number
- */
- public static BigDecimal valueOf(double val) {
- if (Double.isInfinite(val) || Double.isNaN(val)) {
- // math.03=Infinity or NaN
- throw new NumberFormatException("Infinite or NaN"); //$NON-NLS-1$
- }
- return new BigDecimal(Double.toString(val));
- }
-
- /**
- * Returns a new {@code BigDecimal} instance whose value is equal to {@code
- * unscaledVal}. The scale of the result is {@code 0}, and its unscaled value
- * is {@code unscaledVal}.
- *
- * @param unscaledVal value to be converted to a {@code BigDecimal}.
- * @return {@code BigDecimal} instance with the value {@code unscaledVal}.
- */
- public static BigDecimal valueOf(long unscaledVal) {
- if ((unscaledVal >= 0) && (unscaledVal < BI_SCALED_BY_ZERO_LENGTH)) {
- return BI_SCALED_BY_ZERO[(int) unscaledVal];
- }
- return new BigDecimal(unscaledVal, 0);
- }
-
- /**
- * Returns a new {@code BigDecimal} instance whose value is equal to {@code
- * unscaledVal} 10^(-{@code scale}). The scale of the result is {@code scale},
- * and its unscaled value is {@code unscaledVal}.
- *
- * @param unscaledVal unscaled value to be used to construct the new {@code
- * BigDecimal}.
- * @param scale scale to be used to construct the new {@code BigDecimal}.
- * @return {@code BigDecimal} instance with the value {@code unscaledVal}*
- * 10^(-{@code unscaledVal}).
- */
- public static BigDecimal valueOf(long unscaledVal, int scale) {
- if (scale == 0) {
- return valueOf(unscaledVal);
- }
- if ((unscaledVal == 0) && (scale >= 0) && (scale < ZERO_SCALED_BY.length)) {
- return ZERO_SCALED_BY[scale];
- }
- return new BigDecimal(unscaledVal, scale);
- }
-
- private static BigDecimal addAndMult10(BigDecimal thisValue,
- BigDecimal augend, double diffScale) {
- if (diffScale < DOUBLE_TEN_POW.length
- && Math.max(thisValue.bitLength, augend.bitLength
- + DOUBLE_TEN_POW_BIT_LENGTH[(int) diffScale]) + 1 < 54) {
- return valueOf(thisValue.smallValue + augend.smallValue
- * DOUBLE_TEN_POW[(int) diffScale], thisValue.scale);
- }
- return new BigDecimal(thisValue.getUnscaledValue().add(
- Multiplication.multiplyByTenPow(augend.getUnscaledValue(),
- (int) diffScale)), thisValue.scale);
- }
-
- private static int bitLength(double sv) {
- long smallValue = (long) sv;
- if (smallValue < 0) {
- smallValue = ~smallValue;
- }
- return 64 - Long.numberOfLeadingZeros(smallValue);
- }
-
- private static int bitLength(long smallValue) {
- if (smallValue < 0) {
- smallValue = ~smallValue;
- }
- return 64 - Long.numberOfLeadingZeros(smallValue);
- }
-
- private static BigDecimal divideBigIntegers(BigInteger scaledDividend,
- BigInteger scaledDivisor, int scale, RoundingMode roundingMode) {
-
- BigInteger[] quotAndRem = scaledDividend.divideAndRemainder(scaledDivisor); // quotient
- // and
- // remainder
- // If after division there is a remainder...
- BigInteger quotient = quotAndRem[0];
- BigInteger remainder = quotAndRem[1];
- if (remainder.signum() == 0) {
- return new BigDecimal(quotient, scale);
- }
- int sign = scaledDividend.signum() * scaledDivisor.signum();
- int compRem; // 'compare to remainder'
- if (scaledDivisor.bitLength() < 54) {
- long rem = remainder.longValue();
- long divisor = scaledDivisor.longValue();
- compRem = longCompareTo(Math.abs(rem) << 1, Math.abs(divisor));
- // To look if there is a carry
- compRem = roundingBehavior(quotient.testBit(0) ? 1 : 0, sign
- * (5 + compRem), roundingMode);
-
- } else {
- // Checking if: remainder * 2 >= scaledDivisor
- compRem = remainder.abs().shiftLeftOneBit().compareTo(scaledDivisor.abs());
- compRem = roundingBehavior(quotient.testBit(0) ? 1 : 0, sign
- * (5 + compRem), roundingMode);
- }
- if (compRem != 0) {
- if (quotient.bitLength() < 54) {
- return valueOf(quotient.longValue() + compRem, scale);
- }
- quotient = quotient.add(BigInteger.valueOf(compRem));
- return new BigDecimal(quotient, scale);
- }
- // Constructing the result with the appropriate unscaled value
- return new BigDecimal(quotient, scale);
- }
-
- // TODO convert to double math dont use longs
- private static BigDecimal dividePrimitiveLongs(long scaledDividend,
- long scaledDivisor, int scale, RoundingMode roundingMode) {
- long quotient = scaledDividend / scaledDivisor;
- long remainder = scaledDividend % scaledDivisor;
- int sign = Long.signum(scaledDividend) * Long.signum(scaledDivisor);
- if (remainder != 0) {
- // Checking if: remainder * 2 >= scaledDivisor
- int compRem; // 'compare to remainder'
- compRem = longCompareTo(Math.abs(remainder) << 1, Math.abs(scaledDivisor));
- // To look if there is a carry
- quotient += roundingBehavior(((int) quotient) & 1, sign * (5 + compRem),
- roundingMode);
- }
- // Constructing the result with the appropriate unscaled value
- return valueOf(quotient, scale);
- }
-
- private static int longCompareTo(long value1, long value2) {
- return value1 > value2 ? 1 : (value1 < value2 ? -1 : 0);
- }
-
- private static native double parseUnscaled(String str) /*-{
- var unscaledRegex = @java.math.BigDecimal::unscaledRegex;
- if (!unscaledRegex) {
- unscaledRegex = @java.math.BigDecimal::unscaledRegex = /^[+-]?\d*$/i;
- }
- if (unscaledRegex.test(str)) {
- return parseInt(str, 10);
- } else {
- return Number.NaN;
- }
- }-*/;
-
- /**
- * Return an increment that can be -1,0 or 1, depending of {@code
- * roundingMode}.
- *
- * @param parityBit can be 0 or 1, it's only used in the case {@code
- * HALF_EVEN}
- * @param fraction the mantisa to be analyzed
- * @param roundingMode the type of rounding
- * @return the carry propagated after rounding
- */
- private static int roundingBehavior(int parityBit, int fraction,
- RoundingMode roundingMode) {
- int increment = 0; // the carry after rounding
-
- switch (roundingMode) {
- case UNNECESSARY:
- if (fraction != 0) {
- // math.08=Rounding necessary
- throw new ArithmeticException("Rounding necessary"); //$NON-NLS-1$
- }
- break;
- case UP:
- increment = Integer.signum(fraction);
- break;
- case DOWN:
- break;
- case CEILING:
- increment = Math.max(Integer.signum(fraction), 0);
- break;
- case FLOOR:
- increment = Math.min(Integer.signum(fraction), 0);
- break;
- case HALF_UP:
- if (Math.abs(fraction) >= 5) {
- increment = Integer.signum(fraction);
- }
- break;
- case HALF_DOWN:
- if (Math.abs(fraction) > 5) {
- increment = Integer.signum(fraction);
- }
- break;
- case HALF_EVEN:
- if (Math.abs(fraction) + parityBit > 5) {
- increment = Integer.signum(fraction);
- }
- break;
- }
- return increment;
- }
-
- /**
- * It tests if a scale of type {@code long} fits in 32 bits. It returns the
- * same scale being casted to {@code int} type when is possible, otherwise
- * throws an exception.
- *
- * @param doubleScale a double bit scale
- * @return a 32 bit scale when is possible
- * @throws ArithmeticException when {@code scale} doesn't fit in {@code int}
- * type
- * @see #scale
- */
- private static int toIntScale(double doubleScale) {
- if (doubleScale < Integer.MIN_VALUE) {
- // math.09=Overflow
- throw new ArithmeticException("Overflow"); //$NON-NLS-1$
- } else if (doubleScale > Integer.MAX_VALUE) {
- // math.0A=Underflow
- throw new ArithmeticException("Underflow"); //$NON-NLS-1$
- } else {
- return (int) doubleScale;
- }
- }
-
- /**
- * Convert a double to a string with {@code digits} precision. The resulting
- * string may still be in exponential notation.
- *
- * @param d double value
- * @param digits number of digits of precision to include
- * @return non-localized string representation of {@code d}
- */
- private static native String toPrecision(double d, int digits) /*-{
- return d.toPrecision(digits);
- }-*/;
-
- private static BigDecimal valueOf(double smallValue, double scale) {
- return new BigDecimal(smallValue, scale);
- }
-
- /**
- * It returns the value 0 with the most approximated scale of type {@code int}
- * . if {@code longScale > Integer.MAX_VALUE} the scale will be {@code
- * Integer.MAX_VALUE}; if {@code longScale < Integer.MIN_VALUE} the scale will
- * be {@code Integer.MIN_VALUE}; otherwise {@code longScale} is casted to the
- * type {@code int}.
- *
- * @param doubleScale the scale to which the value 0 will be scaled.
- * @return the value 0 scaled by the closer scale of type {@code int}.
- * @see #scale
- */
- private static BigDecimal zeroScaledBy(double doubleScale) {
- if (doubleScale == (int) doubleScale) {
- return valueOf(0, (int) doubleScale);
- }
- if (doubleScale >= 0) {
- return new BigDecimal(0, Integer.MAX_VALUE);
- }
- return new BigDecimal(0, Integer.MIN_VALUE);
- }
-
- private transient int bitLength;
-
- /**
- * Cache for the hash code.
- */
- private transient int hashCode;
-
- /**
- * The arbitrary precision integer (unscaled value) in the internal
- * representation of {@code BigDecimal}.
- */
- private BigInteger intVal;
-
- /**
- * Constructs a new {@code BigDecimal} instance from the 64bit double {@code
- * val}. The constructed big decimal is equivalent to the given double. For
- * example, {@code new BigDecimal(0.1)} is equal to {@code
- * 0.1000000000000000055511151231257827021181583404541015625}. This happens as
- * {@code 0.1} cannot be represented exactly in binary.
- * <p>
- * To generate a big decimal instance which is equivalent to {@code 0.1} use
- * the {@code BigDecimal(String)} constructor.
- *
- * @param val double value to be converted to a {@code BigDecimal} instance.
- * @throws NumberFormatException if {@code val} is infinity or not a number.
- */
- // public BigDecimal(double val) {
- // if (Double.isInfinite(val) || Double.isNaN(val)) {
- // // math.03=Infinity or NaN
- // throw new NumberFormatException("Infinite or NaN"); //$NON-NLS-1$
- // }
- // long bits = Double.doubleToLongBits(val); // IEEE-754
- // long mantisa;
- // int trailingZeros;
- // // Extracting the exponent, note that the bias is 1023
- // scale = 1075 - (int)((bits >> 52) & 0x7FFL);
- // // Extracting the 52 bits of the mantisa.
- // mantisa = (scale == 1075) ? (bits & 0xFFFFFFFFFFFFFL) << 1
- // : (bits & 0xFFFFFFFFFFFFFL) | 0x10000000000000L;
- // if (mantisa == 0) {
- // scale = 0;
- // precision = 1;
- // }
- // // To simplify all factors '2' in the mantisa
- // if (scale > 0) {
- // trailingZeros = Math.min(scale, Long.numberOfTrailingZeros(mantisa));
- // mantisa >>>= trailingZeros;
- // scale -= trailingZeros;
- // }
- // // Calculating the new unscaled value and the new scale
- // if((bits >> 63) != 0) {
- // mantisa = -mantisa;
- // }
- // int mantisaBits = bitLength(mantisa);
- // if (scale < 0) {
- // bitLength = mantisaBits == 0 ? 0 : mantisaBits - scale;
- // if(bitLength < 64) {
- // smallValue = mantisa << (-scale);
- // } else {
- // intVal = BigInteger.valueOf(mantisa).shiftLeft(-scale);
- // }
- // scale = 0;
- // } else if (scale > 0) {
- // // m * 2^e = (m * 5^(-e)) * 10^e
- // if(scale < LONG_FIVE_POW.length
- // && mantisaBits+LONG_FIVE_POW_BIT_LENGTH[scale] < 64) {
- // smallValue = mantisa * LONG_FIVE_POW[scale];
- // bitLength = bitLength(smallValue);
- // } else {
- // setUnscaledValue(Multiplication.multiplyByFivePow(BigInteger.valueOf(mantisa),
- // scale));
- // }
- // } else { // scale == 0
- // smallValue = mantisa;
- // bitLength = mantisaBits;
- // }
- // }
- /**
- * Constructs a new {@code BigDecimal} instance from the 64bit double {@code
- * val}. The constructed big decimal is equivalent to the given double. For
- * example, {@code new BigDecimal(0.1)} is equal to {@code
- * 0.1000000000000000055511151231257827021181583404541015625}. This happens as
- * {@code 0.1} cannot be represented exactly in binary.
- * <p>
- * To generate a big decimal instance which is equivalent to {@code 0.1} use
- * the {@code BigDecimal(String)} constructor.
- *
- * @param val double value to be converted to a {@code BigDecimal} instance.
- * @param mc rounding mode and precision for the result of this operation.
- * @throws NumberFormatException if {@code val} is infinity or not a number.
- * @throws ArithmeticException if {@code mc.precision > 0} and {@code
- * mc.roundingMode == UNNECESSARY} and the new big decimal cannot be
- * represented within the given precision without rounding.
- */
- // public BigDecimal(double val, MathContext mc) {
- // this(val);
- // inplaceRound(mc);
- // }
- /**
- * Represent the number of decimal digits in the unscaled value. This
- * precision is calculated the first time, and used in the following calls of
- * method <code>precision()</code>. Note that some call to the private method
- * <code>inplaceRound()</code> could update this field.
- *
- * @see #precision()
- * @see #inplaceRound(MathContext)
- */
- private transient int precision;
-
- private double scale;
-
- private transient double smallValue;
-
- /**
- * The <code>String</code> representation is cached.
- */
- private transient String toStringImage;
-
- /**
- * Constructs a new {@code BigDecimal} instance from the given big integer
- * {@code val}. The scale of the result is {@code 0}.
- *
- * @param val {@code BigInteger} value to be converted to a {@code BigDecimal}
- * instance.
- */
- public BigDecimal(BigInteger val) {
- this(val, 0);
- }
-
- /**
- * Constructs a new {@code BigDecimal} instance from a given unscaled value
- * {@code unscaledVal} and a given scale. The value of this instance is
- * {@code unscaledVal} 10^(-{@code scale}).
- *
- * @param unscaledVal {@code BigInteger} representing the unscaled value of
- * this {@code BigDecimal} instance.
- * @param scale scale of this {@code BigDecimal} instance.
- * @throws NullPointerException if {@code unscaledVal == null}.
- */
- public BigDecimal(BigInteger unscaledVal, int scale) {
- if (unscaledVal == null) {
- throw new NullPointerException();
- }
- this.scale = scale;
- setUnscaledValue(unscaledVal);
- }
-
- /**
- * Constructs a new {@code BigDecimal} instance from a given unscaled value
- * {@code unscaledVal} and a given scale. The value of this instance is
- * {@code unscaledVal} 10^(-{@code scale}). The result is rounded according to
- * the specified math context.
- *
- * @param unscaledVal {@code BigInteger} representing the unscaled value of
- * this {@code BigDecimal} instance.
- * @param scale scale of this {@code BigDecimal} instance.
- * @param mc rounding mode and precision for the result of this operation.
- * @throws ArithmeticException if {@code mc.precision > 0} and {@code
- * mc.roundingMode == UNNECESSARY} and the new big decimal cannot be
- * represented within the given precision without rounding.
- * @throws NullPointerException if {@code unscaledVal == null}.
- */
- public BigDecimal(BigInteger unscaledVal, int scale, MathContext mc) {
- this(unscaledVal, scale);
- inplaceRound(mc);
- }
-
- /**
- * Constructs a new {@code BigDecimal} instance from the given big integer
- * {@code val}. The scale of the result is {@code 0}.
- *
- * @param val {@code BigInteger} value to be converted to a {@code BigDecimal}
- * instance.
- * @param mc rounding mode and precision for the result of this operation.
- * @throws ArithmeticException if {@code mc.precision > 0} and {@code
- * mc.roundingMode == UNNECESSARY} and the new big decimal cannot be
- * represented within the given precision without rounding.
- */
- public BigDecimal(BigInteger val, MathContext mc) {
- this(val);
- inplaceRound(mc);
- }
-
- /**
- * Constructs a new {@code BigDecimal} instance from a string representation
- * given as a character array.
- *
- * @param in array of characters containing the string representation of this
- * {@code BigDecimal}.
- * @throws NullPointerException if {@code in == null}.
- * @throws NumberFormatException if {@code in} does not contain a valid string
- * representation of a big decimal.
- */
- public BigDecimal(char[] in) {
- this(in, 0, in.length);
- }
-
- /**
- * Constructs a new {@code BigDecimal} instance from a string representation
- * given as a character array.
- *
- * @param in array of characters containing the string representation of this
- * {@code BigDecimal}.
- * @param offset first index to be copied.
- * @param len number of characters to be used.
- * @throws NullPointerException if {@code in == null}.
- * @throws NumberFormatException if {@code offset < 0} or {@code len <= 0} or
- * {@code offset+len-1 < 0} or {@code offset+len-1 >= in.length}.
- * @throws NumberFormatException if in does not contain a valid string
- * representation of a big decimal.
- */
- public BigDecimal(char[] in, int offset, int len) {
- try {
- initFrom(new String(in, offset, len));
- } catch (StringIndexOutOfBoundsException e) {
- throw new NumberFormatException(e.getMessage());
- }
- }
-
- /**
- * Constructs a new {@code BigDecimal} instance from a string representation
- * given as a character array.
- *
- * @param in array of characters containing the string representation of this
- * {@code BigDecimal}.
- * @param offset first index to be copied.
- * @param len number of characters to be used.
- * @param mc rounding mode and precision for the result of this operation.
- * @throws NullPointerException if {@code in == null}.
- * @throws NumberFormatException if {@code offset < 0} or {@code len <= 0} or
- * {@code offset+len-1 < 0} or {@code offset+len-1 >= in.length}.
- * @throws NumberFormatException if {@code in} does not contain a valid string
- * representation of a big decimal.
- * @throws ArithmeticException if {@code mc.precision > 0} and {@code
- * mc.roundingMode == UNNECESSARY} and the new big decimal cannot be
- * represented within the given precision without rounding.
- */
- public BigDecimal(char[] in, int offset, int len, MathContext mc) {
- this(in, offset, len);
- inplaceRound(mc);
- }
-
- /**
- * Constructs a new {@code BigDecimal} instance from a string representation
- * given as a character array. The result is rounded according to the
- * specified math context.
- *
- * @param in array of characters containing the string representation of this
- * {@code BigDecimal}.
- * @param mc rounding mode and precision for the result of this operation.
- * @throws NullPointerException if {@code in == null}.
- * @throws NumberFormatException if {@code in} does not contain a valid string
- * representation of a big decimal.
- * @throws ArithmeticException if {@code mc.precision > 0} and {@code
- * mc.roundingMode == UNNECESSARY} and the new big decimal cannot be
- * represented within the given precision without rounding.
- */
- public BigDecimal(char[] in, MathContext mc) {
- this(in, 0, in.length);
- inplaceRound(mc);
- }
-
- /**
- * Constructs a new {@code BigDecimal} instance from the given double {@code
- * val}. The scale of the result is 0.
- *
- * @param val double value to be converted to a {@code BigDecimal} instance.
- * @throws NumberFormatException if {@code val} is infinite or a NaN
- */
- public BigDecimal(double val) {
- if (Double.isInfinite(val) || Double.isNaN(val)) {
- // math.03=Infinity or NaN
- throw new NumberFormatException("Infinite or NaN"); //$NON-NLS-1$
- }
- initFrom(toPrecision(val, 20));
- }
-
- /**
- * Constructs a new {@code BigDecimal} instance from the given double {@code
- * val}. The scale of the result is 0. The result is rounded according to the
- * specified math context.
- *
- * @param val double value to be converted to a {@code BigDecimal} instance.
- * @param mc rounding mode and precision for the result of this operation.
- * @throws NumberFormatException if {@code val} is infinite or a NaN
- * @throws ArithmeticException if {@code mc.precision > 0} and {@code
- * mc.roundingMode == UNNECESSARY} and the new big decimal cannot be
- * represented within the given precision without rounding.
- */
- public BigDecimal(double val, MathContext mc) {
- if (Double.isInfinite(val) || Double.isNaN(val)) {
- // math.03=Infinity or NaN
- throw new NumberFormatException("Infinite or NaN"); //$NON-NLS-1$
- }
- initFrom(toPrecision(val, 20));
- inplaceRound(mc);
- }
-
- /**
- * Constructs a new {@code BigDecimal} instance from the given int {@code val}
- * . The scale of the result is 0.
- *
- * @param val int value to be converted to a {@code BigDecimal} instance.
- */
- public BigDecimal(int val) {
- this(val, 0);
- }
-
- /**
- * Constructs a new {@code BigDecimal} instance from the given int {@code val}
- * . The scale of the result is {@code 0}. The result is rounded according to
- * the specified math context.
- *
- * @param val int value to be converted to a {@code BigDecimal} instance.
- * @param mc rounding mode and precision for the result of this operation.
- * @throws ArithmeticException if {@code mc.precision > 0} and {@code
- * c.roundingMode == UNNECESSARY} and the new big decimal cannot be
- * represented within the given precision without rounding.
- */
- public BigDecimal(int val, MathContext mc) {
- this(val, 0);
- inplaceRound(mc);
- }
-
- /**
- * Constructs a new {@code BigDecimal} instance from the given long {@code
- * val}. The scale of the result is {@code 0}.
- *
- * @param val long value to be converted to a {@code BigDecimal} instance.
- */
- public BigDecimal(long val) {
- this(val, 0);
- }
-
- /**
- * Constructs a new {@code BigDecimal} instance from the given long {@code
- * val}. The scale of the result is {@code 0}. The result is rounded according
- * to the specified math context.
- *
- * @param val long value to be converted to a {@code BigDecimal} instance.
- * @param mc rounding mode and precision for the result of this operation.
- * @throws ArithmeticException if {@code mc.precision > 0} and {@code
- * mc.roundingMode == UNNECESSARY} and the new big decimal cannot be
- * represented within the given precision without rounding.
- */
- public BigDecimal(long val, MathContext mc) {
- this(val);
- inplaceRound(mc);
- }
-
- /**
- * Constructs a new {@code BigDecimal} instance from a string representation.
- *
- * @param val string containing the string representation of this {@code
- * BigDecimal}.
- * @throws NumberFormatException if {@code val} does not contain a valid
- * string representation of a big decimal.
- */
- public BigDecimal(String val) {
- initFrom(val);
- }
-
- /**
- * Constructs a new {@code BigDecimal} instance from a string representation.
- * The result is rounded according to the specified math context.
- *
- * @param val string containing the string representation of this {@code
- * BigDecimal}.
- * @param mc rounding mode and precision for the result of this operation.
- * @throws NumberFormatException if {@code val} does not contain a valid
- * string representation of a big decimal.
- * @throws ArithmeticException if {@code mc.precision > 0} and {@code
- * mc.roundingMode == UNNECESSARY} and the new big decimal cannot be
- * represented within the given precision without rounding.
- */
- public BigDecimal(String val, MathContext mc) {
- this(val.toCharArray(), 0, val.length());
- inplaceRound(mc);
- }
-
- private BigDecimal(BigInteger unscaledVal, double scale) {
- if (unscaledVal == null) {
- throw new NullPointerException();
- }
- this.scale = scale;
- setUnscaledValue(unscaledVal);
- }
-
- private BigDecimal(double smallValue, double scale) {
- this.smallValue = smallValue;
- this.scale = scale;
- this.bitLength = bitLength(smallValue);
- }
-
- private BigDecimal(long smallValue, int scale) {
- this.scale = scale;
- this.bitLength = bitLength(smallValue);
- if (bitLength < 54) {
- this.smallValue = smallValue;
- } else {
- this.intVal = BigInteger.valueOf(smallValue);
- }
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is the absolute value of
- * {@code this}. The scale of the result is the same as the scale of this.
- *
- * @return {@code abs(this)}
- */
- public BigDecimal abs() {
- return ((signum() < 0) ? negate() : this);
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is the absolute value of
- * {@code this}. The result is rounded according to the passed context {@code
- * mc}.
- *
- * @param mc rounding mode and precision for the result of this operation.
- * @return {@code abs(this)}
- */
- public BigDecimal abs(MathContext mc) {
- return round(mc).abs();
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is {@code this + augend}. The
- * scale of the result is the maximum of the scales of the two arguments.
- *
- * @param augend value to be added to {@code this}.
- * @return {@code this + augend}.
- * @throws NullPointerException if {@code augend == null}.
- */
- public BigDecimal add(BigDecimal augend) {
- double diffScale = this.scale - augend.scale;
- // Fast return when some operand is zero
- if (this.isZero()) {
- if (diffScale <= 0) {
- return augend;
- }
- if (augend.isZero()) {
- return this;
- }
- } else if (augend.isZero()) {
- if (diffScale >= 0) {
- return this;
- }
- }
- // Let be: this = [u1,s1] and augend = [u2,s2]
- if (diffScale == 0) {
- // case s1 == s2: [u1 + u2 , s1]
- if (Math.max(this.bitLength, augend.bitLength) + 1 < 54) {
- return valueOf(this.smallValue + augend.smallValue, this.scale);
- }
- return new BigDecimal(this.getUnscaledValue().add(
- augend.getUnscaledValue()), this.scale);
- } else if (diffScale > 0) {
- // case s1 > s2 : [(u1 + u2) * 10 ^ (s1 - s2) , s1]
- return addAndMult10(this, augend, diffScale);
- } else {
- // case s2 > s1 : [(u2 + u1) * 10 ^ (s2 - s1) , s2]
- return addAndMult10(augend, this, -diffScale);
- }
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is {@code this + augend}. The
- * result is rounded according to the passed context {@code mc}.
- *
- * @param augend value to be added to {@code this}.
- * @param mc rounding mode and precision for the result of this operation.
- * @return {@code this + augend}.
- * @throws NullPointerException if {@code augend == null} or {@code mc ==
- * null}.
- */
- public BigDecimal add(BigDecimal augend, MathContext mc) {
- BigDecimal larger; // operand with the largest unscaled value
- BigDecimal smaller; // operand with the smallest unscaled value
- BigInteger tempBI;
- double diffScale = this.scale - augend.scale;
- int largerSignum;
- // Some operand is zero or the precision is infinity
- if ((augend.isZero()) || (this.isZero()) || (mc.getPrecision() == 0)) {
- return add(augend).round(mc);
- }
- // Cases where there is room for optimizations
- if (this.approxPrecision() < diffScale - 1) {
- larger = augend;
- smaller = this;
- } else if (augend.approxPrecision() < -diffScale - 1) {
- larger = this;
- smaller = augend;
- } else {
- // No optimization is done
- return add(augend).round(mc);
- }
- if (mc.getPrecision() >= larger.approxPrecision()) {
- // No optimization is done
- return add(augend).round(mc);
- }
- // Cases where it's unnecessary to add two numbers with very different
- // scales
- largerSignum = larger.signum();
- if (largerSignum == smaller.signum()) {
- tempBI = Multiplication.multiplyByPositiveInt(larger.getUnscaledValue(),
- 10).add(BigInteger.valueOf(largerSignum));
- } else {
- tempBI = larger.getUnscaledValue().subtract(
- BigInteger.valueOf(largerSignum));
- tempBI = Multiplication.multiplyByPositiveInt(tempBI, 10).add(
- BigInteger.valueOf(largerSignum * 9));
- }
- // Rounding the improved adding
- larger = new BigDecimal(tempBI, larger.scale + 1);
- return larger.round(mc);
- }
-
- /**
- * Returns this {@code BigDecimal} as a byte value if it has no fractional
- * part and if its value fits to the byte range ([-128..127]). If these
- * conditions are not met, an {@code ArithmeticException} is thrown.
- *
- * @return this {@code BigDecimal} as a byte value.
- * @throws ArithmeticException if rounding is necessary or the number doesn't
- * fit in a byte.
- */
- public byte byteValueExact() {
- return (byte) valueExact(8);
- }
-
- /**
- * Compares this {@code BigDecimal} with {@code val}. Returns one of the three
- * values {@code 1}, {@code 0}, or {@code -1}. The method behaves as if
- * {@code this.subtract(val)} is computed. If this difference is > 0 then 1 is
- * returned, if the difference is < 0 then -1 is returned, and if the
- * difference is 0 then 0 is returned. This means, that if two decimal
- * instances are compared which are equal in value but differ in scale, then
- * these two instances are considered as equal.
- *
- * @param val value to be compared with {@code this}.
- * @return {@code 1} if {@code this > val}, {@code -1} if {@code this < val},
- * {@code 0} if {@code this == val}.
- * @throws NullPointerException if {@code val == null}.
- */
- public int compareTo(BigDecimal val) {
- int thisSign = signum();
- int valueSign = val.signum();
-
- if (thisSign == valueSign) {
- if (this.scale == val.scale && this.bitLength < 54 && val.bitLength < 54) {
- return (smallValue < val.smallValue) ? -1
- : (smallValue > val.smallValue) ? 1 : 0;
- }
- double diffScale = this.scale - val.scale;
- double diffPrecision = this.approxPrecision() - val.approxPrecision();
- if (diffPrecision > diffScale + 1) {
- return thisSign;
- } else if (diffPrecision < diffScale - 1) {
- return -thisSign;
- } else {
- // thisSign == val.signum() and diffPrecision is aprox. diffScale
- BigInteger thisUnscaled = this.getUnscaledValue();
- BigInteger valUnscaled = val.getUnscaledValue();
- // If any of both precision is bigger, append zeros to the shorter one
- if (diffScale < 0) {
- thisUnscaled = thisUnscaled.multiply(Multiplication.powerOf10(-diffScale));
- } else if (diffScale > 0) {
- valUnscaled = valUnscaled.multiply(Multiplication.powerOf10(diffScale));
- }
- return thisUnscaled.compareTo(valUnscaled);
- }
- } else if (thisSign < valueSign) {
- return -1;
- } else {
- return 1;
- }
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is {@code this / divisor}. The
- * scale of the result is the difference of the scales of {@code this} and
- * {@code divisor}. If the exact result requires more digits, then the scale
- * is adjusted accordingly. For example, {@code 1/128 = 0.0078125} which has a
- * scale of {@code 7} and precision {@code 5}.
- *
- * @param divisor value by which {@code this} is divided.
- * @return {@code this / divisor}.
- * @throws NullPointerException if {@code divisor == null}.
- * @throws ArithmeticException if {@code divisor == 0}.
- * @throws ArithmeticException if the result cannot be represented exactly.
- */
- public BigDecimal divide(BigDecimal divisor) {
- BigInteger p = this.getUnscaledValue();
- BigInteger q = divisor.getUnscaledValue();
- BigInteger gcd; // greatest common divisor between 'p' and 'q'
- BigInteger quotAndRem[];
- double diffScale = scale - divisor.scale;
- int newScale; // the new scale for final quotient
- int k; // number of factors "2" in 'q'
- int l = 0; // number of factors "5" in 'q'
- int i = 1;
- int lastPow = FIVE_POW.length - 1;
-
- if (divisor.isZero()) {
- // math.04=Division by zero
- throw new ArithmeticException("Division by zero"); //$NON-NLS-1$
- }
- if (p.signum() == 0) {
- return zeroScaledBy(diffScale);
- }
- // To divide both by the GCD
- gcd = p.gcd(q);
- p = p.divide(gcd);
- q = q.divide(gcd);
- // To simplify all "2" factors of q, dividing by 2^k
- k = q.getLowestSetBit();
- q = q.shiftRight(k);
- // To simplify all "5" factors of q, dividing by 5^l
- do {
- quotAndRem = q.divideAndRemainder(FIVE_POW[i]);
- if (quotAndRem[1].signum() == 0) {
- l += i;
- if (i < lastPow) {
- i++;
- }
- q = quotAndRem[0];
- } else {
- if (i == 1) {
- break;
- }
- i = 1;
- }
- } while (true);
- // If abs(q) != 1 then the quotient is periodic
- if (!q.abs().equals(BigInteger.ONE)) {
- // math.05=Non-terminating decimal expansion; no exact representable
- // decimal result.
- throw new ArithmeticException(
- "Non-terminating decimal expansion; no exact representable decimal result"); //$NON-NLS-1$
- }
- // The sign of the is fixed and the quotient will be saved in 'p'
- if (q.signum() < 0) {
- p = p.negate();
- }
- // Checking if the new scale is out of range
- newScale = toIntScale(diffScale + Math.max(k, l));
- // k >= 0 and l >= 0 implies that k - l is in the 32-bit range
- i = k - l;
-
- p = (i > 0) ? Multiplication.multiplyByFivePow(p, i) : p.shiftLeft(-i);
- return new BigDecimal(p, newScale);
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is {@code this / divisor}. The
- * scale of the result is the scale of {@code this}. If rounding is required
- * to meet the specified scale, then the specified rounding mode {@code
- * roundingMode} is applied.
- *
- * @param divisor value by which {@code this} is divided.
- * @param roundingMode rounding mode to be used to round the result.
- * @return {@code this / divisor} rounded according to the given rounding
- * mode.
- * @throws NullPointerException if {@code divisor == null}.
- * @throws IllegalArgumentException if {@code roundingMode} is not a valid
- * rounding mode.
- * @throws ArithmeticException if {@code divisor == 0}.
- * @throws ArithmeticException if {@code roundingMode == ROUND_UNNECESSARY}
- * and rounding is necessary according to the scale of this.
- */
- public BigDecimal divide(BigDecimal divisor, int roundingMode) {
- return divide(divisor, (int) scale, RoundingMode.valueOf(roundingMode));
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is {@code this / divisor}. As
- * scale of the result the parameter {@code scale} is used. If rounding is
- * required to meet the specified scale, then the specified rounding mode
- * {@code roundingMode} is applied.
- *
- * @param divisor value by which {@code this} is divided.
- * @param scale the scale of the result returned.
- * @param roundingMode rounding mode to be used to round the result.
- * @return {@code this / divisor} rounded according to the given rounding
- * mode.
- * @throws NullPointerException if {@code divisor == null}.
- * @throws IllegalArgumentException if {@code roundingMode} is not a valid
- * rounding mode.
- * @throws ArithmeticException if {@code divisor == 0}.
- * @throws ArithmeticException if {@code roundingMode == ROUND_UNNECESSARY}
- * and rounding is necessary according to the given scale.
- */
- public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) {
- return divide(divisor, scale, RoundingMode.valueOf(roundingMode));
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is {@code this / divisor}. As
- * scale of the result the parameter {@code scale} is used. If rounding is
- * required to meet the specified scale, then the specified rounding mode
- * {@code roundingMode} is applied.
- *
- * @param divisor value by which {@code this} is divided.
- * @param scale the scale of the result returned.
- * @param roundingMode rounding mode to be used to round the result.
- * @return {@code this / divisor} rounded according to the given rounding
- * mode.
- * @throws NullPointerException if {@code divisor == null} or {@code
- * roundingMode == null}.
- * @throws ArithmeticException if {@code divisor == 0}.
- * @throws ArithmeticException if {@code roundingMode ==
- * RoundingMode.UNNECESSAR}Y and rounding is necessary according to
- * the given scale and given precision.
- */
- public BigDecimal divide(BigDecimal divisor, int scale,
- RoundingMode roundingMode) {
- // Let be: this = [u1,s1] and divisor = [u2,s2]
- if (roundingMode == null) {
- throw new NullPointerException();
- }
- if (divisor.isZero()) {
- // math.04=Division by zero
- throw new ArithmeticException("Division by zero"); //$NON-NLS-1$
- }
-
- double diffScale = this.scale - divisor.scale - scale;
- if (this.bitLength < 54 && divisor.bitLength < 54) {
- if (diffScale == 0) {
- return dividePrimitiveLongs((long) this.smallValue,
- (long) divisor.smallValue, scale, roundingMode);
- } else if (diffScale > 0) {
- if (diffScale < DOUBLE_TEN_POW.length
- && divisor.bitLength + DOUBLE_TEN_POW_BIT_LENGTH[(int) diffScale] < 54) {
- return dividePrimitiveLongs((long) this.smallValue,
- (long) (divisor.smallValue * DOUBLE_TEN_POW[(int) diffScale]),
- scale, roundingMode);
- }
- } else { // diffScale < 0
- if (-diffScale < DOUBLE_TEN_POW.length
- && this.bitLength + DOUBLE_TEN_POW_BIT_LENGTH[(int) -diffScale] < 54) {
- return dividePrimitiveLongs(
- (long) (this.smallValue * DOUBLE_TEN_POW[(int) -diffScale]),
- (long) divisor.smallValue, scale, roundingMode);
- }
- }
- }
- BigInteger scaledDividend = this.getUnscaledValue();
- BigInteger scaledDivisor = divisor.getUnscaledValue(); // for scaling of
- // 'u2'
-
- if (diffScale > 0) {
- // Multiply 'u2' by: 10^((s1 - s2) - scale)
- scaledDivisor = Multiplication.multiplyByTenPow(scaledDivisor,
- (int) diffScale);
- } else if (diffScale < 0) {
- // Multiply 'u1' by: 10^(scale - (s1 - s2))
- scaledDividend = Multiplication.multiplyByTenPow(scaledDividend,
- (int) -diffScale);
- }
- return divideBigIntegers(scaledDividend, scaledDivisor, scale, roundingMode);
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is {@code this / divisor}. The
- * result is rounded according to the passed context {@code mc}. If the passed
- * math context specifies precision {@code 0}, then this call is equivalent to
- * {@code this.divide(divisor)}.
- *
- * @param divisor value by which {@code this} is divided.
- * @param mc rounding mode and precision for the result of this operation.
- * @return {@code this / divisor}.
- * @throws NullPointerException if {@code divisor == null} or {@code mc ==
- * null}.
- * @throws ArithmeticException if {@code divisor == 0}.
- * @throws ArithmeticException if {@code mc.getRoundingMode() == UNNECESSARY}
- * and rounding is necessary according {@code mc.getPrecision()}.
- */
- public BigDecimal divide(BigDecimal divisor, MathContext mc) {
- /*
- * Calculating how many zeros must be append to 'dividend' to obtain a
- * quotient with at least 'mc.precision()' digits
- */
- double traillingZeros = mc.getPrecision() + 2L + divisor.approxPrecision()
- - approxPrecision();
- double diffScale = scale - divisor.scale;
- double newScale = diffScale; // scale of the final quotient
- int compRem; // to compare the remainder
- int i = 1; // index
- int lastPow = TEN_POW.length - 1; // last power of ten
- BigInteger integerQuot; // for temporal results
- BigInteger quotAndRem[] = {getUnscaledValue()};
- // In special cases it reduces the problem to call the dual method
- if ((mc.getPrecision() == 0) || (this.isZero()) || (divisor.isZero())) {
- return this.divide(divisor);
- }
- if (traillingZeros > 0) {
- // To append trailing zeros at end of dividend
- quotAndRem[0] = getUnscaledValue().multiply(
- Multiplication.powerOf10(traillingZeros));
- newScale += traillingZeros;
- }
- quotAndRem = quotAndRem[0].divideAndRemainder(divisor.getUnscaledValue());
- integerQuot = quotAndRem[0];
- // Calculating the exact quotient with at least 'mc.precision()' digits
- if (quotAndRem[1].signum() != 0) {
- // Checking if: 2 * remainder >= divisor ?
- compRem = quotAndRem[1].shiftLeftOneBit().compareTo(
- divisor.getUnscaledValue());
- // quot := quot * 10 + r; with 'r' in {-6,-5,-4, 0,+4,+5,+6}
- integerQuot = integerQuot.multiply(BigInteger.TEN).add(
- BigInteger.valueOf(quotAndRem[0].signum() * (5 + compRem)));
- newScale++;
- } else {
- // To strip trailing zeros until the preferred scale is reached
- while (!integerQuot.testBit(0)) {
- quotAndRem = integerQuot.divideAndRemainder(TEN_POW[i]);
- if ((quotAndRem[1].signum() == 0) && (newScale - i >= diffScale)) {
- newScale -= i;
- if (i < lastPow) {
- i++;
- }
- integerQuot = quotAndRem[0];
- } else {
- if (i == 1) {
- break;
- }
- i = 1;
- }
- }
- }
- // To perform rounding
- return new BigDecimal(integerQuot, toIntScale(newScale), mc);
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is {@code this / divisor}. The
- * scale of the result is the scale of {@code this}. If rounding is required
- * to meet the specified scale, then the specified rounding mode {@code
- * roundingMode} is applied.
- *
- * @param divisor value by which {@code this} is divided.
- * @param roundingMode rounding mode to be used to round the result.
- * @return {@code this / divisor} rounded according to the given rounding
- * mode.
- * @throws NullPointerException if {@code divisor == null} or {@code
- * roundingMode == null}.
- * @throws ArithmeticException if {@code divisor == 0}.
- * @throws ArithmeticException if {@code roundingMode ==
- * RoundingMode.UNNECESSARY} and rounding is necessary according to
- * the scale of this.
- */
- public BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode) {
- return divide(divisor, (int) scale, roundingMode);
- }
-
- /**
- * Returns a {@code BigDecimal} array which contains the integral part of
- * {@code this / divisor} at index 0 and the remainder {@code this % divisor}
- * at index 1. The quotient is rounded down towards zero to the next integer.
- *
- * @param divisor value by which {@code this} is divided.
- * @return {@code [this.divideToIntegralValue(divisor),
- * this.remainder(divisor)]}.
- * @throws NullPointerException if {@code divisor == null}.
- * @throws ArithmeticException if {@code divisor == 0}.
- * @see #divideToIntegralValue
- * @see #remainder
- */
- public BigDecimal[] divideAndRemainder(BigDecimal divisor) {
- BigDecimal quotAndRem[] = new BigDecimal[2];
-
- quotAndRem[0] = this.divideToIntegralValue(divisor);
- quotAndRem[1] = this.subtract(quotAndRem[0].multiply(divisor));
- return quotAndRem;
- }
-
- /**
- * Returns a {@code BigDecimal} array which contains the integral part of
- * {@code this / divisor} at index 0 and the remainder {@code this % divisor}
- * at index 1. The quotient is rounded down towards zero to the next integer.
- * The rounding mode passed with the parameter {@code mc} is not considered.
- * But if the precision of {@code mc > 0} and the integral part requires more
- * digits, then an {@code ArithmeticException} is thrown.
- *
- * @param divisor value by which {@code this} is divided.
- * @param mc math context which determines the maximal precision of the
- * result.
- * @return {@code [this.divideToIntegralValue(divisor),
- * this.remainder(divisor)]}.
- * @throws NullPointerException if {@code divisor == null}.
- * @throws ArithmeticException if {@code divisor == 0}.
- * @see #divideToIntegralValue
- * @see #remainder
- */
- public BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc) {
- BigDecimal quotAndRem[] = new BigDecimal[2];
-
- quotAndRem[0] = this.divideToIntegralValue(divisor, mc);
- quotAndRem[1] = this.subtract(quotAndRem[0].multiply(divisor));
- return quotAndRem;
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is the integral part of
- * {@code this / divisor}. The quotient is rounded down towards zero to the
- * next integer. For example, {@code 0.5/0.2 = 2}.
- *
- * @param divisor value by which {@code this} is divided.
- * @return integral part of {@code this / divisor}.
- * @throws NullPointerException if {@code divisor == null}.
- * @throws ArithmeticException if {@code divisor == 0}.
- */
- public BigDecimal divideToIntegralValue(BigDecimal divisor) {
- BigInteger integralValue; // the integer of result
- BigInteger powerOfTen; // some power of ten
- BigInteger quotAndRem[] = {getUnscaledValue()};
- double newScale = this.scale - divisor.scale;
- double tempScale = 0;
- int i = 1;
- int lastPow = TEN_POW.length - 1;
-
- if (divisor.isZero()) {
- // math.04=Division by zero
- throw new ArithmeticException("Division by zero"); //$NON-NLS-1$
- }
- if ((divisor.approxPrecision() + newScale > this.approxPrecision() + 1L)
- || (this.isZero())) {
- /*
- * If the divisor's integer part is greater than this's integer part, the
- * result must be zero with the appropriate scale
- */
- integralValue = BigInteger.ZERO;
- } else if (newScale == 0) {
- integralValue = getUnscaledValue().divide(divisor.getUnscaledValue());
- } else if (newScale > 0) {
- powerOfTen = Multiplication.powerOf10(newScale);
- integralValue = getUnscaledValue().divide(
- divisor.getUnscaledValue().multiply(powerOfTen));
- integralValue = integralValue.multiply(powerOfTen);
- } else {
- // (newScale < 0)
- powerOfTen = Multiplication.powerOf10(-newScale);
- integralValue = getUnscaledValue().multiply(powerOfTen).divide(
- divisor.getUnscaledValue());
- // To strip trailing zeros approximating to the preferred scale
- while (!integralValue.testBit(0)) {
- quotAndRem = integralValue.divideAndRemainder(TEN_POW[i]);
- if ((quotAndRem[1].signum() == 0) && (tempScale - i >= newScale)) {
- tempScale -= i;
- if (i < lastPow) {
- i++;
- }
- integralValue = quotAndRem[0];
- } else {
- if (i == 1) {
- break;
- }
- i = 1;
- }
- }
- newScale = tempScale;
- }
- return ((integralValue.signum() == 0) ? zeroScaledBy(newScale)
- : new BigDecimal(integralValue, toIntScale(newScale)));
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is the integral part of
- * {@code this / divisor}. The quotient is rounded down towards zero to the
- * next integer. The rounding mode passed with the parameter {@code mc} is not
- * considered. But if the precision of {@code mc > 0} and the integral part
- * requires more digits, then an {@code ArithmeticException} is thrown.
- *
- * @param divisor value by which {@code this} is divided.
- * @param mc math context which determines the maximal precision of the
- * result.
- * @return integral part of {@code this / divisor}.
- * @throws NullPointerException if {@code divisor == null} or {@code mc ==
- * null}.
- * @throws ArithmeticException if {@code divisor == 0}.
- * @throws ArithmeticException if {@code mc.getPrecision() > 0} and the result
- * requires more digits to be represented.
- */
- public BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext mc) {
- int mcPrecision = mc.getPrecision();
- int diffPrecision = this.precision() - divisor.precision();
- int lastPow = TEN_POW.length - 1;
- double diffScale = this.scale - divisor.scale;
- double newScale = diffScale;
- double quotPrecision = diffPrecision - diffScale + 1;
- BigInteger quotAndRem[] = new BigInteger[2];
- // In special cases it call the dual method
- if ((mcPrecision == 0) || (this.isZero()) || (divisor.isZero())) {
- return this.divideToIntegralValue(divisor);
- }
- // Let be: this = [u1,s1] and divisor = [u2,s2]
- if (quotPrecision <= 0) {
- quotAndRem[0] = BigInteger.ZERO;
- } else if (diffScale == 0) {
- // CASE s1 == s2: to calculate u1 / u2
- quotAndRem[0] = this.getUnscaledValue().divide(divisor.getUnscaledValue());
- } else if (diffScale > 0) {
- // CASE s1 >= s2: to calculate u1 / (u2 * 10^(s1-s2)
- quotAndRem[0] = this.getUnscaledValue().divide(
- divisor.getUnscaledValue().multiply(
- Multiplication.powerOf10(diffScale)));
- // To chose 10^newScale to get a quotient with at least 'mc.precision()'
- // digits
- newScale = Math.min(diffScale, Math.max(mcPrecision - quotPrecision + 1,
- 0));
- // To calculate: (u1 / (u2 * 10^(s1-s2)) * 10^newScale
- quotAndRem[0] = quotAndRem[0].multiply(Multiplication.powerOf10(newScale));
- } else {
- // CASE s2 > s1:
- /*
- * To calculate the minimum power of ten, such that the quotient (u1 *
- * 10^exp) / u2 has at least 'mc.precision()' digits.
- */
- double exp = Math.min(-diffScale, Math.max((double) mcPrecision
- - diffPrecision, 0));
- double compRemDiv;
- // Let be: (u1 * 10^exp) / u2 = [q,r]
- quotAndRem = this.getUnscaledValue().multiply(
- Multiplication.powerOf10(exp)).divideAndRemainder(
- divisor.getUnscaledValue());
- newScale += exp; // To fix the scale
- exp = -newScale; // The remaining power of ten
- // If after division there is a remainder...
- if ((quotAndRem[1].signum() != 0) && (exp > 0)) {
- // Log10(r) + ((s2 - s1) - exp) > mc.precision ?
- compRemDiv = (new BigDecimal(quotAndRem[1])).precision() + exp
- - divisor.precision();
- if (compRemDiv == 0) {
- // To calculate: (r * 10^exp2) / u2
- quotAndRem[1] = quotAndRem[1].multiply(Multiplication.powerOf10(exp)).divide(
- divisor.getUnscaledValue());
- compRemDiv = Math.abs(quotAndRem[1].signum());
- }
- if (compRemDiv > 0) {
- // The quotient won't fit in 'mc.precision()' digits
- // math.06=Division impossible
- throw new ArithmeticException("Division impossible"); //$NON-NLS-1$
- }
- }
- }
- // Fast return if the quotient is zero
- if (quotAndRem[0].signum() == 0) {
- return zeroScaledBy(diffScale);
- }
- BigInteger strippedBI = quotAndRem[0];
- BigDecimal integralValue = new BigDecimal(quotAndRem[0]);
- int resultPrecision = integralValue.precision();
- int i = 1;
- // To strip trailing zeros until the specified precision is reached
- while (!strippedBI.testBit(0)) {
- quotAndRem = strippedBI.divideAndRemainder(TEN_POW[i]);
- if ((quotAndRem[1].signum() == 0)
- && ((resultPrecision - i >= mcPrecision) || (newScale - i >= diffScale))) {
- resultPrecision -= i;
- newScale -= i;
- if (i < lastPow) {
- i++;
- }
- strippedBI = quotAndRem[0];
- } else {
- if (i == 1) {
- break;
- }
- i = 1;
- }
- }
- // To check if the result fit in 'mc.precision()' digits
- if (resultPrecision > mcPrecision) {
- // math.06=Division impossible
- throw new ArithmeticException("Division impossible"); //$NON-NLS-1$
- }
- integralValue.scale = toIntScale(newScale);
- integralValue.setUnscaledValue(strippedBI);
- return integralValue;
- }
-
- /**
- * Returns this {@code BigDecimal} as a double value. If {@code this} is too
- * big to be represented as an float, then {@code Double.POSITIVE_INFINITY} or
- * {@code Double.NEGATIVE_INFINITY} is returned.
- * <p>
- * Note, that if the unscaled value has more than 53 significant digits, then
- * this decimal cannot be represented exactly in a double variable. In this
- * case the result is rounded.
- * <p>
- * For example, if the instance {@code x1 = new BigDecimal("0.1")} cannot be
- * represented exactly as a double, and thus {@code x1.equals(new
- * BigDecimal(x1.doubleValue())} returns {@code false} for this case.
- * <p>
- * Similarly, if the instance {@code new BigDecimal(9007199254740993L)} is
- * converted to a double, the result is {@code 9.007199254740992E15}.
- * <p>
- *
- * @return this {@code BigDecimal} as a double value.
- */
- @Override
- public double doubleValue() {
- return Double.parseDouble(this.toString());
- }
-
- /**
- * Returns {@code true} if {@code x} is a {@code BigDecimal} instance and if
- * this instance is equal to this big decimal. Two big decimals are equal if
- * their unscaled value and their scale is equal. For example, 1.0
- * (10*10^(-1)) is not equal to 1.00 (100*10^(-2)). Similarly, zero instances
- * are not equal if their scale differs.
- *
- * @param x object to be compared with {@code this}.
- * @return true if {@code x} is a {@code BigDecimal} and {@code this == x}.
- */
- @Override
- public boolean equals(Object x) {
- if (this == x) {
- return true;
- }
- if (x instanceof BigDecimal) {
- BigDecimal x1 = (BigDecimal) x;
- return x1.scale == scale
- && (bitLength < 54 ? (x1.smallValue == smallValue)
- : intVal.equals(x1.intVal));
- }
- return false;
- }
-
- // @Override
- // public double doubleValue() {
- // int sign = signum();
- // int exponent = 1076; // bias + 53
- // int lowestSetBit;
- // int discardedSize;
- // long powerOfTwo = this.bitLength - (long)(scale / LOG10_2);
- // long bits; // IEEE-754 Standard
- // long tempBits; // for temporal calculations
- // BigInteger mantisa;
- //
- // if ((powerOfTwo < -1074) || (sign == 0)) {
- // // Cases which 'this' is very small
- // return (sign * 0.0d);
- // } else if (powerOfTwo > 1025) {
- // // Cases which 'this' is very large
- // return (sign * Double.POSITIVE_INFINITY);
- // }
- // mantisa = getUnscaledValue().abs();
- // // Let be: this = [u,s], with s > 0
- // if (scale <= 0) {
- // // mantisa = abs(u) * 10^s
- // mantisa = mantisa.multiply(Multiplication.powerOf10(-scale));
- // } else {// (scale > 0)
- // BigInteger quotAndRem[];
- // BigInteger powerOfTen = Multiplication.powerOf10(scale);
- // int k = 100 - (int)powerOfTwo;
- // int compRem;
- //
- // if (k > 0) {
- // /* Computing (mantisa * 2^k) , where 'k' is a enough big
- // * power of '2' to can divide by 10^s */
- // mantisa = mantisa.shiftLeft(k);
- // exponent -= k;
- // }
- // // Computing (mantisa * 2^k) / 10^s
- // quotAndRem = mantisa.divideAndRemainder(powerOfTen);
- // // To check if the fractional part >= 0.5
- // compRem = quotAndRem[1].shiftLeftOneBit().compareTo(powerOfTen);
- // // To add two rounded bits at end of mantisa
- // mantisa = quotAndRem[0].shiftLeft(2).add(
- // BigInteger.valueOf((compRem * (compRem + 3)) / 2 + 1));
- // exponent -= 2;
- // }
- // lowestSetBit = mantisa.getLowestSetBit();
- // discardedSize = mantisa.bitLength() - 54;
- // if (discardedSize > 0) {// (n > 54)
- // // mantisa = (abs(u) * 10^s) >> (n - 54)
- // bits = mantisa.shiftRight(discardedSize).longValue();
- // tempBits = bits;
- // // #bits = 54, to check if the discarded fraction produces a carry
- // if ((((bits & 1) == 1) && (lowestSetBit < discardedSize))
- // || ((bits & 3) == 3)) {
- // bits += 2;
- // }
- // } else {// (n <= 54)
- // // mantisa = (abs(u) * 10^s) << (54 - n)
- // bits = mantisa.longValue() << -discardedSize;
- // tempBits = bits;
- // // #bits = 54, to check if the discarded fraction produces a carry:
- // if ((bits & 3) == 3) {
- // bits += 2;
- // }
- // }
- // // Testing bit 54 to check if the carry creates a new binary digit
- // if ((bits & 0x40000000000000L) == 0) {
- // // To drop the last bit of mantisa (first discarded)
- // bits >>= 1;
- // // exponent = 2^(s-n+53+bias)
- // exponent += discardedSize;
- // } else {// #bits = 54
- // bits >>= 2;
- // exponent += discardedSize + 1;
- // }
- // // To test if the 53-bits number fits in 'double'
- // if (exponent > 2046) {// (exponent - bias > 1023)
- // return (sign * Double.POSITIVE_INFINITY);
- // } else if (exponent <= 0) {// (exponent - bias <= -1023)
- // // Denormalized numbers (having exponent == 0)
- // if (exponent < -53) {// exponent - bias < -1076
- // return (sign * 0.0d);
- // }
- // // -1076 <= exponent - bias <= -1023
- // // To discard '- exponent + 1' bits
- // bits = tempBits >> 1;
- // tempBits = bits & (-1L >>> (63 + exponent));
- // bits >>= (-exponent );
- // // To test if after discard bits, a new carry is generated
- // if (((bits & 3) == 3) || (((bits & 1) == 1) && (tempBits != 0)
- // && (lowestSetBit < discardedSize))) {
- // bits += 1;
- // }
- // exponent = 0;
- // bits >>= 1;
- // }
- // // Construct the 64 double bits: [sign(1), exponent(11), mantisa(52)]
- // bits = (sign & 0x8000000000000000L) | ((long)exponent << 52)
- // | (bits & 0xFFFFFFFFFFFFFL);
- // return Double.longBitsToDouble(bits);
- // }
-
- /**
- * Returns this {@code BigDecimal} as a float value. If {@code this} is too
- * big to be represented as an float, then {@code Float.POSITIVE_INFINITY} or
- * {@code Float.NEGATIVE_INFINITY} is returned.
- * <p>
- * Note, that if the unscaled value has more than 24 significant digits, then
- * this decimal cannot be represented exactly in a float variable. In this
- * case the result is rounded.
- * <p>
- * For example, if the instance {@code x1 = new BigDecimal("0.1")} cannot be
- * represented exactly as a float, and thus {@code x1.equals(new
- * BigDecimal(x1.folatValue())} returns {@code false} for this case.
- * <p>
- * Similarly, if the instance {@code new BigDecimal(16777217)} is converted to
- * a float, the result is {@code 1.6777216E}7.
- *
- * @return this {@code BigDecimal} as a float value.
- */
- @Override
- public float floatValue() {
- /*
- * A similar code like in doubleValue() could be repeated here, but this
- * simple implementation is quite efficient.
- */
- float floatResult = signum();
- double powerOfTwo = this.bitLength - (scale / LOG10_2);
- if ((powerOfTwo < -149) || (floatResult == 0.0f)) {
- // Cases which 'this' is very small
- floatResult *= 0.0f;
- } else if (powerOfTwo > 129) {
- // Cases which 'this' is very large
- floatResult *= Float.POSITIVE_INFINITY;
- } else {
- floatResult = (float) doubleValue();
- }
- return floatResult;
- }
-
- /**
- * Returns a hash code for this {@code BigDecimal}.
- *
- * @return hash code for {@code this}.
- */
- @Override
- public int hashCode() {
- if (hashCode != 0) {
- return hashCode;
- }
- if (bitLength < 54) {
- long longValue = (long) smallValue;
- hashCode = (int) (longValue & 0xffffffff);
- hashCode = 33 * hashCode + (int) ((longValue >> 32) & 0xffffffff);
- hashCode = 17 * hashCode + (int) scale;
- return hashCode;
- }
- hashCode = 17 * intVal.hashCode() + (int) scale;
- return hashCode;
- }
-
- /**
- * Returns this {@code BigDecimal} as an int value. Any fractional part is
- * discarded. If the integral part of {@code this} is too big to be
- * represented as an int, then {@code this} % 2^32 is returned.
- *
- * @return this {@code BigDecimal} as a int value.
- */
- @Override
- public int intValue() {
- /*
- * If scale <= -32 there are at least 32 trailing bits zero in 10^(-scale).
- * If the scale is positive and very large the long value could be zero.
- */
- return ((scale <= -32) || (scale > approxPrecision()) ? 0
- : toBigInteger().intValue());
- }
-
- /**
- * Returns this {@code BigDecimal} as a int value if it has no fractional part
- * and if its value fits to the int range ([-2^{31}..2^{31}-1]). If these
- * conditions are not met, an {@code ArithmeticException} is thrown.
- *
- * @return this {@code BigDecimal} as a int value.
- * @throws ArithmeticException if rounding is necessary or the number doesn't
- * fit in a int.
- */
- public int intValueExact() {
- return (int) valueExact(32);
- }
-
- /**
- * Returns this {@code BigDecimal} as an long value. Any fractional part is
- * discarded. If the integral part of {@code this} is too big to be
- * represented as an long, then {@code this} % 2^64 is returned.
- *
- * @return this {@code BigDecimal} as a long value.
- */
- @Override
- public long longValue() {
- /*
- * If scale <= -64 there are at least 64 trailing bits zero in 10^(-scale).
- * If the scale is positive and very large the long value could be zero.
- */
- return ((scale <= -64) || (scale > approxPrecision()) ? 0L
- : toBigInteger().longValue());
- }
-
- /**
- * Returns this {@code BigDecimal} as a long value if it has no fractional
- * part and if its value fits to the int range ([-2^{63}..2^{63}-1]). If these
- * conditions are not met, an {@code ArithmeticException} is thrown.
- *
- * @return this {@code BigDecimal} as a long value.
- * @throws ArithmeticException if rounding is necessary or the number doesn't
- * fit in a long.
- */
- public long longValueExact() {
- return valueExact(64);
- }
-
- /**
- * Returns the maximum of this {@code BigDecimal} and {@code val}.
- *
- * @param val value to be used to compute the maximum with this.
- * @return {@code max(this, val}.
- * @throws NullPointerException if {@code val == null}.
- */
- public BigDecimal max(BigDecimal val) {
- return ((compareTo(val) >= 0) ? this : val);
- }
-
- /**
- * Returns the minimum of this {@code BigDecimal} and {@code val}.
- *
- * @param val value to be used to compute the minimum with this.
- * @return {@code min(this, val}.
- * @throws NullPointerException if {@code val == null}.
- */
- public BigDecimal min(BigDecimal val) {
- return ((compareTo(val) <= 0) ? this : val);
- }
-
- /**
- * Returns a new {@code BigDecimal} instance where the decimal point has been
- * moved {@code n} places to the left. If {@code n < 0} then the decimal point
- * is moved {@code -n} places to the right.
- * <p>
- * The result is obtained by changing its scale. If the scale of the result
- * becomes negative, then its precision is increased such that the scale is
- * zero.
- * <p>
- * Note, that {@code movePointLeft(0)} returns a result which is
- * mathematically equivalent, but which has {@code scale >= 0}.
- *
- * @param n number of placed the decimal point has to be moved.
- * @return {@code this * 10^(-n}).
- */
- public BigDecimal movePointLeft(int n) {
- return movePoint(scale + n);
- }
-
- /**
- * Returns a new {@code BigDecimal} instance where the decimal point has been
- * moved {@code n} places to the right. If {@code n < 0} then the decimal
- * point is moved {@code -n} places to the left.
- * <p>
- * The result is obtained by changing its scale. If the scale of the result
- * becomes negative, then its precision is increased such that the scale is
- * zero.
- * <p>
- * Note, that {@code movePointRight(0)} returns a result which is
- * mathematically equivalent, but which has scale >= 0.
- *
- * @param n number of placed the decimal point has to be moved.
- * @return {@code this * 10^n}.
- */
- public BigDecimal movePointRight(int n) {
- return movePoint(scale - n);
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is {@code this * multiplicand}
- * . The scale of the result is the sum of the scales of the two arguments.
- *
- * @param multiplicand value to be multiplied with {@code this}.
- * @return {@code this * multiplicand}.
- * @throws NullPointerException if {@code multiplicand == null}.
- */
- public BigDecimal multiply(BigDecimal multiplicand) {
- double newScale = this.scale + multiplicand.scale;
-
- if ((this.isZero()) || (multiplicand.isZero())) {
- return zeroScaledBy(newScale);
- }
- /*
- * Let be: this = [u1,s1] and multiplicand = [u2,s2] so: this x multiplicand
- * = [ s1 * s2 , s1 + s2 ]
- */
- if (this.bitLength + multiplicand.bitLength < 54) {
- return valueOf(this.smallValue * multiplicand.smallValue,
- toIntScale(newScale));
- }
- return new BigDecimal(this.getUnscaledValue().multiply(
- multiplicand.getUnscaledValue()), toIntScale(newScale));
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is {@code this * multiplicand}
- * . The result is rounded according to the passed context {@code mc}.
- *
- * @param multiplicand value to be multiplied with {@code this}.
- * @param mc rounding mode and precision for the result of this operation.
- * @return {@code this * multiplicand}.
- * @throws NullPointerException if {@code multiplicand == null} or {@code mc
- * == null}.
- */
- public BigDecimal multiply(BigDecimal multiplicand, MathContext mc) {
- BigDecimal result = multiply(multiplicand);
-
- result.inplaceRound(mc);
- return result;
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is the {@code -this}. The
- * scale of the result is the same as the scale of this.
- *
- * @return {@code -this}
- */
- public BigDecimal negate() {
- if (bitLength < 54) {
- return valueOf(-smallValue, scale);
- }
- return new BigDecimal(getUnscaledValue().negate(), scale);
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is the {@code -this}. The
- * result is rounded according to the passed context {@code mc}.
- *
- * @param mc rounding mode and precision for the result of this operation.
- * @return {@code -this}
- */
- public BigDecimal negate(MathContext mc) {
- return round(mc).negate();
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is {@code +this}. The scale of
- * the result is the same as the scale of this.
- *
- * @return {@code this}
- */
- public BigDecimal plus() {
- return this;
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is {@code +this}. The result
- * is rounded according to the passed context {@code mc}.
- *
- * @param mc rounding mode and precision for the result of this operation.
- * @return {@code this}, rounded
- */
- public BigDecimal plus(MathContext mc) {
- return round(mc);
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is {@code this ^ n}. The scale
- * of the result is {@code n} times the scales of {@code this}.
- * <p>
- * {@code x.pow(0)} returns {@code 1}, even if {@code x == 0}.
- * <p>
- * Implementation Note: The implementation is based on the ANSI standard
- * X3.274-1996 algorithm.
- *
- * @param n exponent to which {@code this} is raised.
- * @return {@code this ^ n}.
- * @throws ArithmeticException if {@code n < 0} or {@code n > 999999999}.
- */
- public BigDecimal pow(int n) {
- if (n == 0) {
- return ONE;
- }
- if ((n < 0) || (n > 999999999)) {
- // math.07=Invalid Operation
- throw new ArithmeticException("Invalid Operation"); //$NON-NLS-1$
- }
- double newScale = scale * n;
- // Let be: this = [u,s] so: this^n = [u^n, s*n]
- return ((isZero()) ? zeroScaledBy(newScale) : new BigDecimal(
- getUnscaledValue().pow(n), toIntScale(newScale)));
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is {@code this ^ n}. The
- * result is rounded according to the passed context {@code mc}.
- * <p>
- * Implementation Note: The implementation is based on the ANSI standard
- * X3.274-1996 algorithm.
- *
- * @param n exponent to which {@code this} is raised.
- * @param mc rounding mode and precision for the result of this operation.
- * @return {@code this ^ n}.
- * @throws ArithmeticException if {@code n < 0} or {@code n > 999999999}.
- */
- public BigDecimal pow(int n, MathContext mc) {
- // The ANSI standard X3.274-1996 algorithm
- int m = Math.abs(n);
- int mcPrecision = mc.getPrecision();
- int elength = (int) Math.log10(m) + 1; // decimal digits in 'n'
- int oneBitMask; // mask of bits
- BigDecimal accum; // the single accumulator
- MathContext newPrecision = mc; // MathContext by default
-
- // In particular cases, it reduces the problem to call the other 'pow()'
- if ((n == 0) || ((isZero()) && (n > 0))) {
- return pow(n);
- }
- if ((m > 999999999) || ((mcPrecision == 0) && (n < 0))
- || ((mcPrecision > 0) && (elength > mcPrecision))) {
- // math.07=Invalid Operation
- throw new ArithmeticException("Invalid Operation"); //$NON-NLS-1$
- }
- if (mcPrecision > 0) {
- newPrecision = new MathContext(mcPrecision + elength + 1,
- mc.getRoundingMode());
- }
- // The result is calculated as if 'n' were positive
- accum = round(newPrecision);
- oneBitMask = Integer.highestOneBit(m) >> 1;
-
- while (oneBitMask > 0) {
- accum = accum.multiply(accum, newPrecision);
- if ((m & oneBitMask) == oneBitMask) {
- accum = accum.multiply(this, newPrecision);
- }
- oneBitMask >>= 1;
- }
- // If 'n' is negative, the value is divided into 'ONE'
- if (n < 0) {
- accum = ONE.divide(accum, newPrecision);
- }
- // The final value is rounded to the destination precision
- accum.inplaceRound(mc);
- return accum;
- }
-
- /**
- * Returns the precision of this {@code BigDecimal}. The precision is the
- * number of decimal digits used to represent this decimal. It is equivalent
- * to the number of digits of the unscaled value. The precision of {@code 0}
- * is {@code 1} (independent of the scale).
- *
- * @return the precision of this {@code BigDecimal}.
- */
- public int precision() {
- // Checking if the precision already was calculated
- if (precision > 0) {
- return precision;
- }
- int decimalDigits = 1; // the precision to be calculated
- double doubleUnsc = 1; // intVal in 'double'
-
- if (bitLength < 1024) {
- // To calculate the precision for small numbers
- if (bitLength >= 54) {
- doubleUnsc = getUnscaledValue().doubleValue();
- } else if (bitLength >= 1) {
- doubleUnsc = smallValue;
- }
- decimalDigits += (int) Math.log10(Math.abs(doubleUnsc));
- } else {
- // (bitLength >= 1024)
- /*
- * To calculate the precision for large numbers Note that: 2 ^(bitlength()
- * - 1) <= intVal < 10 ^(precision())
- */
- decimalDigits += (bitLength - 1) * LOG10_2;
- // If after division the number isn't zero, exists an aditional digit
- if (getUnscaledValue().divide(Multiplication.powerOf10(decimalDigits)).signum() != 0) {
- decimalDigits++;
- }
- }
- precision = decimalDigits;
- return precision;
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is {@code this % divisor}.
- * <p>
- * The remainder is defined as {@code this -
- * this.divideToIntegralValue(divisor) * divisor}.
- *
- * @param divisor value by which {@code this} is divided.
- * @return {@code this % divisor}.
- * @throws NullPointerException if {@code divisor == null}.
- * @throws ArithmeticException if {@code divisor == 0}.
- */
- public BigDecimal remainder(BigDecimal divisor) {
- return divideAndRemainder(divisor)[1];
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is {@code this % divisor}.
- * <p>
- * The remainder is defined as {@code this -
- * this.divideToIntegralValue(divisor) * divisor}.
- * <p>
- * The specified rounding mode {@code mc} is used for the division only.
- *
- * @param divisor value by which {@code this} is divided.
- * @param mc rounding mode and precision to be used.
- * @return {@code this % divisor}.
- * @throws NullPointerException if {@code divisor == null}.
- * @throws ArithmeticException if {@code divisor == 0}.
- * @throws ArithmeticException if {@code mc.getPrecision() > 0} and the result
- * of {@code this.divideToIntegralValue(divisor, mc)} requires more
- * digits to be represented.
- */
- public BigDecimal remainder(BigDecimal divisor, MathContext mc) {
- return divideAndRemainder(divisor, mc)[1];
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is {@code this}, rounded
- * according to the passed context {@code mc}.
- * <p>
- * If {@code mc.precision = 0}, then no rounding is performed.
- * <p>
- * If {@code mc.precision > 0} and {@code mc.roundingMode == UNNECESSARY},
- * then an {@code ArithmeticException} is thrown if the result cannot be
- * represented exactly within the given precision.
- *
- * @param mc rounding mode and precision for the result of this operation.
- * @return {@code this} rounded according to the passed context.
- * @throws ArithmeticException if {@code mc.precision > 0} and {@code
- * mc.roundingMode == UNNECESSARY} and this cannot be represented
- * within the given precision.
- */
- public BigDecimal round(MathContext mc) {
- BigDecimal thisBD = new BigDecimal(getUnscaledValue(), scale);
-
- thisBD.inplaceRound(mc);
- return thisBD;
- }
-
- /**
- * Returns the scale of this {@code BigDecimal}. The scale is the number of
- * digits behind the decimal point. The value of this {@code BigDecimal} is
- * the unsignedValue * 10^(-scale). If the scale is negative, then this
- * {@code BigDecimal} represents a big integer.
- *
- * @return the scale of this {@code BigDecimal}.
- */
- public int scale() {
- return (int) scale;
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is {@code this} 10^{@code n}.
- * The scale of the result is {@code this.scale()} - {@code n}. The precision
- * of the result is the precision of {@code this}.
- * <p>
- * This method has the same effect as {@link #movePointRight}, except that the
- * precision is not changed.
- *
- * @param n number of places the decimal point has to be moved.
- * @return {@code this * 10^n}
- */
- public BigDecimal scaleByPowerOfTen(int n) {
- double newScale = scale - n;
- if (bitLength < 54) {
- // Taking care when a 0 is to be scaled
- if (smallValue == 0) {
- return zeroScaledBy(newScale);
- }
- return valueOf(smallValue, toIntScale(newScale));
- }
- return new BigDecimal(getUnscaledValue(), toIntScale(newScale));
- }
-
- /**
- * Returns a new {@code BigDecimal} instance with the specified scale. If the
- * new scale is greater than the old scale, then additional zeros are added to
- * the unscaled value. If the new scale is smaller than the old scale, then
- * trailing zeros are removed. If the trailing digits are not zeros then an
- * ArithmeticException is thrown.
- * <p>
- * If no exception is thrown, then the following equation holds: {@code
- * x.setScale(s).compareTo(x) == 0}.
- *
- * @param newScale scale of the result returned.
- * @return a new {@code BigDecimal} instance with the specified scale.
- * @throws ArithmeticException if rounding would be necessary.
- */
- public BigDecimal setScale(int newScale) {
- return setScale(newScale, RoundingMode.UNNECESSARY);
- }
-
- /**
- * Returns a new {@code BigDecimal} instance with the specified scale.
- * <p>
- * If the new scale is greater than the old scale, then additional zeros are
- * added to the unscaled value. In this case no rounding is necessary.
- * <p>
- * If the new scale is smaller than the old scale, then trailing digits are
- * removed. If these trailing digits are not zero, then the remaining unscaled
- * value has to be rounded. For this rounding operation the specified rounding
- * mode is used.
- *
- * @param newScale scale of the result returned.
- * @param roundingMode rounding mode to be used to round the result.
- * @return a new {@code BigDecimal} instance with the specified scale.
- * @throws IllegalArgumentException if {@code roundingMode} is not a valid
- * rounding mode.
- * @throws ArithmeticException if {@code roundingMode == ROUND_UNNECESSARY}
- * and rounding is necessary according to the given scale.
- */
- public BigDecimal setScale(int newScale, int roundingMode) {
- return setScale(newScale, RoundingMode.valueOf(roundingMode));
- }
-
- /**
- * Returns a new {@code BigDecimal} instance with the specified scale.
- * <p>
- * If the new scale is greater than the old scale, then additional zeros are
- * added to the unscaled value. In this case no rounding is necessary.
- * <p>
- * If the new scale is smaller than the old scale, then trailing digits are
- * removed. If these trailing digits are not zero, then the remaining unscaled
- * value has to be rounded. For this rounding operation the specified rounding
- * mode is used.
- *
- * @param newScale scale of the result returned.
- * @param roundingMode rounding mode to be used to round the result.
- * @return a new {@code BigDecimal} instance with the specified scale.
- * @throws NullPointerException if {@code roundingMode == null}.
- * @throws ArithmeticException if {@code roundingMode == ROUND_UNNECESSARY}
- * and rounding is necessary according to the given scale.
- */
- public BigDecimal setScale(int newScale, RoundingMode roundingMode) {
- if (roundingMode == null) {
- throw new NullPointerException();
- }
- double diffScale = newScale - scale;
- // Let be: 'this' = [u,s]
- if (diffScale == 0) {
- return this;
- }
- if (diffScale > 0) {
- // return [u * 10^(s2 - s), newScale]
- if (diffScale < DOUBLE_TEN_POW.length
- && (this.bitLength + DOUBLE_TEN_POW_BIT_LENGTH[(int) diffScale]) < 54) {
- return valueOf(this.smallValue * DOUBLE_TEN_POW[(int) diffScale],
- newScale);
- }
- return new BigDecimal(Multiplication.multiplyByTenPow(getUnscaledValue(),
- (int) diffScale), newScale);
- }
- // diffScale < 0
- // return [u,s] / [1,newScale] with the appropriate scale and rounding
- if (this.bitLength < 54 && -diffScale < DOUBLE_TEN_POW.length) {
- return dividePrimitiveLongs((long) this.smallValue,
- (long) DOUBLE_TEN_POW[(int) -diffScale], newScale, roundingMode);
- }
- return divideBigIntegers(this.getUnscaledValue(),
- Multiplication.powerOf10(-diffScale), newScale, roundingMode);
- }
-
- /**
- * Returns this {@code BigDecimal} as a short value if it has no fractional
- * part and if its value fits to the short range ([-2^{15}..2^{15}-1]). If
- * these conditions are not met, an {@code ArithmeticException} is thrown.
- *
- * @return this {@code BigDecimal} as a short value.
- * @throws ArithmeticException if rounding is necessary of the number doesn't
- * fit in a short.
- */
- public short shortValueExact() {
- return (short) valueExact(16);
- }
-
- /**
- * Returns the sign of this {@code BigDecimal}.
- *
- * @return {@code -1} if {@code this < 0}, {@code 0} if {@code this == 0},
- * {@code 1} if {@code this > 0}.
- */
- public int signum() {
- if (bitLength < 54) {
- return this.smallValue < 0 ? -1 : this.smallValue > 0 ? 1 : 0;
- }
- return getUnscaledValue().signum();
- }
-
- /**
- * Returns a new {@code BigDecimal} instance with the same value as {@code
- * this} but with a unscaled value where the trailing zeros have been removed.
- * If the unscaled value of {@code this} has n trailing zeros, then the scale
- * and the precision of the result has been reduced by n.
- *
- * @return a new {@code BigDecimal} instance equivalent to this where the
- * trailing zeros of the unscaled value have been removed.
- */
- public BigDecimal stripTrailingZeros() {
- int i = 1; // 1 <= i <= 18
- int lastPow = TEN_POW.length - 1;
- double newScale = scale;
-
- if (isZero()) {
- return new BigDecimal("0");
- }
- BigInteger strippedBI = getUnscaledValue();
- BigInteger[] quotAndRem;
-
- // while the number is even...
- while (!strippedBI.testBit(0)) {
- // To divide by 10^i
- quotAndRem = strippedBI.divideAndRemainder(TEN_POW[i]);
- // To look the remainder
- if (quotAndRem[1].signum() == 0) {
- // To adjust the scale
- newScale -= i;
- if (i < lastPow) {
- // To set to the next power
- i++;
- }
- strippedBI = quotAndRem[0];
- } else {
- if (i == 1) {
- // 'this' has no more trailing zeros
- break;
- }
- // To set to the smallest power of ten
- i = 1;
- }
- }
- return new BigDecimal(strippedBI, toIntScale(newScale));
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is {@code this - subtrahend}.
- * The scale of the result is the maximum of the scales of the two arguments.
- *
- * @param subtrahend value to be subtracted from {@code this}.
- * @return {@code this - subtrahend}.
- * @throws NullPointerException if {@code subtrahend == null}.
- */
- public BigDecimal subtract(BigDecimal subtrahend) {
- double diffScale = this.scale - subtrahend.scale;
- // Fast return when some operand is zero
- if (this.isZero()) {
- if (diffScale <= 0) {
- return subtrahend.negate();
- }
- if (subtrahend.isZero()) {
- return this;
- }
- } else if (subtrahend.isZero()) {
- if (diffScale >= 0) {
- return this;
- }
- }
- // Let be: this = [u1,s1] and subtrahend = [u2,s2] so:
- if (diffScale == 0) {
- // case s1 = s2 : [u1 - u2 , s1]
- if (Math.max(this.bitLength, subtrahend.bitLength) + 1 < 54) {
- return valueOf(this.smallValue - subtrahend.smallValue, this.scale);
- }
- return new BigDecimal(this.getUnscaledValue().subtract(
- subtrahend.getUnscaledValue()), this.scale);
- } else if (diffScale > 0) {
- // case s1 > s2 : [ u1 - u2 * 10 ^ (s1 - s2) , s1 ]
- if (diffScale < DOUBLE_TEN_POW.length
- && Math.max(this.bitLength, subtrahend.bitLength
- + DOUBLE_TEN_POW_BIT_LENGTH[(int) diffScale]) + 1 < 54) {
- return valueOf(this.smallValue - subtrahend.smallValue
- * DOUBLE_TEN_POW[(int) diffScale], this.scale);
- }
- return new BigDecimal(this.getUnscaledValue().subtract(
- Multiplication.multiplyByTenPow(subtrahend.getUnscaledValue(),
- (int) diffScale)), this.scale);
- } else {
- // case s2 > s1 : [ u1 * 10 ^ (s2 - s1) - u2 , s2 ]
- diffScale = -diffScale;
- if (diffScale < DOUBLE_TEN_POW.length
- && Math.max(this.bitLength
- + DOUBLE_TEN_POW_BIT_LENGTH[(int) diffScale],
- subtrahend.bitLength) + 1 < 54) {
- return valueOf(this.smallValue * DOUBLE_TEN_POW[(int) diffScale]
- - subtrahend.smallValue, subtrahend.scale);
- }
- return new BigDecimal(Multiplication.multiplyByTenPow(
- this.getUnscaledValue(), (int) diffScale).subtract(
- subtrahend.getUnscaledValue()), subtrahend.scale);
- }
- }
-
- /**
- * Returns a new {@code BigDecimal} whose value is {@code this - subtrahend}.
- * The result is rounded according to the passed context {@code mc}.
- *
- * @param subtrahend value to be subtracted from {@code this}.
- * @param mc rounding mode and precision for the result of this operation.
- * @return {@code this - subtrahend}.
- * @throws NullPointerException if {@code subtrahend == null} or {@code mc ==
- * null}.
- */
- public BigDecimal subtract(BigDecimal subtrahend, MathContext mc) {
- double diffScale = subtrahend.scale - this.scale;
- int thisSignum;
- BigDecimal leftOperand; // it will be only the left operand (this)
- BigInteger tempBI;
- // Some operand is zero or the precision is infinity
- if ((subtrahend.isZero()) || (this.isZero()) || (mc.getPrecision() == 0)) {
- return subtract(subtrahend).round(mc);
- }
- // Now: this != 0 and subtrahend != 0
- if (subtrahend.approxPrecision() < diffScale - 1) {
- // Cases where it is unnecessary to subtract two numbers with very
- // different scales
- if (mc.getPrecision() < this.approxPrecision()) {
- thisSignum = this.signum();
- if (thisSignum != subtrahend.signum()) {
- tempBI = Multiplication.multiplyByPositiveInt(
- this.getUnscaledValue(), 10).add(BigInteger.valueOf(thisSignum));
- } else {
- tempBI = this.getUnscaledValue().subtract(
- BigInteger.valueOf(thisSignum));
- tempBI = Multiplication.multiplyByPositiveInt(tempBI, 10).add(
- BigInteger.valueOf(thisSignum * 9));
- }
- // Rounding the improved subtracting
- leftOperand = new BigDecimal(tempBI, this.scale + 1);
- return leftOperand.round(mc);
- }
- }
- // No optimization is done
- return subtract(subtrahend).round(mc);
- }
-
- /**
- * Returns this {@code BigDecimal} as a big integer instance. A fractional
- * part is discarded.
- *
- * @return this {@code BigDecimal} as a big integer instance.
- */
- public BigInteger toBigInteger() {
- if ((scale == 0) || (isZero())) {
- return getUnscaledValue();
- } else if (scale < 0) {
- return getUnscaledValue().multiply(Multiplication.powerOf10(-scale));
- } else {
- // (scale > 0)
- return getUnscaledValue().divide(Multiplication.powerOf10(scale));
- }
- }
-
- /**
- * Returns this {@code BigDecimal} as a big integer instance if it has no
- * fractional part. If this {@code BigDecimal} has a fractional part, i.e. if
- * rounding would be necessary, an {@code ArithmeticException} is thrown.
- *
- * @return this {@code BigDecimal} as a big integer value.
- * @throws ArithmeticException if rounding is necessary.
- */
- public BigInteger toBigIntegerExact() {
- if ((scale == 0) || (isZero())) {
- return getUnscaledValue();
- } else if (scale < 0) {
- return getUnscaledValue().multiply(Multiplication.powerOf10(-scale));
- } else {
- // (scale > 0)
- BigInteger[] integerAndFraction;
- // An optimization before do a heavy division
- if ((scale > approxPrecision())
- || (scale > getUnscaledValue().getLowestSetBit())) {
- // math.08=Rounding necessary
- throw new ArithmeticException("Rounding necessary"); //$NON-NLS-1$
- }
- integerAndFraction = getUnscaledValue().divideAndRemainder(
- Multiplication.powerOf10(scale));
- if (integerAndFraction[1].signum() != 0) {
- // It exists a non-zero fractional part
- // math.08=Rounding necessary
- throw new ArithmeticException("Rounding necessary"); //$NON-NLS-1$
- }
- return integerAndFraction[0];
- }
- }
-
- /**
- * Returns a string representation of this {@code BigDecimal}. This
- * representation always prints all significant digits of this value.
- * <p>
- * If the scale is negative or if {@code scale - precision >= 6} then
- * engineering notation is used. Engineering notation is similar to the
- * scientific notation except that the exponent is made to be a multiple of 3
- * such that the integer part is >= 1 and < 1000.
- *
- * @return a string representation of {@code this} in engineering notation if
- * necessary.
- */
- public String toEngineeringString() {
- String intString = getUnscaledValue().toString();
- if (scale == 0) {
- return intString;
- }
- int begin = (getUnscaledValue().signum() < 0) ? 2 : 1;
- int end = intString.length();
- double exponent = -scale + end - begin;
- StringBuilder result = new StringBuilder(intString);
-
- if ((scale > 0) && (exponent >= -6)) {
- if (exponent >= 0) {
- result.insert(end - (int) scale, '.');
- } else {
- result.insert(begin - 1, "0."); //$NON-NLS-1$
- result.insert(begin + 1, CH_ZEROS, 0, -(int) exponent - 1);
- }
- } else {
- int delta = end - begin;
- int rem = (int) (exponent % 3);
-
- if (rem != 0) {
- // adjust exponent so it is a multiple of three
- if (getUnscaledValue().signum() == 0) {
- // zero value
- rem = (rem < 0) ? -rem : 3 - rem;
- exponent += rem;
- } else {
- // nonzero value
- rem = (rem < 0) ? rem + 3 : rem;
- exponent -= rem;
- begin += rem;
- }
- if (delta < 3) {
- for (int i = rem - delta; i > 0; i--) {
- result.insert(end++, '0');
- }
- }
- }
- if (end - begin >= 1) {
- result.insert(begin, '.');
- end++;
- }
- if (exponent != 0) {
- result.insert(end, 'E');
- if (exponent > 0) {
- result.insert(++end, '+');
- }
- result.insert(++end, Long.toString((long) exponent));
- }
- }
- return result.toString();
- }
-
- /* Private Methods */
-
- /**
- * Returns a string representation of this {@code BigDecimal}. No scientific
- * notation is used. This methods adds zeros where necessary.
- * <p>
- * If this string representation is used to create a new instance, this
- * instance is generally not identical to {@code this} as the precision
- * changes.
- * <p>
- * {@code x.equals(new BigDecimal(x.toPlainString())} usually returns {@code
- * false}.
- * <p>
- * {@code x.compareTo(new BigDecimal(x.toPlainString())} returns {@code 0}.
- *
- * @return a string representation of {@code this} without exponent part.
- */
- public String toPlainString() {
- String intStr = getUnscaledValue().toString();
- if ((scale == 0) || ((isZero()) && (scale < 0))) {
- return intStr;
- }
- int begin = (signum() < 0) ? 1 : 0;
- double delta = scale;
- // We take space for all digits, plus a possible decimal point, plus 'scale'
- StringBuilder result = new StringBuilder(intStr.length() + 1
- + Math.abs((int) scale));
-
- if (begin == 1) {
- // If the number is negative, we insert a '-' character at front
- result.append('-');
- }
- if (scale > 0) {
- delta -= (intStr.length() - begin);
- if (delta >= 0) {
- result.append("0."); //$NON-NLS-1$
- // To append zeros after the decimal point
- for (; delta > CH_ZEROS.length; delta -= CH_ZEROS.length) {
- result.append(CH_ZEROS);
- }
- result.append(CH_ZEROS, 0, (int) delta);
- result.append(intStr.substring(begin));
- } else {
- delta = begin - delta;
- result.append(intStr.substring(begin, (int) delta));
- result.append('.');
- result.append(intStr.substring((int) delta));
- }
- } else {
- // (scale <= 0)
- result.append(intStr.substring(begin));
- // To append trailing zeros
- for (; delta < -CH_ZEROS.length; delta += CH_ZEROS.length) {
- result.append(CH_ZEROS);
- }
- result.append(CH_ZEROS, 0, (int) -delta);
- }
- return result.toString();
- }
-
- /**
- * Returns a canonical string representation of this {@code BigDecimal}. If
- * necessary, scientific notation is used. This representation always prints
- * all significant digits of this value.
- * <p>
- * If the scale is negative or if {@code scale - precision >= 6} then
- * scientific notation is used.
- *
- * @return a string representation of {@code this} in scientific notation if
- * necessary.
- */
- @Override
- public String toString() {
- if (toStringImage != null) {
- return toStringImage;
- }
- if (bitLength < 32) {
- // TODO convert to double math dont cast to long :-(
- toStringImage = Conversion.toDecimalScaledString((long) smallValue,
- (int) scale);
- return toStringImage;
- }
- String intString = getUnscaledValue().toString();
- if (scale == 0) {
- return intString;
- }
- int begin = (getUnscaledValue().signum() < 0) ? 2 : 1;
- int end = intString.length();
- double exponent = -scale + end - begin;
- StringBuilder result = new StringBuilder();
-
- result.append(intString);
- if ((scale > 0) && (exponent >= -6)) {
- if (exponent >= 0) {
- result.insert(end - (int) scale, '.');
- } else {
- result.insert(begin - 1, "0."); //$NON-NLS-1$
- result.insert(begin + 1, CH_ZEROS, 0, -(int) exponent - 1);
- }
- } else {
- if (end - begin >= 1) {
- result.insert(begin, '.');
- end++;
- }
- result.insert(end, 'E');
- if (exponent > 0) {
- result.insert(++end, '+');
- }
- result.insert(++end, Long.toString((long) exponent));
- }
- toStringImage = result.toString();
- return toStringImage;
- }
-
- /**
- * Returns the unit in the last place (ULP) of this {@code BigDecimal}
- * instance. An ULP is the distance to the nearest big decimal with the same
- * precision.
- * <p>
- * The amount of a rounding error in the evaluation of a floating-point
- * operation is often expressed in ULPs. An error of 1 ULP is often seen as a
- * tolerable error.
- * <p>
- * For class {@code BigDecimal}, the ULP of a number is simply 10^(-scale).
- * <p>
- * For example, {@code new BigDecimal(0.1).ulp()} returns {@code 1E-55}.
- *
- * @return unit in the last place (ULP) of this {@code BigDecimal} instance.
- */
- public BigDecimal ulp() {
- return valueOf(1, scale);
- }
-
- /**
- * Returns the unscaled value (mantissa) of this {@code BigDecimal} instance
- * as a {@code BigInteger}. The unscaled value can be computed as {@code this}
- * 10^(scale).
- *
- * @return unscaled value (this * 10^(scale)).
- */
- public BigInteger unscaledValue() {
- return getUnscaledValue();
- }
-
- /**
- * If the precision already was calculated it returns that value, otherwise it
- * calculates a very good approximation efficiently . Note that this value
- * will be {@code precision()} or {@code precision()-1} in the worst case.
- *
- * @return an approximation of {@code precision()} value
- */
- private double approxPrecision() {
- return (precision > 0) ? precision
- : Math.floor((this.bitLength - 1) * LOG10_2) + 1;
- }
-
- private BigInteger getUnscaledValue() {
- if (intVal == null) {
- intVal = BigInteger.valueOf((long) smallValue);
- }
- return intVal;
- }
-
- private void initFrom(String val) {
- int begin = 0; // first index to be copied
- int offset = 0;
- int last = val.length() - 1; // last index to be copied
- String scaleString = null; // buffer for scale
- StringBuilder unscaledBuffer; // buffer for unscaled value
-
- if (val == null) {
- throw new NullPointerException();
- }
- unscaledBuffer = new StringBuilder(val.length());
- // To skip a possible '+' symbol
- if ((offset <= last) && (val.charAt(offset) == '+')) {
- offset++;
- begin++;
- }
- int counter = 0;
- boolean wasNonZero = false;
- // Accumulating all digits until a possible decimal point
- for (; (offset <= last) && (val.charAt(offset) != '.')
- && (val.charAt(offset) != 'e') && (val.charAt(offset) != 'E'); offset++) {
- if (!wasNonZero) {
- if (val.charAt(offset) == '0') {
- counter++;
- } else {
- wasNonZero = true;
- }
- }
- }
- unscaledBuffer.append(val, begin, offset);
- // A decimal point was found
- if ((offset <= last) && (val.charAt(offset) == '.')) {
- offset++;
- // Accumulating all digits until a possible exponent
- begin = offset;
- for (; (offset <= last) && (val.charAt(offset) != 'e')
- && (val.charAt(offset) != 'E'); offset++) {
- if (!wasNonZero) {
- if (val.charAt(offset) == '0') {
- counter++;
- } else {
- wasNonZero = true;
- }
- }
- }
- scale = offset - begin;
- unscaledBuffer.append(val, begin, offset);
- } else {
- scale = 0;
- }
- // An exponent was found
- if ((offset <= last)
- && ((val.charAt(offset) == 'e') || (val.charAt(offset) == 'E'))) {
- offset++;
- // Checking for a possible sign of scale
- begin = offset;
- if ((offset <= last) && (val.charAt(offset) == '+')) {
- offset++;
- if ((offset <= last) && (val.charAt(offset) != '-')) {
- begin++;
- }
- }
- // Accumulating all remaining digits
- scaleString = val.substring(begin, last + 1);
- // Checking if the scale is defined
- scale = scale - Integer.parseInt(scaleString);
- if (scale != (int) scale) {
- // math.02=Scale out of range.
- throw new NumberFormatException("Scale out of range."); //$NON-NLS-1$
- }
- }
- // Parsing the unscaled value
- String unscaled = unscaledBuffer.toString();
- if (unscaled.length() < 16) {
- smallValue = parseUnscaled(unscaled);
- if (Double.isNaN(smallValue)) {
- throw new NumberFormatException("For input string: \"" + val + "\"");
- }
- bitLength = bitLength(smallValue);
- } else {
- setUnscaledValue(new BigInteger(unscaled));
- }
- precision = unscaledBuffer.length() - counter;
- if (unscaledBuffer.charAt(0) == '-') {
- precision--;
- }
- }
-
- /**
- * It does all rounding work of the public method {@code round(MathContext)},
- * performing an inplace rounding without creating a new object.
- *
- * @param mc the {@code MathContext} for perform the rounding.
- * @see #round(MathContext)
- */
- private void inplaceRound(MathContext mc) {
- int mcPrecision = mc.getPrecision();
- if (approxPrecision() - mcPrecision <= 0 || mcPrecision == 0) {
- return;
- }
- int discardedPrecision = precision() - mcPrecision;
- // If no rounding is necessary it returns immediately
- if ((discardedPrecision <= 0)) {
- return;
- }
- // When the number is small perform an efficient rounding
- if (this.bitLength < 54) {
- smallRound(mc, discardedPrecision);
- return;
- }
- // Getting the integer part and the discarded fraction
- BigInteger sizeOfFraction = Multiplication.powerOf10(discardedPrecision);
- BigInteger[] integerAndFraction = getUnscaledValue().divideAndRemainder(
- sizeOfFraction);
- double newScale = scale - discardedPrecision;
- int compRem;
- BigDecimal tempBD;
- // If the discarded fraction is non-zero, perform rounding
- if (integerAndFraction[1].signum() != 0) {
- // To check if the discarded fraction >= 0.5
- compRem = (integerAndFraction[1].abs().shiftLeftOneBit().compareTo(sizeOfFraction));
- // To look if there is a carry
- compRem = roundingBehavior(integerAndFraction[0].testBit(0) ? 1 : 0,
- integerAndFraction[1].signum() * (5 + compRem), mc.getRoundingMode());
- if (compRem != 0) {
- integerAndFraction[0] = integerAndFraction[0].add(BigInteger.valueOf(compRem));
- }
- tempBD = new BigDecimal(integerAndFraction[0]);
- // If after to add the increment the precision changed, we normalize the
- // size
- if (tempBD.precision() > mcPrecision) {
- integerAndFraction[0] = integerAndFraction[0].divide(BigInteger.TEN);
- newScale--;
- }
- }
- // To update all internal fields
- scale = toIntScale(newScale);
- precision = mcPrecision;
- setUnscaledValue(integerAndFraction[0]);
- }
-
- private boolean isZero() {
- return bitLength == 0 && this.smallValue != -1;
- }
-
- private BigDecimal movePoint(double newScale) {
- if (isZero()) {
- return zeroScaledBy(Math.max(newScale, 0));
- }
- /*
- * When: 'n'== Integer.MIN_VALUE isn't possible to call to
- * movePointRight(-n) since -Integer.MIN_VALUE == Integer.MIN_VALUE
- */
- if (newScale >= 0) {
- if (bitLength < 54) {
- return valueOf(smallValue, toIntScale(newScale));
- }
- return new BigDecimal(getUnscaledValue(), toIntScale(newScale));
- }
- if (-newScale < DOUBLE_TEN_POW.length
- && bitLength + DOUBLE_TEN_POW_BIT_LENGTH[(int) -newScale] < 54) {
- return valueOf(smallValue * DOUBLE_TEN_POW[(int) -newScale], 0);
- }
- return new BigDecimal(Multiplication.multiplyByTenPow(getUnscaledValue(),
- (int) -newScale), 0);
- }
-
- private void setUnscaledValue(BigInteger unscaledValue) {
- this.intVal = unscaledValue;
- this.bitLength = unscaledValue.bitLength();
- if (this.bitLength < 54) {
- this.smallValue = unscaledValue.longValue();
- }
- }
-
- /**
- * This method implements an efficient rounding for numbers which unscaled
- * value fits in the type {@code long}.
- *
- * @param mc the context to use
- * @param discardedPrecision the number of decimal digits that are discarded
- * @see #round(MathContext)
- */
- private void smallRound(MathContext mc, int discardedPrecision) {
- long sizeOfFraction = (long) DOUBLE_TEN_POW[discardedPrecision];
- long newScale = (long) scale - discardedPrecision;
- long unscaledVal = (long) smallValue; // TODO convert to double math dont
- // use longs
- // Getting the integer part and the discarded fraction
- long integer = unscaledVal / sizeOfFraction;
- long fraction = unscaledVal % sizeOfFraction;
- int compRem;
- // If the discarded fraction is non-zero perform rounding
- if (fraction != 0) {
- // To check if the discarded fraction >= 0.5
- compRem = longCompareTo(Math.abs(fraction) << 1, sizeOfFraction);
- // To look if there is a carry
- integer += roundingBehavior(((int) integer) & 1, Long.signum(fraction)
- * (5 + compRem), mc.getRoundingMode());
- // If after to add the increment the precision changed, we normalize the
- // size
- if (Math.log10(Math.abs(integer)) >= mc.getPrecision()) {
- integer /= 10;
- newScale--;
- }
- }
- // To update all internal fields
- scale = toIntScale(newScale);
- precision = mc.getPrecision();
- smallValue = integer;
- bitLength = bitLength(integer);
- intVal = null;
- }
-
- /**
- * If {@code intVal} has a fractional part throws an exception, otherwise it
- * counts the number of bits of value and checks if it's out of the range of
- * the primitive type. If the number fits in the primitive type returns this
- * number as {@code long}, otherwise throws an exception.
- *
- * @param bitLengthOfType number of bits of the type whose value will be
- * calculated exactly
- * @return the exact value of the integer part of {@code BigDecimal} when is
- * possible
- * @throws ArithmeticException when rounding is necessary or the number don't
- * fit in the primitive type
- */
- private long valueExact(int bitLengthOfType) {
- BigInteger bigInteger = toBigIntegerExact();
-
- if (bigInteger.bitLength() < bitLengthOfType) {
- // It fits in the primitive type
- return bigInteger.longValue();
- }
- // math.08=Rounding necessary
- throw new ArithmeticException("Rounding necessary"); //$NON-NLS-1$
- }
-}
diff --git a/user/super/com/google/gwt/emul/java/math/BigInteger.java b/user/super/com/google/gwt/emul/java/math/BigInteger.java
deleted file mode 100644
index e36c778..0000000
--- a/user/super/com/google/gwt/emul/java/math/BigInteger.java
+++ /dev/null
@@ -1,1497 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY RICHARD ZSCHECH AS WELL AS GOOGLE.
- */
-package java.math;
-
-import java.io.Serializable;
-import java.util.Random;
-
-/**
- * This class represents immutable integer numbers of arbitrary length. Large
- * numbers are typically used in security applications and therefore BigIntegers
- * offer dedicated functionality like the generation of large prime numbers or
- * the computation of modular inverse.
- * <p>
- * Since the class was modeled to offer all the functionality as the
- * {@link Integer} class does, it provides even methods that operate bitwise on
- * a two's complement representation of large integers. Note however that the
- * implementations favors an internal representation where magnitude and sign
- * are treated separately. Hence such operations are inefficient and should be
- * discouraged. In simple words: Do NOT implement any bit fields based on
- * BigInteger.
- */
-public class BigInteger extends Number implements Comparable<BigInteger>,
- Serializable {
-
- /**
- * The {@code BigInteger} constant 1.
- */
- public static final BigInteger ONE = new BigInteger(1, 1);
-
- /* Fields used for the internal representation. */
-
- /**
- * The {@code BigInteger} constant 10.
- */
- public static final BigInteger TEN = new BigInteger(1, 10);
-
- /**
- * The {@code BigInteger} constant 0.
- */
- public static final BigInteger ZERO = new BigInteger(0, 0);
-
- /**
- * The {@code BigInteger} constant 0 used for comparison.
- */
- static final int EQUALS = 0;
-
- /**
- * The {@code BigInteger} constant 1 used for comparison.
- */
- static final int GREATER = 1;
-
- /**
- * The {@code BigInteger} constant -1 used for comparison.
- */
- static final int LESS = -1;
-
- /**
- * The {@code BigInteger} constant -1.
- */
- static final BigInteger MINUS_ONE = new BigInteger(-1, 1);
-
- /**
- * All the {@code BigInteger} numbers in the range [0,10] are cached.
- */
- static final BigInteger[] SMALL_VALUES = {
- ZERO, ONE, new BigInteger(1, 2), new BigInteger(1, 3),
- new BigInteger(1, 4), new BigInteger(1, 5), new BigInteger(1, 6),
- new BigInteger(1, 7), new BigInteger(1, 8), new BigInteger(1, 9), TEN};
-
- static final BigInteger[] TWO_POWS;
-
- /**
- * This is the serialVersionUID used by the sun implementation.
- */
- private static final long serialVersionUID = -8287574255936472291L;
-
- static {
- TWO_POWS = new BigInteger[32];
- for (int i = 0; i < TWO_POWS.length; i++) {
- TWO_POWS[i] = BigInteger.valueOf(1L << i);
- }
- }
-
- /**
- * Returns a random positive {@code BigInteger} instance in the range [0,
- * 2^(bitLength)-1] which is probably prime. The probability that the returned
- * {@code BigInteger} is prime is beyond (1-1/2^80).
- * <p>
- * <b>Implementation Note:</b> Currently {@code rnd} is ignored.
- *
- * @param bitLength length of the new {@code BigInteger} in bits.
- * @param rnd random generator used to generate the new {@code BigInteger}.
- * @return probably prime random {@code BigInteger} instance.
- * @throws IllegalArgumentException if {@code bitLength < 2}.
- */
- public static BigInteger probablePrime(int bitLength, Random rnd) {
- return new BigInteger(bitLength, 100, rnd);
- }
-
- public static BigInteger valueOf(long val) {
- if (val < 0) {
- if (val != -1) {
- return new BigInteger(-1, -val);
- }
- return MINUS_ONE;
- } else if (val <= 10) {
- return SMALL_VALUES[(int) val];
- } else {
- // (val > 10)
- return new BigInteger(1, val);
- }
- }
-
- static BigInteger getPowerOfTwo(int exp) {
- if (exp < TWO_POWS.length) {
- return TWO_POWS[exp];
- }
- int intCount = exp >> 5;
- int bitN = exp & 31;
- int resDigits[] = new int[intCount + 1];
- resDigits[intCount] = 1 << bitN;
- return new BigInteger(1, intCount + 1, resDigits);
- }
-
- /**
- * @see BigInteger#BigInteger(String, int)
- */
- private static void setFromString(BigInteger bi, String val, int radix) {
- int sign;
- int[] digits;
- int numberLength;
- int stringLength = val.length();
- int startChar;
- int endChar = stringLength;
-
- if (val.charAt(0) == '-') {
- sign = -1;
- startChar = 1;
- stringLength--;
- } else {
- sign = 1;
- startChar = 0;
- }
- /*
- * We use the following algorithm: split a string into portions of n
- * characters and convert each portion to an integer according to the radix.
- * Then convert an exp(radix, n) based number to binary using the
- * multiplication method. See D. Knuth, The Art of Computer Programming,
- * vol. 2.
- */
-
- int charsPerInt = Conversion.digitFitInInt[radix];
- int bigRadixDigitsLength = stringLength / charsPerInt;
- int topChars = stringLength % charsPerInt;
-
- if (topChars != 0) {
- bigRadixDigitsLength++;
- }
- digits = new int[bigRadixDigitsLength];
- // Get the maximal power of radix that fits in int
- int bigRadix = Conversion.bigRadices[radix - 2];
- // Parse an input string and accumulate the BigInteger's magnitude
- int digitIndex = 0; // index of digits array
- int substrEnd = startChar + ((topChars == 0) ? charsPerInt : topChars);
- int newDigit;
-
- for (int substrStart = startChar; substrStart < endChar; substrStart = substrEnd, substrEnd = substrStart
- + charsPerInt) {
- int bigRadixDigit = Integer.parseInt(
- val.substring(substrStart, substrEnd), radix);
- newDigit = Multiplication.multiplyByInt(digits, digitIndex, bigRadix);
- newDigit += Elementary.inplaceAdd(digits, digitIndex, bigRadixDigit);
- digits[digitIndex++] = newDigit;
- }
- numberLength = digitIndex;
- bi.sign = sign;
- bi.numberLength = numberLength;
- bi.digits = digits;
- bi.cutOffLeadingZeroes();
- }
-
- /**
- * The magnitude of this big integer. This array holds unsigned little endian
- * digits. For example: {@code 13} is represented as [ 13 ] {@code -13} is
- * represented as [ 13 ] {@code 2^32 + 13} is represented as [ 13, 1 ] {@code
- * 2^64 + 13} is represented as [ 13, 0, 1 ] {@code 2^31} is represented as [
- * Integer.MIN_VALUE ] The magnitude array may be longer than strictly
- * necessary, which results in additional trailing zeros.
- */
- transient int digits[];
-
- /**
- * The length of this in measured in ints. Can be less than digits.length().
- */
- transient int numberLength;
-
- /**
- * The sign of this.
- */
- transient int sign;
-
- private transient int firstNonzeroDigit = -2;
-
- /**
- * Cache for the hash code.
- */
- private transient int hashCode = 0;
-
- /**
- * Constructs a new {@code BigInteger} from the given two's complement
- * representation. The most significant byte is the entry at index 0. The most
- * significant bit of this entry determines the sign of the new {@code
- * BigInteger} instance. The given array must not be empty.
- *
- * @param val two's complement representation of the new {@code BigInteger}.
- * @throws NullPointerException if {@code val == null}.
- * @throws NumberFormatException if the length of {@code val} is zero.
- */
- public BigInteger(byte[] val) {
- if (val.length == 0) {
- // math.12=Zero length BigInteger
- throw new NumberFormatException("Zero length BigInteger"); //$NON-NLS-1$
- }
- if (val[0] < 0) {
- sign = -1;
- putBytesNegativeToIntegers(val);
- } else {
- sign = 1;
- putBytesPositiveToIntegers(val);
- }
- cutOffLeadingZeroes();
- }
-
- /**
- * Constructs a new {@code BigInteger} instance with the given sign and the
- * given magnitude. The sign is given as an integer (-1 for negative, 0 for
- * zero, 1 for positive). The magnitude is specified as a byte array. The most
- * significant byte is the entry at index 0.
- *
- * @param signum sign of the new {@code BigInteger} (-1 for negative, 0 for
- * zero, 1 for positive).
- * @param magnitude magnitude of the new {@code BigInteger} with the most
- * significant byte first.
- * @throws NullPointerException if {@code magnitude == null}.
- * @throws NumberFormatException if the sign is not one of -1, 0, 1 or if the
- * sign is zero and the magnitude contains non-zero entries.
- */
- public BigInteger(int signum, byte[] magnitude) {
- if (magnitude == null) {
- throw new NullPointerException();
- }
- if ((signum < -1) || (signum > 1)) {
- // math.13=Invalid signum value
- throw new NumberFormatException("Invalid signum value"); //$NON-NLS-1$
- }
- if (signum == 0) {
- for (byte element : magnitude) {
- if (element != 0) {
- // math.14=signum-magnitude mismatch
- throw new NumberFormatException("signum-magnitude mismatch"); //$NON-NLS-1$
- }
- }
- }
- if (magnitude.length == 0) {
- sign = 0;
- numberLength = 1;
- digits = new int[] {0};
- } else {
- sign = signum;
- putBytesPositiveToIntegers(magnitude);
- cutOffLeadingZeroes();
- }
- }
-
- /**
- * Constructs a random {@code BigInteger} instance in the range [0,
- * 2^(bitLength)-1] which is probably prime. The probability that the returned
- * {@code BigInteger} is prime is beyond (1-1/2^certainty).
- *
- * @param bitLength length of the new {@code BigInteger} in bits.
- * @param certainty tolerated primality uncertainty.
- * @param rnd is an optional random generator to be used.
- * @throws ArithmeticException if {@code bitLength} < 2.
- */
- public BigInteger(int bitLength, int certainty, Random rnd) {
- if (bitLength < 2) {
- // math.1C=bitLength < 2
- throw new ArithmeticException("bitLength < 2"); //$NON-NLS-1$
- }
- BigInteger me = Primality.consBigInteger(bitLength, certainty, rnd);
- sign = me.sign;
- numberLength = me.numberLength;
- digits = me.digits;
- }
-
- /**
- * Constructs a random non-negative {@code BigInteger} instance in the range
- * [0, 2^(numBits)-1].
- *
- * @param numBits maximum length of the new {@code BigInteger} in bits.
- * @param rnd is an optional random generator to be used.
- * @throws IllegalArgumentException if {@code numBits} < 0.
- */
- public BigInteger(int numBits, Random rnd) {
- if (numBits < 0) {
- // math.1B=numBits must be non-negative
- throw new IllegalArgumentException("numBits must be non-negative"); //$NON-NLS-1$
- }
- if (numBits == 0) {
- sign = 0;
- numberLength = 1;
- digits = new int[] {0};
- } else {
- sign = 1;
- numberLength = (numBits + 31) >> 5;
- digits = new int[numberLength];
- for (int i = 0; i < numberLength; i++) {
- digits[i] = rnd.nextInt();
- }
- // Using only the necessary bits
- digits[numberLength - 1] >>>= (-numBits) & 31;
- cutOffLeadingZeroes();
- }
- }
-
- /**
- * Constructs a new {@code BigInteger} instance from the string
- * representation. The string representation consists of an optional minus
- * sign followed by a non-empty sequence of decimal digits.
- *
- * @param val string representation of the new {@code BigInteger}.
- * @throws NullPointerException if {@code val == null}.
- * @throws NumberFormatException if {@code val} is not a valid representation
- * of a {@code BigInteger}.
- */
- public BigInteger(String val) {
- this(val, 10);
- }
-
- /**
- * Constructs a new {@code BigInteger} instance from the string
- * representation. The string representation consists of an optional minus
- * sign followed by a non-empty sequence of digits in the specified radix. For
- * the conversion the method {@code Character.digit(char, radix)} is used.
- *
- * @param val string representation of the new {@code BigInteger}.
- * @param radix the base to be used for the conversion.
- * @throws NullPointerException if {@code val == null}.
- * @throws NumberFormatException if {@code val} is not a valid representation
- * of a {@code BigInteger} or if {@code radix < Character.MIN_RADIX}
- * or {@code radix > Character.MAX_RADIX}.
- */
- public BigInteger(String val, int radix) {
- if (val == null) {
- throw new NullPointerException();
- }
- if ((radix < Character.MIN_RADIX) || (radix > Character.MAX_RADIX)) {
- // math.11=Radix out of range
- throw new NumberFormatException("Radix out of range"); //$NON-NLS-1$
- }
- if (val.length() == 0) {
- // math.12=Zero length BigInteger
- throw new NumberFormatException("Zero length BigInteger"); //$NON-NLS-1$
- }
- setFromString(this, val, radix);
- }
-
- /**
- * Constructs a number which array is of size 1.
- *
- * @param sign the sign of the number
- * @param value the only one digit of array
- */
- BigInteger(int sign, int value) {
- this.sign = sign;
- numberLength = 1;
- digits = new int[] {value};
- }
-
- /**
- * Creates a new {@code BigInteger} with the given sign and magnitude. This
- * constructor does not create a copy, so any changes to the reference will
- * affect the new number.
- *
- * @param signum The sign of the number represented by {@code digits}
- * @param digits The magnitude of the number
- */
- BigInteger(int signum, int digits[]) {
- if (digits.length == 0) {
- sign = 0;
- numberLength = 1;
- this.digits = new int[] {0};
- } else {
- sign = signum;
- numberLength = digits.length;
- this.digits = digits;
- cutOffLeadingZeroes();
- }
- }
-
- /**
- * Constructs a number without to create new space. This construct should be
- * used only if the three fields of representation are known.
- *
- * @param sign the sign of the number
- * @param numberLength the length of the internal array
- * @param digits a reference of some array created before
- */
- BigInteger(int sign, int numberLength, int[] digits) {
- this.sign = sign;
- this.numberLength = numberLength;
- this.digits = digits;
- }
-
- /**
- * Creates a new {@code BigInteger} whose value is equal to the specified
- * {@code long}.
- *
- * @param sign the sign of the number
- * @param val the value of the new {@code BigInteger}.
- */
- BigInteger(int sign, long val) {
- // PRE: (val >= 0) && (sign >= -1) && (sign <= 1)
- this.sign = sign;
- if ((val & 0xFFFFFFFF00000000L) == 0) {
- // It fits in one 'int'
- numberLength = 1;
- digits = new int[] {(int) val};
- } else {
- numberLength = 2;
- digits = new int[] {(int) val, (int) (val >> 32)};
- }
- }
-
- /**
- * Returns a (new) {@code BigInteger} whose value is the absolute value of
- * {@code this}.
- *
- * @return {@code abs(this)}.
- */
- public BigInteger abs() {
- return ((sign < 0) ? new BigInteger(1, numberLength, digits) : this);
- }
-
- /**
- * Returns a new {@code BigInteger} whose value is {@code this + val}.
- *
- * @param val value to be added to {@code this}.
- * @return {@code this + val}.
- * @throws NullPointerException if {@code val == null}.
- */
- public BigInteger add(BigInteger val) {
- return Elementary.add(this, val);
- }
-
- /**
- * Returns a new {@code BigInteger} whose value is {@code this & val}.
- * <p>
- * <b>Implementation Note:</b> Usage of this method is not recommended as the
- * current implementation is not efficient.
- *
- * @param val value to be and'ed with {@code this}.
- * @return {@code this & val}.
- * @throws NullPointerException if {@code val == null}.
- */
- public BigInteger and(BigInteger val) {
- return Logical.and(this, val);
- }
-
- /**
- * Returns a new {@code BigInteger} whose value is {@code this & ~val}.
- * Evaluating {@code x.andNot(val)} returns the same result as {@code
- * x.and(val.not())}.
- * <p>
- * <b>Implementation Note:</b> Usage of this method is not recommended as the
- * current implementation is not efficient.
- *
- * @param val value to be not'ed and then and'ed with {@code this}.
- * @return {@code this & ~val}.
- * @throws NullPointerException if {@code val == null}.
- */
- public BigInteger andNot(BigInteger val) {
- return Logical.andNot(this, val);
- }
-
- /**
- * Use {@code bitLength(0)} if you want to know the length of the binary value
- * in bits.
- * <p>
- * Returns the number of bits in the binary representation of {@code this}
- * which differ from the sign bit. If {@code this} is positive the result is
- * equivalent to the number of bits set in the binary representation of
- * {@code this}. If {@code this} is negative the result is equivalent to the
- * number of bits set in the binary representation of {@code -this-1}.
- * <p>
- * <b>Implementation Note:</b> Usage of this method is not recommended as the
- * current implementation is not efficient.
- *
- * @return number of bits in the binary representation of {@code this} which
- * differ from the sign bit
- */
- public int bitCount() {
- return BitLevel.bitCount(this);
- }
-
- /**
- * Returns the length of the value's two's complement representation without
- * leading zeros for positive numbers / without leading ones for negative
- * values.
- * <p>
- * The two's complement representation of {@code this} will be at least
- * {@code bitLength() + 1} bits long.
- * <p>
- * The value will fit into an {@code int} if {@code bitLength() < 32} or into
- * a {@code long} if {@code bitLength() < 64}.
- *
- * @return the length of the minimal two's complement representation for
- * {@code this} without the sign bit.
- */
- public int bitLength() {
- return BitLevel.bitLength(this);
- }
-
- /**
- * Returns a new {@code BigInteger} which has the same binary representation
- * as {@code this} but with the bit at position n cleared. The result is
- * equivalent to {@code this & ~(2^n)}.
- * <p>
- * <b>Implementation Note:</b> Usage of this method is not recommended as the
- * current implementation is not efficient.
- *
- * @param n position where the bit in {@code this} has to be cleared.
- * @return {@code this & ~(2^n)}.
- * @throws ArithmeticException if {@code n < 0}.
- */
- public BigInteger clearBit(int n) {
- if (testBit(n)) {
- return BitLevel.flipBit(this, n);
- }
- return this;
- }
-
- /**
- * Compares this {@code BigInteger} with {@code val}. Returns one of the three
- * values 1, 0, or -1.
- *
- * @param val value to be compared with {@code this}.
- * @return {@code 1} if {@code this > val}, {@code -1} if {@code this < val} ,
- * {@code 0} if {@code this == val}.
- * @throws NullPointerException if {@code val == null}.
- */
- public int compareTo(BigInteger val) {
- if (sign > val.sign) {
- return GREATER;
- }
- if (sign < val.sign) {
- return LESS;
- }
- if (numberLength > val.numberLength) {
- return sign;
- }
- if (numberLength < val.numberLength) {
- return -val.sign;
- }
- // Equal sign and equal numberLength
- return (sign * Elementary.compareArrays(digits, val.digits, numberLength));
- }
-
- /**
- * Returns a new {@code BigInteger} whose value is {@code this / divisor}.
- *
- * @param divisor value by which {@code this} is divided.
- * @return {@code this / divisor}.
- * @throws NullPointerException if {@code divisor == null}.
- * @throws ArithmeticException if {@code divisor == 0}.
- */
- public BigInteger divide(BigInteger divisor) {
- if (divisor.sign == 0) {
- // math.17=BigInteger divide by zero
- throw new ArithmeticException("BigInteger divide by zero"); //$NON-NLS-1$
- }
- int divisorSign = divisor.sign;
- if (divisor.isOne()) {
- return ((divisor.sign > 0) ? this : this.negate());
- }
- int thisSign = sign;
- int thisLen = numberLength;
- int divisorLen = divisor.numberLength;
- if (thisLen + divisorLen == 2) {
- long val = (digits[0] & 0xFFFFFFFFL) / (divisor.digits[0] & 0xFFFFFFFFL);
- if (thisSign != divisorSign) {
- val = -val;
- }
- return valueOf(val);
- }
- int cmp = ((thisLen != divisorLen) ? ((thisLen > divisorLen) ? 1 : -1)
- : Elementary.compareArrays(digits, divisor.digits, thisLen));
- if (cmp == EQUALS) {
- return ((thisSign == divisorSign) ? ONE : MINUS_ONE);
- }
- if (cmp == LESS) {
- return ZERO;
- }
- int resLength = thisLen - divisorLen + 1;
- int resDigits[] = new int[resLength];
- int resSign = ((thisSign == divisorSign) ? 1 : -1);
- if (divisorLen == 1) {
- Division.divideArrayByInt(resDigits, digits, thisLen, divisor.digits[0]);
- } else {
- Division.divide(resDigits, resLength, digits, thisLen, divisor.digits,
- divisorLen);
- }
- BigInteger result = new BigInteger(resSign, resLength, resDigits);
- result.cutOffLeadingZeroes();
- return result;
- }
-
- /**
- * Returns a {@code BigInteger} array which contains {@code this / divisor} at
- * index 0 and {@code this % divisor} at index 1.
- *
- * @param divisor value by which {@code this} is divided.
- * @return {@code [this / divisor, this % divisor]}.
- * @throws NullPointerException if {@code divisor == null}.
- * @throws ArithmeticException if {@code divisor == 0}.
- * @see #divide
- * @see #remainder
- */
- public BigInteger[] divideAndRemainder(BigInteger divisor) {
- int divisorSign = divisor.sign;
- if (divisorSign == 0) {
- // math.17=BigInteger divide by zero
- throw new ArithmeticException("BigInteger divide by zero"); //$NON-NLS-1$
- }
- int divisorLen = divisor.numberLength;
- int[] divisorDigits = divisor.digits;
- if (divisorLen == 1) {
- return Division.divideAndRemainderByInteger(this, divisorDigits[0],
- divisorSign);
- }
- // res[0] is a quotient and res[1] is a remainder:
- int[] thisDigits = digits;
- int thisLen = numberLength;
- int cmp = (thisLen != divisorLen) ? ((thisLen > divisorLen) ? 1 : -1)
- : Elementary.compareArrays(thisDigits, divisorDigits, thisLen);
- if (cmp < 0) {
- return new BigInteger[] {ZERO, this};
- }
- int thisSign = sign;
- int quotientLength = thisLen - divisorLen + 1;
- int remainderLength = divisorLen;
- int quotientSign = ((thisSign == divisorSign) ? 1 : -1);
- int quotientDigits[] = new int[quotientLength];
- int remainderDigits[] = Division.divide(quotientDigits, quotientLength,
- thisDigits, thisLen, divisorDigits, divisorLen);
- BigInteger result0 = new BigInteger(quotientSign, quotientLength,
- quotientDigits);
- BigInteger result1 = new BigInteger(thisSign, remainderLength,
- remainderDigits);
- result0.cutOffLeadingZeroes();
- result1.cutOffLeadingZeroes();
- return new BigInteger[] {result0, result1};
- }
-
- /**
- * Returns this {@code BigInteger} as an double value. If {@code this} is too
- * big to be represented as an double, then {@code Double.POSITIVE_INFINITY}
- * or {@code Double.NEGATIVE_INFINITY} is returned. Note, that not all
- * integers x in the range [-Double.MAX_VALUE, Double.MAX_VALUE] can be
- * represented as a double. The double representation has a mantissa of length
- * 53. For example, 2^53+1 = 9007199254740993 is returned as double
- * 9007199254740992.0.
- *
- * @return this {@code BigInteger} as a double value
- */
- @Override
- public double doubleValue() {
- return Double.parseDouble(this.toString());
- }
-
- /**
- * Returns {@code true} if {@code x} is a BigInteger instance and if this
- * instance is equal to this {@code BigInteger}.
- *
- * @param x object to be compared with {@code this}.
- * @return true if {@code x} is a BigInteger and {@code this == x}, {@code
- * false} otherwise.
- */
- @Override
- public boolean equals(Object x) {
- if (this == x) {
- return true;
- }
- if (x instanceof BigInteger) {
- BigInteger x1 = (BigInteger) x;
- return sign == x1.sign && numberLength == x1.numberLength
- && equalsArrays(x1.digits);
- }
- return false;
- }
-
- /**
- * Returns a new {@code BigInteger} which has the same binary representation
- * as {@code this} but with the bit at position n flipped. The result is
- * equivalent to {@code this ^ 2^n}.
- * <p>
- * <b>Implementation Note:</b> Usage of this method is not recommended as the
- * current implementation is not efficient.
- *
- * @param n position where the bit in {@code this} has to be flipped.
- * @return {@code this ^ 2^n}.
- * @throws ArithmeticException if {@code n < 0}.
- */
- public BigInteger flipBit(int n) {
- if (n < 0) {
- // math.15=Negative bit address
- throw new ArithmeticException("Negative bit address"); //$NON-NLS-1$
- }
- return BitLevel.flipBit(this, n);
- }
-
- /**
- * Returns this {@code BigInteger} as an float value. If {@code this} is too
- * big to be represented as an float, then {@code Float.POSITIVE_INFINITY} or
- * {@code Float.NEGATIVE_INFINITY} is returned. Note, that not all integers x
- * in the range [-Float.MAX_VALUE, Float.MAX_VALUE] can be represented as a
- * float. The float representation has a mantissa of length 24. For example,
- * 2^24+1 = 16777217 is returned as float 16777216.0.
- *
- * @return this {@code BigInteger} as a float value.
- */
- @Override
- public float floatValue() {
- return Float.parseFloat(this.toString());
- }
-
- /**
- * Returns a new {@code BigInteger} whose value is greatest common divisor of
- * {@code this} and {@code val}. If {@code this==0} and {@code val==0} then
- * zero is returned, otherwise the result is positive.
- *
- * @param val value with which the greatest common divisor is computed.
- * @return {@code gcd(this, val)}.
- * @throws NullPointerException if {@code val == null}.
- */
- public BigInteger gcd(BigInteger val) {
- BigInteger val1 = this.abs();
- BigInteger val2 = val.abs();
- // To avoid a possible division by zero
- if (val1.signum() == 0) {
- return val2;
- } else if (val2.signum() == 0) {
- return val1;
- }
-
- // Optimization for small operands
- // (op2.bitLength() < 64) and (op1.bitLength() < 64)
- if (((val1.numberLength == 1) || ((val1.numberLength == 2) && (val1.digits[1] > 0)))
- && (val2.numberLength == 1 || (val2.numberLength == 2 && val2.digits[1] > 0))) {
- return BigInteger.valueOf(Division.gcdBinary(val1.longValue(),
- val2.longValue()));
- }
-
- return Division.gcdBinary(val1.copy(), val2.copy());
- }
-
- /**
- * Returns the position of the lowest set bit in the two's complement
- * representation of this {@code BigInteger}. If all bits are zero (this=0)
- * then -1 is returned as result.
- * <p>
- * <b>Implementation Note:</b> Usage of this method is not recommended as the
- * current implementation is not efficient.
- *
- * @return position of lowest bit if {@code this != 0}, {@code -1} otherwise
- */
- public int getLowestSetBit() {
- if (sign == 0) {
- return -1;
- }
- // (sign != 0) implies that exists some non zero digit
- int i = getFirstNonzeroDigit();
- return ((i << 5) + Integer.numberOfTrailingZeros(digits[i]));
- }
-
- /**
- * Returns a hash code for this {@code BigInteger}.
- *
- * @return hash code for {@code this}.
- */
- @Override
- public int hashCode() {
- if (hashCode != 0) {
- return hashCode;
- }
- for (int i = 0; i < digits.length; i++) {
- hashCode = (hashCode * 33 + (digits[i] & 0xffffffff));
- }
- hashCode = hashCode * sign;
- return hashCode;
- }
-
- /**
- * Returns this {@code BigInteger} as an int value. If {@code this} is too big
- * to be represented as an int, then {@code this} % 2^32 is returned.
- *
- * @return this {@code BigInteger} as an int value.
- */
- @Override
- public int intValue() {
- return (sign * digits[0]);
- }
-
- /**
- * Tests whether this {@code BigInteger} is probably prime. If {@code true} is
- * returned, then this is prime with a probability beyond (1-1/2^certainty).
- * If {@code false} is returned, then this is definitely composite. If the
- * argument {@code certainty} <= 0, then this method returns true.
- *
- * @param certainty tolerated primality uncertainty.
- * @return {@code true}, if {@code this} is probably prime, {@code false}
- * otherwise.
- */
- public boolean isProbablePrime(int certainty) {
- return Primality.isProbablePrime(abs(), certainty);
- }
-
- /**
- * Returns this {@code BigInteger} as an long value. If {@code this} is too
- * big to be represented as an long, then {@code this} % 2^64 is returned.
- *
- * @return this {@code BigInteger} as a long value.
- */
- @Override
- public long longValue() {
- long value = (numberLength > 1) ? (((long) digits[1]) << 32)
- | (digits[0] & 0xFFFFFFFFL) : (digits[0] & 0xFFFFFFFFL);
- return (sign * value);
- }
-
- /**
- * Returns the maximum of this {@code BigInteger} and {@code val}.
- *
- * @param val value to be used to compute the maximum with {@code this}
- * @return {@code max(this, val)}
- * @throws NullPointerException if {@code val == null}
- */
- public BigInteger max(BigInteger val) {
- return ((this.compareTo(val) == GREATER) ? this : val);
- }
-
- /**
- * Returns the minimum of this {@code BigInteger} and {@code val}.
- *
- * @param val value to be used to compute the minimum with {@code this}.
- * @return {@code min(this, val)}.
- * @throws NullPointerException if {@code val == null}.
- */
- public BigInteger min(BigInteger val) {
- return ((this.compareTo(val) == LESS) ? this : val);
- }
-
- /**
- * Returns a new {@code BigInteger} whose value is {@code this mod m}. The
- * modulus {@code m} must be positive. The result is guaranteed to be in the
- * interval {@code [0, m)} (0 inclusive, m exclusive). The behavior of this
- * function is not equivalent to the behavior of the % operator defined for
- * the built-in {@code int}'s.
- *
- * @param m the modulus.
- * @return {@code this mod m}.
- * @throws NullPointerException if {@code m == null}.
- * @throws ArithmeticException if {@code m < 0}.
- */
- public BigInteger mod(BigInteger m) {
- if (m.sign <= 0) {
- // math.18=BigInteger: modulus not positive
- throw new ArithmeticException("BigInteger: modulus not positive"); //$NON-NLS-1$
- }
- BigInteger rem = remainder(m);
- return ((rem.sign < 0) ? rem.add(m) : rem);
- }
-
- // @Override
- // public double doubleValue() {
- // return Conversion.bigInteger2Double(this);
- // }
-
- /**
- * Returns a new {@code BigInteger} whose value is {@code 1/this mod m}. The
- * modulus {@code m} must be positive. The result is guaranteed to be in the
- * interval {@code [0, m)} (0 inclusive, m exclusive). If {@code this} is not
- * relatively prime to m, then an exception is thrown.
- *
- * @param m the modulus.
- * @return {@code 1/this mod m}.
- * @throws NullPointerException if {@code m == null}
- * @throws ArithmeticException if {@code m < 0 or} if {@code this} is not
- * relatively prime to {@code m}
- */
- public BigInteger modInverse(BigInteger m) {
- if (m.sign <= 0) {
- // math.18=BigInteger: modulus not positive
- throw new ArithmeticException("BigInteger: modulus not positive"); //$NON-NLS-1$
- }
- // If both are even, no inverse exists
- if (!(testBit(0) || m.testBit(0))) {
- // math.19=BigInteger not invertible.
- throw new ArithmeticException("BigInteger not invertible."); //$NON-NLS-1$
- }
- if (m.isOne()) {
- return ZERO;
- }
-
- // From now on: (m > 1)
- BigInteger res = Division.modInverseMontgomery(abs().mod(m), m);
- if (res.sign == 0) {
- // math.19=BigInteger not invertible.
- throw new ArithmeticException("BigInteger not invertible."); //$NON-NLS-1$
- }
-
- res = ((sign < 0) ? m.subtract(res) : res);
- return res;
- }
-
- /**
- * Returns a new {@code BigInteger} whose value is {@code this^exponent mod m}
- * . The modulus {@code m} must be positive. The result is guaranteed to be in
- * the interval {@code [0, m)} (0 inclusive, m exclusive). If the exponent is
- * negative, then {@code this.modInverse(m)^(-exponent) mod m)} is computed.
- * The inverse of this only exists if {@code this} is relatively prime to m,
- * otherwise an exception is thrown.
- *
- * @param exponent the exponent.
- * @param m the modulus.
- * @return {@code this^exponent mod val}.
- * @throws NullPointerException if {@code m == null} or {@code exponent ==
- * null}.
- * @throws ArithmeticException if {@code m < 0} or if {@code exponent<0} and
- * this is not relatively prime to {@code m}.
- */
- public BigInteger modPow(BigInteger exponent, BigInteger m) {
- if (m.sign <= 0) {
- // math.18=BigInteger: modulus not positive
- throw new ArithmeticException("BigInteger: modulus not positive"); //$NON-NLS-1$
- }
- BigInteger base = this;
-
- if (m.isOne() | (exponent.sign > 0 & base.sign == 0)) {
- return BigInteger.ZERO;
- }
- if (base.sign == 0 && exponent.sign == 0) {
- return BigInteger.ONE;
- }
- if (exponent.sign < 0) {
- base = modInverse(m);
- exponent = exponent.negate();
- }
- // From now on: (m > 0) and (exponent >= 0)
- BigInteger res = (m.testBit(0)) ? Division.oddModPow(base.abs(), exponent,
- m) : Division.evenModPow(base.abs(), exponent, m);
- if ((base.sign < 0) && exponent.testBit(0)) {
- // -b^e mod m == ((-1 mod m) * (b^e mod m)) mod m
- res = m.subtract(BigInteger.ONE).multiply(res).mod(m);
- }
- // else exponent is even, so base^exp is positive
- return res;
- }
-
- /**
- * Returns a new {@code BigInteger} whose value is {@code this * val}.
- *
- * @param val value to be multiplied with {@code this}.
- * @return {@code this * val}.
- * @throws NullPointerException if {@code val == null}.
- */
- public BigInteger multiply(BigInteger val) {
- // This let us to throw NullPointerException when val == null
- if (val.sign == 0) {
- return ZERO;
- }
- if (sign == 0) {
- return ZERO;
- }
- return Multiplication.multiply(this, val);
- }
-
- /**
- * Returns a new {@code BigInteger} whose value is the {@code -this}.
- *
- * @return {@code -this}.
- */
- public BigInteger negate() {
- return ((sign == 0) ? this : new BigInteger(-sign, numberLength, digits));
- }
-
- /**
- * Returns the smallest integer x > {@code this} which is probably prime as a
- * {@code BigInteger} instance. The probability that the returned {@code
- * BigInteger} is prime is beyond (1-1/2^80).
- *
- * @return smallest integer > {@code this} which is robably prime.
- * @throws ArithmeticException if {@code this < 0}.
- */
- public BigInteger nextProbablePrime() {
- if (sign < 0) {
- // math.1A=start < 0: {0}
- throw new ArithmeticException("start < 0: " + this); //$NON-NLS-1$
- }
- return Primality.nextProbablePrime(this);
- }
-
- /**
- * Returns a new {@code BigInteger} whose value is {@code ~this}. The result
- * of this operation is {@code -this-1}.
- * <p>
- * <b>Implementation Note:</b> Usage of this method is not recommended as the
- * current implementation is not efficient.
- *
- * @return {@code ~this}.
- */
- public BigInteger not() {
- return Logical.not(this);
- }
-
- /**
- * Returns a new {@code BigInteger} whose value is {@code this | val}.
- * <p>
- * <b>Implementation Note:</b> Usage of this method is not recommended as the
- * current implementation is not efficient.
- *
- * @param val value to be or'ed with {@code this}.
- * @return {@code this | val}.
- * @throws NullPointerException if {@code val == null}.
- */
- public BigInteger or(BigInteger val) {
- return Logical.or(this, val);
- }
-
- /**
- * Returns a new {@code BigInteger} whose value is {@code this ^ exp}.
- *
- * @param exp exponent to which {@code this} is raised.
- * @return {@code this ^ exp}.
- * @throws ArithmeticException if {@code exp < 0}.
- */
- public BigInteger pow(int exp) {
- if (exp < 0) {
- // math.16=Negative exponent
- throw new ArithmeticException("Negative exponent"); //$NON-NLS-1$
- }
- if (exp == 0) {
- return ONE;
- } else if (exp == 1 || equals(ONE) || equals(ZERO)) {
- return this;
- }
-
- // if even take out 2^x factor which we can
- // calculate by shifting.
- if (!testBit(0)) {
- int x = 1;
- while (!testBit(x)) {
- x++;
- }
- return getPowerOfTwo(x * exp).multiply(this.shiftRight(x).pow(exp));
- }
- return Multiplication.pow(this, exp);
- }
-
- /**
- * Returns a new {@code BigInteger} whose value is {@code this % divisor}.
- * Regarding signs this methods has the same behavior as the % operator on
- * int's, i.e. the sign of the remainder is the same as the sign of this.
- *
- * @param divisor value by which {@code this} is divided.
- * @return {@code this % divisor}.
- * @throws NullPointerException if {@code divisor == null}.
- * @throws ArithmeticException if {@code divisor == 0}.
- */
- public BigInteger remainder(BigInteger divisor) {
- if (divisor.sign == 0) {
- // math.17=BigInteger divide by zero
- throw new ArithmeticException("BigInteger divide by zero"); //$NON-NLS-1$
- }
- int thisLen = numberLength;
- int divisorLen = divisor.numberLength;
- if (((thisLen != divisorLen) ? ((thisLen > divisorLen) ? 1 : -1)
- : Elementary.compareArrays(digits, divisor.digits, thisLen)) == LESS) {
- return this;
- }
- int resLength = divisorLen;
- int resDigits[] = new int[resLength];
- if (resLength == 1) {
- resDigits[0] = Division.remainderArrayByInt(digits, thisLen,
- divisor.digits[0]);
- } else {
- int qLen = thisLen - divisorLen + 1;
- resDigits = Division.divide(null, qLen, digits, thisLen, divisor.digits,
- divisorLen);
- }
- BigInteger result = new BigInteger(sign, resLength, resDigits);
- result.cutOffLeadingZeroes();
- return result;
- }
-
- /**
- * Returns a new {@code BigInteger} which has the same binary representation
- * as {@code this} but with the bit at position n set. The result is
- * equivalent to {@code this | 2^n}.
- * <p>
- * <b>Implementation Note:</b> Usage of this method is not recommended as the
- * current implementation is not efficient.
- *
- * @param n position where the bit in {@code this} has to be set.
- * @return {@code this | 2^n}.
- * @throws ArithmeticException if {@code n < 0}.
- */
- public BigInteger setBit(int n) {
- if (!testBit(n)) {
- return BitLevel.flipBit(this, n);
- }
- return this;
- }
-
- /**
- * Returns a new {@code BigInteger} whose value is {@code this << n}. The
- * result is equivalent to {@code this * 2^n} if n >= 0. The shift distance
- * may be negative which means that {@code this} is shifted right. The result
- * then corresponds to {@code floor(this / 2^(-n))}.
- * <p>
- * <b>Implementation Note:</b> Usage of this method on negative values is not
- * recommended as the current implementation is not efficient.
- *
- * @param n shift distance.
- * @return {@code this << n} if {@code n >= 0}; {@code this >> (-n)}.
- * otherwise
- */
- public BigInteger shiftLeft(int n) {
- if ((n == 0) || (sign == 0)) {
- return this;
- }
- return ((n > 0) ? BitLevel.shiftLeft(this, n) : BitLevel.shiftRight(this,
- -n));
- }
-
- /**
- * Returns a new {@code BigInteger} whose value is {@code this >> n}. For
- * negative arguments, the result is also negative. The shift distance may be
- * negative which means that {@code this} is shifted left.
- * <p>
- * <b>Implementation Note:</b> Usage of this method on negative values is not
- * recommended as the current implementation is not efficient.
- *
- * @param n shift distance
- * @return {@code this >> n} if {@code n >= 0}; {@code this << (-n)} otherwise
- */
- public BigInteger shiftRight(int n) {
- if ((n == 0) || (sign == 0)) {
- return this;
- }
- return ((n > 0) ? BitLevel.shiftRight(this, n) : BitLevel.shiftLeft(this,
- -n));
- }
-
- /**
- * Returns the sign of this {@code BigInteger}.
- *
- * @return {@code -1} if {@code this < 0}, {@code 0} if {@code this == 0},
- * {@code 1} if {@code this > 0}.
- */
- public int signum() {
- return sign;
- }
-
- /**
- * Returns a new {@code BigInteger} whose value is {@code this - val}.
- *
- * @param val value to be subtracted from {@code this}.
- * @return {@code this - val}.
- * @throws NullPointerException if {@code val == null}.
- */
- public BigInteger subtract(BigInteger val) {
- return Elementary.subtract(this, val);
- }
-
- /**
- * Tests whether the bit at position n in {@code this} is set. The result is
- * equivalent to {@code this & (2^n) != 0}.
- * <p>
- * <b>Implementation Note:</b> Usage of this method is not recommended as the
- * current implementation is not efficient.
- *
- * @param n position where the bit in {@code this} has to be inspected.
- * @return {@code this & (2^n) != 0}.
- * @throws ArithmeticException if {@code n < 0}.
- */
- public boolean testBit(int n) {
- if (n == 0) {
- return ((digits[0] & 1) != 0);
- }
- if (n < 0) {
- // math.15=Negative bit address
- throw new ArithmeticException("Negative bit address"); //$NON-NLS-1$
- }
- int intCount = n >> 5;
- if (intCount >= numberLength) {
- return (sign < 0);
- }
- int digit = digits[intCount];
- n = (1 << (n & 31)); // int with 1 set to the needed position
- if (sign < 0) {
- int firstNonZeroDigit = getFirstNonzeroDigit();
- if (intCount < firstNonZeroDigit) {
- return false;
- } else if (firstNonZeroDigit == intCount) {
- digit = -digit;
- } else {
- digit = ~digit;
- }
- }
- return ((digit & n) != 0);
- }
-
- /**
- * Returns the two's complement representation of this BigInteger in a byte
- * array.
- *
- * @return two's complement representation of {@code this}.
- */
- public byte[] toByteArray() {
- if (this.sign == 0) {
- return new byte[] {0};
- }
- BigInteger temp = this;
- int bitLen = bitLength();
- int iThis = getFirstNonzeroDigit();
- int bytesLen = (bitLen >> 3) + 1;
- /*
- * Puts the little-endian int array representing the magnitude of this
- * BigInteger into the big-endian byte array.
- */
- byte[] bytes = new byte[bytesLen];
- int firstByteNumber = 0;
- int highBytes;
- int digitIndex = 0;
- int bytesInInteger = 4;
- int digit;
- int hB;
-
- if (bytesLen - (numberLength << 2) == 1) {
- bytes[0] = (byte) ((sign < 0) ? -1 : 0);
- highBytes = 4;
- firstByteNumber++;
- } else {
- hB = bytesLen & 3;
- highBytes = (hB == 0) ? 4 : hB;
- }
-
- digitIndex = iThis;
- bytesLen -= iThis << 2;
-
- if (sign < 0) {
- digit = -temp.digits[digitIndex];
- digitIndex++;
- if (digitIndex == numberLength) {
- bytesInInteger = highBytes;
- }
- for (int i = 0; i < bytesInInteger; i++, digit >>= 8) {
- bytes[--bytesLen] = (byte) digit;
- }
- while (bytesLen > firstByteNumber) {
- digit = ~temp.digits[digitIndex];
- digitIndex++;
- if (digitIndex == numberLength) {
- bytesInInteger = highBytes;
- }
- for (int i = 0; i < bytesInInteger; i++, digit >>= 8) {
- bytes[--bytesLen] = (byte) digit;
- }
- }
- } else {
- while (bytesLen > firstByteNumber) {
- digit = temp.digits[digitIndex];
- digitIndex++;
- if (digitIndex == numberLength) {
- bytesInInteger = highBytes;
- }
- for (int i = 0; i < bytesInInteger; i++, digit >>= 8) {
- bytes[--bytesLen] = (byte) digit;
- }
- }
- }
- return bytes;
- }
-
- /**
- * Returns a string representation of this {@code BigInteger} in decimal form.
- *
- * @return a string representation of {@code this} in decimal form.
- */
- @Override
- public String toString() {
- return Conversion.toDecimalScaledString(this, 0);
- }
-
- /**
- * Returns a string containing a string representation of this {@code
- * BigInteger} with base radix. If {@code radix} is less than
- * {@link Character#MIN_RADIX} or greater than {@link Character#MAX_RADIX}
- * then a decimal representation is returned. The characters of the string
- * representation are generated with method {@link Character#forDigit}.
- *
- * @param radix base to be used for the string representation.
- * @return a string representation of this with radix 10.
- */
- public String toString(int radix) {
- return Conversion.bigInteger2String(this, radix);
- }
-
- /**
- * Returns a new {@code BigInteger} whose value is {@code this ^ val}.
- * <p>
- * <b>Implementation Note:</b> Usage of this method is not recommended as the
- * current implementation is not efficient.
- *
- * @param val value to be xor'ed with {@code this}
- * @return {@code this ^ val}
- * @throws NullPointerException if {@code val == null}
- */
- public BigInteger xor(BigInteger val) {
- return Logical.xor(this, val);
- }
-
- /*
- * Returns a copy of the current instance to achieve immutability
- */
- BigInteger copy() {
- int[] copyDigits = new int[numberLength];
- System.arraycopy(digits, 0, copyDigits, 0, numberLength);
- return new BigInteger(sign, numberLength, copyDigits);
- }
-
- /* Private Methods */
-
- /**
- * Decreases {@code numberLength} if there are zero high elements.
- */
- final void cutOffLeadingZeroes() {
- while ((numberLength > 0) && (digits[--numberLength] == 0)) {
- // Empty
- }
- if (digits[numberLength++] == 0) {
- sign = 0;
- }
- }
-
- boolean equalsArrays(final int[] b) {
- int i;
- for (i = numberLength - 1; (i >= 0) && (digits[i] == b[i]); i--) {
- // Empty
- }
- return i < 0;
- }
-
- int getFirstNonzeroDigit() {
- if (firstNonzeroDigit == -2) {
- int i;
- if (this.sign == 0) {
- i = -1;
- } else {
- for (i = 0; digits[i] == 0; i++) {
- // Empty
- }
- }
- firstNonzeroDigit = i;
- }
- return firstNonzeroDigit;
- }
-
- /**
- * Tests if {@code this.abs()} is equals to {@code ONE}
- */
- boolean isOne() {
- return ((numberLength == 1) && (digits[0] == 1));
- }
-
- BigInteger shiftLeftOneBit() {
- return (sign == 0) ? this : BitLevel.shiftLeftOneBit(this);
- }
-
- void unCache() {
- firstNonzeroDigit = -2;
- }
-
- /**
- * Puts a big-endian byte array into a little-endian applying two complement.
- */
- private void putBytesNegativeToIntegers(byte[] byteValues) {
- int bytesLen = byteValues.length;
- int highBytes = bytesLen & 3;
- numberLength = (bytesLen >> 2) + ((highBytes == 0) ? 0 : 1);
- digits = new int[numberLength];
- int i = 0;
- // Setting the sign
- digits[numberLength - 1] = -1;
- // Put bytes to the int array starting from the end of the byte array
- while (bytesLen > highBytes) {
- digits[i] = (byteValues[--bytesLen] & 0xFF)
- | (byteValues[--bytesLen] & 0xFF) << 8
- | (byteValues[--bytesLen] & 0xFF) << 16
- | (byteValues[--bytesLen] & 0xFF) << 24;
- if (digits[i] != 0) {
- digits[i] = -digits[i];
- firstNonzeroDigit = i;
- i++;
- while (bytesLen > highBytes) {
- digits[i] = (byteValues[--bytesLen] & 0xFF)
- | (byteValues[--bytesLen] & 0xFF) << 8
- | (byteValues[--bytesLen] & 0xFF) << 16
- | (byteValues[--bytesLen] & 0xFF) << 24;
- digits[i] = ~digits[i];
- i++;
- }
- break;
- }
- i++;
- }
- if (highBytes != 0) {
- // Put the first bytes in the highest element of the int array
- if (firstNonzeroDigit != -2) {
- for (int j = 0; j < bytesLen; j++) {
- digits[i] = (digits[i] << 8) | (byteValues[j] & 0xFF);
- }
- digits[i] = ~digits[i];
- } else {
- for (int j = 0; j < bytesLen; j++) {
- digits[i] = (digits[i] << 8) | (byteValues[j] & 0xFF);
- }
- digits[i] = -digits[i];
- }
- }
- }
-
- /**
- * Puts a big-endian byte array into a little-endian int array.
- */
- private void putBytesPositiveToIntegers(byte[] byteValues) {
- int bytesLen = byteValues.length;
- int highBytes = bytesLen & 3;
- numberLength = (bytesLen >> 2) + ((highBytes == 0) ? 0 : 1);
- digits = new int[numberLength];
- int i = 0;
- // Put bytes to the int array starting from the end of the byte array
- while (bytesLen > highBytes) {
- digits[i++] = (byteValues[--bytesLen] & 0xFF)
- | (byteValues[--bytesLen] & 0xFF) << 8
- | (byteValues[--bytesLen] & 0xFF) << 16
- | (byteValues[--bytesLen] & 0xFF) << 24;
- }
- // Put the first bytes in the highest element of the int array
- for (int j = 0; j < bytesLen; j++) {
- digits[i] = (digits[i] << 8) | (byteValues[j] & 0xFF);
- }
- }
-}
diff --git a/user/super/com/google/gwt/emul/java/math/BitLevel.java b/user/super/com/google/gwt/emul/java/math/BitLevel.java
deleted file mode 100644
index b539637..0000000
--- a/user/super/com/google/gwt/emul/java/math/BitLevel.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY RICHARD ZSCHECH AS WELL AS GOOGLE.
- */
-package java.math;
-
-/**
- * Static library that provides all the <b>bit level</b> operations for
- * {@link BigInteger}. The operations are: <ul type="circle"> <li>Left Shifting</li>
- * <li>Right Shifting</li> <li>Bit clearing</li> <li>Bit setting</li> <li>Bit
- * counting</li> <li>Bit testing</li> <li>Getting of the lowest bit set</li>
- * </ul> All operations are provided in immutable way, and some in both mutable
- * and immutable.
- */
-class BitLevel {
-
- /**
- * @see BigInteger#bitCount()
- * @param val
- * @return
- */
- static int bitCount(BigInteger val) {
- int bCount = 0;
-
- if (val.sign == 0) {
- return 0;
- }
-
- int i = val.getFirstNonzeroDigit();
- if (val.sign > 0) {
- for (; i < val.numberLength; i++) {
- bCount += Integer.bitCount(val.digits[i]);
- }
- } else {
- // (sign < 0)
- // this digit absorbs the carry
- bCount += Integer.bitCount(-val.digits[i]);
- for (i++; i < val.numberLength; i++) {
- bCount += Integer.bitCount(~val.digits[i]);
- }
- // We take the complement sum:
- bCount = (val.numberLength << 5) - bCount;
- }
- return bCount;
- }
-
- /**
- * @see BigInteger#bitLength()
- * @param val
- * @return
- */
- static int bitLength(BigInteger val) {
- if (val.sign == 0) {
- return 0;
- }
- int bLength = (val.numberLength << 5);
- int highDigit = val.digits[val.numberLength - 1];
-
- if (val.sign < 0) {
- int i = val.getFirstNonzeroDigit();
- // We reduce the problem to the positive case.
- if (i == val.numberLength - 1) {
- // ~~ is to handle int overflow
- highDigit = ~~(highDigit - 1);
- }
- }
- // Subtracting all sign bits
- bLength -= Integer.numberOfLeadingZeros(highDigit);
- return bLength;
- }
-
- /**
- * Performs a flipBit on the BigInteger, returning a BigInteger with the the
- * specified bit flipped.
- *
- * @param val BigInteger to operate on
- * @param n the bit to flip
- */
- static BigInteger flipBit(BigInteger val, int n) {
- int resSign = (val.sign == 0) ? 1 : val.sign;
- int intCount = n >> 5;
- int bitN = n & 31;
- int resLength = Math.max(intCount + 1, val.numberLength) + 1;
- int resDigits[] = new int[resLength];
- int i;
-
- int bitNumber = 1 << bitN;
- System.arraycopy(val.digits, 0, resDigits, 0, val.numberLength);
-
- if (val.sign < 0) {
- if (intCount >= val.numberLength) {
- resDigits[intCount] = bitNumber;
- } else {
- // val.sign<0 y intCount < val.numberLength
- int firstNonZeroDigit = val.getFirstNonzeroDigit();
- if (intCount > firstNonZeroDigit) {
- resDigits[intCount] ^= bitNumber;
- } else if (intCount < firstNonZeroDigit) {
- resDigits[intCount] = -bitNumber;
- for (i = intCount + 1; i < firstNonZeroDigit; i++) {
- resDigits[i] = -1;
- }
- resDigits[i] = resDigits[i]--;
- } else {
- i = intCount;
- resDigits[i] = -((-resDigits[intCount]) ^ bitNumber);
- if (resDigits[i] == 0) {
- for (i++; resDigits[i] == -1; i++) {
- resDigits[i] = 0;
- }
- resDigits[i]++;
- }
- }
- }
- } else {
- // case where val is positive
- resDigits[intCount] ^= bitNumber;
- }
- BigInteger result = new BigInteger(resSign, resLength, resDigits);
- result.cutOffLeadingZeroes();
- return result;
- }
-
- /**
- * Performs {@code val <<= count}.
- */
- // val should have enough place (and one digit more)
- static void inplaceShiftLeft(BigInteger val, int count) {
- int intCount = count >> 5; // count of integers
- val.numberLength += intCount
- + (Integer.numberOfLeadingZeros(val.digits[val.numberLength - 1])
- - (count & 31) >= 0 ? 0 : 1);
- shiftLeft(val.digits, val.digits, intCount, count & 31);
- val.cutOffLeadingZeroes();
- val.unCache();
- }
-
- /**
- * Performs {@code val >>= count} where {@code val} is a positive number.
- */
- static void inplaceShiftRight(BigInteger val, int count) {
- int sign = val.signum();
- if (count == 0 || val.signum() == 0) {
- return;
- }
- int intCount = count >> 5; // count of integers
- val.numberLength -= intCount;
- if (!shiftRight(val.digits, val.numberLength, val.digits, intCount,
- count & 31)
- && sign < 0) {
- // remainder not zero: add one to the result
- int i;
- for (i = 0; (i < val.numberLength) && (val.digits[i] == -1); i++) {
- val.digits[i] = 0;
- }
- if (i == val.numberLength) {
- val.numberLength++;
- }
- val.digits[i]++;
- }
- val.cutOffLeadingZeroes();
- val.unCache();
- }
-
- /**
- * Check if there are 1s in the lowest bits of this BigInteger.
- *
- * @param numberOfBits the number of the lowest bits to check
- * @return false if all bits are 0s, true otherwise
- */
- static boolean nonZeroDroppedBits(int numberOfBits, int digits[]) {
- int intCount = numberOfBits >> 5;
- int bitCount = numberOfBits & 31;
- int i;
-
- for (i = 0; (i < intCount) && (digits[i] == 0); i++) {
- }
- return ((i != intCount) || (digits[i] << (32 - bitCount) != 0));
- }
-
- /**
- * @see BigInteger#shiftLeft(int)
- * @param source
- * @param count
- * @return
- */
- static BigInteger shiftLeft(BigInteger source, int count) {
- int intCount = count >> 5;
- count &= 31; // %= 32
- int resLength = source.numberLength + intCount + ((count == 0) ? 0 : 1);
- int resDigits[] = new int[resLength];
-
- shiftLeft(resDigits, source.digits, intCount, count);
- BigInteger result = new BigInteger(source.sign, resLength, resDigits);
- result.cutOffLeadingZeroes();
- return result;
- }
-
- /**
- * Abstractly shifts left an array of integers in little endian (i.e. shift it
- * right). Total shift distance in bits is intCount * 32 + count
- *
- * @param result the destination array
- * @param source the source array
- * @param intCount the shift distance in integers
- * @param count an additional shift distance in bits
- */
- static void shiftLeft(int result[], int source[], int intCount, int count) {
- if (count == 0) {
- System.arraycopy(source, 0, result, intCount, result.length - intCount);
- } else {
- int rightShiftCount = 32 - count;
-
- result[result.length - 1] = 0;
- for (int i = result.length - 1; i > intCount; i--) {
- result[i] |= source[i - intCount - 1] >>> rightShiftCount;
- result[i - 1] = source[i - intCount - 1] << count;
- }
- }
-
- for (int i = 0; i < intCount; i++) {
- result[i] = 0;
- }
- }
-
- static BigInteger shiftLeftOneBit(BigInteger source) {
- int srcLen = source.numberLength;
- int resLen = srcLen + 1;
- int resDigits[] = new int[resLen];
- shiftLeftOneBit(resDigits, source.digits, srcLen);
- BigInteger result = new BigInteger(source.sign, resLen, resDigits);
- result.cutOffLeadingZeroes();
- return result;
- }
-
- /**
- * Shifts the source digits left one bit, creating a value whose magnitude is
- * doubled.
- *
- * @param result an array of digits that will hold the computed result when
- * this method returns. The size of this array is {@code srcLen + 1},
- * and the format is the same as {@link BigInteger#digits}.
- * @param source the array of digits to shift left, in the same format as
- * {@link BigInteger#digits}.
- * @param srcLen the length of {@code source}; may be less than {@code
- * source.length}
- */
- static void shiftLeftOneBit(int result[], int source[], int srcLen) {
- int carry = 0;
- for (int i = 0; i < srcLen; i++) {
- int val = source[i];
- result[i] = (val << 1) | carry;
- carry = val >>> 31;
- }
- if (carry != 0) {
- result[srcLen] = carry;
- }
- }
-
- /**
- * @see BigInteger#shiftRight(int)
- * @param source
- * @param count
- * @return
- */
- static BigInteger shiftRight(BigInteger source, int count) {
- int intCount = count >> 5; // count of integers
- count &= 31; // count of remaining bits
- if (intCount >= source.numberLength) {
- return ((source.sign < 0) ? BigInteger.MINUS_ONE : BigInteger.ZERO);
- }
- int i;
- int resLength = source.numberLength - intCount;
- int resDigits[] = new int[resLength + 1];
-
- shiftRight(resDigits, resLength, source.digits, intCount, count);
- if (source.sign < 0) {
- // Checking if the dropped bits are zeros (the remainder equals to
- // 0)
- for (i = 0; (i < intCount) && (source.digits[i] == 0); i++) {
- }
- // If the remainder is not zero, add 1 to the result
- if ((i < intCount)
- || ((count > 0) && ((source.digits[i] << (32 - count)) != 0))) {
- for (i = 0; (i < resLength) && (resDigits[i] == -1); i++) {
- resDigits[i] = 0;
- }
- if (i == resLength) {
- resLength++;
- }
- resDigits[i]++;
- }
- }
- BigInteger result = new BigInteger(source.sign, resLength, resDigits);
- result.cutOffLeadingZeroes();
- return result;
- }
-
- /**
- * Shifts right an array of integers. Total shift distance in bits is intCount
- * * 32 + count.
- *
- * @param result the destination array
- * @param resultLen the destination array's length
- * @param source the source array
- * @param intCount the number of elements to be shifted
- * @param count the number of bits to be shifted
- * @return dropped bit's are all zero (i.e. remaider is zero)
- */
- static boolean shiftRight(int result[], int resultLen, int source[],
- int intCount, int count) {
- int i;
- boolean allZero = true;
- for (i = 0; i < intCount; i++) {
- allZero &= source[i] == 0;
- }
- if (count == 0) {
- System.arraycopy(source, intCount, result, 0, resultLen);
- i = resultLen;
- } else {
- int leftShiftCount = 32 - count;
-
- allZero &= (source[i] << leftShiftCount) == 0;
- for (i = 0; i < resultLen - 1; i++) {
- result[i] = (source[i + intCount] >>> count)
- | (source[i + intCount + 1] << leftShiftCount);
- }
- result[i] = (source[i + intCount] >>> count);
- i++;
- }
-
- return allZero;
- }
-
- /**
- * Performs a fast bit testing for positive numbers. The bit to to be tested
- * must be in the range {@code [0, val.bitLength()-1]}
- */
- static boolean testBit(BigInteger val, int n) {
- // PRE: 0 <= n < val.bitLength()
- return ((val.digits[n >> 5] & (1 << (n & 31))) != 0);
- }
-
- /**
- * Just to denote that this class can't be instantiated.
- */
- private BitLevel() {
- }
-}
diff --git a/user/super/com/google/gwt/emul/java/math/Conversion.java b/user/super/com/google/gwt/emul/java/math/Conversion.java
deleted file mode 100644
index 28b8a95..0000000
--- a/user/super/com/google/gwt/emul/java/math/Conversion.java
+++ /dev/null
@@ -1,488 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY RICHARD ZSCHECH AS WELL AS GOOGLE.
- */
-package java.math;
-
-/**
- * Static library that provides {@link BigInteger} base conversion from/to any
- * integer represented in an {@link java.lang.String} Object.
- */
-class Conversion {
-
- /**
- * bigRadices values are precomputed maximal powers of radices (integer
- * numbers from 2 to 36) that fit into unsigned int (32 bits). bigRadices[0] =
- * 2 ^ 31, bigRadices[8] = 10 ^ 9, etc.
- */
-
- static final int bigRadices[] = {
- -2147483648, 1162261467, 1073741824, 1220703125, 362797056, 1977326743,
- 1073741824, 387420489, 1000000000, 214358881, 429981696, 815730721,
- 1475789056, 170859375, 268435456, 410338673, 612220032, 893871739,
- 1280000000, 1801088541, 113379904, 148035889, 191102976, 244140625,
- 308915776, 387420489, 481890304, 594823321, 729000000, 887503681,
- 1073741824, 1291467969, 1544804416, 1838265625, 60466176};
-
- /**
- * Holds the maximal exponent for each radix, so that
- * radix<sup>digitFitInInt[radix]</sup> fit in an {@code int} (32 bits).
- */
- static final int[] digitFitInInt = {
- -1, -1, 31, 19, 15, 13, 11, 11, 10, 9, 9, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7,
- 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5};
-
- /**
- * @see BigInteger#toString(int)
- * @param val
- * @param radix
- * @return
- */
- static String bigInteger2String(BigInteger val, int radix) {
- int sign = val.sign;
- int numberLength = val.numberLength;
- int digits[] = val.digits;
-
- if (sign == 0) {
- return "0"; //$NON-NLS-1$
- }
- if (numberLength == 1) {
- int highDigit = digits[numberLength - 1];
- long v = highDigit & 0xFFFFFFFFL;
- if (sign < 0) {
- v = -v;
- }
- return Long.toString(v, radix);
- }
- if ((radix == 10) || (radix < Character.MIN_RADIX)
- || (radix > Character.MAX_RADIX)) {
- return val.toString();
- }
- double bitsForRadixDigit;
- bitsForRadixDigit = Math.log(radix) / Math.log(2);
- int resLengthInChars = (int) (val.abs().bitLength() / bitsForRadixDigit + ((sign < 0)
- ? 1 : 0)) + 1;
-
- char result[] = new char[resLengthInChars];
- int currentChar = resLengthInChars;
- int resDigit;
- if (radix != 16) {
- int temp[] = new int[numberLength];
- System.arraycopy(digits, 0, temp, 0, numberLength);
- int tempLen = numberLength;
- int charsPerInt = digitFitInInt[radix];
- int i;
- // get the maximal power of radix that fits in int
- int bigRadix = bigRadices[radix - 2];
- while (true) {
- // divide the array of digits by bigRadix and convert remainders
- // to characters collecting them in the char array
- resDigit = Division.divideArrayByInt(temp, temp, tempLen, bigRadix);
- int previous = currentChar;
- do {
- result[--currentChar] = Character.forDigit(resDigit % radix, radix);
- } while (((resDigit /= radix) != 0) && (currentChar != 0));
- int delta = charsPerInt - previous + currentChar;
- for (i = 0; i < delta && currentChar > 0; i++) {
- result[--currentChar] = '0';
- }
- for (i = tempLen - 1; (i > 0) && (temp[i] == 0); i--) {
- // empty
- }
- tempLen = i + 1;
- if ((tempLen == 1) && (temp[0] == 0)) { // the quotient is 0
- break;
- }
- }
- } else {
- // radix == 16
- for (int i = 0; i < numberLength; i++) {
- for (int j = 0; (j < 8) && (currentChar > 0); j++) {
- resDigit = digits[i] >> (j << 2) & 0xf;
- result[--currentChar] = Character.forDigit(resDigit, 16);
- }
- }
- }
- while (result[currentChar] == '0') {
- currentChar++;
- }
- if (sign == -1) {
- result[--currentChar] = '-';
- }
- return new String(result, currentChar, resLengthInChars - currentChar);
- }
-
- static long divideLongByBillion(long a) {
- long quot;
- long rem;
-
- if (a >= 0) {
- long bLong = 1000000000L;
- quot = (a / bLong);
- rem = (a % bLong);
- } else {
- /*
- * Make the dividend positive shifting it right by 1 bit then get the
- * quotient an remainder and correct them properly
- */
- long aPos = a >>> 1;
- long bPos = 1000000000L >>> 1;
- quot = aPos / bPos;
- rem = aPos % bPos;
- // double the remainder and add 1 if 'a' is odd
- rem = (rem << 1) + (a & 1);
- }
- return ((rem << 32) | (quot & 0xFFFFFFFFL));
- }
-
- /**
- * Builds the correspondent {@code String} representation of {@code val} being
- * scaled by {@code scale}.
- *
- * @see BigInteger#toString()
- * @see BigDecimal#toString()
- */
- static String toDecimalScaledString(BigInteger val, int scale) {
- int sign = val.sign;
- int numberLength = val.numberLength;
- int digits[] = val.digits;
- int resLengthInChars;
- int currentChar;
- char result[];
-
- if (sign == 0) {
- switch (scale) {
- case 0:
- return "0"; //$NON-NLS-1$
- case 1:
- return "0.0"; //$NON-NLS-1$
- case 2:
- return "0.00"; //$NON-NLS-1$
- case 3:
- return "0.000"; //$NON-NLS-1$
- case 4:
- return "0.0000"; //$NON-NLS-1$
- case 5:
- return "0.00000"; //$NON-NLS-1$
- case 6:
- return "0.000000"; //$NON-NLS-1$
- default:
- StringBuilder result1 = new StringBuilder();
- if (scale < 0) {
- result1.append("0E+"); //$NON-NLS-1$
- } else {
- result1.append("0E"); //$NON-NLS-1$
- }
- result1.append(-scale);
- return result1.toString();
- }
- }
- // one 32-bit unsigned value may contains 10 decimal digits
- resLengthInChars = numberLength * 10 + 1 + 7;
- // Explanation why +1+7:
- // +1 - one char for sign if needed.
- // +7 - For "special case 2" (see below) we have 7 free chars for
- // inserting necessary scaled digits.
- result = new char[resLengthInChars + 1];
- // allocated [resLengthInChars+1] characters.
- // a free latest character may be used for "special case 1" (see
- // below)
- currentChar = resLengthInChars;
- if (numberLength == 1) {
- int highDigit = digits[0];
- if (highDigit < 0) {
- long v = highDigit & 0xFFFFFFFFL;
- do {
- long prev = v;
- v /= 10;
- result[--currentChar] = (char) (0x0030 + ((int) (prev - v * 10)));
- } while (v != 0);
- } else {
- int v = highDigit;
- do {
- int prev = v;
- v /= 10;
- result[--currentChar] = (char) (0x0030 + (prev - v * 10));
- } while (v != 0);
- }
- } else {
- int temp[] = new int[numberLength];
- int tempLen = numberLength;
- System.arraycopy(digits, 0, temp, 0, tempLen);
- BIG_LOOP : while (true) {
- // divide the array of digits by bigRadix and convert
- // remainders
- // to characters collecting them in the char array
- long result11 = 0;
- for (int i1 = tempLen - 1; i1 >= 0; i1--) {
- long temp1 = (result11 << 32) + (temp[i1] & 0xFFFFFFFFL);
- long res = divideLongByBillion(temp1);
- temp[i1] = (int) res;
- result11 = (int) (res >> 32);
- }
- int resDigit = (int) result11;
- int previous = currentChar;
- do {
- result[--currentChar] = (char) (0x0030 + (resDigit % 10));
- } while (((resDigit /= 10) != 0) && (currentChar != 0));
- int delta = 9 - previous + currentChar;
- for (int i = 0; (i < delta) && (currentChar > 0); i++) {
- result[--currentChar] = '0';
- }
- int j = tempLen - 1;
- for (; temp[j] == 0; j--) {
- if (j == 0) { // means temp[0] == 0
- break BIG_LOOP;
- }
- }
- tempLen = j + 1;
- }
- while (result[currentChar] == '0') {
- currentChar++;
- }
- }
- boolean negNumber = (sign < 0);
- int exponent = resLengthInChars - currentChar - scale - 1;
- if (scale == 0) {
- if (negNumber) {
- result[--currentChar] = '-';
- }
- return new String(result, currentChar, resLengthInChars - currentChar);
- }
- if ((scale > 0) && (exponent >= -6)) {
- if (exponent >= 0) {
- // special case 1
- int insertPoint = currentChar + exponent;
- for (int j = resLengthInChars - 1; j >= insertPoint; j--) {
- result[j + 1] = result[j];
- }
- result[++insertPoint] = '.';
- if (negNumber) {
- result[--currentChar] = '-';
- }
- return new String(result, currentChar, resLengthInChars - currentChar
- + 1);
- }
- // special case 2
- for (int j = 2; j < -exponent + 1; j++) {
- result[--currentChar] = '0';
- }
- result[--currentChar] = '.';
- result[--currentChar] = '0';
- if (negNumber) {
- result[--currentChar] = '-';
- }
- return new String(result, currentChar, resLengthInChars - currentChar);
- }
- int startPoint = currentChar + 1;
- int endPoint = resLengthInChars;
- StringBuilder result1 = new StringBuilder(16 + endPoint - startPoint);
- if (negNumber) {
- result1.append('-');
- }
- if (endPoint - startPoint >= 1) {
- result1.append(result[currentChar]);
- result1.append('.');
- result1.append(result, currentChar + 1, resLengthInChars - currentChar
- - 1);
- } else {
- result1.append(result, currentChar, resLengthInChars - currentChar);
- }
- result1.append('E');
- if (exponent > 0) {
- result1.append('+');
- }
- result1.append(Integer.toString(exponent));
- return result1.toString();
- }
-
- /* can process only 32-bit numbers */
- static String toDecimalScaledString(long value, int scale) {
- int resLengthInChars;
- int currentChar;
- char result[];
- boolean negNumber = value < 0;
- if (negNumber) {
- value = -value;
- }
- if (value == 0) {
- switch (scale) {
- case 0:
- return "0"; //$NON-NLS-1$
- case 1:
- return "0.0"; //$NON-NLS-1$
- case 2:
- return "0.00"; //$NON-NLS-1$
- case 3:
- return "0.000"; //$NON-NLS-1$
- case 4:
- return "0.0000"; //$NON-NLS-1$
- case 5:
- return "0.00000"; //$NON-NLS-1$
- case 6:
- return "0.000000"; //$NON-NLS-1$
- default:
- StringBuilder result1 = new StringBuilder();
- if (scale < 0) {
- result1.append("0E+"); //$NON-NLS-1$
- } else {
- result1.append("0E"); //$NON-NLS-1$
- }
- result1.append((scale == Integer.MIN_VALUE)
- ? "2147483648" : Integer.toString(-scale)); //$NON-NLS-1$
- return result1.toString();
- }
- }
- // one 32-bit unsigned value may contains 10 decimal digits
- resLengthInChars = 18;
- // Explanation why +1+7:
- // +1 - one char for sign if needed.
- // +7 - For "special case 2" (see below) we have 7 free chars for
- // inserting necessary scaled digits.
- result = new char[resLengthInChars + 1];
- // Allocated [resLengthInChars+1] characters.
- // a free latest character may be used for "special case 1" (see below)
- currentChar = resLengthInChars;
- long v = value;
- do {
- long prev = v;
- v /= 10;
- result[--currentChar] = (char) (0x0030 + (prev - v * 10));
- } while (v != 0);
-
- long exponent = (long) resLengthInChars - (long) currentChar - scale - 1L;
- if (scale == 0) {
- if (negNumber) {
- result[--currentChar] = '-';
- }
- return new String(result, currentChar, resLengthInChars - currentChar);
- }
- if (scale > 0 && exponent >= -6) {
- if (exponent >= 0) {
- // special case 1
- int insertPoint = currentChar + (int) exponent;
- for (int j = resLengthInChars - 1; j >= insertPoint; j--) {
- result[j + 1] = result[j];
- }
- result[++insertPoint] = '.';
- if (negNumber) {
- result[--currentChar] = '-';
- }
- return new String(result, currentChar, resLengthInChars - currentChar
- + 1);
- }
- // special case 2
- for (int j = 2; j < -exponent + 1; j++) {
- result[--currentChar] = '0';
- }
- result[--currentChar] = '.';
- result[--currentChar] = '0';
- if (negNumber) {
- result[--currentChar] = '-';
- }
- return new String(result, currentChar, resLengthInChars - currentChar);
- }
- int startPoint = currentChar + 1;
- int endPoint = resLengthInChars;
- StringBuilder result1 = new StringBuilder(16 + endPoint - startPoint);
- if (negNumber) {
- result1.append('-');
- }
- if (endPoint - startPoint >= 1) {
- result1.append(result[currentChar]);
- result1.append('.');
- result1.append(result, currentChar + 1, resLengthInChars - currentChar
- - 1);
- } else {
- result1.append(result, currentChar, resLengthInChars - currentChar);
- }
- result1.append('E');
- if (exponent > 0) {
- result1.append('+');
- }
- result1.append(Long.toString(exponent));
- return result1.toString();
- }
-
- /**
- * Just to denote that this class can't be instantiated.
- */
- private Conversion() {
- }
-
-// /**
-// * @see BigInteger#doubleValue()
-// */
- // static double bigInteger2Double(BigInteger val) {
- // // val.bitLength() < 64
- // if ((val.numberLength < 2)
- // || ((val.numberLength == 2) && (val.digits[1] > 0))) {
- // return val.longValue();
- // }
- // // val.bitLength() >= 33 * 32 > 1024
- // if (val.numberLength > 32) {
- // return ((val.sign > 0) ? Double.POSITIVE_INFINITY
- // : Double.NEGATIVE_INFINITY);
- // }
- // int bitLen = val.abs().bitLength();
- // long exponent = bitLen - 1;
- // int delta = bitLen - 54;
- // // We need 54 top bits from this, the 53th bit is always 1 in lVal.
- // long lVal = val.abs().shiftRight(delta).longValue();
- // /*
- // * Take 53 bits from lVal to mantissa. The least significant bit is
- // * needed for rounding.
- // */
- // long mantissa = lVal & 0x1FFFFFFFFFFFFFL;
- // if (exponent == 1023) {
- // if (mantissa == 0X1FFFFFFFFFFFFFL) {
- // return ((val.sign > 0) ? Double.POSITIVE_INFINITY
- // : Double.NEGATIVE_INFINITY);
- // }
- // if (mantissa == 0x1FFFFFFFFFFFFEL) {
- // return ((val.sign > 0) ? Double.MAX_VALUE : -Double.MAX_VALUE);
- // }
- // }
- // // Round the mantissa
- // if (((mantissa & 1) == 1)
- // && (((mantissa & 2) == 2) || BitLevel.nonZeroDroppedBits(delta,
- // val.digits))) {
- // mantissa += 2;
- // }
- // mantissa >>= 1; // drop the rounding bit
- // long resSign = (val.sign < 0) ? 0x8000000000000000L : 0;
- // exponent = ((1023 + exponent) << 52) & 0x7FF0000000000000L;
- // long result = resSign | exponent | mantissa;
- // return Double.longBitsToDouble(result);
- // }
-}
diff --git a/user/super/com/google/gwt/emul/java/math/Division.java b/user/super/com/google/gwt/emul/java/math/Division.java
deleted file mode 100644
index 4179a82..0000000
--- a/user/super/com/google/gwt/emul/java/math/Division.java
+++ /dev/null
@@ -1,1013 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY RICHARD ZSCHECH AS WELL AS GOOGLE.
- */
-package java.math;
-
-/**
- * Static library that provides all operations related with division and modular
- * arithmetic to {@link BigInteger}. Some methods are provided in both mutable
- * and immutable way. There are several variants provided listed below:
- *
- * <ul type="circle"> <li><b>Division</b> <ul type="circle"> <li>
- * {@link BigInteger} division and remainder by {@link BigInteger}.</li> <li>
- * {@link BigInteger} division and remainder by {@code int}.</li> <li><i>gcd</i>
- * between {@link BigInteger} numbers.</li> </ul> </li> <li><b>Modular
- * arithmetic </b> <ul type="circle"> <li>Modular exponentiation between
- * {@link BigInteger} numbers.</li> <li>Modular inverse of a {@link BigInteger}
- * numbers.</li> </ul> </li> </ul>
- */
-class Division {
-
- /**
- * Divides the array 'a' by the array 'b' and gets the quotient and the
- * remainder. Implements the Knuth's division algorithm. See D. Knuth, The Art
- * of Computer Programming, vol. 2. Steps D1-D8 correspond the steps in the
- * algorithm description.
- *
- * @param quot the quotient
- * @param quotLength the quotient's length
- * @param a the dividend
- * @param aLength the dividend's length
- * @param b the divisor
- * @param bLength the divisor's length
- * @return the remainder
- */
- static int[] divide(int quot[], int quotLength, int a[], int aLength,
- int b[], int bLength) {
-
- int normA[] = new int[aLength + 1]; // the normalized dividend
- // an extra byte is needed for correct shift
- int normB[] = new int[bLength + 1]; // the normalized divisor;
- int normBLength = bLength;
- /*
- * Step D1: normalize a and b and put the results to a1 and b1 the
- * normalized divisor's first digit must be >= 2^31
- */
- int divisorShift = Integer.numberOfLeadingZeros(b[bLength - 1]);
- if (divisorShift != 0) {
- BitLevel.shiftLeft(normB, b, 0, divisorShift);
- BitLevel.shiftLeft(normA, a, 0, divisorShift);
- } else {
- System.arraycopy(a, 0, normA, 0, aLength);
- System.arraycopy(b, 0, normB, 0, bLength);
- }
- int firstDivisorDigit = normB[normBLength - 1];
- // Step D2: set the quotient index
- int i = quotLength - 1;
- int j = aLength;
-
- while (i >= 0) {
- // Step D3: calculate a guess digit guessDigit
- int guessDigit = 0;
- if (normA[j] == firstDivisorDigit) {
- // set guessDigit to the largest unsigned int value
- guessDigit = -1;
- } else {
- long product = (((normA[j] & 0xffffffffL) << 32) + (normA[j - 1] & 0xffffffffL));
- long res = Division.divideLongByInt(product, firstDivisorDigit);
- guessDigit = (int) res; // the quotient of divideLongByInt
- int rem = (int) (res >> 32); // the remainder of
- // divideLongByInt
- // decrease guessDigit by 1 while leftHand > rightHand
- if (guessDigit != 0) {
- long leftHand = 0;
- long rightHand = 0;
- boolean rOverflowed = false;
- guessDigit++; // to have the proper value in the loop
- // below
- do {
- guessDigit--;
- if (rOverflowed) {
- break;
- }
- // leftHand always fits in an unsigned long
- leftHand = (guessDigit & 0xffffffffL)
- * (normB[normBLength - 2] & 0xffffffffL);
- /*
- * rightHand can overflow; in this case the loop condition will be
- * true in the next step of the loop
- */
- rightHand = ((long) rem << 32) + (normA[j - 2] & 0xffffffffL);
- long longR = (rem & 0xffffffffL)
- + (firstDivisorDigit & 0xffffffffL);
- /*
- * checks that longR does not fit in an unsigned int; this ensures
- * that rightHand will overflow unsigned long in the next step
- */
- if (Integer.numberOfLeadingZeros((int) (longR >>> 32)) < 32) {
- rOverflowed = true;
- } else {
- rem = (int) longR;
- }
- } while (((leftHand ^ 0x8000000000000000L) > (rightHand ^ 0x8000000000000000L)));
- }
- }
- // Step D4: multiply normB by guessDigit and subtract the production
- // from normA.
- if (guessDigit != 0) {
- int borrow = Division.multiplyAndSubtract(normA, j - normBLength,
- normB, normBLength, guessDigit);
- // Step D5: check the borrow
- if (borrow != 0) {
- // Step D6: compensating addition
- guessDigit--;
- long carry = 0;
- for (int k = 0; k < normBLength; k++) {
- carry += (normA[j - normBLength + k] & 0xffffffffL)
- + (normB[k] & 0xffffffffL);
- normA[j - normBLength + k] = (int) carry;
- carry >>>= 32;
- }
- }
- }
- if (quot != null) {
- quot[i] = guessDigit;
- }
- // Step D7
- j--;
- i--;
- }
- /*
- * Step D8: we got the remainder in normA. Denormalize it id needed
- */
- if (divisorShift != 0) {
- // reuse normB
- BitLevel.shiftRight(normB, normBLength, normA, 0, divisorShift);
- return normB;
- }
- System.arraycopy(normA, 0, normB, 0, bLength);
- return normA;
- }
-
- /**
- * Computes the quotient and the remainder after a division by an {@code int}
- * number.
- *
- * @return an array of the form {@code [quotient, remainder]}.
- */
- static BigInteger[] divideAndRemainderByInteger(BigInteger val, int divisor,
- int divisorSign) {
- // res[0] is a quotient and res[1] is a remainder:
- int[] valDigits = val.digits;
- int valLen = val.numberLength;
- int valSign = val.sign;
- if (valLen == 1) {
- long a = (valDigits[0] & 0xffffffffL);
- long b = (divisor & 0xffffffffL);
- long quo = a / b;
- long rem = a % b;
- if (valSign != divisorSign) {
- quo = -quo;
- }
- if (valSign < 0) {
- rem = -rem;
- }
- return new BigInteger[] {BigInteger.valueOf(quo), BigInteger.valueOf(rem)};
- }
- int quotientLength = valLen;
- int quotientSign = ((valSign == divisorSign) ? 1 : -1);
- int quotientDigits[] = new int[quotientLength];
- int remainderDigits[];
- remainderDigits = new int[] {Division.divideArrayByInt(quotientDigits,
- valDigits, valLen, divisor)};
- BigInteger result0 = new BigInteger(quotientSign, quotientLength,
- quotientDigits);
- BigInteger result1 = new BigInteger(valSign, 1, remainderDigits);
- result0.cutOffLeadingZeroes();
- result1.cutOffLeadingZeroes();
- return new BigInteger[] {result0, result1};
- }
-
- /**
- * Divides an array by an integer value. Implements the Knuth's division
- * algorithm. See D. Knuth, The Art of Computer Programming, vol. 2.
- *
- * @param dest the quotient
- * @param src the dividend
- * @param srcLength the length of the dividend
- * @param divisor the divisor
- * @return remainder
- */
- static int divideArrayByInt(int dest[], int src[], final int srcLength,
- final int divisor) {
-
- long rem = 0;
- long bLong = divisor & 0xffffffffL;
-
- for (int i = srcLength - 1; i >= 0; i--) {
- long temp = (rem << 32) | (src[i] & 0xffffffffL);
- long quot;
- if (temp >= 0) {
- quot = (temp / bLong);
- rem = (temp % bLong);
- } else {
- /*
- * make the dividend positive shifting it right by 1 bit then get the
- * quotient an remainder and correct them properly
- */
- long aPos = temp >>> 1;
- long bPos = divisor >>> 1;
- quot = aPos / bPos;
- rem = aPos % bPos;
- // double the remainder and add 1 if a is odd
- rem = (rem << 1) + (temp & 1);
- if ((divisor & 1) != 0) {
- // the divisor is odd
- if (quot <= rem) {
- rem -= quot;
- } else {
- if (quot - rem <= bLong) {
- rem += bLong - quot;
- quot -= 1;
- } else {
- rem += (bLong << 1) - quot;
- quot -= 2;
- }
- }
- }
- }
- dest[i] = (int) (quot & 0xffffffffL);
- }
- return (int) rem;
- }
-
- /**
- * Divides an unsigned long a by an unsigned int b. It is supposed that the
- * most significant bit of b is set to 1, i.e. b < 0
- *
- * @param a the dividend
- * @param b the divisor
- * @return the long value containing the unsigned integer remainder in the
- * left half and the unsigned integer quotient in the right half
- */
- static long divideLongByInt(long a, int b) {
- long quot;
- long rem;
- long bLong = b & 0xffffffffL;
-
- if (a >= 0) {
- quot = (a / bLong);
- rem = (a % bLong);
- } else {
- /*
- * Make the dividend positive shifting it right by 1 bit then get the
- * quotient an remainder and correct them properly
- */
- long aPos = a >>> 1;
- long bPos = b >>> 1;
- quot = aPos / bPos;
- rem = aPos % bPos;
- // double the remainder and add 1 if a is odd
- rem = (rem << 1) + (a & 1);
- if ((b & 1) != 0) { // the divisor is odd
- if (quot <= rem) {
- rem -= quot;
- } else {
- if (quot - rem <= bLong) {
- rem += bLong - quot;
- quot -= 1;
- } else {
- rem += (bLong << 1) - quot;
- quot -= 2;
- }
- }
- }
- }
- return (rem << 32) | (quot & 0xffffffffL);
- }
-
- /**
- * Performs modular exponentiation using the Montgomery Reduction. It requires
- * that all parameters be positive and the modulus be even. Based <i>The
- * square and multiply algorithm and the Montgomery Reduction C. K. Koc -
- * Montgomery Reduction with Even Modulus</i>. The square and multiply
- * algorithm and the Montgomery Reduction.
- *
- * @ar.org.fitc.ref "C. K. Koc - Montgomery Reduction with Even Modulus"
- * @see BigInteger#modPow(BigInteger, BigInteger)
- */
- static BigInteger evenModPow(BigInteger base, BigInteger exponent,
- BigInteger modulus) {
- // PRE: (base > 0), (exponent > 0), (modulus > 0) and (modulus even)
- // STEP 1: Obtain the factorization 'modulus'= q * 2^j.
- int j = modulus.getLowestSetBit();
- BigInteger q = modulus.shiftRight(j);
-
- // STEP 2: Compute x1 := base^exponent (mod q).
- BigInteger x1 = oddModPow(base, exponent, q);
-
- // STEP 3: Compute x2 := base^exponent (mod 2^j).
- BigInteger x2 = pow2ModPow(base, exponent, j);
-
- // STEP 4: Compute q^(-1) (mod 2^j) and y := (x2-x1) * q^(-1) (mod 2^j)
- BigInteger qInv = modPow2Inverse(q, j);
- BigInteger y = (x2.subtract(x1)).multiply(qInv);
- inplaceModPow2(y, j);
- if (y.sign < 0) {
- y = y.add(BigInteger.getPowerOfTwo(j));
- }
- // STEP 5: Compute and return: x1 + q * y
- return x1.add(q.multiply(y));
- }
-
- /**
- * Performs the final reduction of the Montgomery algorithm.
- *
- * @see #monPro(BigInteger, BigInteger, BigInteger, long)
- * @see #monSquare(BigInteger, BigInteger, long)
- */
- static BigInteger finalSubtraction(int res[], BigInteger modulus) {
-
- // skipping leading zeros
- int modulusLen = modulus.numberLength;
- boolean doSub = res[modulusLen] != 0;
- if (!doSub) {
- int modulusDigits[] = modulus.digits;
- doSub = true;
- for (int i = modulusLen - 1; i >= 0; i--) {
- if (res[i] != modulusDigits[i]) {
- doSub = (res[i] != 0)
- && ((res[i] & 0xFFFFFFFFL) > (modulusDigits[i] & 0xFFFFFFFFL));
- break;
- }
- }
- }
-
- BigInteger result = new BigInteger(1, modulusLen + 1, res);
-
- // if (res >= modulusDigits) compute (res - modulusDigits)
- if (doSub) {
- Elementary.inplaceSubtract(result, modulus);
- }
-
- result.cutOffLeadingZeroes();
- return result;
- }
-
- /**
- * @param m a positive modulus Return the greatest common divisor of op1 and
- * op2,
- *
- * @param op1 must be greater than zero
- * @param op2 must be greater than zero
- * @see BigInteger#gcd(BigInteger)
- * @return {@code GCD(op1, op2)}
- */
- static BigInteger gcdBinary(BigInteger op1, BigInteger op2) {
- // PRE: (op1 > 0) and (op2 > 0)
-
- /*
- * Divide both number the maximal possible times by 2 without rounding
- * gcd(2*a, 2*b) = 2 * gcd(a,b)
- */
- int lsb1 = op1.getLowestSetBit();
- int lsb2 = op2.getLowestSetBit();
- int pow2Count = Math.min(lsb1, lsb2);
-
- BitLevel.inplaceShiftRight(op1, lsb1);
- BitLevel.inplaceShiftRight(op2, lsb2);
-
- BigInteger swap;
- // I want op2 > op1
- if (op1.compareTo(op2) == BigInteger.GREATER) {
- swap = op1;
- op1 = op2;
- op2 = swap;
- }
-
- do { // INV: op2 >= op1 && both are odd unless op1 = 0
-
- // Optimization for small operands
- // (op2.bitLength() < 64) implies by INV (op1.bitLength() < 64)
- if ((op2.numberLength == 1)
- || ((op2.numberLength == 2) && (op2.digits[1] > 0))) {
- op2 = BigInteger.valueOf(Division.gcdBinary(op1.longValue(),
- op2.longValue()));
- break;
- }
-
- // Implements one step of the Euclidean algorithm
- // To reduce one operand if it's much smaller than the other one
- if (op2.numberLength > op1.numberLength * 1.2) {
- op2 = op2.remainder(op1);
- if (op2.signum() != 0) {
- BitLevel.inplaceShiftRight(op2, op2.getLowestSetBit());
- }
- } else {
-
- // Use Knuth's algorithm of successive subtract and shifting
- do {
- Elementary.inplaceSubtract(op2, op1); // both are odd
- BitLevel.inplaceShiftRight(op2, op2.getLowestSetBit()); // op2 is even
- } while (op2.compareTo(op1) >= BigInteger.EQUALS);
- }
- // now op1 >= op2
- swap = op2;
- op2 = op1;
- op1 = swap;
- } while (op1.sign != 0);
- return op2.shiftLeft(pow2Count);
- }
-
- /**
- * Performs the same as {@link #gcdBinary(BigInteger, BigInteger)}, but with
- * numbers of 63 bits, represented in positives values of {@code long} type.
- *
- * @param op1 a positive number
- * @param op2 a positive number
- * @see #gcdBinary(BigInteger, BigInteger)
- * @return <code>GCD(op1, op2)</code>
- */
- static long gcdBinary(long op1, long op2) {
- // PRE: (op1 > 0) and (op2 > 0)
- int lsb1 = Long.numberOfTrailingZeros(op1);
- int lsb2 = Long.numberOfTrailingZeros(op2);
- int pow2Count = Math.min(lsb1, lsb2);
-
- if (lsb1 != 0) {
- op1 >>>= lsb1;
- }
- if (lsb2 != 0) {
- op2 >>>= lsb2;
- }
- do {
- if (op1 >= op2) {
- op1 -= op2;
- op1 >>>= Long.numberOfTrailingZeros(op1);
- } else {
- op2 -= op1;
- op2 >>>= Long.numberOfTrailingZeros(op2);
- }
- } while (op1 != 0);
- return (op2 << pow2Count);
- }
-
- /**
- * Performs {@code x = x mod (2<sup>n</sup>)}.
- *
- * @param x a positive number, it will store the result.
- * @param n a positive exponent of {@code 2}.
- */
- static void inplaceModPow2(BigInteger x, int n) {
- // PRE: (x > 0) and (n >= 0)
- int fd = n >> 5;
- int leadingZeros;
-
- if ((x.numberLength < fd) || (x.bitLength() <= n)) {
- return;
- }
- leadingZeros = 32 - (n & 31);
- x.numberLength = fd + 1;
- x.digits[fd] &= (leadingZeros < 32) ? (-1 >>> leadingZeros) : 0;
- x.cutOffLeadingZeroes();
- }
-
- /**
- *
- * Based on "New Algorithm for Classical Modular Inverse" Róbert Lórencz. LNCS
- * 2523 (2002)
- *
- * @return a^(-1) mod m
- */
- static BigInteger modInverseLorencz(BigInteger a, BigInteger modulo) {
- // PRE: a is coprime with modulo, a < modulo
-
- int max = Math.max(a.numberLength, modulo.numberLength);
- int uDigits[] = new int[max + 1]; // enough place to make all the inplace
- // operation
- int vDigits[] = new int[max + 1];
- System.arraycopy(modulo.digits, 0, uDigits, 0, modulo.numberLength);
- System.arraycopy(a.digits, 0, vDigits, 0, a.numberLength);
- BigInteger u = new BigInteger(modulo.sign, modulo.numberLength, uDigits);
- BigInteger v = new BigInteger(a.sign, a.numberLength, vDigits);
-
- BigInteger r = new BigInteger(0, 1, new int[max + 1]); // BigInteger.ZERO;
- BigInteger s = new BigInteger(1, 1, new int[max + 1]);
- s.digits[0] = 1;
- // r == 0 && s == 1, but with enough place
-
- int coefU = 0, coefV = 0;
- int n = modulo.bitLength();
- int k;
- while (!isPowerOfTwo(u, coefU) && !isPowerOfTwo(v, coefV)) {
-
- // modification of original algorithm: I calculate how many times the
- // algorithm will enter in the same branch of if
- k = howManyIterations(u, n);
-
- if (k != 0) {
- BitLevel.inplaceShiftLeft(u, k);
- if (coefU >= coefV) {
- BitLevel.inplaceShiftLeft(r, k);
- } else {
- BitLevel.inplaceShiftRight(s, Math.min(coefV - coefU, k));
- if (k - (coefV - coefU) > 0) {
- BitLevel.inplaceShiftLeft(r, k - coefV + coefU);
- }
- }
- coefU += k;
- }
-
- k = howManyIterations(v, n);
- if (k != 0) {
- BitLevel.inplaceShiftLeft(v, k);
- if (coefV >= coefU) {
- BitLevel.inplaceShiftLeft(s, k);
- } else {
- BitLevel.inplaceShiftRight(r, Math.min(coefU - coefV, k));
- if (k - (coefU - coefV) > 0) {
- BitLevel.inplaceShiftLeft(s, k - coefU + coefV);
- }
- }
- coefV += k;
- }
-
- if (u.signum() == v.signum()) {
- if (coefU <= coefV) {
- Elementary.completeInPlaceSubtract(u, v);
- Elementary.completeInPlaceSubtract(r, s);
- } else {
- Elementary.completeInPlaceSubtract(v, u);
- Elementary.completeInPlaceSubtract(s, r);
- }
- } else {
- if (coefU <= coefV) {
- Elementary.completeInPlaceAdd(u, v);
- Elementary.completeInPlaceAdd(r, s);
- } else {
- Elementary.completeInPlaceAdd(v, u);
- Elementary.completeInPlaceAdd(s, r);
- }
- }
- if (v.signum() == 0 || u.signum() == 0) {
- // math.19: BigInteger not invertible
- throw new ArithmeticException("BigInteger not invertible.");
- }
- }
-
- if (isPowerOfTwo(v, coefV)) {
- r = s;
- if (v.signum() != u.signum()) {
- u = u.negate();
- }
- }
- if (u.testBit(n)) {
- if (r.signum() < 0) {
- r = r.negate();
- } else {
- r = modulo.subtract(r);
- }
- }
- if (r.signum() < 0) {
- r = r.add(modulo);
- }
-
- return r;
- }
-
- /**
- * Calculates a.modInverse(p) Based on: Savas, E; Koc, C "The Montgomery
- * Modular Inverse - Revised".
- */
- static BigInteger modInverseMontgomery(BigInteger a, BigInteger p) {
- if (a.sign == 0) {
- // ZERO hasn't inverse
- // math.19: BigInteger not invertible
- throw new ArithmeticException("BigInteger not invertible.");
- }
-
- if (!p.testBit(0)) {
- // montgomery inverse require even modulo
- return modInverseLorencz(a, p);
- }
-
- int m = p.numberLength * 32;
- // PRE: a \in [1, p - 1]
- BigInteger u, v, r, s;
- u = p.copy(); // make copy to use inplace method
- v = a.copy();
- int max = Math.max(v.numberLength, u.numberLength);
- r = new BigInteger(1, 1, new int[max + 1]);
- s = new BigInteger(1, 1, new int[max + 1]);
- s.digits[0] = 1;
- // s == 1 && v == 0
-
- int k = 0;
-
- int lsbu = u.getLowestSetBit();
- int lsbv = v.getLowestSetBit();
- int toShift;
-
- if (lsbu > lsbv) {
- BitLevel.inplaceShiftRight(u, lsbu);
- BitLevel.inplaceShiftRight(v, lsbv);
- BitLevel.inplaceShiftLeft(r, lsbv);
- k += lsbu - lsbv;
- } else {
- BitLevel.inplaceShiftRight(u, lsbu);
- BitLevel.inplaceShiftRight(v, lsbv);
- BitLevel.inplaceShiftLeft(s, lsbu);
- k += lsbv - lsbu;
- }
-
- r.sign = 1;
- while (v.signum() > 0) {
- // INV v >= 0, u >= 0, v odd, u odd (except last iteration when v is even
- // (0))
-
- while (u.compareTo(v) > BigInteger.EQUALS) {
- Elementary.inplaceSubtract(u, v);
- toShift = u.getLowestSetBit();
- BitLevel.inplaceShiftRight(u, toShift);
- Elementary.inplaceAdd(r, s);
- BitLevel.inplaceShiftLeft(s, toShift);
- k += toShift;
- }
-
- while (u.compareTo(v) <= BigInteger.EQUALS) {
- Elementary.inplaceSubtract(v, u);
- if (v.signum() == 0) {
- break;
- }
- toShift = v.getLowestSetBit();
- BitLevel.inplaceShiftRight(v, toShift);
- Elementary.inplaceAdd(s, r);
- BitLevel.inplaceShiftLeft(r, toShift);
- k += toShift;
- }
- }
- if (!u.isOne()) {
- // in u is stored the gcd
- // math.19: BigInteger not invertible.
- throw new ArithmeticException("BigInteger not invertible.");
- }
- if (r.compareTo(p) >= BigInteger.EQUALS) {
- Elementary.inplaceSubtract(r, p);
- }
-
- r = p.subtract(r);
-
- // Have pair: ((BigInteger)r, (Integer)k) where r == a^(-1) * 2^k mod
- // (module)
- int n1 = calcN(p);
- if (k > m) {
- r = monPro(r, BigInteger.ONE, p, n1);
- k = k - m;
- }
-
- r = monPro(r, BigInteger.getPowerOfTwo(m - k), p, n1);
- return r;
- }
-
- /**
- * @param x an odd positive number.
- * @param n the exponent by which 2 is raised.
- * @return {@code x<sup>-1</sup> (mod 2<sup>n</sup>)}.
- */
- static BigInteger modPow2Inverse(BigInteger x, int n) {
- // PRE: (x > 0), (x is odd), and (n > 0)
- BigInteger y = new BigInteger(1, new int[1 << n]);
- y.numberLength = 1;
- y.digits[0] = 1;
- y.sign = 1;
-
- for (int i = 1; i < n; i++) {
- if (BitLevel.testBit(x.multiply(y), i)) {
- // Adding 2^i to y (setting the i-th bit)
- y.digits[i >> 5] |= (1 << (i & 31));
- }
- }
- return y;
- }
-
- /**
- * Implements the Montgomery Product of two integers represented by {@code
- * int} arrays. The arrays are supposed in <i>little endian</i> notation.
- *
- * @param a The first factor of the product.
- * @param b The second factor of the product.
- * @param modulus The modulus of the operations. Z<sub>modulus</sub>.
- * @param n2 The digit modulus'[0].
- * @ar.org.fitc.ref "C. K. Koc - Analyzing and Comparing Montgomery
- * Multiplication Algorithms"
- * @see #modPowOdd(BigInteger, BigInteger, BigInteger)
- */
- static BigInteger monPro(BigInteger a, BigInteger b, BigInteger modulus,
- int n2) {
- int modulusLen = modulus.numberLength;
- int res[] = new int[(modulusLen << 1) + 1];
- Multiplication.multArraysPAP(a.digits,
- Math.min(modulusLen, a.numberLength), b.digits, Math.min(modulusLen,
- b.numberLength), res);
- monReduction(res, modulus, n2);
- return finalSubtraction(res, modulus);
- }
-
- /**
- * Multiplies an array by int and subtracts it from a subarray of another
- * array.
- *
- * @param a the array to subtract from
- * @param start the start element of the subarray of a
- * @param b the array to be multiplied and subtracted
- * @param bLen the length of b
- * @param c the multiplier of b
- * @return the carry element of subtraction
- */
- static int multiplyAndSubtract(int a[], int start, int b[], int bLen, int c) {
- long carry0 = 0;
- long carry1 = 0;
-
- for (int i = 0; i < bLen; i++) {
- carry0 = Multiplication.unsignedMultAddAdd(b[i], c, (int) carry0, 0);
- carry1 = (a[start + i] & 0xffffffffL) - (carry0 & 0xffffffffL) + carry1;
- a[start + i] = (int) carry1;
- carry1 >>= 32; // -1 or 0
- carry0 >>>= 32;
- }
-
- carry1 = (a[start + bLen] & 0xffffffffL) - carry0 + carry1;
- a[start + bLen] = (int) carry1;
- return (int) (carry1 >> 32); // -1 or 0
- }
-
- /**
- * Performs modular exponentiation using the Montgomery Reduction. It requires
- * that all parameters be positive and the modulus be odd. >
- *
- * @see BigInteger#modPow(BigInteger, BigInteger)
- * @see #monPro(BigInteger, BigInteger, BigInteger, int)
- * @see #slidingWindow(BigInteger, BigInteger, BigInteger, BigInteger, int)
- * @see #squareAndMultiply(BigInteger, BigInteger, BigInteger, BigInteger,
- * int)
- */
- static BigInteger oddModPow(BigInteger base, BigInteger exponent,
- BigInteger modulus) {
- // PRE: (base > 0), (exponent > 0), (modulus > 0) and (odd modulus)
- int k = (modulus.numberLength << 5); // r = 2^k
- // n-residue of base [base * r (mod modulus)]
- BigInteger a2 = base.shiftLeft(k).mod(modulus);
- // n-residue of base [1 * r (mod modulus)]
- BigInteger x2 = BigInteger.getPowerOfTwo(k).mod(modulus);
- BigInteger res;
- // Compute (modulus[0]^(-1)) (mod 2^32) for odd modulus
-
- int n2 = calcN(modulus);
- if (modulus.numberLength == 1) {
- res = squareAndMultiply(x2, a2, exponent, modulus, n2);
- } else {
- res = slidingWindow(x2, a2, exponent, modulus, n2);
- }
-
- return monPro(res, BigInteger.ONE, modulus, n2);
- }
-
- /**
- * It requires that all parameters be positive.
- *
- * @return {@code base<sup>exponent</sup> mod (2<sup>j</sup>)}.
- * @see BigInteger#modPow(BigInteger, BigInteger)
- */
- static BigInteger pow2ModPow(BigInteger base, BigInteger exponent, int j) {
- // PRE: (base > 0), (exponent > 0) and (j > 0)
- BigInteger res = BigInteger.ONE;
- BigInteger e = exponent.copy();
- BigInteger baseMod2toN = base.copy();
- BigInteger res2;
- /*
- * If 'base' is odd then it's coprime with 2^j and phi(2^j) = 2^(j-1); so we
- * can reduce reduce the exponent (mod 2^(j-1)).
- */
- if (base.testBit(0)) {
- inplaceModPow2(e, j - 1);
- }
- inplaceModPow2(baseMod2toN, j);
-
- for (int i = e.bitLength() - 1; i >= 0; i--) {
- res2 = res.copy();
- inplaceModPow2(res2, j);
- res = res.multiply(res2);
- if (BitLevel.testBit(e, i)) {
- res = res.multiply(baseMod2toN);
- inplaceModPow2(res, j);
- }
- }
- inplaceModPow2(res, j);
- return res;
- }
-
- /**
- * Divides a <code>BigInteger</code> by a signed <code>int</code> and returns
- * the remainder.
- *
- * @param dividend the BigInteger to be divided. Must be non-negative.
- * @param divisor a signed int
- * @return divide % divisor
- */
- static int remainder(BigInteger dividend, int divisor) {
- return remainderArrayByInt(dividend.digits, dividend.numberLength, divisor);
- }
-
- /**
- * Divides an array by an integer value. Implements the Knuth's division
- * algorithm. See D. Knuth, The Art of Computer Programming, vol. 2.
- *
- * @param src the dividend
- * @param srcLength the length of the dividend
- * @param divisor the divisor
- * @return remainder
- */
- static int remainderArrayByInt(int src[], final int srcLength,
- final int divisor) {
-
- long result = 0;
-
- for (int i = srcLength - 1; i >= 0; i--) {
- long temp = (result << 32) + (src[i] & 0xffffffffL);
- long res = divideLongByInt(temp, divisor);
- result = (int) (res >> 32);
- }
- return (int) result;
- }
-
- /*
- * Implements the Montgomery modular exponentiation based in <i>The sliding
- * windows algorithm and the MongomeryReduction</i>.
- *
- * @ar.org.fitc.ref
- * "A. Menezes,P. van Oorschot, S. Vanstone - Handbook of Applied Cryptography"
- * ;
- *
- * @see #oddModPow(BigInteger, BigInteger, BigInteger)
- */
- static BigInteger slidingWindow(BigInteger x2, BigInteger a2,
- BigInteger exponent, BigInteger modulus, int n2) {
- // fill odd low pows of a2
- BigInteger pows[] = new BigInteger[8];
- BigInteger res = x2;
- int lowexp;
- BigInteger x3;
- int acc3;
- pows[0] = a2;
-
- x3 = monPro(a2, a2, modulus, n2);
- for (int i = 1; i <= 7; i++) {
- pows[i] = monPro(pows[i - 1], x3, modulus, n2);
- }
-
- for (int i = exponent.bitLength() - 1; i >= 0; i--) {
- if (BitLevel.testBit(exponent, i)) {
- lowexp = 1;
- acc3 = i;
-
- for (int j = Math.max(i - 3, 0); j <= i - 1; j++) {
- if (BitLevel.testBit(exponent, j)) {
- if (j < acc3) {
- acc3 = j;
- lowexp = (lowexp << (i - j)) ^ 1;
- } else {
- lowexp = lowexp ^ (1 << (j - acc3));
- }
- }
- }
-
- for (int j = acc3; j <= i; j++) {
- res = monPro(res, res, modulus, n2);
- }
- res = monPro(pows[(lowexp - 1) >> 1], res, modulus, n2);
- i = acc3;
- } else {
- res = monPro(res, res, modulus, n2);
- }
- }
- return res;
- }
-
- static BigInteger squareAndMultiply(BigInteger x2, BigInteger a2,
- BigInteger exponent, BigInteger modulus, int n2) {
- BigInteger res = x2;
- for (int i = exponent.bitLength() - 1; i >= 0; i--) {
- res = monPro(res, res, modulus, n2);
- if (BitLevel.testBit(exponent, i)) {
- res = monPro(res, a2, modulus, n2);
- }
- }
- return res;
- }
-
- /**
- * Calculate the first digit of the inverse.
- */
- private static int calcN(BigInteger a) {
- long m0 = a.digits[0] & 0xFFFFFFFFL;
- long n2 = 1L; // this is a'[0]
- long powerOfTwo = 2L;
- do {
- if (((m0 * n2) & powerOfTwo) != 0) {
- n2 |= powerOfTwo;
- }
- powerOfTwo <<= 1;
- } while (powerOfTwo < 0x100000000L);
- n2 = -n2;
- return (int) (n2 & 0xFFFFFFFFL);
- }
-
- /**
- * Calculate how many iteration of Lorencz's algorithm would perform the same
- * operation.
- *
- * @param bi
- * @param n
- * @return
- */
- private static int howManyIterations(BigInteger bi, int n) {
- int i = n - 1;
- if (bi.sign > 0) {
- while (!bi.testBit(i)) {
- i--;
- }
- return n - 1 - i;
- } else {
- while (bi.testBit(i)) {
- i--;
- }
- return n - 1 - Math.max(i, bi.getLowestSetBit());
- }
- }
-
- /**
- * @return bi == abs(2^exp)
- */
- private static boolean isPowerOfTwo(BigInteger bi, int exp) {
- boolean result = false;
- result = (exp >> 5 == bi.numberLength - 1)
- && (bi.digits[bi.numberLength - 1] == 1 << (exp & 31));
- if (result) {
- for (int i = 0; result && i < bi.numberLength - 1; i++) {
- result = bi.digits[i] == 0;
- }
- }
- return result;
- }
-
- private static void monReduction(int[] res, BigInteger modulus, int n2) {
-
- /* res + m*modulus_digits */
- int[] modulusDigits = modulus.digits;
- int modulusLen = modulus.numberLength;
- long outerCarry = 0;
-
- for (int i = 0; i < modulusLen; i++) {
- long innnerCarry = 0;
- int m = (int) Multiplication.unsignedMultAddAdd(res[i], n2, 0, 0);
- for (int j = 0; j < modulusLen; j++) {
- innnerCarry = Multiplication.unsignedMultAddAdd(m, modulusDigits[j],
- res[i + j], (int) innnerCarry);
- res[i + j] = (int) innnerCarry;
- innnerCarry >>>= 32;
- }
-
- outerCarry += (res[i + modulusLen] & 0xFFFFFFFFL) + innnerCarry;
- res[i + modulusLen] = (int) outerCarry;
- outerCarry >>>= 32;
- }
-
- res[modulusLen << 1] = (int) outerCarry;
-
- /* res / r */
- for (int j = 0; j < modulusLen + 1; j++) {
- res[j] = res[j + modulusLen];
- }
- }
-}
diff --git a/user/super/com/google/gwt/emul/java/math/Elementary.java b/user/super/com/google/gwt/emul/java/math/Elementary.java
deleted file mode 100644
index 58bec5b..0000000
--- a/user/super/com/google/gwt/emul/java/math/Elementary.java
+++ /dev/null
@@ -1,457 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY RICHARD ZSCHECH AS WELL AS GOOGLE.
- */
-package java.math;
-
-/**
- * Static library that provides the basic arithmetic mutable operations for
- * {@link BigInteger}. The operations provided are listed below. <ul
- * type="circle"> <li>Addition.</li> <li>Subtraction.</li> <li>Comparison.</li>
- * </ul> In addition to this, some <i><b>Inplace</b></i> (mutable) methods are
- * provided.
- */
-class Elementary {
-
- /**
- * @see BigInteger#add(BigInteger) .
- * @param op1
- * @param op2
- * @return
- */
- static BigInteger add(BigInteger op1, BigInteger op2) {
- int resDigits[];
- int resSign;
- int op1Sign = op1.sign;
- int op2Sign = op2.sign;
-
- if (op1Sign == 0) {
- return op2;
- }
- if (op2Sign == 0) {
- return op1;
- }
- int op1Len = op1.numberLength;
- int op2Len = op2.numberLength;
-
- if (op1Len + op2Len == 2) {
- long a = (op1.digits[0] & 0xFFFFFFFFL);
- long b = (op2.digits[0] & 0xFFFFFFFFL);
- long res;
- int valueLo;
- int valueHi;
-
- if (op1Sign == op2Sign) {
- res = a + b;
- valueLo = (int) res;
- valueHi = (int) (res >>> 32);
- return ((valueHi == 0) ? new BigInteger(op1Sign, valueLo)
- : new BigInteger(op1Sign, 2, new int[] {valueLo, valueHi}));
- }
- return BigInteger.valueOf((op1Sign < 0) ? (b - a) : (a - b));
- } else if (op1Sign == op2Sign) {
- resSign = op1Sign;
- // an augend should not be shorter than addend
- resDigits = (op1Len >= op2Len) ? add(op1.digits, op1Len, op2.digits,
- op2Len) : add(op2.digits, op2Len, op1.digits, op1Len);
- } else { // signs are different
- int cmp = ((op1Len != op2Len) ? ((op1Len > op2Len) ? 1 : -1)
- : compareArrays(op1.digits, op2.digits, op1Len));
-
- if (cmp == BigInteger.EQUALS) {
- return BigInteger.ZERO;
- }
- // a minuend should not be shorter than subtrahend
- if (cmp == BigInteger.GREATER) {
- resSign = op1Sign;
- resDigits = subtract(op1.digits, op1Len, op2.digits, op2Len);
- } else {
- resSign = op2Sign;
- resDigits = subtract(op2.digits, op2Len, op1.digits, op1Len);
- }
- }
- BigInteger res = new BigInteger(resSign, resDigits.length, resDigits);
- res.cutOffLeadingZeroes();
- return res;
- }
-
- /**
- * Compares two arrays. All elements are treated as unsigned integers. The
- * magnitude is the bit chain of elements in big-endian order.
- *
- * @param a the first array
- * @param b the second array
- * @param size the size of arrays
- * @return 1 if a > b, -1 if a < b, 0 if a == b
- */
- static int compareArrays(final int[] a, final int[] b, final int size) {
- int i;
- for (i = size - 1; (i >= 0) && (a[i] == b[i]); i--) {
- // empty
- }
- return ((i < 0) ? BigInteger.EQUALS
- : (a[i] & 0xFFFFFFFFL) < (b[i] & 0xFFFFFFFFL) ? BigInteger.LESS
- : BigInteger.GREATER);
- }
-
- /**
- * Same as @link #inplaceAdd(BigInteger, BigInteger), but without the
- * restriction of non-positive values.
- *
- * @param op1 any number
- * @param op2 any number
- */
- static void completeInPlaceAdd(BigInteger op1, BigInteger op2) {
- if (op1.sign == 0) {
- System.arraycopy(op2.digits, 0, op1.digits, 0, op2.numberLength);
- } else if (op2.sign == 0) {
- return;
- } else if (op1.sign == op2.sign) {
- add(op1.digits, op1.digits, op1.numberLength, op2.digits,
- op2.numberLength);
- } else {
- int sign = unsignedArraysCompare(op1.digits, op2.digits,
- op1.numberLength, op2.numberLength);
- if (sign > 0) {
- subtract(op1.digits, op1.digits, op1.numberLength, op2.digits,
- op2.numberLength);
- } else {
- inverseSubtract(op1.digits, op1.digits, op1.numberLength, op2.digits,
- op2.numberLength);
- op1.sign = -op1.sign;
- }
- }
- op1.numberLength = Math.max(op1.numberLength, op2.numberLength) + 1;
- op1.cutOffLeadingZeroes();
- op1.unCache();
- }
-
- /**
- * Same as @link #inplaceSubtract(BigInteger, BigInteger), but without the
- * restriction of non-positive values.
- *
- * @param op1 should have enough space to save the result
- * @param op2
- */
- static void completeInPlaceSubtract(BigInteger op1, BigInteger op2) {
- int resultSign = op1.compareTo(op2);
- if (op1.sign == 0) {
- System.arraycopy(op2.digits, 0, op1.digits, 0, op2.numberLength);
- op1.sign = -op2.sign;
- } else if (op1.sign != op2.sign) {
- add(op1.digits, op1.digits, op1.numberLength, op2.digits,
- op2.numberLength);
- op1.sign = resultSign;
- } else {
- int sign = unsignedArraysCompare(op1.digits, op2.digits,
- op1.numberLength, op2.numberLength);
- if (sign > 0) {
- subtract(op1.digits, op1.digits, op1.numberLength, op2.digits,
- op2.numberLength); // op1 = op1 - op2
- // op1.sign remains equal
- } else {
- inverseSubtract(op1.digits, op1.digits, op1.numberLength, op2.digits,
- op2.numberLength); // op1 = op2 - op1
- op1.sign = -op1.sign;
- }
- }
- op1.numberLength = Math.max(op1.numberLength, op2.numberLength) + 1;
- op1.cutOffLeadingZeroes();
- op1.unCache();
- }
-
- /**
- * Performs {@code op1 += op2}. {@code op1} must have enough place to store
- * the result (i.e. {@code op1.bitLength() >= op2.bitLength()}). Both should
- * be positive (i.e. {@code op1 >= op2}).
- *
- * @param op1 the input minuend, and the output result.
- * @param op2 the addend
- */
- static void inplaceAdd(BigInteger op1, BigInteger op2) {
- // PRE: op1 >= op2 > 0
- add(op1.digits, op1.digits, op1.numberLength, op2.digits, op2.numberLength);
- op1.numberLength = Math.min(
- Math.max(op1.numberLength, op2.numberLength) + 1, op1.digits.length);
- op1.cutOffLeadingZeroes();
- op1.unCache();
- }
-
- /**
- * Performs: {@code op1 += addend}. The number must to have place to hold a
- * possible carry.
- */
- static void inplaceAdd(BigInteger op1, final int addend) {
- int carry = inplaceAdd(op1.digits, op1.numberLength, addend);
- if (carry == 1) {
- op1.digits[op1.numberLength] = 1;
- op1.numberLength++;
- }
- op1.unCache();
- }
-
- /**
- * Adds an integer value to the array of integers remembering carry.
- *
- * @return a possible generated carry (0 or 1)
- */
- static int inplaceAdd(int a[], final int aSize, final int addend) {
- long carry = addend & 0xFFFFFFFFL;
-
- for (int i = 0; (carry != 0) && (i < aSize); i++) {
- carry += a[i] & 0xFFFFFFFFL;
- a[i] = (int) carry;
- carry >>= 32;
- }
- return (int) carry;
- }
-
- /**
- * Performs {@code op1 -= op2}. {@code op1} must have enough place to store
- * the result (i.e. {@code op1.bitLength() >= op2.bitLength()}). Both should
- * be positive (what implies that {@code op1 >= op2}).
- *
- * @param op1 the input minuend, and the output result.
- * @param op2 the subtrahend
- */
- static void inplaceSubtract(BigInteger op1, BigInteger op2) {
- // PRE: op1 >= op2 > 0
- subtract(op1.digits, op1.digits, op1.numberLength, op2.digits,
- op2.numberLength);
- op1.cutOffLeadingZeroes();
- op1.unCache();
- }
-
- /**
- * @see BigInteger#subtract(BigInteger) .
- * @param op1
- * @param op2
- * @return
- */
- static BigInteger subtract(BigInteger op1, BigInteger op2) {
- int resSign;
- int resDigits[];
- int op1Sign = op1.sign;
- int op2Sign = op2.sign;
-
- if (op2Sign == 0) {
- return op1;
- }
- if (op1Sign == 0) {
- return op2.negate();
- }
- int op1Len = op1.numberLength;
- int op2Len = op2.numberLength;
- if (op1Len + op2Len == 2) {
- long a = (op1.digits[0] & 0xFFFFFFFFL);
- long b = (op2.digits[0] & 0xFFFFFFFFL);
- if (op1Sign < 0) {
- a = -a;
- }
- if (op2Sign < 0) {
- b = -b;
- }
- return BigInteger.valueOf(a - b);
- }
- int cmp = ((op1Len != op2Len) ? ((op1Len > op2Len) ? 1 : -1)
- : Elementary.compareArrays(op1.digits, op2.digits, op1Len));
-
- if (cmp == BigInteger.LESS) {
- resSign = -op2Sign;
- resDigits = (op1Sign == op2Sign) ? subtract(op2.digits, op2Len,
- op1.digits, op1Len) : add(op2.digits, op2Len, op1.digits, op1Len);
- } else {
- resSign = op1Sign;
- if (op1Sign == op2Sign) {
- if (cmp == BigInteger.EQUALS) {
- return BigInteger.ZERO;
- }
- resDigits = subtract(op1.digits, op1Len, op2.digits, op2Len);
- } else {
- resDigits = add(op1.digits, op1Len, op2.digits, op2Len);
- }
- }
- BigInteger res = new BigInteger(resSign, resDigits.length, resDigits);
- res.cutOffLeadingZeroes();
- return res;
- }
-
- /**
- * Addss the value represented by {@code b} to the value represented by
- * {@code a}. It is assumed the magnitude of a is not less than the magnitude
- * of b.
- *
- * @return {@code a + b}
- */
- private static int[] add(int a[], int aSize, int b[], int bSize) {
- // PRE: a[] >= b[]
- int res[] = new int[aSize + 1];
- add(res, a, aSize, b, bSize);
- return res;
- }
-
- /**
- * Performs {@code res = a + b}.
- */
- private static void add(int res[], int a[], int aSize, int b[], int bSize) {
- // PRE: a.length < max(aSize, bSize)
-
- int i;
- long carry = (a[0] & 0xFFFFFFFFL) + (b[0] & 0xFFFFFFFFL);
-
- res[0] = (int) carry;
- carry >>= 32;
-
- if (aSize >= bSize) {
- for (i = 1; i < bSize; i++) {
- carry += (a[i] & 0xFFFFFFFFL) + (b[i] & 0xFFFFFFFFL);
- res[i] = (int) carry;
- carry >>= 32;
- }
- for (; i < aSize; i++) {
- carry += a[i] & 0xFFFFFFFFL;
- res[i] = (int) carry;
- carry >>= 32;
- }
- } else {
- for (i = 1; i < aSize; i++) {
- carry += (a[i] & 0xFFFFFFFFL) + (b[i] & 0xFFFFFFFFL);
- res[i] = (int) carry;
- carry >>= 32;
- }
- for (; i < bSize; i++) {
- carry += b[i] & 0xFFFFFFFFL;
- res[i] = (int) carry;
- carry >>= 32;
- }
- }
- if (carry != 0) {
- res[i] = (int) carry;
- }
- }
-
- /**
- * Performs {@code res = b - a}.
- */
- private static void inverseSubtract(int res[], int a[], int aSize, int b[],
- int bSize) {
- int i;
- long borrow = 0;
- if (aSize < bSize) {
- for (i = 0; i < aSize; i++) {
- borrow += (b[i] & 0xFFFFFFFFL) - (a[i] & 0xFFFFFFFFL);
- res[i] = (int) borrow;
- borrow >>= 32; // -1 or 0
- }
- for (; i < bSize; i++) {
- borrow += b[i] & 0xFFFFFFFFL;
- res[i] = (int) borrow;
- borrow >>= 32; // -1 or 0
- }
- } else {
- for (i = 0; i < bSize; i++) {
- borrow += (b[i] & 0xFFFFFFFFL) - (a[i] & 0xFFFFFFFFL);
- res[i] = (int) borrow;
- borrow >>= 32; // -1 or 0
- }
- for (; i < aSize; i++) {
- borrow -= a[i] & 0xFFFFFFFFL;
- res[i] = (int) borrow;
- borrow >>= 32; // -1 or 0
- }
- }
- }
-
- /**
- * Subtracts the value represented by {@code b} from the value represented by
- * {@code a}. It is assumed the magnitude of a is not less than the magnitude
- * of b.
- *
- * @return {@code a - b}
- */
- private static int[] subtract(int a[], int aSize, int b[], int bSize) {
- // PRE: a[] >= b[]
- int res[] = new int[aSize];
- subtract(res, a, aSize, b, bSize);
- return res;
- }
-
- /**
- * Performs {@code res = a - b}. It is assumed the magnitude of a is not less
- * than the magnitude of b.
- */
- private static void subtract(int res[], int a[], int aSize, int b[], int bSize) {
- // PRE: a[] >= b[]
- int i;
- long borrow = 0;
-
- for (i = 0; i < bSize; i++) {
- borrow += (a[i] & 0xFFFFFFFFL) - (b[i] & 0xFFFFFFFFL);
- res[i] = (int) borrow;
- borrow >>= 32; // -1 or 0
- }
- for (; i < aSize; i++) {
- borrow += a[i] & 0xFFFFFFFFL;
- res[i] = (int) borrow;
- borrow >>= 32; // -1 or 0
- }
- }
-
- /**
- * Compares two arrays, representing unsigned integer in little-endian order.
- * Returns +1,0,-1 if a is - respective - greater, equal or lesser then b
- */
- private static int unsignedArraysCompare(int[] a, int[] b, int aSize,
- int bSize) {
- if (aSize > bSize) {
- return 1;
- } else if (aSize < bSize) {
- return -1;
- } else {
- int i;
- for (i = aSize - 1; i >= 0 && a[i] == b[i]; i--) {
- // empty
- }
- return i < 0 ? BigInteger.EQUALS
- : ((a[i] & 0xFFFFFFFFL) < (b[i] & 0xFFFFFFFFL) ? BigInteger.LESS
- : BigInteger.GREATER);
- }
- }
-
- /**
- * Just to denote that this class can't be instantiated.
- */
- private Elementary() {
- }
-
-}
diff --git a/user/super/com/google/gwt/emul/java/math/Logical.java b/user/super/com/google/gwt/emul/java/math/Logical.java
deleted file mode 100644
index d3ab03e..0000000
--- a/user/super/com/google/gwt/emul/java/math/Logical.java
+++ /dev/null
@@ -1,926 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY RICHARD ZSCHECH AS WELL AS GOOGLE.
- */
-package java.math;
-
-/**
- * The library implements some logical operations over {@code BigInteger}. The
- * operations provided are listed below. <ul type="circle"> <li>not</li> <li>and
- * </li> <li>andNot</li> <li>or</li> <li>xor</li> </ul>
- */
-class Logical {
-
- /**
- * @see BigInteger#and(BigInteger)
- * @param val
- * @param that
- * @return
- */
- static BigInteger and(BigInteger val, BigInteger that) {
- if (that.sign == 0 || val.sign == 0) {
- return BigInteger.ZERO;
- }
- if (that.equals(BigInteger.MINUS_ONE)) {
- return val;
- }
- if (val.equals(BigInteger.MINUS_ONE)) {
- return that;
- }
-
- if (val.sign > 0) {
- if (that.sign > 0) {
- return andPositive(val, that);
- } else {
- return andDiffSigns(val, that);
- }
- } else {
- if (that.sign > 0) {
- return andDiffSigns(that, val);
- } else if (val.numberLength > that.numberLength) {
- return andNegative(val, that);
- } else {
- return andNegative(that, val);
- }
- }
- }
-
- /**
- * Return sign = positive.magnitude & magnitude = -negative.magnitude.
- * @param positive
- * @param negative
- * @return
- */
- static BigInteger andDiffSigns(BigInteger positive, BigInteger negative) {
- // PRE: positive is positive and negative is negative
- int iPos = positive.getFirstNonzeroDigit();
- int iNeg = negative.getFirstNonzeroDigit();
-
- // Look if the trailing zeros of the negative will "blank" all
- // the positive digits
- if (iNeg >= positive.numberLength) {
- return BigInteger.ZERO;
- }
- int resLength = positive.numberLength;
- int resDigits[] = new int[resLength];
-
- // Must start from max(iPos, iNeg)
- int i = Math.max(iPos, iNeg);
- if (i == iNeg) {
- resDigits[i] = -negative.digits[i] & positive.digits[i];
- i++;
- }
- int limit = Math.min(negative.numberLength, positive.numberLength);
- for (; i < limit; i++) {
- resDigits[i] = ~negative.digits[i] & positive.digits[i];
- }
- // if the negative was shorter must copy the remaining digits
- // from positive
- if (i >= negative.numberLength) {
- for (; i < positive.numberLength; i++) {
- resDigits[i] = positive.digits[i];
- }
- } // else positive ended and must "copy" virtual 0's, do nothing then
-
- BigInteger result = new BigInteger(1, resLength, resDigits);
- result.cutOffLeadingZeroes();
- return result;
- }
-
- /**
- * Return sign = -1, magnitude = -(-longer.magnitude & -shorter.magnitude).
- * @param longer
- * @param shorter
- * @return
- */
- static BigInteger andNegative(BigInteger longer, BigInteger shorter) {
- // PRE: longer and shorter are negative
- // PRE: longer has at least as many digits as shorter
- int iLonger = longer.getFirstNonzeroDigit();
- int iShorter = shorter.getFirstNonzeroDigit();
-
- // Does shorter matter?
- if (iLonger >= shorter.numberLength) {
- return longer;
- }
-
- int resLength;
- int resDigits[];
- int i = Math.max(iShorter, iLonger);
- int digit;
- if (iShorter > iLonger) {
- digit = -shorter.digits[i] & ~longer.digits[i];
- } else if (iShorter < iLonger) {
- digit = ~shorter.digits[i] & -longer.digits[i];
- } else {
- digit = -shorter.digits[i] & -longer.digits[i];
- }
- if (digit == 0) {
- for (i++; i < shorter.numberLength
- && (digit = ~(longer.digits[i] | shorter.digits[i])) == 0; i++) {
- // digit
- }
- // = ~longer.digits[i] & ~shorter.digits[i]
- if (digit == 0) {
- // shorter has only the remaining virtual sign bits
- for (; i < longer.numberLength && (digit = ~longer.digits[i]) == 0; i++) {
- // empty
- }
- if (digit == 0) {
- resLength = longer.numberLength + 1;
- resDigits = new int[resLength];
- resDigits[resLength - 1] = 1;
-
- BigInteger result = new BigInteger(-1, resLength, resDigits);
- return result;
- }
- }
- }
- resLength = longer.numberLength;
- resDigits = new int[resLength];
- resDigits[i] = -digit;
- for (i++; i < shorter.numberLength; i++) {
- // resDigits[i] = ~(~longer.digits[i] & ~shorter.digits[i];)
- resDigits[i] = longer.digits[i] | shorter.digits[i];
- }
- // shorter has only the remaining virtual sign bits
- for (; i < longer.numberLength; i++) {
- resDigits[i] = longer.digits[i];
- }
-
- BigInteger result = new BigInteger(-1, resLength, resDigits);
- return result;
- }
-
- /**
- * @see BigInteger#andNot(BigInteger)
- * @param val
- * @param that
- * @return
- */
- static BigInteger andNot(BigInteger val, BigInteger that) {
- if (that.sign == 0) {
- return val;
- }
- if (val.sign == 0) {
- return BigInteger.ZERO;
- }
- if (val.equals(BigInteger.MINUS_ONE)) {
- return that.not();
- }
- if (that.equals(BigInteger.MINUS_ONE)) {
- return BigInteger.ZERO;
- }
-
- // if val == that, return 0
-
- if (val.sign > 0) {
- if (that.sign > 0) {
- return andNotPositive(val, that);
- } else {
- return andNotPositiveNegative(val, that);
- }
- } else {
- if (that.sign > 0) {
- return andNotNegativePositive(val, that);
- } else {
- return andNotNegative(val, that);
- }
- }
- }
-
- /**
- * Return sign = 1, magnitude = -val.magnitude & ~(-that.magnitude).
- * @param val
- * @param that
- * @return
- */
- static BigInteger andNotNegative(BigInteger val, BigInteger that) {
- // PRE: val < 0 && that < 0
- int iVal = val.getFirstNonzeroDigit();
- int iThat = that.getFirstNonzeroDigit();
-
- if (iVal >= that.numberLength) {
- return BigInteger.ZERO;
- }
-
- int resLength = that.numberLength;
- int resDigits[] = new int[resLength];
- int limit;
- int i = iVal;
- if (iVal < iThat) {
- // resDigits[i] = -val.digits[i] & -1;
- resDigits[i] = -val.digits[i];
- limit = Math.min(val.numberLength, iThat);
- for (i++; i < limit; i++) {
- // resDigits[i] = ~val.digits[i] & -1;
- resDigits[i] = ~val.digits[i];
- }
- if (i == val.numberLength) {
- for (; i < iThat; i++) {
- // resDigits[i] = -1 & -1;
- resDigits[i] = -1;
- }
- // resDigits[i] = -1 & ~-that.digits[i];
- resDigits[i] = that.digits[i] - 1;
- } else {
- // resDigits[i] = ~val.digits[i] & ~-that.digits[i];
- resDigits[i] = ~val.digits[i] & (that.digits[i] - 1);
- }
- } else if (iThat < iVal) {
- // resDigits[i] = -val.digits[i] & ~~that.digits[i];
- resDigits[i] = -val.digits[i] & that.digits[i];
- } else {
- // resDigits[i] = -val.digits[i] & ~-that.digits[i];
- resDigits[i] = -val.digits[i] & (that.digits[i] - 1);
- }
-
- limit = Math.min(val.numberLength, that.numberLength);
- for (i++; i < limit; i++) {
- // resDigits[i] = ~val.digits[i] & ~~that.digits[i];
- resDigits[i] = ~val.digits[i] & that.digits[i];
- }
- for (; i < that.numberLength; i++) {
- // resDigits[i] = -1 & ~~that.digits[i];
- resDigits[i] = that.digits[i];
- }
-
- BigInteger result = new BigInteger(1, resLength, resDigits);
- result.cutOffLeadingZeroes();
- return result;
- }
-
- /**
- * Return sign = -1, magnitude = -(-negative.magnitude & ~positive.magnitude).
- * @param negative
- * @param positive
- * @return
- */
- static BigInteger andNotNegativePositive(BigInteger negative,
- BigInteger positive) {
- // PRE: negative < 0 && positive > 0
- int resLength;
- int resDigits[];
- int limit;
- int digit;
-
- int iNeg = negative.getFirstNonzeroDigit();
- int iPos = positive.getFirstNonzeroDigit();
-
- if (iNeg >= positive.numberLength) {
- return negative;
- }
-
- resLength = Math.max(negative.numberLength, positive.numberLength);
- int i = iNeg;
- if (iPos > iNeg) {
- resDigits = new int[resLength];
- limit = Math.min(negative.numberLength, iPos);
- for (; i < limit; i++) {
- // 1st case: resDigits [i] = -(-negative.digits[i] & (~0))
- // otherwise: resDigits[i] = ~(~negative.digits[i] & ~0) ;
- resDigits[i] = negative.digits[i];
- }
- if (i == negative.numberLength) {
- for (i = iPos; i < positive.numberLength; i++) {
- // resDigits[i] = ~(~positive.digits[i] & -1);
- resDigits[i] = positive.digits[i];
- }
- }
- } else {
- digit = -negative.digits[i] & ~positive.digits[i];
- if (digit == 0) {
- limit = Math.min(positive.numberLength, negative.numberLength);
- for (i++; i < limit
- && (digit = ~(negative.digits[i] | positive.digits[i])) == 0; i++) {
- // digit
- }
- // = ~negative.digits[i] & ~positive.digits[i]
- if (digit == 0) {
- // the shorter has only the remaining virtual sign bits
- for (; i < positive.numberLength
- && (digit = ~positive.digits[i]) == 0; i++) {
- // digit = -1 & ~positive.digits[i]
- }
- for (; i < negative.numberLength
- && (digit = ~negative.digits[i]) == 0; i++) {
- // empty
- }
- // digit = ~negative.digits[i] & ~0
- if (digit == 0) {
- resLength++;
- resDigits = new int[resLength];
- resDigits[resLength - 1] = 1;
-
- BigInteger result = new BigInteger(-1, resLength, resDigits);
- return result;
- }
- }
- }
- resDigits = new int[resLength];
- resDigits[i] = -digit;
- i++;
- }
-
- limit = Math.min(positive.numberLength, negative.numberLength);
- for (; i < limit; i++) {
- // resDigits[i] = ~(~negative.digits[i] & ~positive.digits[i]);
- resDigits[i] = negative.digits[i] | positive.digits[i];
- }
- // Actually one of the next two cycles will be executed
- for (; i < negative.numberLength; i++) {
- resDigits[i] = negative.digits[i];
- }
- for (; i < positive.numberLength; i++) {
- resDigits[i] = positive.digits[i];
- }
-
- BigInteger result = new BigInteger(-1, resLength, resDigits);
- return result;
- }
-
- /**
- * Return sign = 1, magnitude = val.magnitude & ~that.magnitude.
- * @param val
- * @param that
- * @return
- */
- static BigInteger andNotPositive(BigInteger val, BigInteger that) {
- // PRE: both arguments are positive
- int resDigits[] = new int[val.numberLength];
-
- int limit = Math.min(val.numberLength, that.numberLength);
- int i;
- for (i = val.getFirstNonzeroDigit(); i < limit; i++) {
- resDigits[i] = val.digits[i] & ~that.digits[i];
- }
- for (; i < val.numberLength; i++) {
- resDigits[i] = val.digits[i];
- }
-
- BigInteger result = new BigInteger(1, val.numberLength, resDigits);
- result.cutOffLeadingZeroes();
- return result;
- }
-
- /**
- * Return sign = 1, magnitude = positive.magnitude & ~(-negative.magnitude).
- * @param positive
- * @param negative
- * @return
- */
- static BigInteger andNotPositiveNegative(BigInteger positive,
- BigInteger negative) {
- // PRE: positive > 0 && negative < 0
- int iNeg = negative.getFirstNonzeroDigit();
- int iPos = positive.getFirstNonzeroDigit();
-
- if (iNeg >= positive.numberLength) {
- return positive;
- }
-
- int resLength = Math.min(positive.numberLength, negative.numberLength);
- int resDigits[] = new int[resLength];
-
- // Always start from first non zero of positive
- int i = iPos;
- for (; i < iNeg; i++) {
- // resDigits[i] = positive.digits[i] & -1 (~0)
- resDigits[i] = positive.digits[i];
- }
- if (i == iNeg) {
- resDigits[i] = positive.digits[i] & (negative.digits[i] - 1);
- i++;
- }
- for (; i < resLength; i++) {
- // resDigits[i] = positive.digits[i] & ~(~negative.digits[i]);
- resDigits[i] = positive.digits[i] & negative.digits[i];
- }
-
- BigInteger result = new BigInteger(1, resLength, resDigits);
- result.cutOffLeadingZeroes();
- return result;
- }
-
- /**
- * Return sign = 1, magnitude = val.magnitude & that.magnitude.
- * @param val
- * @param that
- * @return
- */
- static BigInteger andPositive(BigInteger val, BigInteger that) {
- // PRE: both arguments are positive
- int resLength = Math.min(val.numberLength, that.numberLength);
- int i = Math.max(val.getFirstNonzeroDigit(), that.getFirstNonzeroDigit());
-
- if (i >= resLength) {
- return BigInteger.ZERO;
- }
-
- int resDigits[] = new int[resLength];
- for (; i < resLength; i++) {
- resDigits[i] = val.digits[i] & that.digits[i];
- }
-
- BigInteger result = new BigInteger(1, resLength, resDigits);
- result.cutOffLeadingZeroes();
- return result;
- }
-
- /**
- * @see BigInteger#not()
- * @param val
- * @return
- */
- static BigInteger not(BigInteger val) {
- if (val.sign == 0) {
- return BigInteger.MINUS_ONE;
- }
- if (val.equals(BigInteger.MINUS_ONE)) {
- return BigInteger.ZERO;
- }
- int resDigits[] = new int[val.numberLength + 1];
- int i;
-
- if (val.sign > 0) {
- // ~val = -val + 1
- if (val.digits[val.numberLength - 1] != -1) {
- for (i = 0; val.digits[i] == -1; i++) {
- // empty
- }
- } else {
- for (i = 0; (i < val.numberLength) && (val.digits[i] == -1); i++) {
- // empty
- }
- if (i == val.numberLength) {
- resDigits[i] = 1;
- return new BigInteger(-val.sign, i + 1, resDigits);
- }
- }
- // Here a carry 1 was generated
- } else {
- // (val.sign < 0)
- // ~val = -val - 1
- for (i = 0; val.digits[i] == 0; i++) {
- resDigits[i] = -1;
- }
- // Here a borrow -1 was generated
- }
- // Now, the carry/borrow can be absorbed
- resDigits[i] = val.digits[i] + val.sign;
- // Copying the remaining unchanged digit
- for (i++; i < val.numberLength; i++) {
- resDigits[i] = val.digits[i];
- }
- return new BigInteger(-val.sign, i, resDigits);
- }
-
- /**
- * @see BigInteger#or(BigInteger).
- * @param val
- * @param that
- * @return
- */
- static BigInteger or(BigInteger val, BigInteger that) {
- if (that.equals(BigInteger.MINUS_ONE) || val.equals(BigInteger.MINUS_ONE)) {
- return BigInteger.MINUS_ONE;
- }
- if (that.sign == 0) {
- return val;
- }
- if (val.sign == 0) {
- return that;
- }
-
- if (val.sign > 0) {
- if (that.sign > 0) {
- if (val.numberLength > that.numberLength) {
- return orPositive(val, that);
- } else {
- return orPositive(that, val);
- }
- } else {
- return orDiffSigns(val, that);
- }
- } else {
- if (that.sign > 0) {
- return orDiffSigns(that, val);
- } else if (that.getFirstNonzeroDigit() > val.getFirstNonzeroDigit()) {
- return orNegative(that, val);
- } else {
- return orNegative(val, that);
- }
- }
- }
-
- /**
- * Return sign = -1, magnitude = -(positive.magnitude | -negative.magnitude).
- * @param positive
- * @param negative
- * @return
- */
- static BigInteger orDiffSigns(BigInteger positive, BigInteger negative) {
- // Jumping over the least significant zero bits
- int iNeg = negative.getFirstNonzeroDigit();
- int iPos = positive.getFirstNonzeroDigit();
- int i;
- int limit;
-
- // Look if the trailing zeros of the positive will "copy" all
- // the negative digits
- if (iPos >= negative.numberLength) {
- return negative;
- }
- int resLength = negative.numberLength;
- int resDigits[] = new int[resLength];
-
- if (iNeg < iPos) {
- // We know for sure that this will
- // be the first non zero digit in the result
- for (i = iNeg; i < iPos; i++) {
- resDigits[i] = negative.digits[i];
- }
- } else if (iPos < iNeg) {
- i = iPos;
- resDigits[i] = -positive.digits[i];
- limit = Math.min(positive.numberLength, iNeg);
- for (i++; i < limit; i++) {
- resDigits[i] = ~positive.digits[i];
- }
- if (i != positive.numberLength) {
- resDigits[i] = ~(-negative.digits[i] | positive.digits[i]);
- } else {
- for (; i < iNeg; i++) {
- resDigits[i] = -1;
- }
- // resDigits[i] = ~(-negative.digits[i] | 0);
- resDigits[i] = negative.digits[i] - 1;
- }
- i++;
- } else {
- // iNeg == iPos
- // Applying two complement to negative and to result
- i = iPos;
- resDigits[i] = -(-negative.digits[i] | positive.digits[i]);
- i++;
- }
- limit = Math.min(negative.numberLength, positive.numberLength);
- for (; i < limit; i++) {
- // Applying two complement to negative and to result
- // resDigits[i] = ~(~negative.digits[i] | positive.digits[i] );
- resDigits[i] = negative.digits[i] & ~positive.digits[i];
- }
- for (; i < negative.numberLength; i++) {
- resDigits[i] = negative.digits[i];
- }
-
- BigInteger result = new BigInteger(-1, resLength, resDigits);
- result.cutOffLeadingZeroes();
- return result;
- }
-
- /**
- * Return sign = -1, magnitude = -(-val.magnitude | -that.magnitude).
- * @param val
- * @param that
- * @return
- */
- static BigInteger orNegative(BigInteger val, BigInteger that) {
- // PRE: val and that are negative;
- // PRE: val has at least as many trailing zeros digits as that
- int iThat = that.getFirstNonzeroDigit();
- int iVal = val.getFirstNonzeroDigit();
- int i;
-
- if (iVal >= that.numberLength) {
- return that;
- } else if (iThat >= val.numberLength) {
- return val;
- }
-
- int resLength = Math.min(val.numberLength, that.numberLength);
- int resDigits[] = new int[resLength];
-
- // Looking for the first non-zero digit of the result
- if (iThat == iVal) {
- resDigits[iVal] = -(-val.digits[iVal] | -that.digits[iVal]);
- i = iVal;
- } else {
- for (i = iThat; i < iVal; i++) {
- resDigits[i] = that.digits[i];
- }
- resDigits[i] = that.digits[i] & (val.digits[i] - 1);
- }
-
- for (i++; i < resLength; i++) {
- resDigits[i] = val.digits[i] & that.digits[i];
- }
-
- BigInteger result = new BigInteger(-1, resLength, resDigits);
- result.cutOffLeadingZeroes();
- return result;
- }
-
- /**
- * Return sign = 1, magnitude = longer.magnitude | shorter.magnitude.
- * @param longer
- * @param shorter
- * @return
- */
- static BigInteger orPositive(BigInteger longer, BigInteger shorter) {
- // PRE: longer and shorter are positive;
- // PRE: longer has at least as many digits as shorter
- int resLength = longer.numberLength;
- int resDigits[] = new int[resLength];
-
- int i = Math.min(longer.getFirstNonzeroDigit(),
- shorter.getFirstNonzeroDigit());
- for (i = 0; i < shorter.numberLength; i++) {
- resDigits[i] = longer.digits[i] | shorter.digits[i];
- }
- for (; i < resLength; i++) {
- resDigits[i] = longer.digits[i];
- }
-
- BigInteger result = new BigInteger(1, resLength, resDigits);
- return result;
- }
-
- /**
- * @see BigInteger#xor(BigInteger)
- * @param val
- * @param that
- * @return
- */
- static BigInteger xor(BigInteger val, BigInteger that) {
- if (that.sign == 0) {
- return val;
- }
- if (val.sign == 0) {
- return that;
- }
- if (that.equals(BigInteger.MINUS_ONE)) {
- return val.not();
- }
- if (val.equals(BigInteger.MINUS_ONE)) {
- return that.not();
- }
-
- if (val.sign > 0) {
- if (that.sign > 0) {
- if (val.numberLength > that.numberLength) {
- return xorPositive(val, that);
- } else {
- return xorPositive(that, val);
- }
- } else {
- return xorDiffSigns(val, that);
- }
- } else {
- if (that.sign > 0) {
- return xorDiffSigns(that, val);
- } else if (that.getFirstNonzeroDigit() > val.getFirstNonzeroDigit()) {
- return xorNegative(that, val);
- } else {
- return xorNegative(val, that);
- }
- }
- }
-
- /**
- * Return sign = 1, magnitude = -(positive.magnitude ^ -negative.magnitude).
- * @param positive
- * @param negative
- * @return
- */
- static BigInteger xorDiffSigns(BigInteger positive, BigInteger negative) {
- int resLength = Math.max(negative.numberLength, positive.numberLength);
- int resDigits[];
- int iNeg = negative.getFirstNonzeroDigit();
- int iPos = positive.getFirstNonzeroDigit();
- int i;
- int limit;
-
- // The first
- if (iNeg < iPos) {
- resDigits = new int[resLength];
- i = iNeg;
- // resDigits[i] = -(-negative.digits[i]);
- resDigits[i] = negative.digits[i];
- limit = Math.min(negative.numberLength, iPos);
- // Skip the positive digits while they are zeros
- for (i++; i < limit; i++) {
- // resDigits[i] = ~(~negative.digits[i]);
- resDigits[i] = negative.digits[i];
- }
- // if the negative has no more elements, must fill the
- // result with the remaining digits of the positive
- if (i == negative.numberLength) {
- for (; i < positive.numberLength; i++) {
- // resDigits[i] = ~(positive.digits[i] ^ -1) -> ~(~positive.digits[i])
- resDigits[i] = positive.digits[i];
- }
- }
- } else if (iPos < iNeg) {
- resDigits = new int[resLength];
- i = iPos;
- // Applying two complement to the first non-zero digit of the result
- resDigits[i] = -positive.digits[i];
- limit = Math.min(positive.numberLength, iNeg);
- for (i++; i < limit; i++) {
- // Continue applying two complement the result
- resDigits[i] = ~positive.digits[i];
- }
- // When the first non-zero digit of the negative is reached, must apply
- // two complement (arithmetic negation) to it, and then operate
- if (i == iNeg) {
- resDigits[i] = ~(positive.digits[i] ^ -negative.digits[i]);
- i++;
- } else {
- // if the positive has no more elements must fill the remaining digits
- // with
- // the negative ones
- for (; i < iNeg; i++) {
- // resDigits[i] = ~(0 ^ 0)
- resDigits[i] = -1;
- }
- for (; i < negative.numberLength; i++) {
- // resDigits[i] = ~(~negative.digits[i] ^ 0)
- resDigits[i] = negative.digits[i];
- }
- }
- } else {
- int digit;
- // The first non-zero digit of the positive and negative are the same
- i = iNeg;
- digit = positive.digits[i] ^ -negative.digits[i];
- if (digit == 0) {
- limit = Math.min(positive.numberLength, negative.numberLength);
- for (i++; i < limit
- && (digit = positive.digits[i] ^ ~negative.digits[i]) == 0; i++) {
- // empty
- }
- if (digit == 0) {
- // shorter has only the remaining virtual sign bits
- for (; i < positive.numberLength
- && (digit = ~positive.digits[i]) == 0; i++) {
- // empty
- }
- for (; i < negative.numberLength
- && (digit = ~negative.digits[i]) == 0; i++) {
- // empty
- }
- if (digit == 0) {
- resLength = resLength + 1;
- resDigits = new int[resLength];
- resDigits[resLength - 1] = 1;
-
- BigInteger result = new BigInteger(-1, resLength, resDigits);
- return result;
- }
- }
- }
- resDigits = new int[resLength];
- resDigits[i] = -digit;
- i++;
- }
-
- limit = Math.min(negative.numberLength, positive.numberLength);
- for (; i < limit; i++) {
- resDigits[i] = ~(~negative.digits[i] ^ positive.digits[i]);
- }
- for (; i < positive.numberLength; i++) {
- // resDigits[i] = ~(positive.digits[i] ^ -1)
- resDigits[i] = positive.digits[i];
- }
- for (; i < negative.numberLength; i++) {
- // resDigits[i] = ~(0 ^ ~negative.digits[i])
- resDigits[i] = negative.digits[i];
- }
-
- BigInteger result = new BigInteger(-1, resLength, resDigits);
- result.cutOffLeadingZeroes();
- return result;
- }
-
- /**
- * Return sign = 0, magnitude = -val.magnitude ^ -that.magnitude.
- * @param val
- * @param that
- * @return
- */
- static BigInteger xorNegative(BigInteger val, BigInteger that) {
- // PRE: val and that are negative
- // PRE: val has at least as many trailing zero digits as that
- int resLength = Math.max(val.numberLength, that.numberLength);
- int resDigits[] = new int[resLength];
- int iVal = val.getFirstNonzeroDigit();
- int iThat = that.getFirstNonzeroDigit();
- int i = iThat;
- int limit;
-
- if (iVal == iThat) {
- resDigits[i] = -val.digits[i] ^ -that.digits[i];
- } else {
- resDigits[i] = -that.digits[i];
- limit = Math.min(that.numberLength, iVal);
- for (i++; i < limit; i++) {
- resDigits[i] = ~that.digits[i];
- }
- // Remains digits in that?
- if (i == that.numberLength) {
- // Jumping over the remaining zero to the first non one
- for (; i < iVal; i++) {
- // resDigits[i] = 0 ^ -1;
- resDigits[i] = -1;
- }
- // resDigits[i] = -val.digits[i] ^ -1;
- resDigits[i] = val.digits[i] - 1;
- } else {
- resDigits[i] = -val.digits[i] ^ ~that.digits[i];
- }
- }
-
- limit = Math.min(val.numberLength, that.numberLength);
- // Perform ^ between that al val until that ends
- for (i++; i < limit; i++) {
- // resDigits[i] = ~val.digits[i] ^ ~that.digits[i];
- resDigits[i] = val.digits[i] ^ that.digits[i];
- }
- // Perform ^ between val digits and -1 until val ends
- for (; i < val.numberLength; i++) {
- // resDigits[i] = ~val.digits[i] ^ -1 ;
- resDigits[i] = val.digits[i];
- }
- for (; i < that.numberLength; i++) {
- // resDigits[i] = -1 ^ ~that.digits[i] ;
- resDigits[i] = that.digits[i];
- }
-
- BigInteger result = new BigInteger(1, resLength, resDigits);
- result.cutOffLeadingZeroes();
- return result;
- }
-
- /**
- * Return sign = 0, magnitude = longer.magnitude | shorter.magnitude.
- *
- * @param longer
- * @param shorter
- * @return
- */
- static BigInteger xorPositive(BigInteger longer, BigInteger shorter) {
- // PRE: longer and shorter are positive;
- // PRE: longer has at least as many digits as shorter
- int resLength = longer.numberLength;
- int resDigits[] = new int[resLength];
- int i = Math.min(longer.getFirstNonzeroDigit(),
- shorter.getFirstNonzeroDigit());
- for (; i < shorter.numberLength; i++) {
- resDigits[i] = longer.digits[i] ^ shorter.digits[i];
- }
- for (; i < longer.numberLength; i++) {
- resDigits[i] = longer.digits[i];
- }
-
- BigInteger result = new BigInteger(1, resLength, resDigits);
- result.cutOffLeadingZeroes();
- return result;
- }
-
- /**
- * Just to denote that this class can't be instantiated.
- */
- private Logical() {
- }
-}
diff --git a/user/super/com/google/gwt/emul/java/math/MathContext.java b/user/super/com/google/gwt/emul/java/math/MathContext.java
deleted file mode 100644
index ecde7c2..0000000
--- a/user/super/com/google/gwt/emul/java/math/MathContext.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY RICHARD ZSCHECH AS WELL AS GOOGLE.
- */
-package java.math;
-
-import java.io.Serializable;
-
-/**
- * Immutable objects describing settings such as rounding mode and digit
- * precision for the numerical operations provided by class {@link BigDecimal}.
- */
-public final class MathContext implements Serializable {
-
- /**
- * A {@code MathContext} which corresponds to the IEEE 754r quadruple decimal
- * precision format: 34 digit precision and {@link RoundingMode#HALF_EVEN}
- * rounding.
- */
- public static final MathContext DECIMAL128 = new MathContext(34,
- RoundingMode.HALF_EVEN);
-
- /**
- * A {@code MathContext} which corresponds to the IEEE 754r single decimal
- * precision format: 7 digit precision and {@link RoundingMode#HALF_EVEN}
- * rounding.
- */
- public static final MathContext DECIMAL32 = new MathContext(7,
- RoundingMode.HALF_EVEN);
-
- /**
- * A {@code MathContext} which corresponds to the IEEE 754r double decimal
- * precision format: 16 digit precision and {@link RoundingMode#HALF_EVEN}
- * rounding.
- */
- public static final MathContext DECIMAL64 = new MathContext(16,
- RoundingMode.HALF_EVEN);
-
- /**
- * A {@code MathContext} for unlimited precision with
- * {@link RoundingMode#HALF_UP} rounding.
- */
- public static final MathContext UNLIMITED = new MathContext(0,
- RoundingMode.HALF_UP);
-
- /**
- * An array of {@code char} containing: {@code
- * 'p','r','e','c','i','s','i','o','n','='}. It's used to improve the methods
- * related to {@code String} conversion.
- *
- * @see #MathContext(String)
- * @see #toString()
- */
- private static final char[] chPrecision = {
- 'p', 'r', 'e', 'c', 'i', 's', 'i', 'o', 'n', '='};
-
- /**
- * An array of {@code char} containing: {@code
- * 'r','o','u','n','d','i','n','g','M','o','d','e','='}. It's used to improve
- * the methods related to {@code String} conversion.
- *
- * @see #MathContext(String)
- * @see #toString()
- */
- private static final char[] chRoundingMode = {
- 'r', 'o', 'u', 'n', 'd', 'i', 'n', 'g', 'M', 'o', 'd', 'e', '='};
-
- /**
- * This is the serialVersionUID used by the sun implementation.
- */
- private static final long serialVersionUID = 5579720004786848255L;
-
- /**
- * The number of digits to be used for an operation; results are rounded to
- * this precision.
- */
- private int precision;
-
- /**
- * A {@code RoundingMode} object which specifies the algorithm to be used for
- * rounding.
- */
- private RoundingMode roundingMode;
-
- /**
- * Constructs a new {@code MathContext} with the specified precision and with
- * the rounding mode {@link RoundingMode#HALF_UP HALF_UP}. If the precision
- * passed is zero, then this implies that the computations have to be
- * performed exact, the rounding mode in this case is irrelevant.
- *
- * @param precision the precision for the new {@code MathContext}.
- * @throws IllegalArgumentException if {@code precision < 0}.
- */
- public MathContext(int precision) {
- this(precision, RoundingMode.HALF_UP);
- }
-
- /**
- * Constructs a new {@code MathContext} with the specified precision and with
- * the specified rounding mode. If the precision passed is zero, then this
- * implies that the computations have to be performed exact, the rounding mode
- * in this case is irrelevant.
- *
- * @param precision the precision for the new {@code MathContext}.
- * @param roundingMode the rounding mode for the new {@code MathContext}.
- * @throws IllegalArgumentException if {@code precision < 0}.
- * @throws NullPointerException if {@code roundingMode} is {@code null}.
- */
- public MathContext(int precision, RoundingMode roundingMode) {
- if (precision < 0) {
- // math.0C=Digits < 0
- throw new IllegalArgumentException("Digits < 0"); //$NON-NLS-1$
- }
- if (roundingMode == null) {
- // math.0D=null RoundingMode
- throw new NullPointerException("null RoundingMode"); //$NON-NLS-1$
- }
- this.precision = precision;
- this.roundingMode = roundingMode;
- }
-
- /**
- * Constructs a new {@code MathContext} from a string. The string has to
- * specify the precision and the rounding mode to be used and has to follow
- * the following syntax:
- * "precision=<precision> roundingMode=<roundingMode>" This is the
- * same form as the one returned by the {@link #toString} method.
- *
- * @param val a string describing the precision and rounding mode for the new
- * {@code MathContext}.
- * @throws IllegalArgumentException if the string is not in the correct format
- * or if the precision specified is < 0.
- */
- public MathContext(String val) {
- char[] charVal = val.toCharArray();
- int i; // Index of charVal
- int j; // Index of chRoundingMode
- int digit; // It will contain the digit parsed
-
- if ((charVal.length < 27) || (charVal.length > 45)) {
- // math.0E=bad string format
- throw new IllegalArgumentException("bad string format"); //$NON-NLS-1$
- }
- // Parsing "precision=" String
- for (i = 0; (i < chPrecision.length) && (charVal[i] == chPrecision[i]); i++) {
- // empty
- }
-
- if (i < chPrecision.length) {
- // math.0E=bad string format
- throw new IllegalArgumentException("bad string format"); //$NON-NLS-1$
- }
- // Parsing the value for "precision="...
- digit = Character.digit(charVal[i], 10);
- if (digit == -1) {
- // math.0E=bad string format
- throw new IllegalArgumentException("bad string format"); //$NON-NLS-1$
- }
- this.precision = this.precision * 10 + digit;
- i++;
-
- do {
- digit = Character.digit(charVal[i], 10);
- if (digit == -1) {
- if (charVal[i] == ' ') {
- // It parsed all the digits
- i++;
- break;
- }
- // It isn't a valid digit, and isn't a white space
- // math.0E=bad string format
- throw new IllegalArgumentException("bad string format"); //$NON-NLS-1$
- }
- // Accumulating the value parsed
- this.precision = this.precision * 10 + digit;
- if (this.precision < 0) {
- // math.0E=bad string format
- throw new IllegalArgumentException("bad string format"); //$NON-NLS-1$
- }
- i++;
- } while (true);
- // Parsing "roundingMode="
- for (j = 0; (j < chRoundingMode.length)
- && (charVal[i] == chRoundingMode[j]); i++, j++) {
- // empty
- }
-
- if (j < chRoundingMode.length) {
- // math.0E=bad string format
- throw new IllegalArgumentException("bad string format"); //$NON-NLS-1$
- }
- // Parsing the value for "roundingMode"...
- this.roundingMode = RoundingMode.valueOf(String.valueOf(charVal, i,
- charVal.length - i));
- }
-
- /* Public Methods */
-
- /**
- * Returns true if x is a {@code MathContext} with the same precision setting
- * and the same rounding mode as this {@code MathContext} instance.
- *
- * @param x object to be compared.
- * @return {@code true} if this {@code MathContext} instance is equal to the
- * {@code x} argument; {@code false} otherwise.
- */
- @Override
- public boolean equals(Object x) {
- return ((x instanceof MathContext)
- && (((MathContext) x).getPrecision() == precision) && (((MathContext) x).getRoundingMode() == roundingMode));
- }
-
- /**
- * Returns the precision. The precision is the number of digits used for an
- * operation. Results are rounded to this precision. The precision is
- * guaranteed to be non negative. If the precision is zero, then the
- * computations have to be performed exact, results are not rounded in this
- * case.
- *
- * @return the precision.
- */
- public int getPrecision() {
- return precision;
- }
-
- /**
- * Returns the rounding mode. The rounding mode is the strategy to be used to
- * round results.
- * <p>
- * The rounding mode is one of {@link RoundingMode#UP},
- * {@link RoundingMode#DOWN}, {@link RoundingMode#CEILING},
- * {@link RoundingMode#FLOOR}, {@link RoundingMode#HALF_UP},
- * {@link RoundingMode#HALF_DOWN}, {@link RoundingMode#HALF_EVEN}, or
- * {@link RoundingMode#UNNECESSARY}.
- *
- * @return the rounding mode.
- */
- public RoundingMode getRoundingMode() {
- return roundingMode;
- }
-
- /**
- * Returns the hash code for this {@code MathContext} instance.
- *
- * @return the hash code for this {@code MathContext}.
- */
- @Override
- public int hashCode() {
- // Make place for the necessary bits to represent 8 rounding modes
- return ((precision << 3) | roundingMode.ordinal());
- }
-
- /**
- * Returns the string representation for this {@code MathContext} instance.
- * The string has the form {@code
- * "precision=<precision> roundingMode=<roundingMode>" * } where
- * {@code <precision>} is an integer describing the number of digits
- * used for operations and {@code <roundingMode>} is the string
- * representation of the rounding mode.
- *
- * @return a string representation for this {@code MathContext} instance
- */
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder(45);
-
- sb.append(chPrecision);
- sb.append(precision);
- sb.append(' ');
- sb.append(chRoundingMode);
- sb.append(roundingMode);
- return sb.toString();
- }
-}
diff --git a/user/super/com/google/gwt/emul/java/math/Multiplication.java b/user/super/com/google/gwt/emul/java/math/Multiplication.java
deleted file mode 100644
index 22fdf49..0000000
--- a/user/super/com/google/gwt/emul/java/math/Multiplication.java
+++ /dev/null
@@ -1,534 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY RICHARD ZSCHECH AS WELL AS GOOGLE.
- */
-package java.math;
-
-/**
- * Static library that provides all multiplication of {@link BigInteger}
- * methods.
- */
-class Multiplication {
-
- /**
- * An array with the first powers of five in {@code BigInteger} version. (
- * {@code 5^0,5^1,...,5^31})
- */
- static final BigInteger bigFivePows[] = new BigInteger[32];
-
- /**
- * An array with the first powers of ten in {@code BigInteger} version. (
- * {@code 10^0,10^1,...,10^31})
- */
- static final BigInteger[] bigTenPows = new BigInteger[32];
-
- /**
- * An array with powers of five that fit in the type {@code int}. ({@code
- * 5^0,5^1,...,5^13})
- */
- static final int fivePows[] = {
- 1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625,
- 48828125, 244140625, 1220703125};
-
- /**
- * An array with powers of ten that fit in the type {@code int}. ({@code
- * 10^0,10^1,...,10^9})
- */
- static final int tenPows[] = {
- 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
-
- /**
- * Break point in digits (number of {@code int} elements) between Karatsuba
- * and Pencil and Paper multiply.
- */
- static final int whenUseKaratsuba = 63; // an heuristic value
-
- static {
- int i;
- long fivePow = 1L;
-
- for (i = 0; i <= 18; i++) {
- bigFivePows[i] = BigInteger.valueOf(fivePow);
- bigTenPows[i] = BigInteger.valueOf(fivePow << i);
- fivePow *= 5;
- }
- for (; i < bigTenPows.length; i++) {
- bigFivePows[i] = bigFivePows[i - 1].multiply(bigFivePows[1]);
- bigTenPows[i] = bigTenPows[i - 1].multiply(BigInteger.TEN);
- }
- }
-
- /**
- * Performs the multiplication with the Karatsuba's algorithm. <b>Karatsuba's
- * algorithm:</b> <tt>
- * u = u<sub>1</sub> * B + u<sub>0</sub><br>
- * v = v<sub>1</sub> * B + v<sub>0</sub><br>
- *
- *
- * u*v = (u<sub>1</sub> * v<sub>1</sub>) * B<sub>2</sub> + ((u<sub>1</sub> - u<sub>0</sub>) * (v<sub>0</sub> - v<sub>1</sub>) + u<sub>1</sub> * v<sub>1</sub> +
- * u<sub>0</sub> * v<sub>0</sub> ) * B + u<sub>0</sub> * v<sub>0</sub><br>
- *</tt>
- *
- * @param op1 first factor of the product
- * @param op2 second factor of the product
- * @return {@code op1 * op2}
- * @see #multiply(BigInteger, BigInteger)
- */
- static BigInteger karatsuba(BigInteger op1, BigInteger op2) {
- BigInteger temp;
- if (op2.numberLength > op1.numberLength) {
- temp = op1;
- op1 = op2;
- op2 = temp;
- }
- if (op2.numberLength < whenUseKaratsuba) {
- return multiplyPAP(op1, op2);
- }
- /*
- * Karatsuba: u = u1*B + u0 v = v1*B + v0 u*v = (u1*v1)*B^2 +
- * ((u1-u0)*(v0-v1) + u1*v1 + u0*v0)*B + u0*v0
- */
- // ndiv2 = (op1.numberLength / 2) * 32
- int ndiv2 = (op1.numberLength & 0xFFFFFFFE) << 4;
- BigInteger upperOp1 = op1.shiftRight(ndiv2);
- BigInteger upperOp2 = op2.shiftRight(ndiv2);
- BigInteger lowerOp1 = op1.subtract(upperOp1.shiftLeft(ndiv2));
- BigInteger lowerOp2 = op2.subtract(upperOp2.shiftLeft(ndiv2));
-
- BigInteger upper = karatsuba(upperOp1, upperOp2);
- BigInteger lower = karatsuba(lowerOp1, lowerOp2);
- BigInteger middle = karatsuba(upperOp1.subtract(lowerOp1),
- lowerOp2.subtract(upperOp2));
- middle = middle.add(upper).add(lower);
- middle = middle.shiftLeft(ndiv2);
- upper = upper.shiftLeft(ndiv2 << 1);
-
- return upper.add(middle).add(lower);
- }
-
- static void multArraysPAP(int[] aDigits, int aLen, int[] bDigits, int bLen,
- int[] resDigits) {
- if (aLen == 0 || bLen == 0) {
- return;
- }
-
- if (aLen == 1) {
- resDigits[bLen] = multiplyByInt(resDigits, bDigits, bLen, aDigits[0]);
- } else if (bLen == 1) {
- resDigits[aLen] = multiplyByInt(resDigits, aDigits, aLen, bDigits[0]);
- } else {
- multPAP(aDigits, bDigits, resDigits, aLen, bLen);
- }
- }
-
- /**
- * Performs a multiplication of two BigInteger and hides the algorithm used.
- *
- * @see BigInteger#multiply(BigInteger)
- */
- static BigInteger multiply(BigInteger x, BigInteger y) {
- return karatsuba(x, y);
- }
-
- /**
- * Multiplies a number by a power of five. This method is used in {@code
- * BigDecimal} class.
- *
- * @param val the number to be multiplied
- * @param exp a positive {@code int} exponent
- * @return {@code val * 5<sup>exp</sup>}
- */
- static BigInteger multiplyByFivePow(BigInteger val, int exp) {
- // PRE: exp >= 0
- if (exp < fivePows.length) {
- return multiplyByPositiveInt(val, fivePows[exp]);
- } else if (exp < bigFivePows.length) {
- return val.multiply(bigFivePows[exp]);
- } else {
- // Large powers of five
- return val.multiply(bigFivePows[1].pow(exp));
- }
- }
-
- /**
- * Multiplies an array of integers by an integer value.
- *
- * @param a the array of integers
- * @param aSize the number of elements of intArray to be multiplied
- * @param factor the multiplier
- * @return the top digit of production
- */
- static int multiplyByInt(int a[], final int aSize, final int factor) {
- return multiplyByInt(a, a, aSize, factor);
- }
-
- /**
- * Multiplies a number by a positive integer.
- *
- * @param val an arbitrary {@code BigInteger}
- * @param factor a positive {@code int} number
- * @return {@code val * factor}
- */
- static BigInteger multiplyByPositiveInt(BigInteger val, int factor) {
- int resSign = val.sign;
- if (resSign == 0) {
- return BigInteger.ZERO;
- }
- int aNumberLength = val.numberLength;
- int[] aDigits = val.digits;
-
- if (aNumberLength == 1) {
- long res = unsignedMultAddAdd(aDigits[0], factor, 0, 0);
- int resLo = (int) res;
- int resHi = (int) (res >>> 32);
- return ((resHi == 0) ? new BigInteger(resSign, resLo) : new BigInteger(
- resSign, 2, new int[] {resLo, resHi}));
- }
- // Common case
- int resLength = aNumberLength + 1;
- int resDigits[] = new int[resLength];
-
- resDigits[aNumberLength] = multiplyByInt(resDigits, aDigits, aNumberLength,
- factor);
- BigInteger result = new BigInteger(resSign, resLength, resDigits);
- result.cutOffLeadingZeroes();
- return result;
- }
-
- /**
- * Multiplies a number by a power of ten. This method is used in {@code
- * BigDecimal} class.
- *
- * @param val the number to be multiplied
- * @param exp a positive {@code long} exponent
- * @return {@code val * 10<sup>exp</sup>}
- */
- static BigInteger multiplyByTenPow(BigInteger val, int exp) {
- // PRE: exp >= 0
- return ((exp < tenPows.length) ? multiplyByPositiveInt(val,
- tenPows[(int) exp]) : val.multiply(powerOf10(exp)));
- }
-
- /**
- * Multiplies two BigIntegers. Implements traditional scholar algorithm
- * described by Knuth.
- *
- * <br>
- * <tt>
- * <table border="0">
- * <tbody>
- *
- *
- * <tr>
- * <td align="center">A=</td>
- * <td>a<sub>3</sub></td>
- * <td>a<sub>2</sub></td>
- * <td>a<sub>1</sub></td>
- * <td>a<sub>0</sub></td>
- * <td></td>
- * <td></td>
- * </tr>
- *
- * <tr>
- * <td align="center">B=</td>
- * <td></td>
- * <td>b<sub>2</sub></td>
- * <td>b<sub>1</sub></td>
- * <td>b<sub>1</sub></td>
- * <td></td>
- * <td></td>
- * </tr>
- *
- * <tr>
- * <td></td>
- * <td></td>
- * <td></td>
- * <td>b<sub>0</sub>*a<sub>3</sub></td>
- * <td>b<sub>0</sub>*a<sub>2</sub></td>
- * <td>b<sub>0</sub>*a<sub>1</sub></td>
- * <td>b<sub>0</sub>*a<sub>0</sub></td>
- * </tr>
- *
- * <tr>
- * <td></td>
- * <td></td>
- * <td>b<sub>1</sub>*a<sub>3</sub></td>
- * <td>b<sub>1</sub>*a<sub>2</sub></td>
- * <td>b<sub>1</sub>*a1</td>
- * <td>b<sub>1</sub>*a0</td>
- * </tr>
- *
- * <tr>
- * <td>+</td>
- * <td>b<sub>2</sub>*a<sub>3</sub></td>
- * <td>b<sub>2</sub>*a<sub>2</sub></td>
- * <td>b<sub>2</sub>*a<sub>1</sub></td>
- * <td>b<sub>2</sub>*a<sub>0</sub></td>
- * </tr>
- *
- * <tr>
- * <td></td>
- * <td>______</td>
- * <td>______</td>
- * <td>______</td>
- * <td>______</td>
- * <td>______</td>
- * <td>______</td>
- * </tr>
- *
- * <tr>
- *
- * <td align="center">A*B=R=</td>
- * <td align="center">r<sub>5</sub></td>
- * <td align="center">r<sub>4</sub></td>
- * <td align="center">r<sub>3</sub></td>
- * <td align="center">r<sub>2</sub></td>
- * <td align="center">r<sub>1</sub></td>
- * <td align="center">r<sub>0</sub></td>
- * <td></td>
- * </tr>
- *
- * </tbody>
- * </table>
- *
- *</tt>
- *
- * @param op1 first factor of the multiplication {@code op1 >= 0}
- * @param op2 second factor of the multiplication {@code op2 >= 0}
- * @return a {@code BigInteger} of value {@code op1 * op2}
- */
- static BigInteger multiplyPAP(BigInteger a, BigInteger b) {
- // PRE: a >= b
- int aLen = a.numberLength;
- int bLen = b.numberLength;
- int resLength = aLen + bLen;
- int resSign = (a.sign != b.sign) ? -1 : 1;
- // A special case when both numbers don't exceed int
- if (resLength == 2) {
- long val = unsignedMultAddAdd(a.digits[0], b.digits[0], 0, 0);
- int valueLo = (int) val;
- int valueHi = (int) (val >>> 32);
- return ((valueHi == 0) ? new BigInteger(resSign, valueLo)
- : new BigInteger(resSign, 2, new int[] {valueLo, valueHi}));
- }
- int[] aDigits = a.digits;
- int[] bDigits = b.digits;
- int resDigits[] = new int[resLength];
- // Common case
- multArraysPAP(aDigits, aLen, bDigits, bLen, resDigits);
- BigInteger result = new BigInteger(resSign, resLength, resDigits);
- result.cutOffLeadingZeroes();
- return result;
- }
-
- static void multPAP(int a[], int b[], int t[], int aLen, int bLen) {
- if (a == b && aLen == bLen) {
- square(a, aLen, t);
- return;
- }
-
- for (int i = 0; i < aLen; i++) {
- long carry = 0;
- int aI = a[i];
- for (int j = 0; j < bLen; j++) {
- carry = unsignedMultAddAdd(aI, b[j], t[i + j], (int) carry);
- t[i + j] = (int) carry;
- carry >>>= 32;
- }
- t[i + bLen] = (int) carry;
- }
- }
-
- static BigInteger pow(BigInteger base, int exponent) {
- // PRE: exp > 0
- BigInteger res = BigInteger.ONE;
- BigInteger acc = base;
-
- for (; exponent > 1; exponent >>= 1) {
- if ((exponent & 1) != 0) {
- // if odd, multiply one more time by acc
- res = res.multiply(acc);
- }
- // acc = base^(2^i)
- // a limit where karatsuba performs a faster square than the square
- // algorithm
- if (acc.numberLength == 1) {
- acc = acc.multiply(acc); // square
- } else {
- acc = new BigInteger(1, square(acc.digits, acc.numberLength,
- new int[acc.numberLength << 1]));
- }
- }
- // exponent == 1, multiply one more time
- res = res.multiply(acc);
- return res;
- }
-
- /**
- * It calculates a power of ten, which exponent could be out of 32-bit range.
- * Note that internally this method will be used in the worst case with an
- * exponent equals to: {@code Integer.MAX_VALUE - Integer.MIN_VALUE}.
- *
- * @param exp the exponent of power of ten, it must be positive.
- * @return a {@code BigInteger} with value {@code 10<sup>exp</sup>}.
- */
- static BigInteger powerOf10(double exp) {
- // PRE: exp >= 0
- int intExp = (int) exp;
- // "SMALL POWERS"
- if (exp < bigTenPows.length) {
- // The largest power that fit in 'long' type
- return bigTenPows[intExp];
- } else if (exp <= 50) {
- // To calculate: 10^exp
- return BigInteger.TEN.pow(intExp);
- } else if (exp <= 1000) {
- // To calculate: 5^exp * 2^exp
- return bigFivePows[1].pow(intExp).shiftLeft(intExp);
- }
- // "LARGE POWERS"
- /*
- * To check if there is free memory to allocate a BigInteger of the
- * estimated size, measured in bytes: 1 + [exp / log10(2)]
- */
- if (exp > 1000000) {
- throw new ArithmeticException("power of ten too big"); //$NON-NLS-1$
- }
-
- if (exp <= Integer.MAX_VALUE) {
- // To calculate: 5^exp * 2^exp
- return bigFivePows[1].pow(intExp).shiftLeft(intExp);
- }
- /*
- * "HUGE POWERS"
- *
- * This branch probably won't be executed since the power of ten is too big.
- */
- // To calculate: 5^exp
- BigInteger powerOfFive = bigFivePows[1].pow(Integer.MAX_VALUE);
- BigInteger res = powerOfFive;
- long longExp = (long) (exp - Integer.MAX_VALUE);
-
- intExp = (int) (exp % Integer.MAX_VALUE);
- while (longExp > Integer.MAX_VALUE) {
- res = res.multiply(powerOfFive);
- longExp -= Integer.MAX_VALUE;
- }
- res = res.multiply(bigFivePows[1].pow(intExp));
- // To calculate: 5^exp << exp
- res = res.shiftLeft(Integer.MAX_VALUE);
- longExp = (long) (exp - Integer.MAX_VALUE);
- while (longExp > Integer.MAX_VALUE) {
- res = res.shiftLeft(Integer.MAX_VALUE);
- longExp -= Integer.MAX_VALUE;
- }
- res = res.shiftLeft(intExp);
- return res;
- }
-
- /**
- * Performs a<sup>2</sup>.
- *
- * @param a The number to square.
- * @param aLen The length of the number to square.
- */
- static int[] square(int[] a, int aLen, int[] res) {
- long carry;
-
- for (int i = 0; i < aLen; i++) {
- carry = 0;
- for (int j = i + 1; j < aLen; j++) {
- carry = unsignedMultAddAdd(a[i], a[j], res[i + j], (int) carry);
- res[i + j] = (int) carry;
- carry >>>= 32;
- }
- res[i + aLen] = (int) carry;
- }
-
- BitLevel.shiftLeftOneBit(res, res, aLen << 1);
-
- carry = 0;
- for (int i = 0, index = 0; i < aLen; i++, index++) {
- carry = unsignedMultAddAdd(a[i], a[i], res[index], (int) carry);
- res[index] = (int) carry;
- carry >>>= 32;
- index++;
- carry += res[index] & 0xFFFFFFFFL;
- res[index] = (int) carry;
- carry >>>= 32;
- }
- return res;
- }
-
- /**
- * Computes the value unsigned ((uint)a*(uint)b + (uint)c + (uint)d). This
- * method could improve the readability and performance of the code.
- *
- * @param a parameter 1
- * @param b parameter 2
- * @param c parameter 3
- * @param d parameter 4
- * @return value of expression
- */
- static long unsignedMultAddAdd(int a, int b, int c, int d) {
- return (a & 0xFFFFFFFFL) * (b & 0xFFFFFFFFL) + (c & 0xFFFFFFFFL)
- + (d & 0xFFFFFFFFL);
- }
-
- /**
- * Multiplies an array of integers by an integer value and saves the result in
- * {@code res}.
- *
- * @param a the array of integers
- * @param aSize the number of elements of intArray to be multiplied
- * @param factor the multiplier
- * @return the top digit of production
- */
- private static int multiplyByInt(int res[], int a[], final int aSize,
- final int factor) {
- long carry = 0;
- for (int i = 0; i < aSize; i++) {
- carry = unsignedMultAddAdd(a[i], factor, (int) carry, 0);
- res[i] = (int) carry;
- carry >>>= 32;
- }
- return (int) carry;
- }
-
- /**
- * Just to denote that this class can't be instantiated.
- */
- private Multiplication() {
- }
-
-}
diff --git a/user/super/com/google/gwt/emul/java/math/Primality.java b/user/super/com/google/gwt/emul/java/math/Primality.java
deleted file mode 100644
index 016d99c..0000000
--- a/user/super/com/google/gwt/emul/java/math/Primality.java
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY RICHARD ZSCHECH AS WELL AS GOOGLE.
- */
-package java.math;
-
-import java.util.Arrays;
-import java.util.Random;
-
-/**
- * Provides primality probabilistic methods.
- */
-class Primality {
-
- /**
- * It encodes how many iterations of Miller-Rabin test are need to get an
- * error bound not greater than {@code 2<sup>(-100)</sup>}. For example: for a
- * {@code 1000}-bit number we need {@code 4} iterations, since {@code BITS[3]
- * < 1000 <= BITS[4]}.
- */
- private static final int[] BITS = {
- 0, 0, 1854, 1233, 927, 747, 627, 543, 480, 431, 393, 361, 335, 314, 295,
- 279, 265, 253, 242, 232, 223, 216, 181, 169, 158, 150, 145, 140, 136,
- 132, 127, 123, 119, 114, 110, 105, 101, 96, 92, 87, 83, 78, 73, 69, 64,
- 59, 54, 49, 44, 38, 32, 26, 1};
-
- /**
- * It encodes how many i-bit primes there are in the table for {@code
- * i=2,...,10}. For example {@code offsetPrimes[6]} says that from index
- * {@code 11} exists {@code 7} consecutive {@code 6}-bit prime numbers in the
- * array.
- */
- private static final int[][] offsetPrimes = {
- null, null, {0, 2}, {2, 2}, {4, 2}, {6, 5}, {11, 7}, {18, 13}, {31, 23},
- {54, 43}, {97, 75}};
-
- /**
- * All prime numbers with bit length lesser than 10 bits.
- */
- private static final int primes[] = {
- 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67,
- 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149,
- 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227,
- 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307,
- 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389,
- 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467,
- 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571,
- 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653,
- 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751,
- 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853,
- 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947,
- 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021};
-
- /**
- * All {@code BigInteger} prime numbers with bit length lesser than 8 bits.
- */
- private static final BigInteger BIprimes[] = new BigInteger[primes.length];
-
- static {
- // To initialize the dual table of BigInteger primes
- for (int i = 0; i < primes.length; i++) {
- BIprimes[i] = BigInteger.valueOf(primes[i]);
- }
- }
-
- /**
- * A random number is generated until a probable prime number is found.
- *
- * @see BigInteger#BigInteger(int,int,Random)
- * @see BigInteger#probablePrime(int,Random)
- * @see #isProbablePrime(BigInteger, int)
- */
- static BigInteger consBigInteger(int bitLength, int certainty, Random rnd) {
- // PRE: bitLength >= 2;
- // For small numbers get a random prime from the prime table
- if (bitLength <= 10) {
- int rp[] = offsetPrimes[bitLength];
- return BIprimes[rp[0] + rnd.nextInt(rp[1])];
- }
- int shiftCount = (-bitLength) & 31;
- int last = (bitLength + 31) >> 5;
- BigInteger n = new BigInteger(1, last, new int[last]);
-
- last--;
- do {
- // To fill the array with random integers
- for (int i = 0; i < n.numberLength; i++) {
- n.digits[i] = rnd.nextInt();
- }
- // To fix to the correct bitLength
- n.digits[last] |= 0x80000000;
- n.digits[last] >>>= shiftCount;
- // To create an odd number
- n.digits[0] |= 1;
- } while (!isProbablePrime(n, certainty));
- return n;
- }
-
- /**
- * @see BigInteger#isProbablePrime(int)
- * @see #millerRabin(BigInteger, int)
- * @ar.org.fitc.ref Optimizations: "A. Menezes - Handbook of applied
- * Cryptography, Chapter 4".
- */
- static boolean isProbablePrime(BigInteger n, int certainty) {
- // PRE: n >= 0;
- if ((certainty <= 0) || ((n.numberLength == 1) && (n.digits[0] == 2))) {
- return true;
- }
- // To discard all even numbers
- if (!n.testBit(0)) {
- return false;
- }
- // To check if 'n' exists in the table (it fit in 10 bits)
- if ((n.numberLength == 1) && ((n.digits[0] & 0XFFFFFC00) == 0)) {
- return (Arrays.binarySearch(primes, n.digits[0]) >= 0);
- }
- // To check if 'n' is divisible by some prime of the table
- for (int i = 1; i < primes.length; i++) {
- if (Division.remainderArrayByInt(n.digits, n.numberLength, primes[i]) == 0) {
- return false;
- }
- }
- // To set the number of iterations necessary for Miller-Rabin test
- int i;
- int bitLength = n.bitLength();
-
- for (i = 2; bitLength < BITS[i]; i++) {
- // empty
- }
- certainty = Math.min(i, 1 + ((certainty - 1) >> 1));
-
- return millerRabin(n, certainty);
- }
-
- /**
- * It uses the sieve of Eratosthenes to discard several composite numbers in
- * some appropriate range (at the moment {@code [this, this + 1024]}). After
- * this process it applies the Miller-Rabin test to the numbers that were not
- * discarded in the sieve.
- *
- * @see BigInteger#nextProbablePrime()
- * @see #millerRabin(BigInteger, int)
- */
- static BigInteger nextProbablePrime(BigInteger n) {
- // PRE: n >= 0
- int i, j;
- int certainty;
- int gapSize = 1024; // for searching of the next probable prime number
- int modules[] = new int[primes.length];
- boolean isDivisible[] = new boolean[gapSize];
- BigInteger startPoint;
- BigInteger probPrime;
- // If n < "last prime of table" searches next prime in the table
- if ((n.numberLength == 1) && (n.digits[0] >= 0)
- && (n.digits[0] < primes[primes.length - 1])) {
- for (i = 0; n.digits[0] >= primes[i]; i++) {
- // empty
- }
- return BIprimes[i];
- }
- /*
- * Creates a "N" enough big to hold the next probable prime Note that: N <
- * "next prime" < 2*N
- */
- startPoint = new BigInteger(1, n.numberLength, new int[n.numberLength + 1]);
- System.arraycopy(n.digits, 0, startPoint.digits, 0, n.numberLength);
- // To fix N to the "next odd number"
- if (n.testBit(0)) {
- Elementary.inplaceAdd(startPoint, 2);
- } else {
- startPoint.digits[0] |= 1;
- }
- // To set the improved certainly of Miller-Rabin
- j = startPoint.bitLength();
- for (certainty = 2; j < BITS[certainty]; certainty++) {
- // empty
- }
- // To calculate modules: N mod p1, N mod p2, ... for first primes.
- for (i = 0; i < primes.length; i++) {
- modules[i] = Division.remainder(startPoint, primes[i]) - gapSize;
- }
- while (true) {
- // At this point, all numbers in the gap are initialized as
- // probably primes
- Arrays.fill(isDivisible, false);
- // To discard multiples of first primes
- for (i = 0; i < primes.length; i++) {
- modules[i] = (modules[i] + gapSize) % primes[i];
- j = (modules[i] == 0) ? 0 : (primes[i] - modules[i]);
- for (; j < gapSize; j += primes[i]) {
- isDivisible[j] = true;
- }
- }
- // To execute Miller-Rabin for non-divisible numbers by all first
- // primes
- for (j = 0; j < gapSize; j++) {
- if (!isDivisible[j]) {
- probPrime = startPoint.copy();
- Elementary.inplaceAdd(probPrime, j);
-
- if (millerRabin(probPrime, certainty)) {
- return probPrime;
- }
- }
- }
- Elementary.inplaceAdd(startPoint, gapSize);
- }
- }
-
- /**
- * The Miller-Rabin primality test.
- *
- * @param n the input number to be tested.
- * @param t the number of trials.
- * @return {@code false} if the number is definitely compose, otherwise
- * {@code true} with probability {@code 1 - 4<sup>(-t)</sup>}.
- * @ar.org.fitc.ref "D. Knuth, The Art of Computer Programming Vo.2, Section
- * 4.5.4., Algorithm P"
- */
- private static boolean millerRabin(BigInteger n, int t) {
- // PRE: n >= 0, t >= 0
- BigInteger x; // x := UNIFORM{2...n-1}
- BigInteger y; // y := x^(q * 2^j) mod n
- BigInteger nMinus1 = n.subtract(BigInteger.ONE); // n-1
- int bitLength = nMinus1.bitLength(); // ~ log2(n-1)
- // (q,k) such that: n-1 = q * 2^k and q is odd
- int k = nMinus1.getLowestSetBit();
- BigInteger q = nMinus1.shiftRight(k);
- Random rnd = new Random();
-
- for (int i = 0; i < t; i++) {
- // To generate a witness 'x', first it use the primes of table
- if (i < primes.length) {
- x = BIprimes[i];
- } else {
- /*
- * It generates random witness only if it's necesssary. Note that all
- * methods would call Miller-Rabin with t <= 50 so this part is only to
- * do more robust the algorithm
- */
- do {
- x = new BigInteger(bitLength, rnd);
- } while ((x.compareTo(n) >= BigInteger.EQUALS) || (x.sign == 0)
- || x.isOne());
- }
- y = x.modPow(q, n);
- if (y.isOne() || y.equals(nMinus1)) {
- continue;
- }
- for (int j = 1; j < k; j++) {
- if (y.equals(nMinus1)) {
- continue;
- }
- y = y.multiply(y).mod(n);
- if (y.isOne()) {
- return false;
- }
- }
- if (!y.equals(nMinus1)) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Just to denote that this class can't be instantiated.
- */
- private Primality() {
- }
-
-}
diff --git a/user/super/com/google/gwt/emul/java/math/RoundingMode.java b/user/super/com/google/gwt/emul/java/math/RoundingMode.java
deleted file mode 100644
index f432d05..0000000
--- a/user/super/com/google/gwt/emul/java/math/RoundingMode.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY RICHARD ZSCHECH AS WELL AS GOOGLE.
- */
-package java.math;
-
-/**
- * Specifies the rounding behavior for operations whose results cannot be
- * represented exactly.
- */
-public enum RoundingMode {
-
- /**
- * Rounding mode to round towards positive infinity. For positive values this
- * rounding mode behaves as {@link #UP}, for negative values as {@link #DOWN}. <br>
- * Rule: {@code x.round() >= x}
- */
- CEILING(BigDecimal.ROUND_CEILING),
-
- /**
- * Rounding mode where the values are rounded towards zero. <br>
- * Rule: {@code x.round().abs() <= x.abs()}
- */
- DOWN(BigDecimal.ROUND_DOWN),
-
- /**
- * Rounding mode to round towards negative infinity. For positive values this
- * rounding mode behaves as {@link #DOWN}, for negative values as {@link #UP}. <br>
- * Rule: {@code x.round() <= x}
- */
- FLOOR(BigDecimal.ROUND_FLOOR),
-
- /**
- * Rounding mode where values are rounded towards the nearest neighbor. Ties
- * are broken by rounding down.
- */
- HALF_DOWN(BigDecimal.ROUND_HALF_DOWN),
-
- /**
- * Rounding mode where values are rounded towards the nearest neighbor. Ties
- * are broken by rounding to the even neighbor.
- */
- HALF_EVEN(BigDecimal.ROUND_HALF_EVEN),
-
- /**
- * Rounding mode where values are rounded towards the nearest neighbor. Ties
- * are broken by rounding up.
- */
- HALF_UP(BigDecimal.ROUND_HALF_UP),
-
- /**
- * Rounding mode where the rounding operations throws an ArithmeticException
- * for the case that rounding is necessary, i.e. for the case that the value
- * cannot be represented exactly.
- */
- UNNECESSARY(BigDecimal.ROUND_UNNECESSARY),
-
- /**
- * Rounding mode where positive values are rounded towards positive infinity
- * and negative values towards negative infinity. <br>
- * Rule: {@code x.round().abs() >= x.abs()}
- */
- UP(BigDecimal.ROUND_UP);
-
- /**
- * Converts rounding mode constants from class {@code BigDecimal} into {@code
- * RoundingMode} values.
- *
- * @param mode rounding mode constant as defined in class {@code BigDecimal}
- * @return corresponding rounding mode object
- */
- public static RoundingMode valueOf(int mode) {
- switch (mode) {
- case BigDecimal.ROUND_CEILING:
- return CEILING;
- case BigDecimal.ROUND_DOWN:
- return DOWN;
- case BigDecimal.ROUND_FLOOR:
- return FLOOR;
- case BigDecimal.ROUND_HALF_DOWN:
- return HALF_DOWN;
- case BigDecimal.ROUND_HALF_EVEN:
- return HALF_EVEN;
- case BigDecimal.ROUND_HALF_UP:
- return HALF_UP;
- case BigDecimal.ROUND_UNNECESSARY:
- return UNNECESSARY;
- case BigDecimal.ROUND_UP:
- return UP;
- default:
- // math.00=Invalid rounding mode
- throw new IllegalArgumentException("Invalid rounding mode"); //$NON-NLS-1$
- }
- }
-
- /**
- * Set the old constant.
- * @param rm unused
- */
- RoundingMode(int rm) {
- // Note that we do not need the old-style rounding mode, so we ignore it.
- }
-}
diff --git a/user/super/com/google/gwt/emul/java/util/Random.java b/user/super/com/google/gwt/emul/java/util/Random.java
deleted file mode 100644
index f0330e4..0000000
--- a/user/super/com/google/gwt/emul/java/util/Random.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY RICHARD ZSCHECH AS WELL AS GOOGLE.
- */
-package java.util;
-
-import java.io.Serializable;
-
-/**
- * This class provides methods that generates pseudo-random numbers of different
- * types, such as {@code int}, {@code long}, {@code double}, and {@code float}.
- */
-public class Random implements Serializable {
-
- private static final long serialVersionUID = 3905348978240129619L;
-
- private static final long multiplier = 0x5deece66dL;
-
- /**
- * A value used to avoid two random number generators produced at the same
- * time having the same seed.
- */
- private static int uniqueSeed = 0;
-
- /**
- * The boolean value indicating if the second Gaussian number is available.
- *
- * @serial
- */
- private boolean haveNextNextGaussian;
-
- /**
- * @serial It is associated with the internal state of this generator.
- */
- private long seed;
-
- /**
- * The second Gaussian generated number.
- *
- * @serial
- */
- private double nextNextGaussian;
-
- /**
- * Construct a random generator with the current time of day in milliseconds
- * as the initial state.
- *
- * @see #setSeed
- */
- public Random() {
- setSeed(uniqueSeed++ + System.currentTimeMillis());
- }
-
- /**
- * Construct a random generator with the given {@code seed} as the initial
- * state.
- *
- * @param seed the seed that will determine the initial state of this random
- * number generator.
- * @see #setSeed
- */
- public Random(long seed) {
- setSeed(seed);
- }
-
- /**
- * Returns the next pseudo-random, uniformly distributed {@code boolean} value
- * generated by this generator.
- *
- * @return a pseudo-random, uniformly distributed boolean value.
- */
- public boolean nextBoolean() {
- return next(1) != 0;
- }
-
- /**
- * Modifies the {@code byte} array by a random sequence of {@code byte}s
- * generated by this random number generator.
- *
- * @param buf non-null array to contain the new random {@code byte}s.
- * @see #next
- */
- public void nextBytes(byte[] buf) {
- int rand = 0, count = 0, loop = 0;
- while (count < buf.length) {
- if (loop == 0) {
- rand = nextInt();
- loop = 3;
- } else {
- loop--;
- }
- buf[count++] = (byte) rand;
- rand >>= 8;
- }
- }
-
- /**
- * Generates a normally distributed random {@code double} number between 0.0
- * inclusively and 1.0 exclusively.
- *
- * @return a random {@code double} in the range [0.0 - 1.0)
- * @see #nextFloat
- */
- public double nextDouble() {
- return ((((long) next(26) << 27) + next(27)) / (double) (1L << 53));
- }
-
- /**
- * Generates a normally distributed random {@code float} number between 0.0
- * inclusively and 1.0 exclusively.
- *
- * @return float a random {@code float} number between [0.0 and 1.0)
- * @see #nextDouble
- */
- public float nextFloat() {
- return (next(24) / 16777216f);
- }
-
- /**
- * Pseudo-randomly generates (approximately) a normally distributed {@code
- * double} value with mean 0.0 and a standard deviation value of {@code 1.0}
- * using the <i>polar method<i> of G. E. P. Box, M. E. Muller, and G.
- * Marsaglia, as described by Donald E. Knuth in <i>The Art of Computer
- * Programming, Volume 2: Seminumerical Algorithms</i>, section 3.4.1,
- * subsection C, algorithm P.
- *
- * @return a random {@code double}
- * @see #nextDouble
- */
- public double nextGaussian() {
- if (haveNextNextGaussian) {
- // if X1 has been returned, return the second Gaussian
- haveNextNextGaussian = false;
- return nextNextGaussian;
- }
-
- double v1, v2, s;
- do {
- // Generates two independent random variables U1, U2
- v1 = 2 * nextDouble() - 1;
- v2 = 2 * nextDouble() - 1;
- s = v1 * v1 + v2 * v2;
- } while (s >= 1);
- double norm = Math.sqrt(-2 * Math.log(s) / s);
- nextNextGaussian = v2 * norm;
- haveNextNextGaussian = true;
- return v1 * norm;
- }
-
- /**
- * Generates a uniformly distributed 32-bit {@code int} value from the random
- * number sequence.
- *
- * @return a uniformly distributed {@code int} value.
- * @see java.lang.Integer#MAX_VALUE
- * @see java.lang.Integer#MIN_VALUE
- * @see #next
- * @see #nextLong
- */
- public int nextInt() {
- return next(32);
- }
-
- /**
- * Returns a new pseudo-random {@code int} value which is uniformly
- * distributed between 0 (inclusively) and the value of {@code n}
- * (exclusively).
- *
- * @param n the exclusive upper border of the range [0 - n).
- * @return a random {@code int}.
- */
- public int nextInt(int n) {
- if (n > 0) {
- if ((n & -n) == n) {
- return (int) ((n * (long) next(31)) >> 31);
- }
- int bits, val;
- do {
- bits = next(31);
- val = bits % n;
- } while (bits - val + (n - 1) < 0);
- return val;
- }
- throw new IllegalArgumentException();
- }
-
- /**
- * Generates a uniformly distributed 64-bit integer value from the random
- * number sequence.
- *
- * @return 64-bit random integer.
- * @see java.lang.Integer#MAX_VALUE
- * @see java.lang.Integer#MIN_VALUE
- * @see #next
- * @see #nextInt()
- * @see #nextInt(int)
- */
- public long nextLong() {
- return ((long) next(32) << 32) + next(32);
- }
-
- /**
- * Modifies the seed a using linear congruential formula presented in <i>The
- * Art of Computer Programming, Volume 2</i>, Section 3.2.1.
- *
- * @param seed the seed that alters the state of the random number generator.
- * @see #next
- * @see #Random()
- * @see #Random(long)
- */
- public void setSeed(long seed) {
- this.seed = (seed ^ multiplier) & ((1L << 48) - 1);
- haveNextNextGaussian = false;
- }
-
- /**
- * Returns a pseudo-random uniformly distributed {@code int} value of the
- * number of bits specified by the argument {@code bits} as described by
- * Donald E. Knuth in <i>The Art of Computer Programming, Volume 2:
- * Seminumerical Algorithms</i>, section 3.2.1.
- *
- * @param bits number of bits of the returned value.
- * @return a pseudo-random generated int number.
- * @see #nextBytes
- * @see #nextDouble
- * @see #nextFloat
- * @see #nextInt()
- * @see #nextInt(int)
- * @see #nextGaussian
- * @see #nextLong
- */
- protected int next(int bits) {
- seed = (seed * multiplier + 0xbL) & ((1L << 48) - 1);
- return (int) (seed >>> (48 - bits));
- }
-}
diff --git a/user/test/com/google/gwt/emultest/EmulSuite.java b/user/test/com/google/gwt/emultest/EmulSuite.java
index dae2713..34266e4 100644
--- a/user/test/com/google/gwt/emultest/EmulSuite.java
+++ b/user/test/com/google/gwt/emultest/EmulSuite.java
@@ -29,26 +29,6 @@
import com.google.gwt.emultest.java.lang.StringBufferTest;
import com.google.gwt.emultest.java.lang.StringTest;
import com.google.gwt.emultest.java.lang.SystemTest;
-import com.google.gwt.emultest.java.math.BigDecimalArithmeticTest;
-import com.google.gwt.emultest.java.math.BigDecimalCompareTest;
-import com.google.gwt.emultest.java.math.BigDecimalConstructorsTest;
-import com.google.gwt.emultest.java.math.BigDecimalConvertTest;
-import com.google.gwt.emultest.java.math.BigDecimalScaleOperationsTest;
-import com.google.gwt.emultest.java.math.BigIntegerAddTest;
-import com.google.gwt.emultest.java.math.BigIntegerAndTest;
-import com.google.gwt.emultest.java.math.BigIntegerCompareTest;
-import com.google.gwt.emultest.java.math.BigIntegerConstructorsTest;
-import com.google.gwt.emultest.java.math.BigIntegerConvertTest;
-import com.google.gwt.emultest.java.math.BigIntegerDivideTest;
-import com.google.gwt.emultest.java.math.BigIntegerHashCodeTest;
-import com.google.gwt.emultest.java.math.BigIntegerModPowTest;
-import com.google.gwt.emultest.java.math.BigIntegerMultiplyTest;
-import com.google.gwt.emultest.java.math.BigIntegerNotTest;
-import com.google.gwt.emultest.java.math.BigIntegerOperateBitsTest;
-import com.google.gwt.emultest.java.math.BigIntegerOrTest;
-import com.google.gwt.emultest.java.math.BigIntegerSubtractTest;
-import com.google.gwt.emultest.java.math.BigIntegerToStringTest;
-import com.google.gwt.emultest.java.math.BigIntegerXorTest;
import com.google.gwt.emultest.java.sql.SqlDateTest;
import com.google.gwt.emultest.java.sql.SqlTimeTest;
import com.google.gwt.emultest.java.sql.SqlTimestampTest;
@@ -66,22 +46,21 @@
import com.google.gwt.emultest.java.util.LinkedHashMapTest;
import com.google.gwt.emultest.java.util.LinkedListTest;
import com.google.gwt.emultest.java.util.PriorityQueueTest;
-import com.google.gwt.emultest.java.util.RandomTest;
import com.google.gwt.emultest.java.util.StackTest;
import com.google.gwt.junit.tools.GWTTestSuite;
import junit.framework.Test;
/**
- * Tests for JRE emulation classes.
+ * TODO: document me.
*/
public class EmulSuite {
+ /** Note: due to compiler error, only can use one Test Case at a time. */
public static Test suite() {
GWTTestSuite suite = new GWTTestSuite("Tests for com.google.gwt.emul.java");
// $JUnit-BEGIN$
- // java.lang
suite.addTestSuite(BooleanTest.class);
suite.addTestSuite(ByteTest.class);
suite.addTestSuite(CharacterTest.class);
@@ -97,29 +76,6 @@
suite.addTestSuite(StringTest.class);
suite.addTestSuite(SystemTest.class);
- // java.math
- suite.addTestSuite(BigDecimalArithmeticTest.class);
- suite.addTestSuite(BigDecimalCompareTest.class);
- suite.addTestSuite(BigDecimalConstructorsTest.class);
- suite.addTestSuite(BigDecimalConvertTest.class);
- suite.addTestSuite(BigDecimalScaleOperationsTest.class);
- suite.addTestSuite(BigIntegerAddTest.class);
- suite.addTestSuite(BigIntegerAndTest.class);
- suite.addTestSuite(BigIntegerCompareTest.class);
- suite.addTestSuite(BigIntegerConstructorsTest.class);
- suite.addTestSuite(BigIntegerConvertTest.class);
- suite.addTestSuite(BigIntegerDivideTest.class);
- suite.addTestSuite(BigIntegerHashCodeTest.class);
- suite.addTestSuite(BigIntegerModPowTest.class);
- suite.addTestSuite(BigIntegerMultiplyTest.class);
- suite.addTestSuite(BigIntegerNotTest.class);
- suite.addTestSuite(BigIntegerOperateBitsTest.class);
- suite.addTestSuite(BigIntegerOrTest.class);
- suite.addTestSuite(BigIntegerSubtractTest.class);
- suite.addTestSuite(BigIntegerToStringTest.class);
- suite.addTestSuite(BigIntegerXorTest.class);
-
- // java.util
suite.addTestSuite(ApacheMapTest.class);
suite.addTestSuite(ArrayListTest.class);
suite.addTestSuite(ArraysTest.class);
@@ -134,7 +90,6 @@
suite.addTestSuite(LinkedHashMapTest.class);
suite.addTestSuite(LinkedListTest.class);
suite.addTestSuite(PriorityQueueTest.class);
- suite.addTestSuite(RandomTest.class);
suite.addTestSuite(StackTest.class);
suite.addTestSuite(SqlDateTest.class);
suite.addTestSuite(SqlTimeTest.class);
@@ -145,4 +100,5 @@
return suite;
}
+
}
diff --git a/user/test/com/google/gwt/emultest/java/lang/FloatTest.java b/user/test/com/google/gwt/emultest/java/lang/FloatTest.java
index 3254e20..c8cea58 100644
--- a/user/test/com/google/gwt/emultest/java/lang/FloatTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/FloatTest.java
@@ -24,7 +24,6 @@
*/
public class FloatTest extends GWTTestCase {
- @Override
public String getModuleName() {
return "com.google.gwt.emultest.EmulSuite";
}
@@ -78,13 +77,9 @@
assertEquals(-1.5f, Float.parseFloat("-1.5"), 0.0);
assertEquals(3.0f, Float.parseFloat("3."), 0.0);
assertEquals(0.5f, Float.parseFloat(".5"), 0.0);
- // TODO(jat): it isn't safe to parse MAX/MIN_VALUE because we also want to
- // be able to get POSITIVE/NEGATIVE_INFINITY for out-of-range values, and
- // since all math in JS is done in double we can't rely on getting the
- // exact value back.
-// assertEquals("Can't parse MAX_VALUE", Float.MAX_VALUE,
-// Float.parseFloat(String.valueOf(Float.MAX_VALUE)), 1e31);
-// assertEquals("Can't parse MIN_VALUE", Float.MIN_VALUE,
-// Float.parseFloat(String.valueOf(Float.MIN_VALUE)), Float.MIN_VALUE);
+ assertEquals("Can't parse MAX_VALUE", Float.MAX_VALUE,
+ Float.parseFloat(String.valueOf(Float.MAX_VALUE)), 1e31);
+ assertEquals("Can't parse MIN_VALUE", Float.MIN_VALUE,
+ Float.parseFloat(String.valueOf(Float.MIN_VALUE)), Float.MIN_VALUE);
}
}
diff --git a/user/test/com/google/gwt/emultest/java/math/BigDecimalArithmeticTest.java b/user/test/com/google/gwt/emultest/java/math/BigDecimalArithmeticTest.java
deleted file mode 100644
index 99ae798..0000000
--- a/user/test/com/google/gwt/emultest/java/math/BigDecimalArithmeticTest.java
+++ /dev/null
@@ -1,1741 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-package com.google.gwt.emultest.java.math;
-
-import com.google.gwt.emultest.java.util.EmulTestBase;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.math.MathContext;
-import java.math.RoundingMode;
-
-/**
- * Class: java.math.BigDecimal Methods: add, subtract, multiply, divide
- */
-public class BigDecimalArithmeticTest extends EmulTestBase {
- /**
- * Add two numbers of different scales; the first is negative
- */
- public void testAddDiffScaleNegPos() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = -15;
- String b = "747233429293018787918347987234564568";
- int bScale = 10;
- String c = "1231212478987482988429808779810457634781459480137916301878791834798.7234564568";
- int cScale = 10;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.add(bNumber);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * Add two numbers of different scales; the first is positive
- */
- public void testAddDiffScalePosNeg() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 15;
- String b = "747233429293018787918347987234564568";
- int bScale = -10;
- String c = "7472334294161400358170962860775454459810457634.781384756794987";
- int cScale = 15;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.add(bNumber);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * Add two numbers of different scales; the first is positive
- */
- public void testAddDiffScalePosPos() {
- String a = "100";
- int aScale = 15;
- String b = "200";
- int bScale = 14;
- String c = "2.100E-12";
- int cScale = 15;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.add(bNumber);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * Add two zeroes of different scales; the first is negative
- */
- public void testAddDiffScaleZeroZero() {
- String a = "0";
- int aScale = -15;
- String b = "0";
- int bScale = 10;
- String c = "0E-10";
- int cScale = 10;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.add(bNumber);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * Add two numbers of equal negative scales
- */
- public void testAddEqualScaleNegNeg() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = -10;
- String b = "747233429293018787918347987234564568";
- int bScale = -10;
- String c = "1.231212478987483735663238072829245553129371991359555E+61";
- int cScale = -10;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.add(bNumber);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * Add two numbers of equal positive scales
- */
- public void testAddEqualScalePosPos() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 10;
- String b = "747233429293018787918347987234564568";
- int bScale = 10;
- String c = "123121247898748373566323807282924555312937.1991359555";
- int cScale = 10;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.add(bNumber);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * Add two numbers of different scales using MathContext; the first is
- * positive
- */
- public void testAddMathContextDiffScalePosNeg() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 15;
- String b = "747233429293018787918347987234564568";
- int bScale = -10;
- String c = "7.47233429416141E+45";
- int cScale = -31;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- MathContext mc = new MathContext(15, RoundingMode.CEILING);
- BigDecimal result = aNumber.add(bNumber, mc);
- assertEquals("incorrect value", c, c.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * Add two numbers of equal negative scales using MathContext
- */
- public void testAddMathContextEqualScaleNegNeg() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = -10;
- String b = "747233429293018787918347987234564568";
- int bScale = -10;
- String c = "1.2312E+61";
- int cScale = -57;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- MathContext mc = new MathContext(5, RoundingMode.FLOOR);
- BigDecimal result = aNumber.add(bNumber, mc);
- assertEquals("incorrect value ", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * Add two numbers of equal positive scales using MathContext
- */
- public void testAddMathContextEqualScalePosPos() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 10;
- String b = "747233429293018787918347987234564568";
- int bScale = 10;
- String c = "1.2313E+41";
- int cScale = -37;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- MathContext mc = new MathContext(5, RoundingMode.UP);
- BigDecimal result = aNumber.add(bNumber, mc);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- public void testAddZero() {
- BigDecimal val = new BigDecimal("123456789");
- BigDecimal sum = val.add(BigDecimal.ZERO);
- assertEquals(val, sum);
- sum = BigDecimal.ZERO.add(val);
- assertEquals(val, sum);
- val = BigDecimal.valueOf(0L, 1);
- sum = val.add(BigDecimal.ZERO);
- assertEquals(val, sum);
- }
-
-
- /**
- * Test the the approximate scale is computed correctly.
- * <p>
- * See https://issues.apache.org/jira/browse/HARMONY-6406
- */
- public void testApproxScale() {
- BigDecimal decVal = BigDecimal.TEN.multiply(new BigDecimal("0.1"));
- int compare = decVal.compareTo(new BigDecimal("1.00"));
- assertEquals(0, compare);
- }
-
- /**
- * divideAndRemainder(BigDecimal).
- */
- public void testDivideAndRemainder1() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = 45;
- String b = "134432345432345748766876876723342238476237823787879183470";
- int bScale = 70;
- String res = "277923185514690367474770683";
- int resScale = 0;
- String rem = "1.3032693871288309587558885943391070087960319452465789990E-15";
- int remScale = 70;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result[] = aNumber.divideAndRemainder(bNumber);
- assertEquals("incorrect quotient value", res, result[0].toString());
- assertEquals("incorrect quotient scale", resScale, result[0].scale());
- assertEquals("incorrect remainder value", rem, result[1].toString());
- assertEquals("incorrect remainder scale", remScale, result[1].scale());
- }
-
- /**
- * divideAndRemainder(BigDecimal).
- */
- public void testDivideAndRemainder2() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = -45;
- String b = "134432345432345748766876876723342238476237823787879183470";
- int bScale = 70;
- String res = "2779231855146903674747706830969461168692256919247547952"
- + "2608549363170374005512836303475980101168105698072946555" + "6862849";
- int resScale = 0;
- String rem = "3.4935796954060524114470681810486417234751682675102093970E-15";
- int remScale = 70;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result[] = aNumber.divideAndRemainder(bNumber);
- assertEquals("incorrect quotient value", res, result[0].toString());
- assertEquals("incorrect quotient scale", resScale, result[0].scale());
- assertEquals("incorrect remainder value", rem, result[1].toString());
- assertEquals("incorrect remainder scale", remScale, result[1].scale());
- }
-
- /**
- * divideAndRemainder(BigDecimal, MathContext).
- */
- public void testDivideAndRemainderMathContextDOWN() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = 45;
- String b = "134432345432345748766876876723342238476237823787879183470";
- int bScale = 20;
- int precision = 15;
- RoundingMode rm = RoundingMode.DOWN;
- MathContext mc = new MathContext(precision, rm);
- String res = "0E-25";
- int resScale = 25;
- String rem = "3736186567876.876578956958765675671119238118911893939591735";
- int remScale = 45;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result[] = aNumber.divideAndRemainder(bNumber, mc);
- assertEquals("incorrect quotient value", res, result[0].toString());
- assertEquals("incorrect quotient scale", resScale, result[0].scale());
- assertEquals("incorrect remainder value", rem, result[1].toString());
- assertEquals("incorrect remainder scale", remScale, result[1].scale());
- }
-
- /**
- * divideAndRemainder(BigDecimal, MathContext).
- */
- public void testDivideAndRemainderMathContextUP() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = 45;
- String b = "134432345432345748766876876723342238476237823787879183470";
- int bScale = 70;
- int precision = 75;
- RoundingMode rm = RoundingMode.UP;
- MathContext mc = new MathContext(precision, rm);
- String res = "277923185514690367474770683";
- int resScale = 0;
- String rem = "1.3032693871288309587558885943391070087960319452465789990E-15";
- int remScale = 70;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result[] = aNumber.divideAndRemainder(bNumber, mc);
- assertEquals("incorrect quotient value", res, result[0].toString());
- assertEquals("incorrect quotient scale", resScale, result[0].scale());
- assertEquals("incorrect remainder value", rem, result[1].toString());
- assertEquals("incorrect remainder scale", remScale, result[1].scale());
- }
-
- /**
- * Divide to BigDecimal.
- */
- public void testDivideBigDecimal1() {
- String a = "-37361671119238118911893939591735";
- int aScale = 10;
- String b = "74723342238476237823787879183470";
- int bScale = 15;
- String c = "-5E+4";
- int resScale = -4;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide to BigDecimal.
- */
- public void testDivideBigDecimal2() {
- String a = "-37361671119238118911893939591735";
- int aScale = 10;
- String b = "74723342238476237823787879183470";
- int bScale = -15;
- String c = "-5E-26";
- int resScale = 26;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * divide(BigDecimal, MathContext).
- */
- public void testDivideBigDecimalScaleMathContextCEILING() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = 15;
- String b = "748766876876723342238476237823787879183470";
- int bScale = 70;
- int precision = 21;
- RoundingMode rm = RoundingMode.CEILING;
- MathContext mc = new MathContext(precision, rm);
- String c = "4.98978611802562512996E+70";
- int resScale = -50;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, mc);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * divide(BigDecimal, MathContext).
- */
- public void testDivideBigDecimalScaleMathContextDOWN() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = 15;
- String b = "748766876876723342238476237823787879183470";
- int bScale = 70;
- int precision = 21;
- RoundingMode rm = RoundingMode.DOWN;
- MathContext mc = new MathContext(precision, rm);
- String c = "4.98978611802562512995E+70";
- int resScale = -50;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, mc);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * divide(BigDecimal, MathContext).
- */
- public void testDivideBigDecimalScaleMathContextFLOOR() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = 15;
- String b = "748766876876723342238476237823787879183470";
- int bScale = 70;
- int precision = 21;
- RoundingMode rm = RoundingMode.FLOOR;
- MathContext mc = new MathContext(precision, rm);
- String c = "4.98978611802562512995E+70";
- int resScale = -50;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, mc);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * divide(BigDecimal, MathContext).
- */
- public void testDivideBigDecimalScaleMathContextHALF_DOWN() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = 45;
- String b = "134432345432345748766876876723342238476237823787879183470";
- int bScale = 70;
- int precision = 21;
- RoundingMode rm = RoundingMode.HALF_DOWN;
- MathContext mc = new MathContext(precision, rm);
- String c = "2.77923185514690367475E+26";
- int resScale = -6;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, mc);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * divide(BigDecimal, MathContext).
- */
- public void testDivideBigDecimalScaleMathContextHALF_EVEN() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = 45;
- String b = "134432345432345748766876876723342238476237823787879183470";
- int bScale = 70;
- int precision = 21;
- RoundingMode rm = RoundingMode.HALF_EVEN;
- MathContext mc = new MathContext(precision, rm);
- String c = "2.77923185514690367475E+26";
- int resScale = -6;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, mc);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * divide(BigDecimal, MathContext).
- */
- public void testDivideBigDecimalScaleMathContextHALF_UP() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = 45;
- String b = "134432345432345748766876876723342238476237823787879183470";
- int bScale = 70;
- int precision = 21;
- RoundingMode rm = RoundingMode.HALF_UP;
- MathContext mc = new MathContext(precision, rm);
- String c = "2.77923185514690367475E+26";
- int resScale = -6;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, mc);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * divide(BigDecimal, MathContext).
- */
- public void testDivideBigDecimalScaleMathContextUP() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = 15;
- String b = "748766876876723342238476237823787879183470";
- int bScale = 10;
- int precision = 21;
- RoundingMode rm = RoundingMode.UP;
- MathContext mc = new MathContext(precision, rm);
- String c = "49897861180.2562512996";
- int resScale = 10;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, mc);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * divide(BigDecimal, scale, RoundingMode).
- */
- public void testDivideBigDecimalScaleRoundingModeCEILING() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = 100;
- String b = "74723342238476237823787879183470";
- int bScale = 15;
- int newScale = 45;
- RoundingMode rm = RoundingMode.CEILING;
- String c = "1E-45";
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, newScale, rm);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", newScale, result.scale());
- }
-
- /**
- * divide(BigDecimal, scale, RoundingMode).
- */
- public void testDivideBigDecimalScaleRoundingModeDOWN() {
- String a = "-37361671119238118911893939591735";
- int aScale = 10;
- String b = "74723342238476237823787879183470";
- int bScale = 15;
- int newScale = 31;
- RoundingMode rm = RoundingMode.DOWN;
- String c = "-50000.0000000000000000000000000000000";
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, newScale, rm);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", newScale, result.scale());
- }
-
- /**
- * divide(BigDecimal, scale, RoundingMode).
- */
- public void testDivideBigDecimalScaleRoundingModeFLOOR() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = 100;
- String b = "74723342238476237823787879183470";
- int bScale = 15;
- int newScale = 45;
- RoundingMode rm = RoundingMode.FLOOR;
- String c = "0E-45";
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, newScale, rm);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", newScale, result.scale());
- }
-
- /**
- * divide(BigDecimal, scale, RoundingMode).
- */
- public void testDivideBigDecimalScaleRoundingModeHALF_DOWN() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = 5;
- String b = "74723342238476237823787879183470";
- int bScale = 15;
- int newScale = 7;
- RoundingMode rm = RoundingMode.HALF_DOWN;
- String c = "500002603731642864013619132621009722.1803810";
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, newScale, rm);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", newScale, result.scale());
- }
-
- /**
- * divide(BigDecimal, scale, RoundingMode).
- */
- public void testDivideBigDecimalScaleRoundingModeHALF_EVEN() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = 5;
- String b = "74723342238476237823787879183470";
- int bScale = 15;
- int newScale = 7;
- RoundingMode rm = RoundingMode.HALF_EVEN;
- String c = "500002603731642864013619132621009722.1803810";
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, newScale, rm);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", newScale, result.scale());
- }
-
- /**
- * divide(BigDecimal, scale, RoundingMode).
- */
- public void testDivideBigDecimalScaleRoundingModeHALF_UP() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = -51;
- String b = "74723342238476237823787879183470";
- int bScale = 45;
- int newScale = 3;
- RoundingMode rm = RoundingMode.HALF_UP;
- String c = "50000260373164286401361913262100972218038099522752460421"
- + "05959924024355721031761947728703598332749334086415670525"
- + "3761096961.670";
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, newScale, rm);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", newScale, result.scale());
- }
-
- /**
- * divide(BigDecimal, scale, RoundingMode).
- */
- public void testDivideBigDecimalScaleRoundingModeUP() {
- String a = "-37361671119238118911893939591735";
- int aScale = 10;
- String b = "74723342238476237823787879183470";
- int bScale = -15;
- int newScale = 31;
- RoundingMode rm = RoundingMode.UP;
- String c = "-5.00000E-26";
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, newScale, rm);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", newScale, result.scale());
- }
-
- /**
- * Divide by zero.
- */
- public void testDivideByZero() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 15;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = BigDecimal.valueOf(0L);
- try {
- aNumber.divide(bNumber);
- fail("ArithmeticException has not been caught");
- } catch (ArithmeticException e) {
- assertEquals("Improper exception message", "Division by zero",
- e.getMessage());
- }
- }
-
- /**
- * Divide with invalid rounding mode.
- */
- public void testDivideExceptionInvalidRM() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 15;
- String b = "747233429293018787918347987234564568";
- int bScale = 10;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- try {
- aNumber.divide(bNumber, 100);
- fail("IllegalArgumentException has not been caught");
- } catch (IllegalArgumentException e) {
- assertEquals("Improper exception message", "Invalid rounding mode",
- e.getMessage());
- }
- }
-
- /**
- * Divide with ROUND_UNNECESSARY.
- */
- public void testDivideExceptionRM() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 15;
- String b = "747233429293018787918347987234564568";
- int bScale = 10;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- try {
- aNumber.divide(bNumber, BigDecimal.ROUND_UNNECESSARY);
- fail("ArithmeticException has not been caught");
- } catch (ArithmeticException e) {
- assertEquals("Improper exception message", "Rounding necessary",
- e.getMessage());
- }
- }
-
- /**
- * Divide: local variable exponent is equal to zero.
- */
- public void testDivideExpEqualsZero() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = -15;
- String b = "747233429293018787918347987234564568";
- int bScale = 10;
- String c = "1.64769459009933764189139568605273529E+40";
- int resScale = -5;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_CEILING);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: local variable exponent is greater than zero.
- */
- public void testDivideExpGreaterZero() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = -15;
- String b = "747233429293018787918347987234564568";
- int bScale = 20;
- String c = "1.647694590099337641891395686052735285121058381E+50";
- int resScale = -5;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_CEILING);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: local variable exponent is less than zero.
- */
- public void testDivideExpLessZero() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 15;
- String b = "747233429293018787918347987234564568";
- int bScale = 10;
- String c = "1.64770E+10";
- int resScale = -5;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_CEILING);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * BigDecimal.divide with a scale that's too large.
- *
- * Regression test for HARMONY-6271
- */
- public void testDivideLargeScale() {
- BigDecimal arg1 = new BigDecimal("320.0E+2147483647");
- BigDecimal arg2 = new BigDecimal("6E-2147483647");
- try {
- arg1.divide(arg2, Integer.MAX_VALUE, RoundingMode.CEILING);
- fail("Expected ArithmeticException when dividing with a scale that's too large");
- } catch (ArithmeticException e) {
- // expected behaviour
- }
- }
-
- /**
- * Divide: remainder is zero.
- */
- public void testDivideRemainderIsZero() {
- String a = "8311389578904553209874735431110";
- int aScale = -15;
- String b = "237468273682987234567849583746";
- int bScale = 20;
- String c = "3.5000000000000000000000000000000E+36";
- int resScale = -5;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_CEILING);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_CEILING, result is negative.
- */
- public void testDivideRoundCeilingNeg() {
- String a = "-92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = -24;
- String b = "7472334223847623782375469293018787918347987234564568";
- int bScale = 13;
- String c = "-1.24390557635720517122423359799283E+53";
- int resScale = -21;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_CEILING);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_CEILING, result is positive.
- */
- public void testDivideRoundCeilingPos() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = -24;
- String b = "7472334223847623782375469293018787918347987234564568";
- int bScale = 13;
- String c = "1.24390557635720517122423359799284E+53";
- int resScale = -21;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_CEILING);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_DOWN, result is negative.
- */
- public void testDivideRoundDownNeg() {
- String a = "-92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = -24;
- String b = "7472334223847623782375469293018787918347987234564568";
- int bScale = 13;
- String c = "-1.24390557635720517122423359799283E+53";
- int resScale = -21;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_DOWN);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_DOWN, result is positive.
- */
- public void testDivideRoundDownPos() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = -24;
- String b = "7472334223847623782375469293018787918347987234564568";
- int bScale = 13;
- String c = "1.24390557635720517122423359799283E+53";
- int resScale = -21;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_DOWN);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_FLOOR, result is negative.
- */
- public void testDivideRoundFloorNeg() {
- String a = "-92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = -24;
- String b = "7472334223847623782375469293018787918347987234564568";
- int bScale = 13;
- String c = "-1.24390557635720517122423359799284E+53";
- int resScale = -21;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_FLOOR);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_FLOOR, result is positive.
- */
- public void testDivideRoundFloorPos() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = -24;
- String b = "7472334223847623782375469293018787918347987234564568";
- int bScale = 13;
- String c = "1.24390557635720517122423359799283E+53";
- int resScale = -21;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_FLOOR);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_HALF_DOWN, result is negative;
- * distance = -1.
- */
- public void testDivideRoundHalfDownNeg() {
- String a = "-92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = -24;
- String b = "7472334223847623782375469293018787918347987234564568";
- int bScale = 13;
- String c = "-1.24390557635720517122423359799284E+53";
- int resScale = -21;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_HALF_DOWN);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_HALF_DOWN, result is negative; distance = 1.
- */
- public void testDivideRoundHalfDownNeg1() {
- String a = "-92948782094488478231212478987482988798104576347813847567949855464535634534563456";
- int aScale = -24;
- String b = "74723342238476237823754692930187879183479";
- int bScale = 13;
- String c = "-1.2439055763572051712242335979928354832010167729111113605E+76";
- int resScale = -21;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_HALF_DOWN);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_HALF_UP, result is negative; equidistant.
- */
- public void testDivideRoundHalfDownNeg2() {
- String a = "-37361671119238118911893939591735";
- int aScale = 10;
- String b = "74723342238476237823787879183470";
- int bScale = 15;
- String c = "0E+5";
- int resScale = -5;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_HALF_DOWN);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_HALF_DOWN, result is positive;
- * distance = -1.
- */
- public void testDivideRoundHalfDownPos() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = -24;
- String b = "7472334223847623782375469293018787918347987234564568";
- int bScale = 13;
- String c = "1.24390557635720517122423359799284E+53";
- int resScale = -21;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_HALF_DOWN);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_HALF_DOWN, result is positive; distance = 1.
- */
- public void testDivideRoundHalfDownPos1() {
- String a = "92948782094488478231212478987482988798104576347813847567949855464535634534563456";
- int aScale = -24;
- String b = "74723342238476237823754692930187879183479";
- int bScale = 13;
- String c = "1.2439055763572051712242335979928354832010167729111113605E+76";
- int resScale = -21;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_HALF_DOWN);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_HALF_EVEN, result is negative;
- * distance = -1.
- */
- public void testDivideRoundHalfEvenNeg() {
- String a = "-92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = -24;
- String b = "7472334223847623782375469293018787918347987234564568";
- int bScale = 13;
- String c = "-1.24390557635720517122423359799284E+53";
- int resScale = -21;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_HALF_EVEN);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_HALF_EVEN, result is negative; distance = 1
- */
- public void testDivideRoundHalfEvenNeg1() {
- String a = "-92948782094488478231212478987482988798104576347813847567949855464535634534563456";
- int aScale = -24;
- String b = "74723342238476237823754692930187879183479";
- int bScale = 13;
- String c = "-1.2439055763572051712242335979928354832010167729111113605E+76";
- int resScale = -21;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_HALF_EVEN);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_HALF_EVEN, result is negative; equidistant
- */
- public void testDivideRoundHalfEvenNeg2() {
- String a = "-37361671119238118911893939591735";
- int aScale = 10;
- String b = "74723342238476237823787879183470";
- int bScale = 15;
- String c = "0E+5";
- int resScale = -5;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_HALF_EVEN);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_HALF_EVEN, result is positive; distance = -1
- */
- public void testDivideRoundHalfEvenPos() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = -24;
- String b = "7472334223847623782375469293018787918347987234564568";
- int bScale = 13;
- String c = "1.24390557635720517122423359799284E+53";
- int resScale = -21;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_HALF_EVEN);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_HALF_EVEN, result is positive; distance = 1
- */
- public void testDivideRoundHalfEvenPos1() {
- String a = "92948782094488478231212478987482988798104576347813847567949855464535634534563456";
- int aScale = -24;
- String b = "74723342238476237823754692930187879183479";
- int bScale = 13;
- String c = "1.2439055763572051712242335979928354832010167729111113605E+76";
- int resScale = -21;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_HALF_EVEN);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_HALF_UP, result is negative; distance = -1
- */
- public void testDivideRoundHalfUpNeg() {
- String a = "-92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = -24;
- String b = "7472334223847623782375469293018787918347987234564568";
- int bScale = 13;
- String c = "-1.24390557635720517122423359799284E+53";
- int resScale = -21;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_HALF_UP);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_HALF_UP, result is negative; distance = 1
- */
- public void testDivideRoundHalfUpNeg1() {
- String a = "-92948782094488478231212478987482988798104576347813847567949855464535634534563456";
- int aScale = -24;
- String b = "74723342238476237823754692930187879183479";
- int bScale = 13;
- String c = "-1.2439055763572051712242335979928354832010167729111113605E+76";
- int resScale = -21;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_HALF_UP);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_HALF_UP, result is negative; equidistant
- */
- public void testDivideRoundHalfUpNeg2() {
- String a = "-37361671119238118911893939591735";
- int aScale = 10;
- String b = "74723342238476237823787879183470";
- int bScale = 15;
- String c = "-1E+5";
- int resScale = -5;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_HALF_UP);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_HALF_UP, result is positive; distance = -1
- */
- public void testDivideRoundHalfUpPos() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = -24;
- String b = "7472334223847623782375469293018787918347987234564568";
- int bScale = 13;
- String c = "1.24390557635720517122423359799284E+53";
- int resScale = -21;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_HALF_UP);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_HALF_UP, result is positive; distance = 1
- */
- public void testDivideRoundHalfUpPos1() {
- String a = "92948782094488478231212478987482988798104576347813847567949855464535634534563456";
- int aScale = -24;
- String b = "74723342238476237823754692930187879183479";
- int bScale = 13;
- String c = "1.2439055763572051712242335979928354832010167729111113605E+76";
- int resScale = -21;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale,
- BigDecimal.ROUND_HALF_UP);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_UP, result is negative
- */
- public void testDivideRoundUpNeg() {
- String a = "-92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = -24;
- String b = "7472334223847623782375469293018787918347987234564568";
- int bScale = 13;
- String c = "-1.24390557635720517122423359799284E+53";
- int resScale = -21;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_UP);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Divide: rounding mode is ROUND_UP, result is positive
- */
- public void testDivideRoundUpPos() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = -24;
- String b = "7472334223847623782375469293018787918347987234564568";
- int bScale = 13;
- String c = "1.24390557635720517122423359799284E+53";
- int resScale = -21;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_UP);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- public void testDivideSmall() {
- BigDecimal a = BigDecimal.valueOf(6);
- BigDecimal b = BigDecimal.valueOf(2);
- BigDecimal quotient = a.divide(b);
- assertEquals("3", quotient.toString());
- quotient = a.divideToIntegralValue(b);
- assertEquals("3", quotient.toString());
- quotient = a.divide(BigDecimal.ONE);
- assertEquals("6", quotient.toString());
- quotient = a.divide(BigDecimal.ONE.negate());
- assertEquals("-6", quotient.toString());
- }
-
- /**
- * divideToIntegralValue(BigDecimal)
- */
- public void testDivideToIntegralValue() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = 45;
- String b = "134432345432345748766876876723342238476237823787879183470";
- int bScale = 70;
- String c = "277923185514690367474770683";
- int resScale = 0;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divideToIntegralValue(bNumber);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * divideToIntegralValue(BigDecimal, MathContext)
- */
- public void testDivideToIntegralValueMathContextDOWN() {
- String a = "3736186567876876578956958769675785435673453453653543654354365435675671119238118911893939591735";
- int aScale = 45;
- String b = "134432345432345748766876876723342238476237823787879183470";
- int bScale = 70;
- int precision = 75;
- RoundingMode rm = RoundingMode.DOWN;
- MathContext mc = new MathContext(precision, rm);
- String c = "2.7792318551469036747477068339450205874992634417590178670822889E+62";
- int resScale = -1;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divideToIntegralValue(bNumber, mc);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * divideToIntegralValue(BigDecimal, MathContext)
- */
- public void testDivideToIntegralValueMathContextUP() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = 45;
- String b = "134432345432345748766876876723342238476237823787879183470";
- int bScale = 70;
- int precision = 32;
- RoundingMode rm = RoundingMode.UP;
- MathContext mc = new MathContext(precision, rm);
- String c = "277923185514690367474770683";
- int resScale = 0;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.divideToIntegralValue(bNumber, mc);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- public void testDivideZero() {
- BigDecimal quotient = BigDecimal.ZERO.divide(BigDecimal.ONE);
- assertEquals(BigDecimal.ZERO, quotient);
- quotient = BigDecimal.ZERO.negate().divide(BigDecimal.ONE);
- assertEquals(BigDecimal.ZERO, quotient);
- try {
- quotient = BigDecimal.ZERO.divide(BigDecimal.ZERO);
- fail("Expected ArithmeticException, divide by zero");
- } catch (ArithmeticException expected) {
- }
- assertEquals(BigDecimal.ZERO, quotient);
- try {
- quotient = BigDecimal.ONE.divide(BigDecimal.ZERO);
- fail("Expected ArithmeticException, divide by zero");
- } catch (ArithmeticException expected) {
- }
- try {
- quotient = BigDecimal.ONE.divideToIntegralValue(BigDecimal.ZERO);
- fail("Expected ArithmeticException, divide by zero");
- } catch (ArithmeticException expected) {
- }
- }
-
- /**
- * Multiply two numbers of different scales
- */
- public void testMultiplyDiffScaleNegPos() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = -15;
- String b = "747233429293018787918347987234564568";
- int bScale = 10;
- String c = "9.20003122862175749786430095741145455670101391569026662845893091880727173060570190220616E+91";
- int cScale = -5;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.multiply(bNumber);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * Multiply two numbers of different scales
- */
- public void testMultiplyDiffScalePosNeg() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 10;
- String b = "747233429293018787918347987234564568";
- int bScale = -10;
- String c = "920003122862175749786430095741145455670101391569026662845893091880727173060570190220616";
- int cScale = 0;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.multiply(bNumber);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * Multiply two numbers of negative scales
- */
- public void testMultiplyEqualScaleNegNeg() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = -15;
- String b = "747233429293018787918347987234564568";
- int bScale = -10;
- String c = "9.20003122862175749786430095741145455670101391569026662845893091880727173060570190220616E+111";
- int cScale = -25;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.multiply(bNumber);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * Multiply two numbers of different scales using MathContext
- */
- public void testMultiplyMathContextDiffScaleNegPos() {
- String a = "488757458676796558668876576576579097029810457634781384756794987";
- int aScale = -63;
- String b = "747233429293018787918347987234564568";
- int bScale = 63;
- String c = "3.6521591193960361339707130098174381429788164316E+98";
- int cScale = -52;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- MathContext mc = new MathContext(47, RoundingMode.HALF_UP);
- BigDecimal result = aNumber.multiply(bNumber, mc);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * Multiply two numbers of different scales using MathContext
- */
- public void testMultiplyMathContextDiffScalePosNeg() {
- String a = "987667796597975765768768767866756808779810457634781384756794987";
- int aScale = 100;
- String b = "747233429293018787918347987234564568";
- int bScale = -70;
- String c = "7.3801839465418518653942222612429081498248509257207477E+68";
- int cScale = -16;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- MathContext mc = new MathContext(53, RoundingMode.HALF_UP);
- BigDecimal result = aNumber.multiply(bNumber, mc);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * Multiply two numbers of positive scales using MathContext
- */
- public void testMultiplyMathContextScalePosPos() {
- String a = "97665696756578755423325476545428779810457634781384756794987";
- int aScale = -25;
- String b = "87656965586786097685674786576598865";
- int bScale = 10;
- String c = "8.561078619600910561431314228543672720908E+108";
- int cScale = -69;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- MathContext mc = new MathContext(40, RoundingMode.HALF_DOWN);
- BigDecimal result = aNumber.multiply(bNumber, mc);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * Multiply two numbers of positive scales
- */
- public void testMultiplyScalePosPos() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 15;
- String b = "747233429293018787918347987234564568";
- int bScale = 10;
- String c = "92000312286217574978643009574114545567010139156902666284589309.1880727173060570190220616";
- int cScale = 25;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.multiply(bNumber);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * pow(int)
- */
- public void testPow() {
- String a = "123121247898748298842980";
- int aScale = 10;
- int exp = 10;
- String c = "8004424019039195734129783677098845174704975003788210729597"
- + "4875206425711159855030832837132149513512555214958035390490"
- + "798520842025826.594316163502809818340013610490541783276343"
- + "6514490899700151256484355936102754469438371850240000000000";
- int cScale = 100;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal result = aNumber.pow(exp);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * pow(0)
- */
- public void testPow0() {
- String a = "123121247898748298842980";
- int aScale = 10;
- int exp = 0;
- String c = "1";
- int cScale = 0;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal result = aNumber.pow(exp);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * pow(int, MathContext)
- */
- public void testPowMathContext() {
- String a = "123121247898748298842980";
- int aScale = 10;
- int exp = 10;
- String c = "8.0044E+130";
- int cScale = -126;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- MathContext mc = new MathContext(5, RoundingMode.HALF_UP);
- BigDecimal result = aNumber.pow(exp, mc);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * remainder(BigDecimal)
- */
- public void testRemainder1() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = 45;
- String b = "134432345432345748766876876723342238476237823787879183470";
- int bScale = 10;
- String res = "3736186567876.876578956958765675671119238118911893939591735";
- int resScale = 45;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.remainder(bNumber);
- assertEquals("incorrect quotient value", res, result.toString());
- assertEquals("incorrect quotient scale", resScale, result.scale());
- }
-
- /**
- * remainder(BigDecimal)
- */
- public void testRemainder2() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = -45;
- String b = "134432345432345748766876876723342238476237823787879183470";
- int bScale = 10;
- String res = "1149310942946292909508821656680979993738625937.2065885780";
- int resScale = 10;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.remainder(bNumber);
- assertEquals("incorrect quotient value", res, result.toString());
- assertEquals("incorrect quotient scale", resScale, result.scale());
- }
-
- /**
- * remainder(BigDecimal, MathContext)
- */
- public void testRemainderMathContextHALF_DOWN() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = -45;
- String b = "134432345432345748766876876723342238476237823787879183470";
- int bScale = 10;
- int precision = 75;
- RoundingMode rm = RoundingMode.HALF_DOWN;
- MathContext mc = new MathContext(precision, rm);
- String res = "1149310942946292909508821656680979993738625937.2065885780";
- int resScale = 10;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.remainder(bNumber, mc);
- assertEquals("incorrect quotient value", res, result.toString());
- assertEquals("incorrect quotient scale", resScale, result.scale());
- }
-
- /**
- * remainder(BigDecimal, MathContext)
- */
- public void testRemainderMathContextHALF_UP() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = 45;
- String b = "134432345432345748766876876723342238476237823787879183470";
- int bScale = 10;
- int precision = 15;
- RoundingMode rm = RoundingMode.HALF_UP;
- MathContext mc = new MathContext(precision, rm);
- String res = "3736186567876.876578956958765675671119238118911893939591735";
- int resScale = 45;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.remainder(bNumber, mc);
- assertEquals("incorrect quotient value", res, result.toString());
- assertEquals("incorrect quotient scale", resScale, result.scale());
- }
-
- /**
- * round(BigDecimal, MathContext)
- */
- public void testRoundMathContextHALF_DOWN() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = -45;
- int precision = 75;
- RoundingMode rm = RoundingMode.HALF_DOWN;
- MathContext mc = new MathContext(precision, rm);
- String res = "3.736186567876876578956958765675671119238118911893939591735E+102";
- int resScale = -45;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal result = aNumber.round(mc);
- assertEquals("incorrect quotient value", res, result.toString());
- assertEquals("incorrect quotient scale", resScale, result.scale());
- }
-
- /**
- * round(BigDecimal, MathContext)
- */
- public void testRoundMathContextHALF_UP() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = 45;
- int precision = 15;
- RoundingMode rm = RoundingMode.HALF_UP;
- MathContext mc = new MathContext(precision, rm);
- String res = "3736186567876.88";
- int resScale = 2;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal result = aNumber.round(mc);
- assertEquals("incorrect quotient value", res, result.toString());
- assertEquals("incorrect quotient scale", resScale, result.scale());
- }
-
- /**
- * round(BigDecimal, MathContext) when precision = 0
- */
- public void testRoundMathContextPrecision0() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = 45;
- int precision = 0;
- RoundingMode rm = RoundingMode.HALF_UP;
- MathContext mc = new MathContext(precision, rm);
- String res = "3736186567876.876578956958765675671119238118911893939591735";
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal result = aNumber.round(mc);
- assertEquals("incorrect quotient value", res, result.toString());
- assertEquals("incorrect quotient scale", aScale, result.scale());
- }
-
- /**
- * Subtract two numbers of different scales; the first is negative
- */
- public void testSubtractDiffScaleNegPos() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = -15;
- String b = "747233429293018787918347987234564568";
- int bScale = 10;
- String c = "1231212478987482988429808779810457634781310033452057698121208165201.2765435432";
- int cScale = 10;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.subtract(bNumber);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * Subtract two numbers of different scales; the first is positive
- */
- public void testSubtractDiffScalePosNeg() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 15;
- String b = "747233429293018787918347987234564568";
- int bScale = -10;
- String c = "-7472334291698975400195996883915836900189542365.218615243205013";
- int cScale = 15;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.subtract(bNumber);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * Subtract two numbers of equal negative scales
- */
- public void testSubtractEqualScaleNegNeg() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = -10;
- String b = "747233429293018787918347987234564568";
- int bScale = -10;
- String c = "1.231212478987482241196379486791669716433397522230419E+61";
- int cScale = -10;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.subtract(bNumber);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * Subtract two numbers of equal positive scales
- */
- public void testSubtractEqualScalePosPos() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 10;
- String b = "747233429293018787918347987234564568";
- int bScale = 10;
- String c = "123121247898748224119637948679166971643339.7522230419";
- int cScale = 10;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal result = aNumber.subtract(bNumber);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * Subtract two numbers of different scales using MathContext; the first is
- * negative
- */
- public void testSubtractMathContextDiffScaleNegPos() {
- String a = "986798656676789766678767876078779810457634781384756794987";
- int aScale = -15;
- String b = "747233429293018787918347987234564568";
- int bScale = 40;
- String c = "9.867986566767897666787678760787798104576347813847567949870000000000000E+71";
- int cScale = -2;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- MathContext mc = new MathContext(70, RoundingMode.HALF_DOWN);
- BigDecimal result = aNumber.subtract(bNumber, mc);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * Subtract two numbers of different scales using MathContext; the first is
- * positive
- */
- public void testSubtractMathContextDiffScalePosNeg() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 15;
- String b = "747233429293018787918347987234564568";
- int bScale = -10;
- String c = "-7.4723342916989754E+45";
- int cScale = -29;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- MathContext mc = new MathContext(17, RoundingMode.DOWN);
- BigDecimal result = aNumber.subtract(bNumber, mc);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * Subtract two numbers of equal positive scales using MathContext
- */
- public void testSubtractMathContextEqualScalePosPos() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 10;
- String b = "747233429293018787918347987234564568";
- int bScale = 10;
- String c = "1.23121247898749E+41";
- int cScale = -27;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- MathContext mc = new MathContext(15, RoundingMode.CEILING);
- BigDecimal result = aNumber.subtract(bNumber, mc);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-
- /**
- * ulp() of a negative BigDecimal
- */
- public void testUlpNeg() {
- String a = "-3736186567876876578956958765675671119238118911893939591735";
- int aScale = 45;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal result = aNumber.ulp();
- String res = "1E-45";
- int resScale = 45;
- assertEquals("incorrect value", res, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * ulp() of a positive BigDecimal
- */
- public void testUlpPos() {
- String a = "3736186567876876578956958765675671119238118911893939591735";
- int aScale = -45;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal result = aNumber.ulp();
- String res = "1E+45";
- int resScale = -45;
- assertEquals("incorrect value", res, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * ulp() of a negative BigDecimal
- */
- public void testUlpZero() {
- String a = "0";
- int aScale = 2;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal result = aNumber.ulp();
- String res = "0.01";
- int resScale = 2;
- assertEquals("incorrect value", res, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * ZERO.pow(0)
- */
- public void testZeroPow0() {
- String c = "1";
- int cScale = 0;
- BigDecimal result = BigDecimal.ZERO.pow(0);
- assertEquals("incorrect value", c, result.toString());
- assertEquals("incorrect scale", cScale, result.scale());
- }
-}
diff --git a/user/test/com/google/gwt/emultest/java/math/BigDecimalCompareTest.java b/user/test/com/google/gwt/emultest/java/math/BigDecimalCompareTest.java
deleted file mode 100644
index d91f5b1..0000000
--- a/user/test/com/google/gwt/emultest/java/math/BigDecimalCompareTest.java
+++ /dev/null
@@ -1,529 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-/**
- * author Elena Semukhina
- */
-package com.google.gwt.emultest.java.math;
-
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.emultest.java.util.EmulTestBase;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.math.MathContext;
-import java.math.RoundingMode;
-
-/**
- * Class: java.math.BigDecimal Methods: abs, compareTo, equals, hashCode, max,
- * min, negate, signum.
- */
-public class BigDecimalCompareTest extends EmulTestBase {
-
- /**
- * Abs(MathContext) of a negative BigDecimal.
- */
- public void testAbsMathContextNeg() {
- String a = "-123809648392384754573567356745735.63567890295784902768787678287E+21";
- BigDecimal aNumber = new BigDecimal(a);
- int precision = 15;
- RoundingMode rm = RoundingMode.HALF_DOWN;
- MathContext mc = new MathContext(precision, rm);
- String result = "1.23809648392385E+53";
- int resScale = -39;
- BigDecimal res = aNumber.abs(mc);
- assertEquals("incorrect value", result, res.toString());
- assertEquals("incorrect scale", resScale, res.scale());
- }
-
- /**
- * Abs(MathContext) of a positive BigDecimal.
- */
- public void testAbsMathContextPos() {
- String a = "123809648392384754573567356745735.63567890295784902768787678287E+21";
- BigDecimal aNumber = new BigDecimal(a);
- int precision = 41;
- RoundingMode rm = RoundingMode.HALF_EVEN;
- MathContext mc = new MathContext(precision, rm);
- String result = "1.2380964839238475457356735674573563567890E+53";
- int resScale = -13;
- BigDecimal res = aNumber.abs(mc);
- assertEquals("incorrect value", result, res.toString());
- assertEquals("incorrect scale", resScale, res.scale());
- }
-
- /**
- * Abs() of a negative BigDecimal.
- */
- public void testAbsNeg() {
- String a = "-123809648392384754573567356745735.63567890295784902768787678287E+21";
- BigDecimal aNumber = new BigDecimal(a);
- String result = "123809648392384754573567356745735635678902957849027687.87678287";
- assertEquals("incorrect value", result, aNumber.abs().toString());
- }
-
- /**
- * Abs() of a positive BigDecimal.
- */
- public void testAbsPos() {
- String a = "123809648392384754573567356745735.63567890295784902768787678287E+21";
- BigDecimal aNumber = new BigDecimal(a);
- String result = "123809648392384754573567356745735635678902957849027687.87678287";
- assertEquals("incorrect value", result, aNumber.abs().toString());
- }
-
- /**
- * Compare to a number of an equal scale.
- */
- public void testCompareEqualScale1() {
- String a = "12380964839238475457356735674573563567890295784902768787678287";
- int aScale = 18;
- String b = "4573563567890295784902768787678287";
- int bScale = 18;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- int result = 1;
- assertEquals("incorrect result", result, aNumber.compareTo(bNumber));
- }
-
- /**
- * Compare to a number of an equal scale.
- */
- public void testCompareEqualScale2() {
- String a = "12380964839238475457356735674573563567890295784902768787678287";
- int aScale = 18;
- String b = "4573563923487289357829759278282992758247567890295784902768787678287";
- int bScale = 18;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- int result = -1;
- assertEquals("incorrect result", result, aNumber.compareTo(bNumber));
- }
-
- /**
- * Compare to a number of an greater scale.
- */
- public void testCompareGreaterScale1() {
- String a = "12380964839238475457356735674573563567890295784902768787678287";
- int aScale = 28;
- String b = "4573563567890295784902768787678287";
- int bScale = 18;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- int result = 1;
- assertEquals("incorrect result", result, aNumber.compareTo(bNumber));
- }
-
- /**
- * Compare to a number of an greater scale.
- */
- public void testCompareGreaterScale2() {
- String a = "12380964839238475457356735674573563567890295784902768787678287";
- int aScale = 48;
- String b = "4573563567890295784902768787678287";
- int bScale = 2;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- int result = -1;
- assertEquals("incorrect result", result, aNumber.compareTo(bNumber));
- }
-
- /**
- * Compare to a number of an less scale.
- */
- public void testCompareLessScale1() {
- String a = "12380964839238475457356735674573563567890295784902768787678287";
- int aScale = 18;
- String b = "4573563567890295784902768787678287";
- int bScale = 28;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- int result = 1;
- assertEquals("incorrect result", result, aNumber.compareTo(bNumber));
- }
-
- /**
- * Compare to a number of an less scale.
- */
- public void testCompareLessScale2() {
- String a = "12380964839238475457356735674573";
- int aScale = 36;
- String b = "45735635948573894578349572001798379183767890295784902768787678287";
- int bScale = 48;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- int result = -1;
- assertEquals("incorrect result", result, aNumber.compareTo(bNumber));
- }
-
- /**
- * equals() for equal BigDecimals.
- */
- public void testEqualsEqual() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = -24;
- String b = "92948782094488478231212478987482988429808779810457634781384756794987";
- int bScale = -24;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- assertEquals(aNumber, bNumber);
- }
-
- /**
- * equals() for equal BigDecimals.
- */
- public void testEqualsNull() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = -24;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- assertFalse(aNumber.equals(null));
- }
-
- /**
- * Equals() for unequal BigDecimals.
- */
- public void testEqualsUnequal1() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = -24;
- String b = "7472334223847623782375469293018787918347987234564568";
- int bScale = 13;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- assertFalse(aNumber.equals(bNumber));
- }
-
- /**
- * Equals() for unequal BigDecimals.
- */
- public void testEqualsUnequal2() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = -24;
- String b = "92948782094488478231212478987482988429808779810457634781384756794987";
- int bScale = 13;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- assertFalse(aNumber.equals(bNumber));
- }
-
- /**
- * Equals() for unequal BigDecimals.
- */
- public void testEqualsUnequal3() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = -24;
- String b = "92948782094488478231212478987482988429808779810457634781384756794987";
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- assertFalse(aNumber.equals(b));
- }
-
- /**
- * hashCode() for equal BigDecimals.
- */
- public void testHashCodeEqual() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = -24;
- String b = "92948782094488478231212478987482988429808779810457634781384756794987";
- int bScale = -24;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- assertEquals("incorrect value", aNumber.hashCode(), bNumber.hashCode());
- }
-
- /**
- * hashCode() for unequal BigDecimals.
- */
- public void testHashCodeUnequal() {
- String a = "8478231212478987482988429808779810457634781384756794987";
- int aScale = 41;
- String b = "92948782094488478231212478987482988429808779810457634781384756794987";
- int bScale = -24;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- assertTrue("incorrect value", aNumber.hashCode() != bNumber.hashCode());
- }
-
- /**
- * max() for equal BigDecimals.
- */
- public void testMaxEqual() {
- String a = "8478231212478987482988429808779810457634781384756794987";
- int aScale = 41;
- String b = "8478231212478987482988429808779810457634781384756794987";
- int bScale = 41;
- String c = "8478231212478987482988429808779810457634781384756794987";
- int cScale = 41;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal cNumber = new BigDecimal(new BigInteger(c), cScale);
- assertEquals("incorrect value", cNumber, aNumber.max(bNumber));
- }
-
- /**
- * max() for unequal BigDecimals.
- */
- public void testMaxUnequal1() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = 24;
- String b = "92948782094488478231212478987482988429808779810457634781384756794987";
- int bScale = 41;
- String c = "92948782094488478231212478987482988429808779810457634781384756794987";
- int cScale = 24;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal cNumber = new BigDecimal(new BigInteger(c), cScale);
- assertEquals("incorrect value", cNumber, aNumber.max(bNumber));
- }
-
- /**
- * max() for unequal BigDecimals.
- */
- public void testMaxUnequal2() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = 41;
- String b = "94488478231212478987482988429808779810457634781384756794987";
- int bScale = 41;
- String c = "92948782094488478231212478987482988429808779810457634781384756794987";
- int cScale = 41;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal cNumber = new BigDecimal(new BigInteger(c), cScale);
- assertEquals("incorrect value", cNumber, aNumber.max(bNumber));
- }
-
- /**
- * min() for equal BigDecimals.
- */
- public void testMinEqual() {
- String a = "8478231212478987482988429808779810457634781384756794987";
- int aScale = 41;
- String b = "8478231212478987482988429808779810457634781384756794987";
- int bScale = 41;
- String c = "8478231212478987482988429808779810457634781384756794987";
- int cScale = 41;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal cNumber = new BigDecimal(new BigInteger(c), cScale);
- assertEquals("incorrect value", cNumber, aNumber.min(bNumber));
- }
-
- /**
- * min() for unequal BigDecimals.
- */
- public void testMinUnequal1() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = 24;
- String b = "92948782094488478231212478987482988429808779810457634781384756794987";
- int bScale = 41;
- String c = "92948782094488478231212478987482988429808779810457634781384756794987";
- int cScale = 41;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal cNumber = new BigDecimal(new BigInteger(c), cScale);
- assertEquals("incorrect value", cNumber, aNumber.min(bNumber));
- }
-
- /**
- * min() for unequal BigDecimals.
- */
- public void testMinUnequal2() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = 41;
- String b = "94488478231212478987482988429808779810457634781384756794987";
- int bScale = 41;
- String c = "94488478231212478987482988429808779810457634781384756794987";
- int cScale = 41;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
- BigDecimal cNumber = new BigDecimal(new BigInteger(c), cScale);
- assertEquals("incorrect value", cNumber, aNumber.min(bNumber));
- }
-
- /**
- * negate(MathContext) for a negative BigDecimal.
- */
- public void testNegateMathContextNegative() {
- if (!GWT.isScript()) {
- // OpenJDK fails this test, so for now we only run it in web mode
- return;
- }
- String a = "-92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = 49;
- int precision = 46;
- RoundingMode rm = RoundingMode.CEILING;
- MathContext mc = new MathContext(precision, rm);
- String c = "9294878209448847823.121247898748298842980877981";
- int cScale = 27;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal res = aNumber.negate(mc);
- assertEquals("incorrect value", c, res.toString());
- assertEquals("incorrect scale", cScale, res.scale());
- }
-
- /**
- * negate(MathContext) for a positive BigDecimal.
- */
- public void testNegateMathContextPositive() {
- if (!GWT.isScript()) {
- // OpenJDK fails this test, so for now we only run it in web mode
- return;
- }
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = 41;
- int precision = 37;
- RoundingMode rm = RoundingMode.FLOOR;
- MathContext mc = new MathContext(precision, rm);
- String c = "-929487820944884782312124789.8748298842";
- int cScale = 10;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal res = aNumber.negate(mc);
- assertEquals("incorrect value", c, res.toString());
- assertEquals("incorrect scale", cScale, res.scale());
- }
-
- /**
- * negate() for a negative BigDecimal.
- */
- public void testNegateNegative() {
- String a = "-92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = 41;
- String c = "92948782094488478231212478987482988429808779810457634781384756794987";
- int cScale = 41;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal cNumber = new BigDecimal(new BigInteger(c), cScale);
- assertEquals("incorrect value", cNumber, aNumber.negate());
- }
-
- /**
- * negate() for a positive BigDecimal.
- */
- public void testNegatePositive() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = 41;
- String c = "-92948782094488478231212478987482988429808779810457634781384756794987";
- int cScale = 41;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal cNumber = new BigDecimal(new BigInteger(c), cScale);
- assertEquals("incorrect value", cNumber, aNumber.negate());
- }
-
- /**
- * plus(MathContext) for a negative BigDecimal.
- */
- public void testPlusMathContextNegative() {
- String a = "-92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = 49;
- int precision = 46;
- RoundingMode rm = RoundingMode.CEILING;
- MathContext mc = new MathContext(precision, rm);
- String c = "-9294878209448847823.121247898748298842980877981";
- int cScale = 27;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal res = aNumber.plus(mc);
- assertEquals("incorrect value", c, res.toString());
- assertEquals("incorrect scale", cScale, res.scale());
- }
-
- /**
- * plus(MathContext) for a positive BigDecimal.
- */
- public void testPlusMathContextPositive() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = 41;
- int precision = 37;
- RoundingMode rm = RoundingMode.FLOOR;
- MathContext mc = new MathContext(precision, rm);
- String c = "929487820944884782312124789.8748298842";
- int cScale = 10;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal res = aNumber.plus(mc);
- assertEquals("incorrect value", c, res.toString());
- assertEquals("incorrect scale", cScale, res.scale());
- }
-
- /**
- * plus() for a negative BigDecimal.
- */
- public void testPlusNegative() {
- String a = "-92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = 41;
- String c = "-92948782094488478231212478987482988429808779810457634781384756794987";
- int cScale = 41;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal cNumber = new BigDecimal(new BigInteger(c), cScale);
- assertEquals("incorrect value", cNumber, aNumber.plus());
- }
-
- /**
- * plus() for a positive BigDecimal.
- */
- public void testPlusPositive() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = 41;
- String c = "92948782094488478231212478987482988429808779810457634781384756794987";
- int cScale = 41;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal cNumber = new BigDecimal(new BigInteger(c), cScale);
- assertEquals("incorrect value", cNumber, aNumber.plus());
- }
-
- /**
- * signum() for a negative BigDecimal.
- */
- public void testSignumNegative() {
- String a = "-92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = 41;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- assertEquals("incorrect value", -1, aNumber.signum());
- }
-
- /**
- * signum() for a positive BigDecimal.
- */
- public void testSignumPositive() {
- String a = "92948782094488478231212478987482988429808779810457634781384756794987";
- int aScale = 41;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- assertEquals("incorrect value", 1, aNumber.signum());
- }
-
- /**
- * signum() for zero.
- */
- public void testSignumZero() {
- String a = "0";
- int aScale = 41;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- assertEquals("incorrect value", 0, aNumber.signum());
- }
-}
diff --git a/user/test/com/google/gwt/emultest/java/math/BigDecimalConstructorsTest.java b/user/test/com/google/gwt/emultest/java/math/BigDecimalConstructorsTest.java
deleted file mode 100644
index fc87dd3..0000000
--- a/user/test/com/google/gwt/emultest/java/math/BigDecimalConstructorsTest.java
+++ /dev/null
@@ -1,762 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-/**
- * author Elena Semukhina
- */
-package com.google.gwt.emultest.java.math;
-
-import com.google.gwt.emultest.java.util.EmulTestBase;
-import com.google.gwt.junit.DoNotRunWith;
-import com.google.gwt.junit.Platform;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.math.MathContext;
-import java.math.RoundingMode;
-
-/**
- * Class: java.math.BigDecimal Methods: constructors and fields.
- */
-public class BigDecimalConstructorsTest extends EmulTestBase {
-
- /**
- * new BigDecimal(BigInteger value).
- */
- public void testConstrBI() {
- String a = "1231212478987482988429808779810457634781384756794987";
- BigInteger bA = new BigInteger(a);
- BigDecimal aNumber = new BigDecimal(bA);
- assertEquals("incorrect value", bA, aNumber.unscaledValue());
- assertEquals("incorrect scale", 0, aNumber.scale());
-
- try {
- new BigDecimal((BigInteger) null);
- fail("No NullPointerException");
- } catch (NullPointerException e) {
- // expected
- }
- }
-
- /**
- * new BigDecimal(BigInteger value, MathContext).
- */
- public void testConstrBigIntegerMathContext() {
- String a = "1231212478987482988429808779810457634781384756794987";
- BigInteger bA = new BigInteger(a);
- int precision = 46;
- RoundingMode rm = RoundingMode.CEILING;
- MathContext mc = new MathContext(precision, rm);
- String res = "1231212478987482988429808779810457634781384757";
- int resScale = -6;
- BigDecimal result = new BigDecimal(bA, mc);
- assertEquals("incorrect value", res, result.unscaledValue().toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * new BigDecimal(BigInteger value, int scale, MathContext).
- */
- public void testConstrBigIntegerScaleMathContext() {
- String a = "1231212478987482988429808779810457634781384756794987";
- BigInteger bA = new BigInteger(a);
- int aScale = 10;
- int precision = 46;
- RoundingMode rm = RoundingMode.CEILING;
- MathContext mc = new MathContext(precision, rm);
- String res = "1231212478987482988429808779810457634781384757";
- int resScale = 4;
- BigDecimal result = new BigDecimal(bA, aScale, mc);
- assertEquals("incorrect value", res, result.unscaledValue().toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * new BigDecimal(BigInteger value, int scale).
- */
- public void testConstrBIScale() {
- String a = "1231212478987482988429808779810457634781384756794987";
- BigInteger bA = new BigInteger(a);
- int aScale = 10;
- BigDecimal aNumber = new BigDecimal(bA, aScale);
- assertEquals("incorrect value", bA, aNumber.unscaledValue());
- assertEquals("incorrect scale", aScale, aNumber.scale());
- }
-
- /**
- * new BigDecimal(char[] value).
- */
- public void testConstrChar() {
- char value[] = {
- '-', '1', '2', '3', '8', '0', '.', '4', '7', '3', '8', 'E', '-', '4',
- '2', '3'};
- BigDecimal result = new BigDecimal(value);
- String res = "-1.23804738E-419";
- int resScale = 427;
- assertEquals("incorrect value", res, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
-
- try {
- // Regression for HARMONY-783
- new BigDecimal(new char[] {});
- fail("NumberFormatException has not been thrown");
- } catch (NumberFormatException e) {
- }
- }
-
- /**
- * new BigDecimal(char[] value, int offset, int len).
- */
- public void testConstrCharIntInt() {
- char value[] = {
- '-', '1', '2', '3', '8', '0', '.', '4', '7', '3', '8', 'E', '-', '4',
- '2', '3'};
- int offset = 3;
- int len = 12;
- BigDecimal result = new BigDecimal(value, offset, len);
- String res = "3.804738E-40";
- int resScale = 46;
- assertEquals("incorrect value", res, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
-
- try {
- // Regression for HARMONY-783
- new BigDecimal(new char[] {}, 0, 0);
- fail("NumberFormatException has not been thrown");
- } catch (NumberFormatException e) {
- }
- }
-
- /**
- * new BigDecimal(char[] value, int offset, int len, MathContext mc).
- */
- public void testConstrCharIntIntMathContext() {
- char value[] = {
- '-', '1', '2', '3', '8', '0', '.', '4', '7', '3', '8', 'E', '-', '4',
- '2', '3'};
- int offset = 3;
- int len = 12;
- int precision = 4;
- RoundingMode rm = RoundingMode.CEILING;
- MathContext mc = new MathContext(precision, rm);
- BigDecimal result = new BigDecimal(value, offset, len, mc);
- String res = "3.805E-40";
- int resScale = 43;
- assertEquals("incorrect value", res, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
-
- try {
- // Regression for HARMONY-783
- new BigDecimal(new char[] {}, 0, 0, MathContext.DECIMAL32);
- fail("NumberFormatException has not been thrown");
- } catch (NumberFormatException e) {
- }
- }
-
- /**
- * new BigDecimal(char[] value, int offset, int len, MathContext mc).
- */
- public void testConstrCharIntIntMathContextException1() {
- char value[] = {
- '-', '1', '2', '3', '8', '0', '.', '4', '7', '3', '8', 'E', '-', '4',
- '2', '3'};
- int offset = 3;
- int len = 120;
- int precision = 4;
- RoundingMode rm = RoundingMode.CEILING;
- MathContext mc = new MathContext(precision, rm);
- try {
- new BigDecimal(value, offset, len, mc);
- fail("NumberFormatException has not been thrown");
- } catch (NumberFormatException e) {
- }
- }
-
- /**
- * new BigDecimal(char[] value, int offset, int len, MathContext mc).
- */
- public void testConstrCharIntIntMathContextException2() {
- char value[] = {
- '-', '1', '2', '3', '8', '0', ',', '4', '7', '3', '8', 'E', '-', '4',
- '2', '3'};
- int offset = 3;
- int len = 120;
- int precision = 4;
- RoundingMode rm = RoundingMode.CEILING;
- MathContext mc = new MathContext(precision, rm);
- try {
- new BigDecimal(value, offset, len, mc);
- fail("NumberFormatException has not been thrown");
- } catch (NumberFormatException e) {
- }
- }
-
- /**
- * new BigDecimal(char[] value, MathContext mc).
- */
- public void testConstrCharMathContext() {
- char value[] = {
- '3', '8', '0', '.', '4', '7', '3', '8', 'E', '-', '4', '2'
- };
- int precision = 4;
- RoundingMode rm = RoundingMode.CEILING;
- MathContext mc = new MathContext(precision, rm);
- BigDecimal result = new BigDecimal(value, mc);
- String res = "3.805E-40";
- int resScale = 43;
- assertEquals("incorrect value", res, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
-
- // Regression for HARMONY-783
- try {
- new BigDecimal(new char[] {}, MathContext.DECIMAL32);
- fail("NumberFormatException has not been thrown");
- } catch (NumberFormatException e) {
- }
- }
-
- /**
- * new BigDecimal(double value).
- */
- public void testConstrDouble() {
- double a = 732546982374982347892379283571094797.287346782359284756;
- BigDecimal aNumber = new BigDecimal(a);
- BigDecimal expected = new BigDecimal(
- "732546982374982347892379283571094797.287346782359284756");
- assertEquals(expected, aNumber, 1e21);
- }
-
- /**
- * new BigDecimal(0.1).
- */
- public void testConstrDouble01() {
- double a = 1.E-1;
- BigDecimal aNumber = new BigDecimal(a);
- BigDecimal expected = new BigDecimal(
- ".1000000000000000055511151231257827021181583404541015625");
- assertEquals(expected, aNumber, 1e-9);
- }
-
- /**
- * new BigDecimal(0.555).
- */
- public void testConstrDouble02() {
- double a = 0.555;
- BigDecimal aNumber = new BigDecimal(a);
- BigDecimal expected = new BigDecimal(
- ".55500000000000004884981308350688777863979339599609375");
- assertEquals(expected, aNumber, 1e-8);
- }
-
- /**
- * new BigDecimal(double value) when value is denormalized.
- */
- @DoNotRunWith(Platform.HtmlUnit)
- public void testConstrDoubleDenormalized() {
- // HtmlUnit incorrectly converts the following double to a string
- double a = 2.274341322658976E-309;
- BigDecimal aNumber = new BigDecimal(a);
- BigDecimal expected = new BigDecimal(
- "2.274341322658976E-309");
- assertEquals(expected, aNumber, 1e-310);
- }
-
- /**
- * new BigDecimal(double, MathContext).
- */
- public void testConstrDoubleMathContext() {
- double a = 732546982374982347892379283571094797.287346782359284756;
- int precision = 21;
- RoundingMode rm = RoundingMode.CEILING;
- MathContext mc = new MathContext(precision, rm);
- BigDecimal result = new BigDecimal(a, mc);
- BigDecimal expected = new BigDecimal("732546982374982e21");
- assertEquals(expected, result, 1e21);
- try {
- new BigDecimal(Double.NaN);
- fail("Expected NumberFormatException on NaN");
- } catch (NumberFormatException expectedException) {
- }
- try {
- new BigDecimal(Double.POSITIVE_INFINITY);
- fail("Expected NumberFormatException on +Infinity");
- } catch (NumberFormatException expectedException) {
- }
- try {
- new BigDecimal(Double.NEGATIVE_INFINITY);
- fail("Expected NumberFormatException on -Infinity");
- } catch (NumberFormatException expectedException) {
- }
- }
-
- /**
- * new BigDecimal(-0.1).
- */
- public void testConstrDoubleMinus01() {
- double a = -1.E-1;
- BigDecimal aNumber = new BigDecimal(a);
- BigDecimal expected = new BigDecimal(
- "-.1000000000000000055511151231257827021181583404541015625");
- assertEquals(expected, aNumber, 1e-9);
- }
-
- /**
- * new BigDecimal(double value) when value is NaN.
- */
- public void testConstrDoubleNaN() {
- double a = Double.NaN;
- try {
- new BigDecimal(a);
- fail("NumberFormatException has not been caught");
- } catch (NumberFormatException e) {
- assertEquals("Improper exception message", "Infinite or NaN",
- e.getMessage());
- }
- }
-
- /**
- * new BigDecimal(double value) when value is positive infinity.
- */
- public void testConstrDoubleNegInfinity() {
- double a = Double.NEGATIVE_INFINITY;
- try {
- new BigDecimal(a);
- fail("NumberFormatException has not been caught");
- } catch (NumberFormatException e) {
- assertEquals("Improper exception message", "Infinite or NaN",
- e.getMessage());
- }
- }
-
- /**
- * new BigDecimal(double value) when value is positive infinity.
- */
- public void testConstrDoublePosInfinity() {
- double a = Double.POSITIVE_INFINITY;
- try {
- new BigDecimal(a);
- fail("NumberFormatException has not been caught");
- } catch (NumberFormatException e) {
- assertEquals("Improper exception message", "Infinite or NaN",
- e.getMessage());
- }
- }
-
- /**
- * new BigDecimal(int value).
- */
- public void testConstrInt() {
- int a = 732546982;
- String res = "732546982";
- int resScale = 0;
- BigDecimal result = new BigDecimal(a);
- assertEquals("incorrect value", res, result.unscaledValue().toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * new BigDecimal(int, MathContext).
- */
- public void testConstrIntMathContext() {
- int a = 732546982;
- int precision = 21;
- RoundingMode rm = RoundingMode.CEILING;
- MathContext mc = new MathContext(precision, rm);
- String res = "732546982";
- int resScale = 0;
- BigDecimal result = new BigDecimal(a, mc);
- assertEquals("incorrect value", res, result.unscaledValue().toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * new BigDecimal(long value).
- */
- public void testConstrLong() {
- long a = 4576578677732546982L;
- String res = "4576578677732546982";
- int resScale = 0;
- BigDecimal result = new BigDecimal(a);
- assertEquals("incorrect value", res, result.unscaledValue().toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * new BigDecimal(long, MathContext).
- */
- public void testConstrLongMathContext() {
- long a = 4576578677732546982L;
- int precision = 5;
- RoundingMode rm = RoundingMode.CEILING;
- MathContext mc = new MathContext(precision, rm);
- String res = "45766";
- int resScale = -14;
- BigDecimal result = new BigDecimal(a, mc);
- assertEquals("incorrect value", res, result.unscaledValue().toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * new BigDecimal(String value) when value is not a valid representation of
- * BigDecimal.
- */
- public void testConstrStringException() {
- String a = "-238768.787678287a+10";
- try {
- new BigDecimal(a);
- fail("NumberFormatException has not been caught");
- } catch (NumberFormatException e) {
- }
- }
-
- /**
- * new BigDecimal(String value) when exponent is empty.
- */
- public void testConstrStringExceptionEmptyExponent1() {
- String a = "-238768.787678287e";
- try {
- new BigDecimal(a);
- fail("NumberFormatException has not been caught");
- } catch (NumberFormatException e) {
- }
- }
-
- /**
- * new BigDecimal(String value) when exponent is empty.
- */
- public void testConstrStringExceptionEmptyExponent2() {
- String a = "-238768.787678287e-";
- try {
- new BigDecimal(a);
- fail("NumberFormatException has not been caught");
- } catch (NumberFormatException e) {
- }
- }
-
- /**
- * new BigDecimal(String value) when exponent is greater than
- * Integer.MAX_VALUE.
- */
- public void testConstrStringExceptionExponentGreaterIntegerMax() {
- String a = "-238768.787678287e214748364767876";
- try {
- new BigDecimal(a);
- fail("NumberFormatException has not been caught");
- } catch (NumberFormatException e) {
- }
- }
-
- /**
- * new BigDecimal(String value) when exponent is less than Integer.MIN_VALUE.
- */
- public void testConstrStringExceptionExponentLessIntegerMin() {
- String a = "-238768.787678287e-214748364767876";
- try {
- new BigDecimal(a);
- fail("NumberFormatException has not been caught");
- } catch (NumberFormatException e) {
- }
- }
-
- /**
- * new BigDecimal(String value) when exponent is Integer.MAX_VALUE.
- */
- public void testConstrStringExponentIntegerMax() {
- String a = "-238768.787678287e2147483647";
- int aScale = -2147483638;
- BigInteger bA = new BigInteger("-238768787678287");
- BigDecimal aNumber = new BigDecimal(a);
- assertEquals("incorrect value", bA, aNumber.unscaledValue());
- assertEquals("incorrect scale", aScale, aNumber.scale());
- }
-
- /**
- * new BigDecimal(String value) when exponent is Integer.MIN_VALUE.
- */
- public void testConstrStringExponentIntegerMin() {
- String a = ".238768e-2147483648";
- try {
- new BigDecimal(a);
- fail("NumberFormatException expected");
- } catch (NumberFormatException e) {
- assertEquals("Improper exception message", "Scale out of range.",
- e.getMessage());
- }
- }
-
- /**
- * new BigDecimal(String value, MathContext).
- */
- public void testConstrStringMathContext() {
- String a = "-238768787678287e214";
- int precision = 5;
- RoundingMode rm = RoundingMode.CEILING;
- MathContext mc = new MathContext(precision, rm);
- String res = "-23876";
- int resScale = -224;
- BigDecimal result = new BigDecimal(a, mc);
- assertEquals("incorrect value", res, result.unscaledValue().toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * new BigDecimal(String value); value contains exponent and does not contain
- * decimal point.
- */
- public void testConstrStringWithExponentWithoutPoint1() {
- String a = "-238768787678287e214";
- int aScale = -214;
- BigInteger bA = new BigInteger("-238768787678287");
- BigDecimal aNumber = new BigDecimal(a);
- assertEquals("incorrect value", bA, aNumber.unscaledValue());
- assertEquals("incorrect scale", aScale, aNumber.scale());
- }
-
- /**
- * new BigDecimal(String value); value contains exponent and does not contain
- * decimal point.
- */
- public void testConstrStringWithExponentWithoutPoint2() {
- String a = "-238768787678287e-214";
- int aScale = 214;
- BigInteger bA = new BigInteger("-238768787678287");
- BigDecimal aNumber = new BigDecimal(a);
- assertEquals("incorrect value", bA, aNumber.unscaledValue());
- assertEquals("incorrect scale", aScale, aNumber.scale());
- }
-
- /**
- * new BigDecimal(String value); value contains exponent and does not contain
- * decimal point.
- */
- public void testConstrStringWithExponentWithoutPoint3() {
- String a = "238768787678287e-214";
- int aScale = 214;
- BigInteger bA = new BigInteger("238768787678287");
- BigDecimal aNumber = new BigDecimal(a);
- assertEquals("incorrect value", bA, aNumber.unscaledValue());
- assertEquals("incorrect scale", aScale, aNumber.scale());
- }
-
- /**
- * new BigDecimal(String value); value contains exponent and does not contain
- * decimal point.
- */
- public void testConstrStringWithExponentWithoutPoint4() {
- String a = "238768787678287e+214";
- int aScale = -214;
- BigInteger bA = new BigInteger("238768787678287");
- BigDecimal aNumber = new BigDecimal(a);
- assertEquals("incorrect value", bA, aNumber.unscaledValue());
- assertEquals("incorrect scale", aScale, aNumber.scale());
- }
-
- /**
- * new BigDecimal(String value); value contains exponent and does not contain
- * decimal point.
- */
- public void testConstrStringWithExponentWithoutPoint5() {
- String a = "238768787678287E214";
- int aScale = -214;
- BigInteger bA = new BigInteger("238768787678287");
- BigDecimal aNumber = new BigDecimal(a);
- assertEquals("incorrect value", bA, aNumber.unscaledValue());
- assertEquals("incorrect scale", aScale, aNumber.scale());
- }
-
- /**
- * new BigDecimal(String value); value contains both exponent and decimal
- * point.
- */
- public void testConstrStringWithExponentWithPoint1() {
- String a = "23985439837984782435652424523876878.7678287e+214";
- int aScale = -207;
- BigInteger bA = new BigInteger("239854398379847824356524245238768787678287");
- BigDecimal aNumber = new BigDecimal(a);
- assertEquals("incorrect value", bA, aNumber.unscaledValue());
- assertEquals("incorrect scale", aScale, aNumber.scale());
- }
-
- /**
- * new BigDecimal(String value); value contains both exponent and decimal
- * point.
- */
- public void testConstrStringWithExponentWithPoint2() {
- String a = "238096483923847545735673567457356356789029578490276878.7678287e-214";
- int aScale = 221;
- BigInteger bA = new BigInteger(
- "2380964839238475457356735674573563567890295784902768787678287");
- BigDecimal aNumber = new BigDecimal(a);
- assertEquals("incorrect value", bA, aNumber.unscaledValue());
- assertEquals("incorrect scale", aScale, aNumber.scale());
- }
-
- /**
- * new BigDecimal(String value); value contains both exponent and decimal
- * point.
- */
- public void testConstrStringWithExponentWithPoint3() {
- String a = "2380964839238475457356735674573563567890.295784902768787678287E+21";
- int aScale = 0;
- BigInteger bA = new BigInteger(
- "2380964839238475457356735674573563567890295784902768787678287");
- BigDecimal aNumber = new BigDecimal(a);
- assertEquals("incorrect value", bA, aNumber.unscaledValue());
- assertEquals("incorrect scale", aScale, aNumber.scale());
- }
-
- /**
- * new BigDecimal(String value); value contains both exponent and decimal
- * point.
- */
- public void testConstrStringWithExponentWithPoint4() {
- String a = "23809648392384754573567356745735635678.90295784902768787678287E+21";
- int aScale = 2;
- BigInteger bA = new BigInteger(
- "2380964839238475457356735674573563567890295784902768787678287");
- BigDecimal aNumber = new BigDecimal(a);
- assertEquals("incorrect value", bA, aNumber.unscaledValue());
- assertEquals("incorrect scale", aScale, aNumber.scale());
- }
-
- /**
- * new BigDecimal(String value); value contains both exponent and decimal
- * point.
- */
- public void testConstrStringWithExponentWithPoint5() {
- String a = "238096483923847545735673567457356356789029.5784902768787678287E+21";
- int aScale = -2;
- BigInteger bA = new BigInteger(
- "2380964839238475457356735674573563567890295784902768787678287");
- BigDecimal aNumber = new BigDecimal(a);
- assertEquals("incorrect value", bA, aNumber.unscaledValue());
- assertEquals("incorrect scale", aScale, aNumber.scale());
- }
-
- /**
- * new BigDecimal(String value); value does not contain exponent.
- */
- public void testConstrStringWithoutExpNeg() {
- String a = "-732546982374982347892379283571094797.287346782359284756";
- int aScale = 18;
- BigInteger bA = new BigInteger(
- "-732546982374982347892379283571094797287346782359284756");
- BigDecimal aNumber = new BigDecimal(a);
- assertEquals("incorrect value", bA, aNumber.unscaledValue());
- assertEquals("incorrect scale", aScale, aNumber.scale());
- }
-
- /**
- * new BigDecimal(String value); value does not contain exponent.
- */
- public void testConstrStringWithoutExpPos1() {
- String a = "732546982374982347892379283571094797.287346782359284756";
- int aScale = 18;
- BigInteger bA = new BigInteger(
- "732546982374982347892379283571094797287346782359284756");
- BigDecimal aNumber = new BigDecimal(a);
- assertEquals("incorrect value", bA, aNumber.unscaledValue());
- assertEquals("incorrect scale", aScale, aNumber.scale());
- }
-
- /**
- * new BigDecimal(String value); value does not contain exponent.
- */
- public void testConstrStringWithoutExpPos2() {
- String a = "+732546982374982347892379283571094797.287346782359284756";
- int aScale = 18;
- BigInteger bA = new BigInteger(
- "732546982374982347892379283571094797287346782359284756");
- BigDecimal aNumber = new BigDecimal(a);
- assertEquals("incorrect value", bA, aNumber.unscaledValue());
- assertEquals("incorrect scale", aScale, aNumber.scale());
- }
-
- /**
- * new BigDecimal(String value); value does not contain exponent and decimal
- * point.
- */
- public void testConstrStringWithoutExpWithoutPoint() {
- String a = "-732546982374982347892379283571094797287346782359284756";
- int aScale = 0;
- BigInteger bA = new BigInteger(
- "-732546982374982347892379283571094797287346782359284756");
- BigDecimal aNumber = new BigDecimal(a);
- assertEquals("incorrect value", bA, aNumber.unscaledValue());
- assertEquals("incorrect scale", aScale, aNumber.scale());
- }
-
- /**
- * check ONE.
- */
- public void testFieldONE() {
- String oneS = "1";
- double oneD = 1.0;
- assertEquals("incorrect string value", oneS, BigDecimal.ONE.toString());
- assertEquals("incorrect double value", oneD, BigDecimal.ONE.doubleValue(),
- 0);
- }
-
- /**
- * check TEN.
- */
- public void testFieldTEN() {
- String oneS = "10";
- double oneD = 10.0;
- assertEquals("incorrect string value", oneS, BigDecimal.TEN.toString());
- assertEquals("incorrect double value", oneD, BigDecimal.TEN.doubleValue(),
- 0);
- }
-
- /**
- * check ZERO.
- */
- public void testFieldZERO() {
- String oneS = "0";
- double oneD = 0.0;
- assertEquals("incorrect string value", oneS, BigDecimal.ZERO.toString());
- assertEquals("incorrect double value", oneD, BigDecimal.ZERO.doubleValue(),
- 0);
- }
-
- private void assertEquals(BigDecimal expected, BigDecimal actual,
- double delta) {
- BigDecimal actualDeltaDecimal = actual.subtract(expected);
- double actualDelta = actualDeltaDecimal.abs().doubleValue();
- if (actualDelta >= delta) {
- fail("expected=" + expected + " actual=" + actual + " delta="
- + actualDelta);
- }
- }
-}
diff --git a/user/test/com/google/gwt/emultest/java/math/BigDecimalConvertTest.java b/user/test/com/google/gwt/emultest/java/math/BigDecimalConvertTest.java
deleted file mode 100644
index e43953f..0000000
--- a/user/test/com/google/gwt/emultest/java/math/BigDecimalConvertTest.java
+++ /dev/null
@@ -1,656 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-/**
- * author Elena Semukhina
- */
-package com.google.gwt.emultest.java.math;
-
-import com.google.gwt.emultest.java.util.EmulTestBase;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-/**
- * Class: java.math.BigDecimal. Methods: doubleValue, floatValue, intValue,
- * longValue, valueOf, toString, toBigInteger
- */
-public class BigDecimalConvertTest extends EmulTestBase {
-
- public void testByteValue() {
- assertEquals((byte) 1, BigDecimal.ONE.byteValue());
- assertEquals((byte) -1, BigDecimal.valueOf(255).byteValue());
- assertEquals((byte) 1, BigDecimal.ONE.byteValueExact());
- try {
- BigDecimal.valueOf(255).byteValueExact();
- fail("Expected ArithmeticException on byteValueExact(255)");
- } catch (ArithmeticException expected) {
- }
- }
-
- /**
- * Double value of a small negative BigDecimal.
- */
- // TODO(jat): add back after Double.doubleToLongBits is implemented
-// public void testDoubleValueMinusZero() {
-// String a = "-123809648392384754573567356745735.63567890295784902768787678287E-400";
-// BigDecimal aNumber = new BigDecimal(a);
-// long minusZero = -9223372036854775808L;
-// double result = aNumber.doubleValue();
-// assertTrue("incorrect value", Double.doubleToLongBits(result) == minusZero);
-// }
-
- /**
- * Double value of a negative BigDecimal.
- */
- public void testDoubleValueNeg() {
- String a = "-123809648392384754573567356745735.63567890295784902768787678287E+21";
- BigDecimal aNumber = new BigDecimal(a);
- double result = -1.2380964839238476E53;
- assertEquals("incorrect value", result, aNumber.doubleValue(), 0);
- }
-
- /**
- * Double value of a large negative BigDecimal.
- */
- public void testDoubleValueNegInfinity() {
- String a = "-123809648392384754573567356745735.63567890295784902768787678287E+400";
- BigDecimal aNumber = new BigDecimal(a);
- double result = Double.NEGATIVE_INFINITY;
- assertEquals("incorrect value", result, aNumber.doubleValue(), 0);
- }
-
- /**
- * Double value of a small positive BigDecimal.
- */
- // TODO(jat): add back after Double.doubleToLongBits is implemented
-// public void testDoubleValuePlusZero() {
-// String a = "123809648392384754573567356745735.63567890295784902768787678287E-400";
-// BigDecimal aNumber = new BigDecimal(a);
-// long zero = 0;
-// double result = aNumber.doubleValue();
-// assertTrue("incorrect value", Double.doubleToLongBits(result) == zero);
-// }
-
- /**
- * Double value of a positive BigDecimal.
- */
- public void testDoubleValuePos() {
- String a = "123809648392384754573567356745735.63567890295784902768787678287E+21";
- BigDecimal aNumber = new BigDecimal(a);
- double result = 1.2380964839238476E53;
- assertEquals("incorrect value", result, aNumber.doubleValue(), 0);
- }
-
- /**
- * Double value of a large positive BigDecimal.
- */
- public void testDoubleValuePosInfinity() {
- String a = "123809648392384754573567356745735.63567890295784902768787678287E+400";
- BigDecimal aNumber = new BigDecimal(a);
- double result = Double.POSITIVE_INFINITY;
- assertEquals("incorrect value", result, aNumber.doubleValue(), 0);
- }
-
- /**
- * Float value of a small negative BigDecimal.
- */
- // TODO(jat): add back after Float.floatToIntBits is implemented
-// public void testFloatValueMinusZero() {
-// String a = "-123809648392384754573567356745735.63567890295784902768787678287E-400";
-// BigDecimal aNumber = new BigDecimal(a);
-// int minusZero = -2147483648;
-// float result = aNumber.floatValue();
-// assertTrue("incorrect value", Float.floatToIntBits(result) == minusZero);
-// }
-
- /**
- * Float value of a negative BigDecimal.
- */
- public void testFloatValueNeg() {
- String a = "-1238096483923847.6356789029578E+21";
- BigDecimal aNumber = new BigDecimal(a);
- float result = -1.2380965E36F;
- // Use range rather than exact value check, since GWT uses doubles anyway
- assertEquals("incorrect value", aNumber.floatValue(), result, 1E29);
- }
-
- /**
- * Float value of a large negative BigDecimal.
- */
- public void testFloatValueNegInfinity() {
- String a = "-123809648392384755735.63567887678287E+200";
- BigDecimal aNumber = new BigDecimal(a);
- float result = Float.NEGATIVE_INFINITY;
- assertTrue("incorrect value", aNumber.floatValue() == result);
- }
-
- /**
- * Float value of a small positive BigDecimal.
- */
- // TODO(jat): add back after Float.floatToIntBits is implemented
-// public void testFloatValuePlusZero() {
-// String a = "123809648392384754573567356745735.63567890295784902768787678287E-400";
-// BigDecimal aNumber = new BigDecimal(a);
-// int zero = 0;
-// float result = aNumber.floatValue();
-// assertTrue("incorrect value", Float.floatToIntBits(result) == zero);
-// }
-
- /**
- * Float value of a positive BigDecimal.
- */
- public void testFloatValuePos() {
- String a = "1238096483923847.6356789029578E+21";
- BigDecimal aNumber = new BigDecimal(a);
- float result = 1.2380965E36F;
- // Use range rather than exact value check, since GWT uses doubles anyway
- assertEquals("incorrect value", aNumber.floatValue(), result, 1E29);
- }
-
- /**
- * Float value of a large positive BigDecimal.
- */
- public void testFloatValuePosInfinity() {
- String a = "123809648373567356745735.6356789787678287E+200";
- BigDecimal aNumber = new BigDecimal(a);
- float result = Float.POSITIVE_INFINITY;
- assertTrue("incorrect value", aNumber.floatValue() == result);
- }
-
- /**
- * Integer value of a negative BigDecimal.
- */
- public void testIntValueNeg() {
- String a = "-123809648392384754573567356745735.63567890295784902768787678287E+21";
- BigDecimal aNumber = new BigDecimal(a);
- int result = 218520473;
- assertEquals("incorrect value", result, aNumber.intValue());
- try {
- aNumber.intValueExact();
- fail("Expected ArithmeticException on intValueExact");
- } catch (ArithmeticException expected) {
- }
- }
-
- /**
- * Integer value of a positive BigDecimal.
- */
- public void testIntValuePos() {
- String a = "123809648392384754573567356745735.63567890295784902768787678287E+21";
- BigDecimal aNumber = new BigDecimal(a);
- int result = -218520473;
- assertEquals("incorrect value", result, aNumber.intValue());
- try {
- aNumber.intValueExact();
- fail("Expected ArithmeticException on intValueExact");
- } catch (ArithmeticException expected) {
- }
- }
-
- /**
- * Long value of a negative BigDecimal.
- */
- public void testLongValueNeg() {
- String a = "-123809648392384754573567356745735.63567890295784902768787678287E+21";
- BigDecimal aNumber = new BigDecimal(a);
- long result = -1246043477766677607L;
- assertTrue("incorrect value", aNumber.longValue() == result);
- try {
- aNumber.longValueExact();
- fail("Expected ArithmeticException on longValueExact");
- } catch (ArithmeticException expected) {
- }
- }
-
- /**
- * Long value of a positive BigDecimal.
- */
- public void testLongValuePos() {
- String a = "123809648392384754573567356745735.63567890295784902768787678287E+21";
- BigDecimal aNumber = new BigDecimal(a);
- long result = 1246043477766677607L;
- assertTrue("incorrect value", aNumber.longValue() == result);
- try {
- aNumber.longValueExact();
- fail("Expected ArithmeticException on longValueExact");
- } catch (ArithmeticException expected) {
- }
- }
-
- /**
- * scaleByPowerOfTen(int n).
- */
- public void testScaleByPowerOfTen1() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 13;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal result = aNumber.scaleByPowerOfTen(10);
- String res = "1231212478987482988429808779810457634781384756794.987";
- int resScale = 3;
- assertEquals("incorrect value", res, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * scaleByPowerOfTen(int n).
- */
- public void testScaleByPowerOfTen2() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = -13;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal result = aNumber.scaleByPowerOfTen(10);
- String res = "1.231212478987482988429808779810457634781384756794987E+74";
- int resScale = -23;
- assertEquals("incorrect value", res, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- public void testShortValue() {
- BigDecimal value = BigDecimal.valueOf(0x13fff);
- assertEquals(0x3fff, value.shortValue());
- try {
- value.shortValueExact();
- fail("Expected ArithmeticException");
- } catch (ArithmeticException expected) {
- }
- }
-
- /**
- * toBigIntegerExact().
- */
- public void testToBigIntegerExact1() {
- String a = "-123809648392384754573567356745735.63567890295784902768787678287E+45";
- BigDecimal aNumber = new BigDecimal(a);
- String res = "-123809648392384754573567356745735635678902957849027687876782870000000000000000";
- BigInteger result = aNumber.toBigIntegerExact();
- assertEquals("incorrect value", res, result.toString());
- }
-
- /**
- * toBigIntegerExact().
- */
- public void testToBigIntegerExactException() {
- String a = "-123809648392384754573567356745735.63567890295784902768787678287E-10";
- BigDecimal aNumber = new BigDecimal(a);
- try {
- aNumber.toBigIntegerExact();
- fail("java.lang.ArithmeticException has not been thrown");
- } catch (java.lang.ArithmeticException e) {
- return;
- }
- }
-
- /**
- * Convert a negative BigDecimal to BigInteger.
- */
- public void testToBigIntegerNeg1() {
- String a = "-123809648392384754573567356745735.63567890295784902768787678287E+21";
- BigInteger bNumber = new BigInteger(
- "-123809648392384754573567356745735635678902957849027687");
- BigDecimal aNumber = new BigDecimal(a);
- BigInteger result = aNumber.toBigInteger();
- assertTrue("incorrect value", result.equals(bNumber));
- }
-
- /**
- * Convert a negative BigDecimal to BigInteger.
- */
- public void testToBigIntegerNeg2() {
- String a = "-123809648392384754573567356745735.63567890295784902768787678287E+15";
- BigInteger bNumber = new BigInteger(
- "-123809648392384754573567356745735635678902957849");
- BigDecimal aNumber = new BigDecimal(a);
- BigInteger result = aNumber.toBigInteger();
- assertTrue("incorrect value", result.equals(bNumber));
- }
-
- /**
- * Convert a negative BigDecimal to BigInteger.
- */
- public void testToBigIntegerNeg3() {
- String a = "-123809648392384754573567356745735.63567890295784902768787678287E+45";
- BigInteger bNumber = new BigInteger(
- "-123809648392384754573567356745735635678902957849027687876782870000000000000000");
- BigDecimal aNumber = new BigDecimal(a);
- BigInteger result = aNumber.toBigInteger();
- assertTrue("incorrect value", result.equals(bNumber));
- }
-
- /**
- * Convert a positive BigDecimal to BigInteger.
- */
- public void testToBigIntegerPos1() {
- String a = "123809648392384754573567356745735.63567890295784902768787678287E+21";
- BigInteger bNumber = new BigInteger(
- "123809648392384754573567356745735635678902957849027687");
- BigDecimal aNumber = new BigDecimal(a);
- BigInteger result = aNumber.toBigInteger();
- assertTrue("incorrect value", result.equals(bNumber));
- }
-
- /**
- * Convert a positive BigDecimal to BigInteger.
- */
- public void testToBigIntegerPos2() {
- String a = "123809648392384754573567356745735.63567890295784902768787678287E+15";
- BigInteger bNumber = new BigInteger(
- "123809648392384754573567356745735635678902957849");
- BigDecimal aNumber = new BigDecimal(a);
- BigInteger result = aNumber.toBigInteger();
- assertTrue("incorrect value", result.equals(bNumber));
- }
-
- /**
- * Convert a positive BigDecimal to BigInteger.
- */
- public void testToBigIntegerPos3() {
- String a = "123809648392384754573567356745735.63567890295784902768787678287E+45";
- BigInteger bNumber = new BigInteger(
- "123809648392384754573567356745735635678902957849027687876782870000000000000000");
- BigDecimal aNumber = new BigDecimal(a);
- BigInteger result = aNumber.toBigInteger();
- assertTrue("incorrect value", result.equals(bNumber));
- }
-
- /**
- * Convert a small BigDecimal to BigInteger.
- */
- public void testToBigIntegerZero() {
- String a = "-123809648392384754573567356745735.63567890295784902768787678287E-500";
- BigInteger bNumber = new BigInteger("0");
- BigDecimal aNumber = new BigDecimal(a);
- BigInteger result = aNumber.toBigInteger();
- assertTrue("incorrect value", result.equals(bNumber));
- }
-
- /**
- * Convert a negative BigDecimal to an engineering string representation.
- */
- public void testToEngineeringStringNeg() {
- String a = "-123809648392384754573567356745735.63567890295784902768787678287E-501";
- BigDecimal aNumber = new BigDecimal(a);
- String result = "-123.80964839238475457356735674573563567890295784902768787678287E-471";
- assertEquals("incorrect value", result, aNumber.toEngineeringString());
- }
-
- /**
- * Convert a positive BigDecimal to an engineering string representation.
- */
- public void testToEngineeringStringPos() {
- String a = "123809648392384754573567356745735.63567890295784902768787678287E-501";
- BigDecimal aNumber = new BigDecimal(a);
- String result = "123.80964839238475457356735674573563567890295784902768787678287E-471";
- assertEquals("incorrect value", result, aNumber.toEngineeringString());
- }
-
- /**
- * Convert a negative BigDecimal to an engineering string representation.
- */
- public void testToEngineeringStringZeroNegExponent() {
- String a = "0.0E-16";
- BigDecimal aNumber = new BigDecimal(a);
- String result = "0.00E-15";
- assertEquals("incorrect value", result, aNumber.toEngineeringString());
- }
-
- /**
- * Convert a negative BigDecimal to an engineering string representation.
- */
- public void testToEngineeringStringZeroPosExponent() {
- String a = "0.0E+16";
- BigDecimal aNumber = new BigDecimal(a);
- String result = "0E+15";
- assertEquals("incorrect value", result, aNumber.toEngineeringString());
- }
-
- /**
- * Convert a negative BigDecimal with a negative exponent to a plain string
- * representation; scale == 0.
- */
- public void testToPlainStringNegNegExp() {
- String a = "-123809648392384754573567356745735.63567890295784902768787678287E-100";
- BigDecimal aNumber = new BigDecimal(a);
- String result = "-0.000000000000000000000000000000000000000000000000000000000000000000012380964839238475457356735674573563567890295784902768787678287";
- assertTrue("incorrect value", aNumber.toPlainString().equals(result));
- }
-
- /**
- * Convert a negative BigDecimal with a positive exponent to a plain string
- * representation; scale == 0.
- */
- public void testToPlainStringNegPosExp() {
- String a = "-123809648392384754573567356745735.63567890295784902768787678287E100";
- BigDecimal aNumber = new BigDecimal(a);
- String result = "-1238096483923847545735673567457356356789029578490276878767828700000000000000000000000000000000000000000000000000000000000000000000000";
- assertTrue("incorrect value", aNumber.toPlainString().equals(result));
- }
-
- /**
- * Convert a positive BigDecimal with a negative exponent to a plain string
- * representation; scale == 0.
- */
- public void testToPlainStringPosNegExp() {
- String a = "123809648392384754573567356745735.63567890295784902768787678287E-100";
- BigDecimal aNumber = new BigDecimal(a);
- String result = "0.000000000000000000000000000000000000000000000000000000000000000000012380964839238475457356735674573563567890295784902768787678287";
- assertTrue("incorrect value", aNumber.toPlainString().equals(result));
- }
-
- /**
- * Convert a negative BigDecimal with a negative exponent to a plain string
- * representation; scale == 0.
- */
- public void testToPlainStringPosPosExp() {
- String a = "123809648392384754573567356745735.63567890295784902768787678287E+100";
- BigDecimal aNumber = new BigDecimal(a);
- String result = "1238096483923847545735673567457356356789029578490276878767828700000000000000000000000000000000000000000000000000000000000000000000000";
- assertTrue("incorrect value", aNumber.toPlainString().equals(result));
- }
-
- /**
- * Convert a negative BigDecimal to a string representation.
- */
- public void testToStringNeg() {
- String a = "-123.4564563673567380964839238475457356735674573563567890295784902768787678287E-5";
- BigDecimal aNumber = new BigDecimal(a);
- String result = "-0.001234564563673567380964839238475457356735674573563567890295784902768787678287";
- assertTrue("incorrect value", aNumber.toString().equals(result));
- }
-
- /**
- * Convert a positive BigDecimal to a string representation.
- */
- public void testToStringPos() {
- String a = "123809648392384754573567356745735.63567890295784902768787678287E-500";
- BigDecimal aNumber = new BigDecimal(a);
- String result = "1.2380964839238475457356735674573563567890295784902768787678287E-468";
- assertTrue("incorrect value", aNumber.toString().equals(result));
- }
-
- /**
- * Convert a BigDecimal to a string representation; scale == 0.
- */
- public void testToStringZeroScale() {
- String a = "-123809648392384754573567356745735635678902957849027687876782870";
- BigDecimal aNumber = new BigDecimal(new BigInteger(a));
- String result = "-123809648392384754573567356745735635678902957849027687876782870";
- assertTrue("incorrect value", aNumber.toString().equals(result));
- }
-
- /**
- * valueOf(Double.NaN).
- */
- public void testValueOfDoubleNaN() {
- double a = Double.NaN;
- try {
- BigDecimal.valueOf(a);
- fail("NumberFormatException has not been thrown for Double.NaN");
- } catch (NumberFormatException e) {
- return;
- }
- }
-
- /**
- * Create a BigDecimal from a negative double value.
- */
- public void testValueOfDoubleNeg() {
- double a = -65678765876567576.98788767;
- BigDecimal result = BigDecimal.valueOf(a);
- String res = "-65678765876567576";
- int resScale = 0;
- assertEquals("incorrect value", res, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Create a BigDecimal from a positive double value.
- */
- public void testValueOfDoublePos1() {
- double a = 65678765876567576.98788767;
- BigDecimal result = BigDecimal.valueOf(a);
- String res = "65678765876567576";
- int resScale = 0;
- assertEquals("incorrect value", res, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Create a BigDecimal from a positive double value.
- */
- public void testValueOfDoublePos2() {
- double a = 12321237576.98788767;
- BigDecimal result = BigDecimal.valueOf(a);
- String res = "12321237576.987888";
- int resScale = 6;
- assertEquals("incorrect value", res, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Create a BigDecimal from a positive double value.
- */
- public void testValueOfDoublePos3() {
- double a = 12321237576.9878838;
- BigDecimal result = BigDecimal.valueOf(a);
- String res = "12321237576.987885";
- int resScale = 6;
- assertEquals("incorrect value", res, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Create a BigDecimal from a negative long value; scale is negative.
- */
- public void testValueOfNegScaleNeg() {
- long a = -98374823947823578L;
- int scale = -12;
- BigDecimal aNumber = BigDecimal.valueOf(a, scale);
- String result = "-9.8374823947823578E+28";
- assertTrue("incorrect value", aNumber.toString().equals(result));
- }
-
- /**
- * Create a BigDecimal from a negative long value; scale is positive.
- */
- public void testValueOfNegScalePos() {
- long a = -98374823947823578L;
- int scale = 12;
- BigDecimal aNumber = BigDecimal.valueOf(a, scale);
- String result = "-98374.823947823578";
- assertTrue("incorrect value", aNumber.toString().equals(result));
- }
-
- /**
- * Create a BigDecimal from a negative long value; scale is 0.
- */
- public void testValueOfNegZeroScale() {
- long a = -98374823947823578L;
- BigDecimal aNumber = BigDecimal.valueOf(a);
- String result = "-98374823947823578";
- assertTrue("incorrect value", aNumber.toString().equals(result));
- }
-
- /**
- * Create a BigDecimal from a negative long value; scale is negative.
- */
- public void testValueOfPosScaleNeg() {
- long a = 98374823947823578L;
- int scale = -12;
- BigDecimal aNumber = BigDecimal.valueOf(a, scale);
- String result = "9.8374823947823578E+28";
- assertTrue("incorrect value", aNumber.toString().equals(result));
- }
-
- /**
- * Create a BigDecimal from a negative long value; scale is positive.
- */
- public void testValueOfPosScalePos() {
- long a = 98374823947823578L;
- int scale = 12;
- BigDecimal aNumber = BigDecimal.valueOf(a, scale);
- String result = "98374.823947823578";
- assertTrue("incorrect value", aNumber.toString().equals(result));
- }
-
- /**
- * Create a BigDecimal from a positive long value; scale == 0.
- */
- public void testValueOfPosZeroScale() {
- long a = 98374823947823578L;
- BigDecimal aNumber = BigDecimal.valueOf(a);
- String result = "98374823947823578";
- assertTrue("incorrect value", aNumber.toString().equals(result));
- }
-
- /**
- * Create a BigDecimal from a zero value; with a small negative scale.
- */
- public void testValueOfZeroScaleNeg() {
- int scale = -2;
- BigDecimal number = BigDecimal.valueOf(0L, scale);
- assertEquals("incorrect value", "0E+2", number.toString());
- assertEquals("bad scale", scale, number.scale());
- }
-
- /**
- * Create a BigDecimal from a zero value; with a small positive scale.
- */
- public void testValueOfZeroScalePos() {
- int scale = 1;
- BigDecimal number = BigDecimal.valueOf(0L, scale);
- assertEquals("incorrect value", "0.0", number.toString());
- assertEquals("bad scale", scale, number.scale());
- }
-}
diff --git a/user/test/com/google/gwt/emultest/java/math/BigDecimalScaleOperationsTest.java b/user/test/com/google/gwt/emultest/java/math/BigDecimalScaleOperationsTest.java
deleted file mode 100644
index ab9a5c7..0000000
--- a/user/test/com/google/gwt/emultest/java/math/BigDecimalScaleOperationsTest.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-/**
- * author Elena Semukhina
- */
-package com.google.gwt.emultest.java.math;
-
-import com.google.gwt.emultest.java.util.EmulTestBase;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.math.RoundingMode;
-
-/**
- * Class: java.math.BigDecimal Methods: movePointLeft, movePointRight, scale,
- * setScale, unscaledValue *
- */
-public class BigDecimalScaleOperationsTest extends EmulTestBase {
-
- public void testScaleByPowerOfTen() {
- BigDecimal val = BigDecimal.ONE.scaleByPowerOfTen(1);
- assertEquals(10, val.intValue());
- }
-
- /**
- * Check the default scale
- */
- public void testScaleDefault() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int cScale = 0;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a));
- assertTrue("incorrect scale", aNumber.scale() == cScale);
- }
-
- /**
- * Check a negative scale
- */
- public void testScaleNeg() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = -10;
- int cScale = -10;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- assertTrue("incorrect scale", aNumber.scale() == cScale);
- }
-
- /**
- * Check a positive scale
- */
- public void testScalePos() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 10;
- int cScale = 10;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- assertTrue("incorrect scale", aNumber.scale() == cScale);
- }
-
- /**
- * Check the zero scale
- */
- public void testScaleZero() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 0;
- int cScale = 0;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- assertTrue("incorrect scale", aNumber.scale() == cScale);
- }
-
- /**
- * Check the unscaled value
- */
- public void testUnscaledValue() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 100;
- BigInteger bNumber = new BigInteger(a);
- BigDecimal aNumber = new BigDecimal(bNumber, aScale);
- assertTrue("incorrect unscaled value", aNumber.unscaledValue().equals(
- bNumber));
- }
-
- /**
- * Set a greater new scale
- */
- public void testSetScaleGreater() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 18;
- int newScale = 28;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = aNumber.setScale(newScale);
- assertTrue("incorrect scale", bNumber.scale() == newScale);
- assertEquals("incorrect value", 0, bNumber.compareTo(aNumber));
- }
-
- /**
- * Set a less new scale; this.scale == 8; newScale == 5.
- */
- public void testSetScaleLess() {
- String a = "2.345726458768760000E+10";
- int newScale = 5;
- BigDecimal aNumber = new BigDecimal(a);
- BigDecimal bNumber = aNumber.setScale(newScale);
- assertTrue("incorrect scale", bNumber.scale() == newScale);
- assertEquals("incorrect value", 0, bNumber.compareTo(aNumber));
- }
-
- /**
- * Verify an exception when setting a new scale
- */
- public void testSetScaleException() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 28;
- int newScale = 18;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- try {
- aNumber.setScale(newScale);
- fail("ArithmeticException has not been caught");
- } catch (ArithmeticException e) {
- assertEquals("Improper exception message", "Rounding necessary",
- e.getMessage());
- }
- }
-
- /**
- * Set the same new scale
- */
- public void testSetScaleSame() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 18;
- int newScale = 18;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = aNumber.setScale(newScale);
- assertTrue("incorrect scale", bNumber.scale() == newScale);
- assertTrue("incorrect value", bNumber.equals(aNumber));
- }
-
- /**
- * Set a new scale
- */
- public void testSetScaleRoundUp() {
- String a = "1231212478987482988429808779810457634781384756794987";
- String b = "123121247898748298842980877981045763478139";
- int aScale = 28;
- int newScale = 18;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = aNumber.setScale(newScale, BigDecimal.ROUND_UP);
- assertTrue("incorrect scale", bNumber.scale() == newScale);
- assertTrue("incorrect value", bNumber.unscaledValue().toString().equals(b));
- }
-
- /**
- * Set a new scale
- */
- public void testSetScaleRoundDown() {
- String a = "1231212478987482988429808779810457634781384756794987";
- String b = "123121247898748298842980877981045763478138";
- int aScale = 28;
- int newScale = 18;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = aNumber.setScale(newScale, BigDecimal.ROUND_DOWN);
- assertTrue("incorrect scale", bNumber.scale() == newScale);
- assertTrue("incorrect value", bNumber.unscaledValue().toString().equals(b));
- }
-
- /**
- * Set a new scale
- */
- public void testSetScaleRoundCeiling() {
- String a = "1231212478987482988429808779810457634781384756794987";
- String b = "123121247898748298842980877981045763478139";
- int aScale = 28;
- int newScale = 18;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = aNumber.setScale(newScale, BigDecimal.ROUND_CEILING);
- assertTrue("incorrect scale", bNumber.scale() == newScale);
- assertTrue("incorrect value", bNumber.unscaledValue().toString().equals(b));
- }
-
- /**
- * Set a new scale
- */
- public void testSetScaleRoundFloor() {
- String a = "1231212478987482988429808779810457634781384756794987";
- String b = "123121247898748298842980877981045763478138";
- int aScale = 28;
- int newScale = 18;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = aNumber.setScale(newScale, BigDecimal.ROUND_FLOOR);
- assertTrue("incorrect scale", bNumber.scale() == newScale);
- assertTrue("incorrect value", bNumber.unscaledValue().toString().equals(b));
- }
-
- /**
- * Set a new scale
- */
- public void testSetScaleRoundHalfUp() {
- String a = "1231212478987482988429808779810457634781384756794987";
- String b = "123121247898748298842980877981045763478138";
- int aScale = 28;
- int newScale = 18;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = aNumber.setScale(newScale, BigDecimal.ROUND_HALF_UP);
- assertTrue("incorrect scale", bNumber.scale() == newScale);
- assertTrue("incorrect value", bNumber.unscaledValue().toString().equals(b));
- }
-
- /**
- * Set a new scale
- */
- public void testSetScaleRoundHalfDown() {
- String a = "1231212478987482988429808779810457634781384756794987";
- String b = "123121247898748298842980877981045763478138";
- int aScale = 28;
- int newScale = 18;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = aNumber.setScale(newScale, BigDecimal.ROUND_HALF_DOWN);
- assertTrue("incorrect scale", bNumber.scale() == newScale);
- assertTrue("incorrect value", bNumber.unscaledValue().toString().equals(b));
- }
-
- /**
- * Set a new scale
- */
- public void testSetScaleRoundHalfEven() {
- String a = "1231212478987482988429808779810457634781384756794987";
- String b = "123121247898748298842980877981045763478138";
- int aScale = 28;
- int newScale = 18;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = aNumber.setScale(newScale, BigDecimal.ROUND_HALF_EVEN);
- assertTrue("incorrect scale", bNumber.scale() == newScale);
- assertTrue("incorrect value", bNumber.unscaledValue().toString().equals(b));
- }
-
- /**
- * SetScale(int, RoundingMode)
- */
- public void testSetScaleIntRoundingMode() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 28;
- int newScale = 18;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal result = aNumber.setScale(newScale, RoundingMode.HALF_EVEN);
- String res = "123121247898748298842980.877981045763478138";
- int resScale = 18;
- assertEquals("incorrect value", res, result.toString());
- assertEquals("incorrect scale", resScale, result.scale());
- }
-
- /**
- * Move the decimal point to the left; the shift value is positive
- */
- public void testMovePointLeftPos() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 28;
- int shift = 18;
- int resScale = 46;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = aNumber.movePointLeft(shift);
- assertTrue("incorrect scale", bNumber.scale() == resScale);
- assertTrue("incorrect value", bNumber.unscaledValue().toString().equals(a));
- }
-
- /**
- * Move the decimal point to the left; the shift value is positive
- */
- public void testMovePointLeftNeg() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 28;
- int shift = -18;
- int resScale = 10;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = aNumber.movePointLeft(shift);
- assertTrue("incorrect scale", bNumber.scale() == resScale);
- assertTrue("incorrect value", bNumber.unscaledValue().toString().equals(a));
- }
-
- /**
- * Move the decimal point to the right; the shift value is positive
- */
- public void testMovePointRightPosGreater() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 28;
- int shift = 18;
- int resScale = 10;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = aNumber.movePointRight(shift);
- assertTrue("incorrect scale", bNumber.scale() == resScale);
- assertTrue("incorrect value", bNumber.unscaledValue().toString().equals(a));
- }
-
- /**
- * Move the decimal point to the right; the shift value is positive
- */
- public void testMovePointRightPosLess() {
- String a = "1231212478987482988429808779810457634781384756794987";
- String b = "123121247898748298842980877981045763478138475679498700";
- int aScale = 28;
- int shift = 30;
- int resScale = 0;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = aNumber.movePointRight(shift);
- assertTrue("incorrect scale", bNumber.scale() == resScale);
- assertTrue("incorrect value", bNumber.unscaledValue().toString().equals(b));
- }
-
- /**
- * Move the decimal point to the right; the shift value is positive
- */
- public void testMovePointRightNeg() {
- String a = "1231212478987482988429808779810457634781384756794987";
- int aScale = 28;
- int shift = -18;
- int resScale = 46;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- BigDecimal bNumber = aNumber.movePointRight(shift);
- assertTrue("incorrect scale", bNumber.scale() == resScale);
- assertTrue("incorrect value", bNumber.unscaledValue().toString().equals(a));
- }
-
- /**
- * Move the decimal point to the right when the scale overflows
- */
- public void testMovePointRightException() {
- String a = "12312124789874829887348723648726347429808779810457634781384756794987";
- int aScale = Integer.MAX_VALUE; // 2147483647
- int shift = -18;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- try {
- aNumber.movePointRight(shift);
- fail("ArithmeticException has not been caught");
- } catch (ArithmeticException e) {
- assertEquals("Improper exception message", "Underflow", e.getMessage());
- }
- }
-
- /**
- * precision()
- */
- public void testPrecision() {
- String a = "12312124789874829887348723648726347429808779810457634781384756794987";
- int aScale = 14;
- BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
- int prec = aNumber.precision();
- assertEquals(68, prec);
- }
-}
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerAddTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerAddTest.java
deleted file mode 100644
index aa125d1..0000000
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerAddTest.java
+++ /dev/null
@@ -1,503 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-/**
- * author Elena Semukhina
- */
-package com.google.gwt.emultest.java.math;
-
-import com.google.gwt.emultest.java.util.EmulTestBase;
-
-import java.math.BigInteger;
-
-/**
- * Class: java.math.BigInteger Method: add
- */
-public class BigIntegerAddTest extends EmulTestBase {
-
- /**
- * Add two positive numbers of the same length
- */
- public void testCase1() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {11, 22, 33, 44, 55, 66, 77, 11, 22, 33};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Add two negative numbers of the same length
- */
- public void testCase2() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = -1;
- int bSign = -1;
- byte rBytes[] = {-12, -23, -34, -45, -56, -67, -78, -12, -23, -33};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Add two numbers of the same length. The first one is positive and the
- * second is negative. The first one is greater in absolute value.
- */
- public void testCase3() {
- byte aBytes[] = {3, 4, 5, 6, 7, 8, 9};
- byte bBytes[] = {1, 2, 3, 4, 5, 6, 7};
- byte rBytes[] = {2, 2, 2, 2, 2, 2, 2};
- int aSign = 1;
- int bSign = -1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Add two numbers of the same length. The first one is negative and the
- * second is positive. The first one is greater in absolute value.
- */
- public void testCase4() {
- byte aBytes[] = {3, 4, 5, 6, 7, 8, 9};
- byte bBytes[] = {1, 2, 3, 4, 5, 6, 7};
- byte rBytes[] = {-3, -3, -3, -3, -3, -3, -2};
- int aSign = -1;
- int bSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Add two numbers of the same length. The first is positive and the second is
- * negative. The first is less in absolute value.
- */
- public void testCase5() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7};
- byte bBytes[] = {3, 4, 5, 6, 7, 8, 9};
- byte rBytes[] = {-3, -3, -3, -3, -3, -3, -2};
- int aSign = 1;
- int bSign = -1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Add two numbers of the same length. The first one is negative and the
- * second is positive. The first one is less in absolute value.
- */
- public void testCase6() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7};
- byte bBytes[] = {3, 4, 5, 6, 7, 8, 9};
- byte rBytes[] = {2, 2, 2, 2, 2, 2, 2};
- int aSign = -1;
- int bSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Add two positive numbers of different length. The first is longer.
- */
- public void testCase7() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {1, 2, 3, 4, 15, 26, 37, 41, 52, 63, 74, 15, 26, 37};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Add two positive numbers of different length. The second is longer.
- */
- public void testCase8() {
- byte aBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- byte bBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
- byte rBytes[] = {1, 2, 3, 4, 15, 26, 37, 41, 52, 63, 74, 15, 26, 37};
- BigInteger aNumber = new BigInteger(aBytes);
- BigInteger bNumber = new BigInteger(bBytes);
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Add two negative numbers of different length. The first is longer.
- */
- public void testCase9() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = -1;
- int bSign = -1;
- byte rBytes[] = {
- -2, -3, -4, -5, -16, -27, -38, -42, -53, -64, -75, -16, -27, -37};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Add two negative numbers of different length. The second is longer.
- */
- public void testCase10() {
- byte aBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- byte bBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
- int aSign = -1;
- int bSign = -1;
- byte rBytes[] = {
- -2, -3, -4, -5, -16, -27, -38, -42, -53, -64, -75, -16, -27, -37};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Add two numbers of different length and sign. The first is positive. The
- * first is longer.
- */
- public void testCase11() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {1, 2, 3, 3, -6, -15, -24, -40, -49, -58, -67, -6, -15, -23};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Add two numbers of different length and sign. The first is positive. The
- * second is longer.
- */
- public void testCase12() {
- byte aBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- byte bBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Add two numbers of different length and sign. The first is negative. The
- * first is longer.
- */
- public void testCase13() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Add two numbers of different length and sign. The first is negative. The
- * second is longer.
- */
- public void testCase14() {
- byte aBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- byte bBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[] = {1, 2, 3, 3, -6, -15, -24, -40, -49, -58, -67, -6, -15, -23};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Add two equal numbers of different signs
- */
- public void testCase15() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7};
- byte bBytes[] = {1, 2, 3, 4, 5, 6, 7};
- byte rBytes[] = {0};
- int aSign = -1;
- int bSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-
- /**
- * Add zero to a number
- */
- public void testCase16() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7};
- byte bBytes[] = {0};
- byte rBytes[] = {1, 2, 3, 4, 5, 6, 7};
- int aSign = 1;
- int bSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Add a number to zero
- */
- public void testCase17() {
- byte aBytes[] = {0};
- byte bBytes[] = {1, 2, 3, 4, 5, 6, 7};
- byte rBytes[] = {1, 2, 3, 4, 5, 6, 7};
- int aSign = 1;
- int bSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Add zero to zero
- */
- public void testCase18() {
- byte aBytes[] = {0};
- byte bBytes[] = {0};
- byte rBytes[] = {0};
- int aSign = 1;
- int bSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-
- /**
- * Add ZERO to a number
- */
- public void testCase19() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7};
- byte rBytes[] = {1, 2, 3, 4, 5, 6, 7};
- int aSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = BigInteger.ZERO;
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Add a number to zero
- */
- public void testCase20() {
- byte bBytes[] = {1, 2, 3, 4, 5, 6, 7};
- byte rBytes[] = {1, 2, 3, 4, 5, 6, 7};
- int bSign = 1;
- BigInteger aNumber = BigInteger.ZERO;
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Add ZERO to ZERO
- */
- public void testCase21() {
- byte rBytes[] = {0};
- BigInteger aNumber = BigInteger.ZERO;
- BigInteger bNumber = BigInteger.ZERO;
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-
- /**
- * Add ONE to ONE
- */
- public void testCase22() {
- byte rBytes[] = {2};
- BigInteger aNumber = BigInteger.ONE;
- BigInteger bNumber = BigInteger.ONE;
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Add two numbers so that carry is 1
- */
- public void testCase23() {
- byte aBytes[] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
- byte bBytes[] = {-1, -1, -1, -1, -1, -1, -1, -1};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {1, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -2};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.add(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-}
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerAndTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerAndTest.java
deleted file mode 100644
index d1db148..0000000
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerAndTest.java
+++ /dev/null
@@ -1,475 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-/**
- * author Elena Semukhina
- */
-package com.google.gwt.emultest.java.math;
-
-import com.google.gwt.emultest.java.util.EmulTestBase;
-
-import java.math.BigInteger;
-
-/**
- * Class: java.math.BigInteger Method: and
- */
-public class BigIntegerAndTest extends EmulTestBase {
-
- /**
- * And for two negative numbers; the first is longer
- */
- public void testNegNegFirstLonger() {
- byte aBytes[] = {
- -128, 9, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117, 23, 87,
- -25, -75};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = -1;
- int bSign = -1;
- byte rBytes[] = {
- -1, 127, -10, -57, -101, 1, 2, 2, 2, -96, -16, 8, -40, -59, 68, -88,
- -88, 16, 73};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.and(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * And for two negative numbers; the first is shorter
- */
- public void testNegNegFirstShorter() {
- byte aBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- byte bBytes[] = {
- -128, 9, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117, 23, 87,
- -25, -75};
- int aSign = -1;
- int bSign = -1;
- byte rBytes[] = {
- -1, 127, -10, -57, -101, 1, 2, 2, 2, -96, -16, 8, -40, -59, 68, -88,
- -88, 16, 73};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.and(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * And for two negative numbers of the same length
- */
- public void testNegNegSameLength() {
- byte aBytes[] = {-128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = -1;
- int bSign = -1;
- byte rBytes[] = {
- -1, 1, 2, 3, 3, 0, 65, -96, -48, -124, -60, 12, -40, -31, 97};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.and(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * And for a negative number and zero
- */
- public void testNegPos() {
- byte aBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- byte bBytes[] = {0};
- int aSign = -1;
- int bSign = 0;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.and(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-
- /**
- * And for a negative and a positive numbers; the first is longer
- */
- public void testNegPosFirstLonger() {
- byte aBytes[] = {
- -128, 9, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117, 23, 87,
- -25, -75};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[] = {73, -92, -48, 4, 12, 6, 4, 32, 48, 64, 0, 8, 3};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.and(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * And for a negative and a positive numbers; the first is shorter
- */
- public void testNegPosFirstShorter() {
- byte aBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- byte bBytes[] = {
- -128, 9, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117, 23, 87,
- -25, -75};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[] = {
- 0, -128, 9, 56, 100, 0, 0, 1, 1, 90, 1, -32, 0, 10, -126, 21, 82, -31,
- -95};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.and(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * And for two numbers of different signs and the same length
- */
- public void testNegPosSameLength() {
- byte aBytes[] = {-128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[] = {0, -2, 125, -60, -104, 1, 10, 6, 2, 32, 56, 2, 4, 4, 21};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.and(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * And for one and one
- */
- public void testOneOne() {
- BigInteger aNumber = BigInteger.ONE;
- BigInteger bNumber = BigInteger.ONE;
- BigInteger result = aNumber.and(bNumber);
- assertTrue(result.equals(BigInteger.ONE));
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * And for a positive and a negative numbers; the first is longer
- */
- public void testPosNegFirstLonger() {
- byte aBytes[] = {
- -128, 9, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117, 23, 87,
- -25, -75};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {
- 0, -128, 9, 56, 100, 0, 0, 1, 1, 90, 1, -32, 0, 10, -126, 21, 82, -31,
- -95};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.and(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * And for a positive and a negative numbers; the first is shorter
- */
- public void testPosNegFirstShorter() {
- byte aBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- byte bBytes[] = {
- -128, 9, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117, 23, 87,
- -25, -75};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {73, -92, -48, 4, 12, 6, 4, 32, 48, 64, 0, 8, 3};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.and(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * And for two numbers of different signs and the same length
- */
- public void testPosNegSameLength() {
- byte aBytes[] = {-128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {0, -6, -80, 72, 8, 75, 2, -79, 34, 16, -119};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.and(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * And for two positive numbers; the first is longer
- */
- public void testPosPosFirstLonger() {
- byte aBytes[] = {
- -128, 9, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117, 23, 87,
- -25, -75};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {0, -2, -76, 88, 44, 1, 2, 17, 35, 16, 9, 2, 5, 6, 21};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.and(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * And for two positive numbers; the first is shorter
- */
- public void testPosPosFirstShorter() {
- byte aBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- byte bBytes[] = {
- -128, 9, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117, 23, 87,
- -25, -75};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {0, -2, -76, 88, 44, 1, 2, 17, 35, 16, 9, 2, 5, 6, 21};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.and(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * And for two positive numbers of the same length
- */
- public void testPosPosSameLength() {
- byte aBytes[] = {-128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {0, -128, 56, 100, 4, 4, 17, 37, 16, 1, 64, 1, 10, 3};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.and(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * And for a positive number and zero
- */
- public void testPosZero() {
- byte aBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- byte bBytes[] = {0};
- int aSign = 1;
- int bSign = 0;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.and(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-
- /**
- * Test for a special case
- */
- public void testSpecialCase1() {
- byte aBytes[] = {-1, -1, -1, -1};
- byte bBytes[] = {5, -4, -3, -2};
- int aSign = -1;
- int bSign = -1;
- byte rBytes[] = {-1, 0, 0, 0, 0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.and(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Test for a special case
- */
- public void testSpecialCase2() {
- byte aBytes[] = {-51};
- byte bBytes[] = {-52, -51, -50, -49, -48};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[] = {0, -52, -51, -50, -49, 16};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.and(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * And for zero and a negative number
- */
- public void testZeroNeg() {
- byte aBytes[] = {0};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = 0;
- int bSign = -1;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.and(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-
- /**
- * And for zero and one
- */
- public void testZeroOne() {
- BigInteger aNumber = BigInteger.ZERO;
- BigInteger bNumber = BigInteger.ONE;
- BigInteger result = aNumber.and(bNumber);
- assertTrue(result.equals(BigInteger.ZERO));
- assertEquals("incorrect sign", 0, result.signum());
- }
-
- /**
- * And for zero and a positive number
- */
- public void testZeroPos() {
- byte aBytes[] = {0};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = 0;
- int bSign = 1;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.and(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-
- /**
- * And for zero and zero
- */
- public void testZeroZero() {
- byte aBytes[] = {0};
- byte bBytes[] = {0};
- int aSign = 0;
- int bSign = 0;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.and(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-}
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerCompareTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerCompareTest.java
deleted file mode 100644
index 8b56def..0000000
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerCompareTest.java
+++ /dev/null
@@ -1,530 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-/**
- * author Elena Semukhina
- */
-package com.google.gwt.emultest.java.math;
-
-import com.google.gwt.emultest.java.util.EmulTestBase;
-
-import java.math.BigInteger;
-
-/**
- * Class: java.math.BigInteger Methods: abs, compareTo, equals, max, min,
- * negate, signum
- */
-public class BigIntegerCompareTest extends EmulTestBase {
- /**
- * abs() for a negative number
- */
- public void testAbsNegative() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7};
- int aSign = -1;
- byte rBytes[] = {1, 2, 3, 4, 5, 6, 7};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.abs();
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * abs() for a positive number
- */
- public void testAbsPositive() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7};
- int aSign = 1;
- byte rBytes[] = {1, 2, 3, 4, 5, 6, 7};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.abs();
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * compareTo(BigInteger a). Compare two negative numbers. The first is less in
- * absolute value.
- */
- public void testCompareNegNeg2() {
- byte aBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- byte bBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = -1;
- int bSign = -1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- assertEquals(1, aNumber.compareTo(bNumber));
- }
-
- /**
- * compareTo(BigInteger a). Compare two numbers of different signs. The first
- * is positive.
- */
- public void testCompareToDiffSigns1() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = 1;
- int bSign = -1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- assertEquals(1, aNumber.compareTo(bNumber));
- }
-
- /**
- * compareTo(BigInteger a). Compare two numbers of different signs. The first
- * is negative.
- */
- public void testCompareToDiffSigns2() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = -1;
- int bSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- assertEquals(-1, aNumber.compareTo(bNumber));
- }
-
- /**
- * compareTo(BigInteger a). Compare two equal negative numbers.
- */
- public void testCompareToEqualNeg() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- byte bBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = -1;
- int bSign = -1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- assertEquals(0, aNumber.compareTo(bNumber));
- }
-
- /**
- * compareTo(BigInteger a). Compare two equal positive numbers.
- */
- public void testCompareToEqualPos() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- byte bBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = 1;
- int bSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- assertEquals(0, aNumber.compareTo(bNumber));
- }
-
- /**
- * compareTo(BigInteger a). Compare two negative numbers. The first is greater
- * in absolute value.
- */
- public void testCompareToNegNeg1() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = -1;
- int bSign = -1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- assertEquals(-1, aNumber.compareTo(bNumber));
- }
-
- /**
- * compareTo(BigInteger a). Compare a negative number to ZERO.
- */
- public void testCompareToNegZero() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = -1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = BigInteger.ZERO;
- assertEquals(-1, aNumber.compareTo(bNumber));
- }
-
- /**
- * compareTo(BigInteger a). Compare two positive numbers. The first is
- * greater.
- */
- public void testCompareToPosPos1() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = 1;
- int bSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- assertEquals(1, aNumber.compareTo(bNumber));
- }
-
- /**
- * compareTo(BigInteger a). Compare two positive numbers. The first is less.
- */
- public void testCompareToPosPos2() {
- byte aBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- byte bBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = 1;
- int bSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- assertEquals(-1, aNumber.compareTo(bNumber));
- }
-
- /**
- * compareTo(BigInteger a). Compare a positive number to ZERO.
- */
- public void testCompareToPosZero() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = BigInteger.ZERO;
- assertEquals(1, aNumber.compareTo(bNumber));
- }
-
- /**
- * compareTo(BigInteger a). Compare ZERO to a negative number.
- */
- public void testCompareToZeroNeg() {
- byte bBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- int bSign = -1;
- BigInteger aNumber = BigInteger.ZERO;
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- assertEquals(1, aNumber.compareTo(bNumber));
- }
-
- /**
- * compareTo(BigInteger a). Compare ZERO to a positive number.
- */
- public void testCompareToZeroPos() {
- byte bBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- int bSign = 1;
- BigInteger aNumber = BigInteger.ZERO;
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- assertEquals(-1, aNumber.compareTo(bNumber));
- }
-
- /**
- * compareTo(BigInteger a). Compare ZERO to ZERO.
- */
- public void testCompareToZeroZero() {
- BigInteger aNumber = BigInteger.ZERO;
- BigInteger bNumber = BigInteger.ZERO;
- assertEquals(0, aNumber.compareTo(bNumber));
- }
-
- /**
- * equals(Object obj). obj is a BigInteger. numbers are not equal.
- */
- public void testEqualsBigIntegerFalse() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- byte bBytes[] = {45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = 1;
- int bSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- Object bNumber = new BigInteger(bSign, bBytes);
- assertFalse(aNumber.equals(bNumber));
- }
-
- /**
- * equals(Object obj). obj is a BigInteger. numbers are equal.
- */
- public void testEqualsBigIntegerTrue() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- byte bBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = 1;
- int bSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- Object bNumber = new BigInteger(bSign, bBytes);
- assertTrue(aNumber.equals(bNumber));
- }
-
- /**
- * equals(null).
- */
- public void testEqualsNull() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- assertFalse(aNumber.equals(null));
- }
-
- /**
- * equals(Object obj). obj is not a BigInteger
- */
- public void testEqualsObject() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- Object obj = new Object();
- assertFalse(aNumber.equals(obj));
- }
-
- /**
- * max(BigInteger val). numbers are equal.
- */
- public void testMaxEqual() {
- byte aBytes[] = {45, 91, 3, -15, 35, 26, 3, 91};
- byte bBytes[] = {45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {45, 91, 3, -15, 35, 26, 3, 91};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.max(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * max(BigInteger val). the first is greater.
- */
- public void testMaxGreater() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- byte bBytes[] = {45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.max(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertTrue("incorrect sign", result.signum() == 1);
- result = bNumber.max(aNumber);
- assertEquals(aNumber, result);
- }
-
- /**
- * max(BigInteger val). the first is less.
- */
- public void testMaxLess() {
- byte aBytes[] = {45, 91, 3, -15, 35, 26, 3, 91};
- byte bBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.max(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertTrue("incorrect sign", result.signum() == 1);
- }
-
- /**
- * max(BigInteger val). max of negative and ZERO.
- */
- public void testMaxNegZero() {
- byte aBytes[] = {45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = -1;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = BigInteger.ZERO;
- BigInteger result = aNumber.max(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertTrue("incorrect sign", result.signum() == 0);
- }
-
- /**
- * min(BigInteger val). numbers are equal.
- */
- public void testMinEqual() {
- byte aBytes[] = {45, 91, 3, -15, 35, 26, 3, 91};
- byte bBytes[] = {45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {45, 91, 3, -15, 35, 26, 3, 91};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.min(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertTrue("incorrect sign", result.signum() == 1);
- }
-
- /**
- * min(BigInteger val). the first is greater.
- */
- public void testMinGreater() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- byte bBytes[] = {45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {45, 91, 3, -15, 35, 26, 3, 91};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.min(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * min(BigInteger val). the first is less.
- */
- public void testMinLess() {
- byte aBytes[] = {45, 91, 3, -15, 35, 26, 3, 91};
- byte bBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {45, 91, 3, -15, 35, 26, 3, 91};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.min(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * max(BigInteger val). min of positive and ZERO.
- */
- public void testMinPosZero() {
- byte aBytes[] = {45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = 1;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = BigInteger.ZERO;
- BigInteger result = aNumber.min(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertTrue("incorrect sign", result.signum() == 0);
- }
-
- /**
- * negate() a negative number.
- */
- public void testNegateNegative() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = -1;
- byte rBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.negate();
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- } for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
-
- assertTrue("incorrect sign", result.signum() == 1);
- }
-
- /**
- * negate() a positive number.
- */
- public void testNegatePositive() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = 1;
- byte rBytes[] = {
- -13, -57, -101, 1, 75, -90, -46, -92, -4, 14, -36, -27, -4, -91};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.negate();
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertTrue("incorrect sign", result.signum() == -1);
- }
-
- /**
- * negate() ZERO.
- */
- public void testNegateZero() {
- byte rBytes[] = {0};
- BigInteger aNumber = BigInteger.ZERO;
- BigInteger result = aNumber.negate();
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-
- /**
- * signum() of a negative number.
- */
- public void testSignumNegative() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = -1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- assertEquals("incorrect sign", -1, aNumber.signum());
- }
-
- /**
- * signum() of a positive number.
- */
- public void testSignumPositive() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-
- /**
- * signum() of ZERO.
- */
- public void testSignumZero() {
- BigInteger aNumber = BigInteger.ZERO;
- assertEquals("incorrect sign", 0, aNumber.signum());
- }
-}
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerConstructorsTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerConstructorsTest.java
deleted file mode 100644
index 6024e6f..0000000
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerConstructorsTest.java
+++ /dev/null
@@ -1,779 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-/**
- * author Elena Semukhina
- */
-package com.google.gwt.emultest.java.math;
-
-import com.google.gwt.emultest.java.util.EmulTestBase;
-
-import java.math.BigInteger;
-import java.util.Random;
-
-/**
- * Class: java.math.BigInteger Constructors: BigInteger(byte[] a),
- * BigInteger(int sign, byte[] a), BigInteger(String val, int radix)
- */
-public class BigIntegerConstructorsTest extends EmulTestBase {
- /**
- * Create a number from an array of bytes. Verify an exception thrown if an
- * array is zero bytes long
- */
- public void testConstructorBytesException() {
- byte aBytes[] = {};
- try {
- new BigInteger(aBytes);
- fail("NumberFormatException has not been caught");
- } catch (NumberFormatException e) {
- assertEquals("Improper exception message", "Zero length BigInteger",
- e.getMessage());
- }
- }
-
- /**
- * Create a negative number from an array of bytes. The number fits in an
- * array of integers.
- */
- public void testConstructorBytesNegative1() {
- byte aBytes[] = {-12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- byte rBytes[] = {-12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- BigInteger aNumber = new BigInteger(aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, aNumber.signum());
- }
-
- /**
- * Create a negative number from an array of bytes. The number fits in an
- * integer.
- */
- public void testConstructorBytesNegative2() {
- byte aBytes[] = {-12, 56, 100};
- byte rBytes[] = {-12, 56, 100};
- BigInteger aNumber = new BigInteger(aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, aNumber.signum());
- }
-
- /**
- * Create a negative number from an array of bytes. The number of bytes is 4.
- */
- public void testConstructorBytesNegative3() {
- byte aBytes[] = {-128, -12, 56, 100};
- byte rBytes[] = {-128, -12, 56, 100};
- BigInteger aNumber = new BigInteger(aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, aNumber.signum());
- }
-
- /**
- * Create a negative number from an array of bytes. The number of bytes is
- * multiple of 4.
- */
- public void testConstructorBytesNegative4() {
- byte aBytes[] = {-128, -12, 56, 100, -13, 56, 93, -78};
- byte rBytes[] = {-128, -12, 56, 100, -13, 56, 93, -78};
- BigInteger aNumber = new BigInteger(aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, aNumber.signum());
- }
-
- /**
- * Create a positive number from an array of bytes. The number of bytes is
- * multiple of 4.
- */
- public void testConstructorBytesPositive() {
- byte aBytes[] = {127, 56, 100, -1, 14, 75, -24, -100};
- byte rBytes[] = {127, 56, 100, -1, 14, 75, -24, -100};
- BigInteger aNumber = new BigInteger(aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-
- /**
- * Create a positive number from an array of bytes. The number fits in an
- * array of integers.
- */
- public void testConstructorBytesPositive1() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- byte rBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- BigInteger aNumber = new BigInteger(aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-
- /**
- * Create a positive number from an array of bytes. The number fits in an
- * integer.
- */
- public void testConstructorBytesPositive2() {
- byte aBytes[] = {12, 56, 100};
- byte rBytes[] = {12, 56, 100};
- BigInteger aNumber = new BigInteger(aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-
- /**
- * Create a positive number from an array of bytes. The number of bytes is 4.
- */
- public void testConstructorBytesPositive3() {
- byte aBytes[] = {127, 56, 100, -1};
- byte rBytes[] = {127, 56, 100, -1};
- BigInteger aNumber = new BigInteger(aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-
- /**
- * Create a zero number from an array of zero bytes.
- */
- public void testConstructorBytesZero() {
- byte aBytes[] = {0, 0, 0, -0, +0, 0, -0};
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, aNumber.signum());
- }
-
- /**
- * Create a prime number of 25 bits length.
- */
- public void testConstructorPrime() {
- int bitLen = 25;
- Random rnd = new Random();
- BigInteger aNumber = new BigInteger(bitLen, 80, rnd);
- assertTrue("incorrect bitLength", aNumber.bitLength() == bitLen);
- }
-
- /**
- * Create a prime number of 2 bits length.
- */
- public void testConstructorPrime2() {
- int bitLen = 2;
- Random rnd = new Random();
- BigInteger aNumber = new BigInteger(bitLen, 80, rnd);
- assertTrue("incorrect bitLength", aNumber.bitLength() == bitLen);
- int num = aNumber.intValue();
- assertTrue("incorrect value", num == 2 || num == 3);
- }
-
- /**
- * Create a random number of 75 bits length.
- */
- public void testConstructorRandom() {
- int bitLen = 75;
- Random rnd = new Random();
- BigInteger aNumber = new BigInteger(bitLen, rnd);
- assertTrue("incorrect bitLength", aNumber.bitLength() <= bitLen);
- }
-
- /**
- * Create a number from a sign and an array of bytes. Verify an exception
- * thrown if a sign has improper value.
- */
- public void testConstructorSignBytesException1() {
- byte aBytes[] = {123, 45, -3, -76};
- int aSign = 3;
- try {
- new BigInteger(aSign, aBytes);
- fail("NumberFormatException has not been caught");
- } catch (NumberFormatException e) {
- assertEquals("Improper exception message", "Invalid signum value",
- e.getMessage());
- }
- }
-
- /**
- * Create a number from a sign and an array of bytes. Verify an exception
- * thrown if the array contains non-zero bytes while the sign is 0.
- */
- public void testConstructorSignBytesException2() {
- byte aBytes[] = {123, 45, -3, -76};
- int aSign = 0;
- try {
- new BigInteger(aSign, aBytes);
- fail("NumberFormatException has not been caught");
- } catch (NumberFormatException e) {
- assertEquals("Improper exception message", "signum-magnitude mismatch",
- e.getMessage());
- }
- }
-
- /**
- * Create a negative number from a sign and an array of bytes. The number fits
- * in an array of integers. The most significant byte is positive.
- */
- public void testConstructorSignBytesNegative1() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15};
- int aSign = -1;
- byte rBytes[] = {-13, -57, -101, 1, 75, -90, -46, -92, -4, 15};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, aNumber.signum());
- }
-
- /**
- * Create a negative number from a sign and an array of bytes. The number fits
- * in an array of integers. The most significant byte is negative.
- */
- public void testConstructorSignBytesNegative2() {
- byte aBytes[] = {-12, 56, 100, -2, -76, 89, 45, 91, 3, -15};
- int aSign = -1;
- byte rBytes[] = {-1, 11, -57, -101, 1, 75, -90, -46, -92, -4, 15};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, aNumber.signum());
- }
-
- /**
- * Create a negative number from a sign and an array of bytes. The number fits
- * in an integer.
- */
- public void testConstructorSignBytesNegative3() {
- byte aBytes[] = {-12, 56, 100};
- int aSign = -1;
- byte rBytes[] = {-1, 11, -57, -100};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, aNumber.signum());
- }
-
- /**
- * Create a negative number from a sign and an array of bytes. The number of
- * bytes is 4. The most significant byte is positive.
- */
- public void testConstructorSignBytesNegative4() {
- byte aBytes[] = {127, 56, 100, -2};
- int aSign = -1;
- byte rBytes[] = {-128, -57, -101, 2};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, aNumber.signum());
- }
-
- /**
- * Create a negative number from a sign and an array of bytes. The number of
- * bytes is 4. The most significant byte is negative.
- */
- public void testConstructorSignBytesNegative5() {
- byte aBytes[] = {-127, 56, 100, -2};
- int aSign = -1;
- byte rBytes[] = {-1, 126, -57, -101, 2};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, aNumber.signum());
- }
-
- /**
- * Create a negative number from a sign and an array of bytes. The number of
- * bytes is multiple of 4. The most significant byte is positive.
- */
- public void testConstructorSignBytesNegative6() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 23, -101};
- int aSign = -1;
- byte rBytes[] = {-13, -57, -101, 1, 75, -90, -46, -92, -4, 14, -24, 101};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, aNumber.signum());
- }
-
- /**
- * Create a negative number from a sign and an array of bytes. The number of
- * bytes is multiple of 4. The most significant byte is negative.
- */
- public void testConstructorSignBytesNegative7() {
- byte aBytes[] = {-12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 23, -101};
- int aSign = -1;
- byte rBytes[] = {-1, 11, -57, -101, 1, 75, -90, -46, -92, -4, 14, -24, 101};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, aNumber.signum());
- }
-
- /**
- * Create a positive number from a sign and an array of bytes. The number fits
- * in an array of integers. The most significant byte is positive.
- */
- public void testConstructorSignBytesPositive1() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15};
- int aSign = 1;
- byte rBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-
- /**
- * Create a positive number from a sign and an array of bytes. The number fits
- * in an array of integers. The most significant byte is negative.
- */
- public void testConstructorSignBytesPositive2() {
- byte aBytes[] = {-12, 56, 100, -2, -76, 89, 45, 91, 3, -15};
- int aSign = 1;
- byte rBytes[] = {0, -12, 56, 100, -2, -76, 89, 45, 91, 3, -15};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-
- /**
- * Create a positive number from a sign and an array of bytes. The number fits
- * in an integer.
- */
- public void testConstructorSignBytesPositive3() {
- byte aBytes[] = {-12, 56, 100};
- int aSign = 1;
- byte rBytes[] = {0, -12, 56, 100};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-
- /**
- * Create a positive number from a sign and an array of bytes. The number of
- * bytes is 4. The most significant byte is positive.
- */
- public void testConstructorSignBytesPositive4() {
- byte aBytes[] = {127, 56, 100, -2};
- int aSign = 1;
- byte rBytes[] = {127, 56, 100, -2};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-
- /**
- * Create a positive number from a sign and an array of bytes. The number of
- * bytes is 4. The most significant byte is negative.
- */
- public void testConstructorSignBytesPositive5() {
- byte aBytes[] = {-127, 56, 100, -2};
- int aSign = 1;
- byte rBytes[] = {0, -127, 56, 100, -2};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-
- /**
- * Create a positive number from a sign and an array of bytes. The number of
- * bytes is multiple of 4. The most significant byte is positive.
- */
- public void testConstructorSignBytesPositive6() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 23, -101};
- int aSign = 1;
- byte rBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 23, -101};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-
- /**
- * Create a positive number from a sign and an array of bytes. The number of
- * bytes is multiple of 4. The most significant byte is negative.
- */
- public void testConstructorSignBytesPositive7() {
- byte aBytes[] = {-12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 23, -101};
- int aSign = 1;
- byte rBytes[] = {0, -12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 23, -101};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-
- /**
- * Create a zero number from a sign and an array of zero bytes. The sign is
- * -1.
- */
- public void testConstructorSignBytesZero1() {
- byte aBytes[] = {-0, 0, +0, 0, 0, 00, 000};
- int aSign = -1;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, aNumber.signum());
- }
-
- /**
- * Create a zero number from a sign and an array of zero bytes. The sign is 0.
- */
- public void testConstructorSignBytesZero2() {
- byte aBytes[] = {-0, 0, +0, 0, 0, 00, 000};
- int aSign = 0;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, aNumber.signum());
- }
-
- /**
- * Create a zero number from a sign and an array of zero bytes. The sign is 1.
- */
- public void testConstructorSignBytesZero3() {
- byte aBytes[] = {-0, 0, +0, 0, 0, 00, 000};
- int aSign = 1;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, aNumber.signum());
- }
-
- /**
- * Create a zero number from a sign and an array of zero length. The sign is
- * -1.
- */
- public void testConstructorSignBytesZeroNull1() {
- byte aBytes[] = {};
- int aSign = -1;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, aNumber.signum());
- }
-
- /**
- * Create a zero number from a sign and an array of zero length. The sign is
- * 0.
- */
- public void testConstructorSignBytesZeroNull2() {
- byte aBytes[] = {};
- int aSign = 0;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, aNumber.signum());
- }
-
- /**
- * Create a zero number from a sign and an array of zero length. The sign is
- * 1.
- */
- public void testConstructorSignBytesZeroNull3() {
- byte aBytes[] = {};
- int aSign = 1;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, aNumber.signum());
- }
-
- /**
- * Create a number from a string value and radix. Verify an exception thrown
- * if a radix is out of range
- */
- public void testConstructorStringException1() {
- String value = "9234853876401";
- int radix = 45;
- try {
- new BigInteger(value, radix);
- fail("NumberFormatException has not been caught");
- } catch (NumberFormatException e) {
- assertEquals("Improper exception message", "Radix out of range",
- e.getMessage());
- }
- }
-
- /**
- * Create a number from a string value and radix. Verify an exception thrown
- * if the string starts with a space.
- */
- public void testConstructorStringException2() {
- String value = " 9234853876401";
- int radix = 10;
- try {
- new BigInteger(value, radix);
- fail("NumberFormatException has not been caught");
- } catch (NumberFormatException e) {
- }
- }
-
- /**
- * Create a number from a string value and radix. Verify an exception thrown
- * if the string contains improper characters.
- */
- public void testConstructorStringException3() {
- String value = "92348$*#78987";
- int radix = 34;
- try {
- new BigInteger(value, radix);
- fail("NumberFormatException has not been caught");
- } catch (NumberFormatException e) {
- }
- }
-
- /**
- * Create a number from a string value and radix. Verify an exception thrown
- * if some digits are greater than radix.
- */
- public void testConstructorStringException4() {
- String value = "98zv765hdsaiy";
- int radix = 20;
- try {
- new BigInteger(value, radix);
- fail("NumberFormatException has not been caught");
- } catch (NumberFormatException e) {
- }
- }
-
- /**
- * Create a positive number from a string value and radix 10.
- */
- public void testConstructorStringRadix10() {
- String value = "987328901348934898";
- int radix = 10;
- byte rBytes[] = {13, -77, -78, 103, -103, 97, 68, -14};
- BigInteger aNumber = new BigInteger(value, radix);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-
- /**
- * Create a negative number from a string value and radix 10.
- */
- public void testConstructorStringRadix10Negative() {
- String value = "-234871376037";
- int radix = 36;
- byte rBytes[] = {-4, 48, 71, 62, -76, 93, -105, 13};
- BigInteger aNumber = new BigInteger(value, radix);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, aNumber.signum());
- }
-
- /**
- * Create a zero number from a string value and radix 36.
- */
- public void testConstructorStringRadix10Zero() {
- String value = "-00000000000000";
- int radix = 10;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(value, radix);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, aNumber.signum());
- }
-
- /**
- * Create a positive number from a string value and radix 16.
- */
- public void testConstructorStringRadix16() {
- String value = "fe2340a8b5ce790";
- int radix = 16;
- byte rBytes[] = {15, -30, 52, 10, -117, 92, -25, -112};
- BigInteger aNumber = new BigInteger(value, radix);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-
- /**
- * Create a positive number from a string value and radix 2.
- */
- public void testConstructorStringRadix2() {
- String value = "10101010101010101";
- int radix = 2;
- byte rBytes[] = {1, 85, 85};
- BigInteger aNumber = new BigInteger(value, radix);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-
- /**
- * Create a positive number from a string value and radix 36.
- */
- public void testConstructorStringRadix36() {
- String value = "skdjgocvhdjfkl20jndjkf347ejg457";
- int radix = 36;
- byte rBytes[] = {
- 0, -12, -116, 112, -105, 12, -36, 66, 108, 66, -20, -37, -15, 108, -7,
- 52, -99, -109, -8, -45, -5};
- BigInteger aNumber = new BigInteger(value, radix);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-
- /**
- * Create a positive number from a string value and radix 8.
- */
- public void testConstructorStringRadix8() {
- String value = "76356237071623450";
- int radix = 8;
- byte rBytes[] = {7, -50, -28, -8, -25, 39, 40};
- BigInteger aNumber = new BigInteger(value, radix);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-}
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerConvertTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerConvertTest.java
deleted file mode 100644
index df634f5..0000000
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerConvertTest.java
+++ /dev/null
@@ -1,811 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-/**
- * author Elena Semukhina
- */
-package com.google.gwt.emultest.java.math;
-
-import com.google.gwt.emultest.java.util.EmulTestBase;
-
-import java.math.BigInteger;
-
-/**
- * Class: java.math.BigInteger Methods: intValue, longValue, toByteArray(),
- * valueOf(long val), floatValue(), doubleValue()
- */
-public class BigIntegerConvertTest extends EmulTestBase {
- /**
- * Convert a negative number to a double value. The number's bit length is
- * less than 64 bits.
- */
- public void testDoubleValueNegative1() {
- String a = "-27467238945";
- double result = -2.7467238945E10;
- double aNumber = new BigInteger(a).doubleValue();
- assertTrue(aNumber == result);
- }
-
- /**
- * Convert a negative number to a double value. The number's bit length is
- * inside [63, 1024].
- */
- public void testDoubleValueNegative2() {
- String a = "-2746723894572364578265426346273456972";
- double result = -2.7467238945723645E36;
- double aNumber = new BigInteger(a).doubleValue();
- assertTrue(aNumber == result);
- }
-
- /**
- * Convert a negative number to a double value. The number's bit length is
- * greater than 1024.
- */
- public void testDoubleValueNegativeInfinity1() {
- String a = "-2746723894572364578265426346273456972283746872364768676747462342342342342342342342323423423423423423426767456345745293762384756238475634563456845634568934568347586346578648576478568456457634875673845678456786587345873645767456834756745763457863485768475678465783456702897830296720476846578634576384567845678346573465786457863";
- double aNumber = new BigInteger(a).doubleValue();
- assertTrue(aNumber == Double.NEGATIVE_INFINITY);
- }
-
- /**
- * Convert a negative number to a double value. The exponent is 1023 and the
- * mantissa is all 0s. The rounding bit is 0. The result is
- * Double.NEGATIVE_INFINITY.
- */
- public void testDoubleValueNegativeInfinity2() {
- byte[] a = {
- -1, -1, -1, -1, -1, -1, -1, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
- int aSign = -1;
- double aNumber = new BigInteger(aSign, a).doubleValue();
- assertTrue(aNumber == Double.NEGATIVE_INFINITY);
- }
-
- /**
- * Convert a positive number to a double value. The exponent is 1023 and the
- * mantissa is all 0s but the 54th bit (implicit) is 1.
- */
- public void testDoubleValueNegMantissaIsZero() {
- byte[] a = {
- -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0};
- int aSign = -1;
- double aNumber = new BigInteger(aSign, a).doubleValue();
- assertTrue(aNumber == -8.98846567431158E307);
- }
-
- /**
- * Convert a negative number to a double value. The exponent is 1023 and the
- * mantissa is all 1s. The result is -Double.MAX_VALUE.
- */
- public void testDoubleValueNegMaxValue() {
- byte[] a = {
- 0, -1, -1, -1, -1, -1, -1, -8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1};
- int aSign = -1;
- double aNumber = new BigInteger(aSign, a).doubleValue();
- assertTrue(aNumber == -Double.MAX_VALUE);
- }
-
- /**
- * Convert a positive number to a double value. Rounding is NOT needed.
- */
- public void testDoubleValueNegNotRounded() {
- byte[] a = {-128, 1, 2, 3, 4, 5, -128, 23, 1, -3, -5};
- int aSign = -1;
- double result = -1.5474726438794828E26;
- double aNumber = new BigInteger(aSign, a).doubleValue();
- assertTrue(aNumber == result);
- }
-
- /**
- * Convert a positive number to a double value. Rounding is needed.
- */
- public void testDoubleValueNegRounded1() {
- byte[] a = {-128, 1, 2, 3, 4, 5, 60, 23, 1, -3, -5};
- int aSign = -1;
- double result = -1.54747264387948E26;
- double aNumber = new BigInteger(aSign, a).doubleValue();
- assertTrue(aNumber == result);
- }
-
- /**
- * Convert a positive number to a double value. Rounding is needed. The
- * rounding bit is 1 and the next bit to the left is 0 but some of dropped
- * bits are 1s.
- */
- public void testDoubleValueNegRounded2() {
- byte[] a = {-128, 1, 2, 3, 4, 5, 36, 23, 1, -3, -5};
- int aSign = -1;
- double result = -1.547472643879479E26;
- double aNumber = new BigInteger(aSign, a).doubleValue();
- assertTrue(aNumber == result);
- }
-
- /**
- * Convert a positive number to a double value. The number's length is less
- * than 64 bits.
- */
- public void testDoubleValuePositive1() {
- String a = "27467238945";
- double result = 2.7467238945E10;
- double aNumber = new BigInteger(a).doubleValue();
- assertTrue(aNumber == result);
- }
-
- /**
- * Convert a positive number to a double value. The number's bit length is
- * inside [63, 1024].
- */
- public void testDoubleValuePositive2() {
- String a = "2746723894572364578265426346273456972";
- double result = 2.7467238945723645E36;
- double aNumber = new BigInteger(a).doubleValue();
- assertTrue(aNumber == result);
- }
-
- /**
- * Convert a positive number to a double value. The exponent is 1023 and the
- * mantissa is all 1s. The rounding bit is 1. The result is
- * Double.POSITIVE_INFINITY.
- */
- public void testDoubleValuePositiveInfinity1() {
- byte[] a = {
- -1, -1, -1, -1, -1, -1, -1, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
- int aSign = 1;
- double aNumber = new BigInteger(aSign, a).doubleValue();
- assertTrue(aNumber == Double.POSITIVE_INFINITY);
- }
-
- /**
- * Convert a positive number to a double value. The number's bit length is
- * greater than 1024.
- */
- public void testDoubleValuePositiveInfinity2() {
- String a = "2746723894572364578265426346273456972283746872364768676747462342342342342342342342323423423423423423426767456345745293762384756238475634563456845634568934568347586346578648576478568456457634875673845678456786587345873645767456834756745763457863485768475678465783456702897830296720476846578634576384567845678346573465786457863";
- double aNumber = new BigInteger(a).doubleValue();
- assertTrue(aNumber == Double.POSITIVE_INFINITY);
- }
-
- /**
- * Convert a positive number to a double value. The exponent is 1023 and the
- * mantissa is all 0s but the 54th bit (implicit) is 1.
- */
- public void testDoubleValuePosMantissaIsZero() {
- byte[] a = {
- -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0};
- int aSign = 1;
- double result = 8.98846567431158E307;
- double aNumber = new BigInteger(aSign, a).doubleValue();
- assertTrue(aNumber == result);
- }
-
- /**
- * Convert a positive number to a double value. The exponent is 1023 and the
- * mantissa is all 1s. The rounding bit is 0. The result is Double.MAX_VALUE.
- */
- public void testDoubleValuePosMaxValue() {
- byte[] a = {
- 0, -1, -1, -1, -1, -1, -1, -8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1};
- int aSign = 1;
- double aNumber = new BigInteger(aSign, a).doubleValue();
- assertTrue(aNumber == Double.MAX_VALUE);
- }
-
- /**
- * Convert a positive number to a double value. Rounding is NOT needed.
- */
- public void testDoubleValuePosNotRounded() {
- byte[] a = {-128, 1, 2, 3, 4, 5, -128, 23, 1, -3, -5};
- int aSign = 1;
- double result = 1.5474726438794828E26;
- double aNumber = new BigInteger(aSign, a).doubleValue();
- assertTrue(aNumber == result);
- }
-
- /**
- * Convert a positive number to a double value. Rounding is needed. The
- * rounding bit is 1 and the next bit to the left is 1.
- */
- public void testDoubleValuePosRounded1() {
- byte[] a = {-128, 1, 2, 3, 4, 5, 60, 23, 1, -3, -5};
- int aSign = 1;
- double result = 1.54747264387948E26;
- double aNumber = new BigInteger(aSign, a).doubleValue();
- assertTrue(aNumber == result);
- }
-
- /**
- * Convert a positive number to a double value. Rounding is needed. The
- * rounding bit is 1 and the next bit to the left is 0 but some of dropped
- * bits are 1s.
- */
- public void testDoubleValuePosRounded2() {
- byte[] a = {-128, 1, 2, 3, 4, 5, 36, 23, 1, -3, -5};
- int aSign = 1;
- double result = 1.547472643879479E26;
- double aNumber = new BigInteger(aSign, a).doubleValue();
- assertTrue(aNumber == result);
- }
-
- /**
- * Return the double value of ZERO.
- */
- public void testDoubleValueZero() {
- String a = "0";
- double result = 0.0;
- double aNumber = new BigInteger(a).doubleValue();
- assertTrue(aNumber == result);
- }
-
- /**
- * Convert a negative number to a float value. The number's bit length is less
- * than 32 bits.
- */
- public void testFloatValueBug2482() {
- String a = "2147483649";
- float result = 2.14748365E9f;
- float aNumber = new BigInteger(a).floatValue();
- assertEquals("incorrect value", aNumber, result, 1);
- }
-
- /**
- * Convert a negative number to a float value. The value is near
- * Float.MAX_VALUE, but since all calculation in JS is done in double
- * precision, it can't be completely accurate about passing that value
- * through.
- */
- public void testFloatValueNearNegMaxValue() {
- byte[] a = {
- 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
- int aSign = -1;
- float aNumber = new BigInteger(aSign, a).floatValue();
- assertEquals(-3.4028235e38, aNumber, 1e31);
- }
-
- /**
- * Convert a positive number to a float value. The value is near
- * Float.MAX_VALUE, but since all calculation in JS is done in double
- * precision, it can't be completely accurate about passing that value
- * through.
- */
- public void testFloatValueNearPosMaxValue() {
- byte[] a = {
- 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
- int aSign = 1;
- float aNumber = new BigInteger(aSign, a).floatValue();
- assertEquals(3.4028235e38, aNumber, 1e31);
- }
-
- /**
- * Convert a negative number to a float value. The number's bit length is less
- * than 32 bits.
- */
- public void testFloatValueNegative1() {
- String a = "-27467238";
- float result = -2.7467238E7f;
- float aNumber = new BigInteger(a).floatValue();
- assertEquals("incorrect value", result, aNumber, 1);
- }
-
- /**
- * Convert a negative number to a double value. The number's bit length
- * is inside [63, 1024].
- */
- public void testFloatValueNegative2() {
- String a = "-27467238945723645782";
- float result = -2.7467239E19f;
- float aNumber = new BigInteger(a).floatValue();
- assertEquals("incorrect value", result, aNumber, 1e12);
- }
-
- /**
- * Convert a negative number to a float value. The number's bit length is
- * greater than 127.
- */
- public void testFloatValueNegativeInfinity1() {
- String a = "-2746723894572364578265426346273456972283746872364768676747462342342342342342342342323423423423423423426767456345745293762384756238475634563456845634568934568347586346578648576478568456457634875673845678456786587345873645767456834756745763457863485768475678465783456702897830296720476846578634576384567845678346573465786457863";
- float aNumber = new BigInteger(a).floatValue();
- assertEquals("incorrect value", Float.NEGATIVE_INFINITY, aNumber);
- }
-
- /**
- * Convert a negative number to a float value. The exponent is 1023 and the
- * mantissa is all 0s. The rounding bit is 0. The result is
- * Float.NEGATIVE_INFINITY.
- */
- public void testFloatValueNegativeInfinity2() {
- byte[] a = {
- 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
- int aSign = -1;
- float aNumber = new BigInteger(aSign, a).floatValue();
- assertEquals(Float.NEGATIVE_INFINITY, aNumber);
- }
-
- /**
- * Convert a positive number to a double value. The exponent is 1023 and the
- * mantissa is all 0s but the 54th bit (implicit) is 1.
- */
- public void testFloatValueNegMantissaIsZero() {
- byte[] a = {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
- int aSign = -1;
- float aNumber = new BigInteger(aSign, a).floatValue();
- assertEquals(Float.NEGATIVE_INFINITY, aNumber);
- }
-
- /**
- * Convert a positive number to a float value. Rounding is NOT needed.
- */
- public void testFloatValueNegNotRounded() {
- byte[] a = {-128, 1, 2, 3, 4, 5, 60, 23, 1, -3, -5};
- int aSign = -1;
- float result = -1.5474726E26f;
- float aNumber = new BigInteger(aSign, a).floatValue();
- assertEquals(result, aNumber, 1e19);
- }
-
- /**
- * Convert a positive number to a float value. Rounding is needed.
- */
- public void testFloatValueNegRounded1() {
- byte[] a = {-128, 1, -1, -4, 4, 5, 60, 23, 1, -3, -5};
- int aSign = -1;
- float result = -1.5475195E26f;
- float aNumber = new BigInteger(aSign, a).floatValue();
- assertEquals(result, aNumber, 1e19);
- }
-
- /**
- * Convert a positive number to a float value. Rounding is needed. The
- * rounding bit is 1 and the next bit to the left is 0 but some of dropped
- * bits are 1s.
- */
- public void testFloatValueNegRounded2() {
- byte[] a = {-128, 1, 2, -128, 4, 5, 60, 23, 1, -3, -5};
- int aSign = -1;
- float result = -1.5474728E26f;
- float aNumber = new BigInteger(aSign, a).floatValue();
- assertEquals(result, aNumber, 1e19);
- }
-
- /**
- * Convert a negative number beyond Float.MAX_VALUE, ensuring that it is
- * converted to Float.NEGATIVE_INFINITY.
- */
- public void testFloatValuePastNegMaxValue() {
- byte[] a = {
- 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
- int aSign = -1;
- float aNumber = new BigInteger(aSign, a).floatValue();
- assertEquals(Float.NEGATIVE_INFINITY, aNumber);
- }
-
- /**
- * Convert a positive number beyond Float.MAX_VALUE, ensuring that it is
- * converted to Float.POSITIVE_INFINITY.
- */
- public void testFloatValuePastPosMaxValue() {
- byte[] a = {
- 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
- int aSign = 1;
- float aNumber = new BigInteger(aSign, a).floatValue();
- assertEquals(Float.POSITIVE_INFINITY, aNumber);
- }
-
- /**
- * Convert a positive number to a float value. The number's length is less
- * than 32 bits.
- */
- public void testFloatValuePositive1() {
- String a = "27467238";
- float result = 2.7467238E7f;
- float aNumber = new BigInteger(a).floatValue();
- assertEquals(result, aNumber);
- }
-
- /**
- * Convert a positive number to a float value. The number's bit length is
- * inside [32, 127].
- */
- public void testFloatValuePositive2() {
- String a = "27467238945723645782";
- float result = 2.7467239E19f;
- float aNumber = new BigInteger(a).floatValue();
- assertEquals(result, aNumber, 1e12);
- }
-
- /**
- * Convert a positive number to a float value. The exponent is 1023 and the
- * mantissa is all 1s. The rounding bit is 1. The result is
- * Float.POSITIVE_INFINITY.
- */
- public void testFloatValuePositiveInfinity1() {
- byte[] a = {
- 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
- int aSign = 1;
- float aNumber = new BigInteger(aSign, a).floatValue();
- assertEquals(Float.POSITIVE_INFINITY, aNumber);
- }
-
- /**
- * Convert a positive number to a float value. The number's bit length is
- * greater than 127.
- */
- public void testFloatValuePositiveInfinity2() {
- String a = "274672389457236457826542634627345697228374687236476867674746234"
- + "23423423423423423423234234234234234234267674563457452937623847562384"
- + "75634563456845634568934568347586346578648576478568456457634875673845"
- + "67845678658734587364576745683475674576345786348576847567846578345670"
- + "2897830296720476846578634576384567845678346573465786457863";
- float aNumber = new BigInteger(a).floatValue();
- assertEquals(Float.POSITIVE_INFINITY, aNumber);
- }
-
- /**
- * Convert a positive number to a float value. The exponent is 1023 and the
- * mantissa is all 0s but the 54th bit (implicit) is 1.
- */
- public void testFloatValuePosMantissaIsZero() {
- byte[] a = {-128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
- int aSign = 1;
- float result = 1.7014118E38f;
- float aNumber = new BigInteger(aSign, a).floatValue();
- assertEquals(result, aNumber, 1e31);
- }
-
- /**
- * Convert a positive number to a float value. Rounding is NOT needed.
- */
- public void testFloatValuePosNotRounded() {
- byte[] a = {-128, 1, 2, 3, 4, 5, 60, 23, 1, -3, -5};
- int aSign = 1;
- float result = 1.5474726E26f;
- float aNumber = new BigInteger(aSign, a).floatValue();
- assertEquals(result, aNumber, 1e19);
- }
-
- /**
- * Convert a positive number to a float value. Rounding is needed. The
- * rounding bit is 1 and the next bit to the left is 1.
- */
- public void testFloatValuePosRounded1() {
- byte[] a = {-128, 1, -1, -4, 4, 5, 60, 23, 1, -3, -5};
- int aSign = 1;
- float result = 1.5475195E26f;
- float aNumber = new BigInteger(aSign, a).floatValue();
- assertEquals(result, aNumber, 1e19);
- }
-
- /**
- * Convert a positive number to a float value. Rounding is needed. The
- * rounding bit is 1 and the next bit to the left is 0 but some of dropped
- * bits are 1s.
- */
- public void testFloatValuePosRounded2() {
- byte[] a = {-128, 1, 2, -128, 4, 5, 60, 23, 1, -3, -5};
- int aSign = 1;
- float result = 1.5474728E26f;
- float aNumber = new BigInteger(aSign, a).floatValue();
- assertEquals(result, aNumber, 1e19);
- }
-
- /**
- * Return the float value of ZERO.
- */
- public void testFloatValueZero() {
- String a = "0";
- float result = 0.0f;
- float aNumber = new BigInteger(a).floatValue();
- assertEquals(result, aNumber);
- }
-
- /**
- * Convert a negative BigInteger to an integer value. The low digit is
- * negative.
- */
- public void testIntValueNegative1() {
- byte aBytes[] = {12, 56, 100, -2, -76, -128, 45, 91, 3};
- int sign = -1;
- int resInt = 2144511229;
- int aNumber = new BigInteger(sign, aBytes).intValue();
- assertEquals(resInt, aNumber);
- }
-
- /**
- * Convert a negative BigInteger to an integer value. The low digit is
- * negative.
- */
- public void testIntValueNegative2() {
- byte aBytes[] = {-12, 56, 100};
- int result = -771996;
- int aNumber = new BigInteger(aBytes).intValue();
- assertEquals(result, aNumber);
- }
-
- /**
- * Convert a negative BigInteger to an integer value. The low digit is
- * positive.
- */
- public void testIntValueNegative3() {
- byte aBytes[] = {12, 56, 100, -2, -76, 127, 45, 91, 3};
- int sign = -1;
- int resInt = -2133678851;
- int aNumber = new BigInteger(sign, aBytes).intValue();
- assertEquals(resInt, aNumber);
- }
-
- /**
- * Convert a positive BigInteger to an integer value. The low digit is
- * positive
- */
- public void testIntValuePositive1() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3};
- int resInt = 1496144643;
- int aNumber = new BigInteger(aBytes).intValue();
- assertEquals(resInt, aNumber);
- }
-
- /**
- * Convert a positive BigInteger to an integer value. The low digit is
- * positive
- */
- public void testIntValuePositive2() {
- byte aBytes[] = {12, 56, 100};
- int resInt = 800868;
- int aNumber = new BigInteger(aBytes).intValue();
- assertEquals(resInt, aNumber);
- }
-
- /**
- * Convert a positive BigInteger to an integer value. The low digit is
- * negative.
- */
- public void testIntValuePositive3() {
- byte aBytes[] = {56, 13, 78, -12, -5, 56, 100};
- int sign = 1;
- int resInt = -184862620;
- int aNumber = new BigInteger(sign, aBytes).intValue();
- assertEquals(resInt, aNumber);
- }
-
- /**
- * Convert a number to a negative long value The BigInteger is longer than
- * int.
- */
- public void testLongValueNegative1() {
- byte aBytes[] = {12, -1, 100, -2, -76, -128, 45, 91, 3};
- long result = -43630045168837885L;
- long aNumber = new BigInteger(aBytes).longValue();
- assertEquals(result, aNumber);
- }
-
- /**
- * Convert a number to a negative long value The number fits in a long.
- */
- public void testLongValueNegative2() {
- byte aBytes[] = {-12, 56, 100, 45, -101, 45, 98};
- long result = -3315696807498398L;
- long aNumber = new BigInteger(aBytes).longValue();
- assertEquals(result, aNumber);
- }
-
- /**
- * Convert a BigInteger to a positive long value The BigInteger is longer than
- * int.
- */
- public void testLongValuePositive1() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, 120, -34, -12, 45, 98};
- long result = 3268209772258930018L;
- long aNumber = new BigInteger(aBytes).longValue();
- assertEquals(result, aNumber);
- }
-
- /**
- * Convert a number to a positive long value The number fits in a long.
- */
- public void testLongValuePositive2() {
- byte aBytes[] = {12, 56, 100, 18, -105, 34, -18, 45};
- long result = 880563758158769709L;
- long aNumber = new BigInteger(aBytes).longValue();
- assertEquals(result, aNumber);
- }
-
- /**
- * valueOf (long val): convert Integer.MAX_VALUE to a BigInteger.
- */
- public void testValueOfIntegerMax() {
- long longVal = Integer.MAX_VALUE;
- BigInteger aNumber = BigInteger.valueOf(longVal);
- byte rBytes[] = {127, -1, -1, -1};
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-
- /**
- * valueOf (long val): convert Integer.MIN_VALUE to a BigInteger.
- */
- public void testValueOfIntegerMin() {
- long longVal = Integer.MIN_VALUE;
- BigInteger aNumber = BigInteger.valueOf(longVal);
- byte rBytes[] = {-128, 0, 0, 0};
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", -1, aNumber.signum());
- }
-
- /**
- * valueOf (long val): convert Long.MAX_VALUE to a BigInteger.
- */
- public void testValueOfLongMax() {
- long longVal = Long.MAX_VALUE;
- BigInteger aNumber = BigInteger.valueOf(longVal);
- byte rBytes[] = {127, -1, -1, -1, -1, -1, -1, -1};
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-
- /**
- * valueOf (long val): convert Long.MIN_VALUE to a BigInteger.
- */
- public void testValueOfLongMin() {
- long longVal = Long.MIN_VALUE;
- BigInteger aNumber = BigInteger.valueOf(longVal);
- byte rBytes[] = {-128, 0, 0, 0, 0, 0, 0, 0};
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", -1, aNumber.signum());
- }
-
- /**
- * valueOf (long val): convert a negative long value to a BigInteger.
- */
- public void testValueOfLongNegative1() {
- long longVal = -268209772258930018L;
- BigInteger aNumber = BigInteger.valueOf(longVal);
- byte rBytes[] = {-4, 71, 32, -94, 23, 55, -46, -98};
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", -1, aNumber.signum());
- }
-
- /**
- * valueOf (long val): convert a negative long value to a BigInteger. The long
- * value fits in integer.
- */
- public void testValueOfLongNegative2() {
- long longVal = -58930018L;
- BigInteger aNumber = BigInteger.valueOf(longVal);
- byte rBytes[] = {-4, 124, -52, -98};
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", -1, aNumber.signum());
- }
-
- /**
- * valueOf (long val): convert a positive long value to a BigInteger.
- */
- public void testValueOfLongPositive1() {
- long longVal = 268209772258930018L;
- BigInteger aNumber = BigInteger.valueOf(longVal);
- byte rBytes[] = {3, -72, -33, 93, -24, -56, 45, 98};
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-
- /**
- * valueOf (long val): convert a positive long value to a BigInteger. The long
- * value fits in integer.
- */
- public void testValueOfLongPositive2() {
- long longVal = 58930018L;
- BigInteger aNumber = BigInteger.valueOf(longVal);
- byte rBytes[] = {3, -125, 51, 98};
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 1, aNumber.signum());
- }
-
- /**
- * valueOf (long val): convert a zero long value to a BigInteger.
- */
- public void testValueOfLongZero() {
- long longVal = 0L;
- BigInteger aNumber = BigInteger.valueOf(longVal);
- byte rBytes[] = {0};
- byte resBytes[] = new byte[rBytes.length];
- resBytes = aNumber.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 0, aNumber.signum());
- }
-}
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerDivideTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerDivideTest.java
deleted file mode 100644
index 5975a2b..0000000
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerDivideTest.java
+++ /dev/null
@@ -1,687 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-/**
- * author Elena Semukhina
- */
-package com.google.gwt.emultest.java.math;
-
-import com.google.gwt.emultest.java.util.EmulTestBase;
-
-import java.math.BigInteger;
-
-/**
- * Class: java.math.BigInteger Methods: divide, remainder, mod, and
- * divideAndRemainder
- */
-public class BigIntegerDivideTest extends EmulTestBase {
- /**
- * Divide by zero
- */
- public void testCase1() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7};
- byte bBytes[] = {0};
- int aSign = 1;
- int bSign = 0;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- try {
- aNumber.divide(bNumber);
- fail("ArithmeticException has not been caught");
- } catch (ArithmeticException e) {
- assertEquals("Improper exception message", "BigInteger divide by zero",
- e.getMessage());
- }
- }
-
- /**
- * Divide two negative numbers.
- */
- public void testCase10() {
- byte aBytes[] = {1, 100, 56, 7, 98, -1, 39, -128, 127, 5, 6, 7, 8, 9};
- byte bBytes[] = {15, 48, -29, 7, 98, -1, 39, -128};
- int aSign = -1;
- int bSign = -1;
- byte rBytes[] = {23, 115, 11, 78, 35, -11};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.divide(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Divide zero by a negative number.
- */
- public void testCase11() {
- byte aBytes[] = {0};
- byte bBytes[] = {15, 48, -29, 7, 98, -1, 39, -128};
- int aSign = 0;
- int bSign = -1;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.divide(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-
- /**
- * Divide ZERO by a negative number.
- */
- public void testCase12() {
- byte bBytes[] = {15, 48, -29, 7, 98, -1, 39, -128};
- int bSign = -1;
- byte rBytes[] = {0};
- BigInteger aNumber = BigInteger.ZERO;
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.divide(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-
- /**
- * Divide a positive number by ONE.
- */
- public void testCase13() {
- byte aBytes[] = {15, 48, -29, 7, 98, -1, 39, -128};
- int aSign = 1;
- byte rBytes[] = {15, 48, -29, 7, 98, -1, 39, -128};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = BigInteger.ONE;
- BigInteger result = aNumber.divide(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Divide ONE by ONE.
- */
- public void testCase14() {
- byte rBytes[] = {1};
- BigInteger aNumber = BigInteger.ONE;
- BigInteger bNumber = BigInteger.ONE;
- BigInteger result = aNumber.divide(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Remainder of division by zero
- */
- public void testCase15() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7};
- byte bBytes[] = {0};
- int aSign = 1;
- int bSign = 0;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- try {
- aNumber.remainder(bNumber);
- fail("ArithmeticException has not been caught");
- } catch (ArithmeticException e) {
- assertEquals("Improper exception message", "BigInteger divide by zero",
- e.getMessage());
- }
- }
-
- /**
- * Remainder of division of equal numbers
- */
- public void testCase16() {
- byte aBytes[] = {-127, 100, 56, 7, 98, -1, 39, -128, 127};
- byte bBytes[] = {-127, 100, 56, 7, 98, -1, 39, -128, 127};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.remainder(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-
- /**
- * Remainder of division of two positive numbers
- */
- public void testCase17() {
- byte aBytes[] = {-127, 100, 56, 7, 98, -1, 39, -128, 127, 75};
- byte bBytes[] = {27, -15, 65, 39, 100};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {12, -21, 73, 56, 27};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.remainder(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Remainder of division of two negative numbers
- */
- public void testCase18() {
- byte aBytes[] = {-127, 100, 56, 7, 98, -1, 39, -128, 127, 75};
- byte bBytes[] = {27, -15, 65, 39, 100};
- int aSign = -1;
- int bSign = -1;
- byte rBytes[] = {-13, 20, -74, -57, -27};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.remainder(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Remainder of division of two numbers of different signs. The first is
- * positive.
- */
- public void testCase19() {
- byte aBytes[] = {-127, 100, 56, 7, 98, -1, 39, -128, 127, 75};
- byte bBytes[] = {27, -15, 65, 39, 100};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {12, -21, 73, 56, 27};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.remainder(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Divide by ZERO
- */
- public void testCase2() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7};
- int aSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = BigInteger.ZERO;
- try {
- aNumber.divide(bNumber);
- fail("ArithmeticException has not been caught");
- } catch (ArithmeticException e) {
- assertEquals("Improper exception message", "BigInteger divide by zero",
- e.getMessage());
- }
- }
-
- /**
- * Remainder of division of two numbers of different signs. The first is
- * negative.
- */
- public void testCase20() {
- byte aBytes[] = {-127, 100, 56, 7, 98, -1, 39, -128, 127, 75};
- byte bBytes[] = {27, -15, 65, 39, 100};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[] = {-13, 20, -74, -57, -27};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.remainder(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * divideAndRemainder of two numbers of different signs. The first is
- * negative.
- */
- public void testCase21() {
- byte aBytes[] = {-127, 100, 56, 7, 98, -1, 39, -128, 127, 75};
- byte bBytes[] = {27, -15, 65, 39, 100};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[][] = { {-5, 94, -115, -74, -85, 84}, {-13, 20, -74, -57, -27}};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result[] = aNumber.divideAndRemainder(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result[0].toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- if (resBytes[i] != rBytes[0][i]) {
- fail("Incorrect quotation");
- }
- }
- assertEquals(-1, result[0].signum());
- resBytes = result[1].toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- if (resBytes[i] != rBytes[1][i]) {
- fail("Incorrect remainder");
- }
- assertEquals(-1, result[1].signum());
- }
- }
-
- /**
- * mod when modulus is negative
- */
- public void testCase22() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7};
- byte bBytes[] = {1, 30, 40, 56, -1, 45};
- int aSign = 1;
- int bSign = -1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- try {
- aNumber.mod(bNumber);
- fail("ArithmeticException has not been caught");
- } catch (ArithmeticException e) {
- assertEquals("Improper exception message",
- "BigInteger: modulus not positive", e.getMessage());
- }
- }
-
- /**
- * mod when a divisor is positive
- */
- public void testCase23() {
- byte aBytes[] = {-127, 100, 56, 7, 98, -1, 39, -128, 127, 75};
- byte bBytes[] = {27, -15, 65, 39, 100};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {12, -21, 73, 56, 27};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.mod(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * mod when a divisor is negative
- */
- public void testCase24() {
- byte aBytes[] = {-127, 100, 56, 7, 98, -1, 39, -128, 127, 75};
- byte bBytes[] = {27, -15, 65, 39, 100};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[] = {15, 5, -9, -17, 73};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.mod(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Divide two equal positive numbers
- */
- public void testCase3() {
- byte aBytes[] = {-127, 100, 56, 7, 98, -1, 39, -128, 127};
- byte bBytes[] = {-127, 100, 56, 7, 98, -1, 39, -128, 127};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {1};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.divide(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Divide two equal in absolute value numbers of different signs.
- */
- public void testCase4() {
- byte aBytes[] = {-127, 100, 56, 7, 98, -1, 39, -128, 127};
- byte bBytes[] = {-127, 100, 56, 7, 98, -1, 39, -128, 127};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[] = {-1};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.divide(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Divide two numbers of different length and different signs. The second is
- * longer.
- */
- public void testCase5() {
- byte aBytes[] = {-127, 100, 56, 7, 98, -1, 39, -128, 127};
- byte bBytes[] = {-127, 100, 56, 7, 98, -1, 39, -128, 127, 1, 2, 3, 4, 5};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.divide(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-
- /**
- * Divide two positive numbers of the same length. The second is greater.
- */
- public void testCase6() {
- byte aBytes[] = {1, 100, 56, 7, 98, -1, 39, -128, 127};
- byte bBytes[] = {15, 100, 56, 7, 98, -1, 39, -128, 127};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.divide(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-
- /**
- * Divide two positive numbers.
- */
- public void testCase7() {
- byte aBytes[] = {1, 100, 56, 7, 98, -1, 39, -128, 127, 5, 6, 7, 8, 9};
- byte bBytes[] = {15, 48, -29, 7, 98, -1, 39, -128};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {23, 115, 11, 78, 35, -11};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.divide(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Divide a positive number by a negative one.
- */
- public void testCase8() {
- byte aBytes[] = {1, 100, 56, 7, 98, -1, 39, -128, 127, 5, 6, 7, 8, 9};
- byte bBytes[] = {15, 48, -29, 7, 98, -1, 39, -128};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {-24, -116, -12, -79, -36, 11};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.divide(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Divide a negative number by a positive one.
- */
- public void testCase9() {
- byte aBytes[] = {1, 100, 56, 7, 98, -1, 39, -128, 127, 5, 6, 7, 8, 9};
- byte bBytes[] = {15, 48, -29, 7, 98, -1, 39, -128};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[] = {-24, -116, -12, -79, -36, 11};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.divide(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Verifies the case when borrow != 0 in the private divide method.
- */
- public void testDivisionKnuth1() {
- byte aBytes[] = {-7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7};
- byte bBytes[] = {-3, -3, -3, -3};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {0, -5, -12, -33, -96, -36, -105, -56, 92, 15, 48, -109};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.divide(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Verifies the case when the first digits of the dividend and divisor equal.
- */
- public void testDivisionKnuthFirstDigitsEqual() {
- byte aBytes[] = {2, -3, -4, -5, -1, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5};
- byte bBytes[] = {2, -3, -4, -5, -1, -1, -1, -1};
- int aSign = -1;
- int bSign = -1;
- byte rBytes[] = {0, -1, -1, -1, -1, -2, -88, -60, 41};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.divide(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Verifies the case when the divisor is already normalized.
- */
- public void testDivisionKnuthIsNormalized() {
- byte aBytes[] = {-9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5};
- byte bBytes[] = {-1, -1, -1, -1, -1, -1, -1, -1};
- int aSign = -1;
- int bSign = -1;
- byte rBytes[] = {0, -9, -8, -7, -6, -5, -4, -3};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.divide(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Divide the number of multi digits by the number of one digit
- */
- public void testDivisionKnuthMultiDigitsByOneDigit() {
- byte aBytes[] = {113, -83, 123, -5, 18, -34, 67, 39, -29};
- byte bBytes[] = {2, -3, -4, -5};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {-38, 2, 7, 30, 109, -43};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.divide(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Divide the number of one digit by the number of one digit
- */
- public void testDivisionKnuthOneDigitByOneDigit() {
- byte aBytes[] = {113, -83, 123, -5};
- byte bBytes[] = {2, -3, -4, -5};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {-37};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.divide(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Tests the step D6 from the Knuth algorithm
- */
- public void testRemainderKnuth1() {
- byte aBytes[] = {-9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1};
- byte bBytes[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {1, 2, 3, 4, 5, 6, 7, 7, 18, -89};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.remainder(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Divide the number of multi digits by the number of one digit
- */
- public void testRemainderKnuthMultiDigitsByOneDigit() {
- byte aBytes[] = {113, -83, 123, -5, 18, -34, 67, 39, -29};
- byte bBytes[] = {2, -3, -4, -50};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {2, -37, -60, 59};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.remainder(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Divide the number of one digit by the number of one digit
- */
- public void testRemainderKnuthOneDigitByOneDigit() {
- byte aBytes[] = {113, -83, 123, -5};
- byte bBytes[] = {2, -3, -4, -50};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {2, -9, -14, 53};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.remainder(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-}
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerHashCodeTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerHashCodeTest.java
deleted file mode 100644
index 1e311c0..0000000
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerHashCodeTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-/**
- * author Elena Semukhina
- */
-package com.google.gwt.emultest.java.math;
-
-import com.google.gwt.emultest.java.util.EmulTestBase;
-
-import java.math.BigInteger;
-
-/**
- * Class: java.math.BigInteger Method: hashCode()
- */
-public class BigIntegerHashCodeTest extends EmulTestBase {
- /**
- * Test hash codes for equal objects.
- */
- public void testEqualObjects() {
- String value1 = "12378246728727834290276457386374882976782849";
- String value2 = "12378246728727834290276457386374882976782849";
- BigInteger aNumber1 = new BigInteger(value1);
- BigInteger aNumber2 = new BigInteger(value2);
- int code1 = aNumber1.hashCode();
- int code2 = aNumber2.hashCode();
- if (aNumber1.equals(aNumber2)) {
- assertTrue("hash codes for equal objects are unequal", code1 == code2);
- }
- }
-
- /**
- * Test hash codes for the same object
- */
- public void testSameObject() {
- String value1 = "12378246728727834290276457386374882976782849";
- String value2 = "-5634562095872038262928728727834290276457386374882976782849";
- BigInteger aNumber1 = new BigInteger(value1);
- BigInteger aNumber2 = new BigInteger(value2);
- int code1 = aNumber1.hashCode();
- aNumber1.add(aNumber2).shiftLeft(125);
- aNumber1.subtract(aNumber2).shiftRight(125);
- aNumber1.multiply(aNumber2).toByteArray();
- aNumber1.divide(aNumber2).bitLength();
- aNumber1.gcd(aNumber2).pow(7);
- int code2 = aNumber1.hashCode();
- assertTrue("hash codes for the same object differ", code1 == code2);
- }
-
- /**
- * Test hash codes for unequal objects. The codes are unequal.
- */
- public void testUnequalObjectsUnequal() {
- String value1 = "12378246728727834290276457386374882976782849";
- String value2 = "-5634562095872038262928728727834290276457386374882976782849";
- BigInteger aNumber1 = new BigInteger(value1);
- BigInteger aNumber2 = new BigInteger(value2);
- int code1 = aNumber1.hashCode();
- int code2 = aNumber2.hashCode();
- if (!aNumber1.equals(aNumber2)) {
- assertTrue("hash codes for unequal objects are equal", code1 != code2);
- }
- }
-}
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerModPowTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerModPowTest.java
deleted file mode 100644
index c3bb24f..0000000
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerModPowTest.java
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-/**
- * author Elena Semukhina
- */
-package com.google.gwt.emultest.java.math;
-
-import com.google.gwt.emultest.java.util.EmulTestBase;
-
-import java.math.BigInteger;
-
-/**
- * Class: java.math.BigInteger Methods: modPow, modInverse, and gcd
- */
-public class BigIntegerModPowTest extends EmulTestBase {
- /**
- * gcd: both numbers are zeros
- */
- public void testGcdBothZeros() {
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger("0");
- BigInteger bNumber = BigInteger.valueOf(0L);
- BigInteger result = aNumber.gcd(bNumber);
- byte resBytes[] = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-
- /**
- * gcd: the first number is longer
- */
- public void testGcdFirstLonger() {
- byte aBytes[] = {
- -15, 24, 123, 56, -11, -112, -34, -98, 8, 10, 12, 14, 25, 125, -15, 28,
- -127};
- byte bBytes[] = {-12, 1, 0, 0, 0, 23, 44, 55, 66};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {7};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.gcd(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * gcd: the first number is zero
- */
- public void testGcdFirstZero() {
- byte aBytes[] = {0};
- byte bBytes[] = {15, 24, 123, 57, -15, 24, 123, 57, -15, 24, 123, 57};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {15, 24, 123, 57, -15, 24, 123, 57, -15, 24, 123, 57};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.gcd(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * gcd: the first number is ZERO
- */
- public void testGcdFirstZERO() {
- byte bBytes[] = {15, 24, 123, 57, -15, 24, 123, 57, -15, 24, 123, 57};
- int bSign = 1;
- byte rBytes[] = {15, 24, 123, 57, -15, 24, 123, 57, -15, 24, 123, 57};
- BigInteger aNumber = BigInteger.ZERO;
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.gcd(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * gcd: the second number is longer
- */
- public void testGcdSecondLonger() {
- byte aBytes[] = {-12, 1, 0, 0, 0, 23, 44, 55, 66};
- byte bBytes[] = {
- -15, 24, 123, 56, -11, -112, -34, -98, 8, 10, 12, 14, 25, 125, -15, 28,
- -127};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {7};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.gcd(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * gcd: the second number is zero
- */
- public void testGcdSecondZero() {
- byte aBytes[] = {15, 24, 123, 57, -15, 24, 123, 57, -15, 24, 123, 57};
- byte bBytes[] = {0};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {15, 24, 123, 57, -15, 24, 123, 57, -15, 24, 123, 57};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.gcd(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * modInverse: non-positive modulus
- */
- public void testmodInverseException() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7};
- byte mBytes[] = {1, 2, 3};
- int aSign = 1;
- int mSign = -1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger modulus = new BigInteger(mSign, mBytes);
- try {
- aNumber.modInverse(modulus);
- fail("ArithmeticException has not been caught");
- } catch (ArithmeticException e) {
- assertEquals("Improper exception message",
- "BigInteger: modulus not positive", e.getMessage());
- }
- }
-
- /**
- * modInverse: negative number
- */
- public void testmodInverseNeg1() {
- byte aBytes[] = {
- 15, 24, 123, 56, -11, -112, -34, -98, 8, 10, 12, 14, 25, 125, -15, 28,
- -127};
- byte mBytes[] = {2, 122, 45, 36, 100};
- int aSign = -1;
- int mSign = 1;
- byte rBytes[] = {0, -41, 4, -91, 27};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger modulus = new BigInteger(mSign, mBytes);
- BigInteger result = aNumber.modInverse(modulus);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * modInverse: negative number (another case: x < 0)
- */
- public void testmodInverseNeg2() {
- byte aBytes[] = {-15, 24, 123, 57, -15, 24, 123, 57, -15, 24, 123, 57};
- byte mBytes[] = {122, 2, 4, 122, 2, 4};
- byte rBytes[] = {85, 47, 127, 4, -128, 45};
- BigInteger aNumber = new BigInteger(aBytes);
- BigInteger modulus = new BigInteger(mBytes);
- BigInteger result = aNumber.modInverse(modulus);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * modInverse: non-invertible number
- */
- public void testmodInverseNonInvertible() {
- byte aBytes[] = {
- -15, 24, 123, 56, -11, -112, -34, -98, 8, 10, 12, 14, 25, 125, -15, 28,
- -127};
- byte mBytes[] = {-12, 1, 0, 0, 0, 23, 44, 55, 66};
- int aSign = 1;
- int mSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger modulus = new BigInteger(mSign, mBytes);
- try {
- aNumber.modInverse(modulus);
- fail("ArithmeticException has not been caught");
- } catch (ArithmeticException e) {
- assertEquals("Improper exception message", "BigInteger not invertible.",
- e.getMessage());
- }
- }
-
- /**
- * modInverse: positive number
- */
- public void testmodInversePos1() {
- byte aBytes[] = {
- 24, 123, 56, -11, -112, -34, -98, 8, 10, 12, 14, 25, 125, -15, 28, -127};
- byte mBytes[] = {122, 45, 36, 100, 122, 45};
- int aSign = 1;
- int mSign = 1;
- byte rBytes[] = {47, 3, 96, 62, 87, 19};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger modulus = new BigInteger(mSign, mBytes);
- BigInteger result = aNumber.modInverse(modulus);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * modInverse: positive number (another case: a < 0)
- */
- public void testmodInversePos2() {
- byte aBytes[] = {
- 15, 24, 123, 56, -11, -112, -34, -98, 8, 10, 12, 14, 25, 125, -15, 28,
- -127};
- byte mBytes[] = {2, 122, 45, 36, 100};
- int aSign = 1;
- int mSign = 1;
- byte rBytes[] = {1, -93, 40, 127, 73};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger modulus = new BigInteger(mSign, mBytes);
- BigInteger result = aNumber.modInverse(modulus);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * modPow: non-positive modulus
- */
- public void testModPowException() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7};
- byte eBytes[] = {1, 2, 3, 4, 5};
- byte mBytes[] = {1, 2, 3};
- int aSign = 1;
- int eSign = 1;
- int mSign = -1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger exp = new BigInteger(eSign, eBytes);
- BigInteger modulus = new BigInteger(mSign, mBytes);
- try {
- aNumber.modPow(exp, modulus);
- fail("ArithmeticException has not been caught");
- } catch (ArithmeticException e) {
- assertEquals("Improper exception message",
- "BigInteger: modulus not positive", e.getMessage());
- }
- }
-
- /**
- * modPow: negative exponent
- */
- public void testModPowNegExp() {
- byte aBytes[] = {-127, 100, 56, 7, 98, -1, 39, -128, 127, 75, 48, -7};
- byte eBytes[] = {27, -15, 65, 39};
- byte mBytes[] = {-128, 2, 3, 4, 5};
- int aSign = 1;
- int eSign = -1;
- int mSign = 1;
- byte rBytes[] = {12, 118, 46, 86, 92};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger exp = new BigInteger(eSign, eBytes);
- BigInteger modulus = new BigInteger(mSign, mBytes);
- BigInteger result = aNumber.modPow(exp, modulus);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * modPow: positive exponent.
- */
- public void testModPowPosExp() {
- byte aBytes[] = {-127, 100, 56, 7, 98, -1, 39, -128, 127, 75, 48, -7};
- byte eBytes[] = {27, -15, 65, 39};
- byte mBytes[] = {-128, 2, 3, 4, 5};
- int aSign = 1;
- int eSign = 1;
- int mSign = 1;
- byte rBytes[] = {113, 100, -84, -28, -85};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger exp = new BigInteger(eSign, eBytes);
- BigInteger modulus = new BigInteger(mSign, mBytes);
- BigInteger result = aNumber.modPow(exp, modulus);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertEquals("Byte " + i, rBytes[i], resBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-}
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerMultiplyTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerMultiplyTest.java
deleted file mode 100644
index 5b24a50..0000000
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerMultiplyTest.java
+++ /dev/null
@@ -1,414 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-/**
- * author Elena Semukhina
- */
-package com.google.gwt.emultest.java.math;
-
-import com.google.gwt.emultest.java.util.EmulTestBase;
-
-import java.math.BigInteger;
-
-/**
- * Class: java.math.BigInteger Method: multiply
- */
-public class BigIntegerMultiplyTest extends EmulTestBase {
- /**
- * Multiply two negative numbers of the same length
- */
- public void testCase1() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = -1;
- int bSign = -1;
- byte rBytes[] = {
- 10, 40, 100, -55, 96, 51, 76, 40, -45, 85, 105, 4, 28, -86, -117, -52,
- 100, 120, 90};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.multiply(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Multiply a negative number by ONE.
- */
- public void testCase10() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 1, 2, 3, 4, 5};
- int aSign = -1;
- byte rBytes[] = {-2, -3, -4, -5, -6, -7, -8, -2, -3, -4, -2, -3, -4, -5, -5};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = BigInteger.ONE;
- BigInteger result = aNumber.multiply(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Multiply two numbers of the same length and different signs. The first is
- * negative.
- */
- public void testCase2() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[] = {
- -11, -41, -101, 54, -97, -52, -77, -41, 44, -86, -106, -5, -29, 85,
- 116, 51, -101, -121, -90};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.multiply(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Multiply two positive numbers of different length. The first is longer.
- */
- public void testCase3() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 1, 2, 3, 4, 5};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {
- 10, 40, 100, -55, 96, 51, 76, 40, -45, 85, 115, 44, -127, 115, -21,
- -62, -15, 85, 64, -87, -2, -36, -36, -106};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.multiply(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Multiply two positive numbers of different length. The second is longer.
- */
- public void testCase4() {
- byte aBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- byte bBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 1, 2, 3, 4, 5};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {
- 10, 40, 100, -55, 96, 51, 76, 40, -45, 85, 115, 44, -127, 115, -21,
- -62, -15, 85, 64, -87, -2, -36, -36, -106};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.multiply(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Multiply two numbers of different length and different signs. The first is
- * positive. The first is longer.
- */
- public void testCase5() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 1, 2, 3, 4, 5};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {
- -11, -41, -101, 54, -97, -52, -77, -41, 44, -86, -116, -45, 126, -116,
- 20, 61, 14, -86, -65, 86, 1, 35, 35, 106};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.multiply(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Multiply two numbers of different length and different signs. The first is
- * positive. The second is longer.
- */
- public void testCase6() {
- byte aBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- byte bBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 1, 2, 3, 4, 5};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {
- -11, -41, -101, 54, -97, -52, -77, -41, 44, -86, -116, -45, 126, -116,
- 20, 61, 14, -86, -65, 86, 1, 35, 35, 106};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.multiply(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Multiply a number by zero.
- */
- public void testCase7() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 1, 2, 3, 4, 5};
- byte bBytes[] = {0};
- int aSign = 1;
- int bSign = 0;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.multiply(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-
- /**
- * Multiply a number by ZERO.
- */
- public void testCase8() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 1, 2, 3, 4, 5};
- int aSign = 1;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = BigInteger.ZERO;
- BigInteger result = aNumber.multiply(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-
- /**
- * Multiply a positive number by ONE.
- */
- public void testCase9() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 1, 2, 3, 4, 5};
- int aSign = 1;
- byte rBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 1, 2, 3, 4, 5};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = BigInteger.ONE;
- BigInteger result = aNumber.multiply(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Multiply two numbers of 4 bytes length.
- */
- public void testIntbyInt1() {
- byte aBytes[] = {10, 20, 30, 40};
- byte bBytes[] = {1, 2, 3, 4};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {-11, -41, -101, 55, 5, 15, 96};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.multiply(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Multiply two numbers of 4 bytes length.
- */
- public void testIntbyInt2() {
- byte aBytes[] = {-1, -1, -1, -1};
- byte bBytes[] = {-1, -1, -1, -1};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {0, -1, -1, -1, -2, 0, 0, 0, 1};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.multiply(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Negative exponent.
- */
- public void testPowException() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7};
- int aSign = 1;
- int exp = -5;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- try {
- aNumber.pow(exp);
- fail("ArithmeticException has not been caught");
- } catch (ArithmeticException e) {
- assertEquals("Improper exception message", "Negative exponent",
- e.getMessage());
- }
- }
-
- /**
- * Exponentiation of a negative number to an even exponent.
- */
- public void testPowNegativeNumToEvenExp() {
- byte aBytes[] = {50, -26, 90, 69, 120, 32, 63, -103, -14, 35};
- int aSign = -1;
- int exp = 4;
- byte rBytes[] = {
- 102, 107, -122, -43, -52, -20, -27, 25, -9, 88, -13, 75, 78, 81, -33,
- -77, 39, 27, -37, 106, 121, -73, 108, -47, -101, 80, -25, 71, 13, 94,
- -7, -33, 1, -17, -65, -70, -61, -3, -47};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.pow(exp);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Exponentiation of a negative number to an odd exponent.
- */
- public void testPowNegativeNumToOddExp() {
- byte aBytes[] = {50, -26, 90, 69, 120, 32, 63, -103, -14, 35};
- int aSign = -1;
- int exp = 5;
- byte rBytes[] = {
- -21, -94, -42, -15, -127, 113, -50, -88, 115, -35, 3, 59, -92, 111,
- -75, 103, -42, 41, 34, -114, 99, -32, 105, -59, 127, 45, 108, 74, -93,
- 105, 33, 12, -5, -20, 17, -21, -119, -127, -115, 27, -122, 26, -67,
- 109, -125, 16, 91, -70, 109};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.pow(exp);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Exponentiation of a negative number to zero exponent.
- */
- public void testPowNegativeNumToZeroExp() {
- byte aBytes[] = {50, -26, 90, 69, 120, 32, 63, -103, -14, 35};
- int aSign = -1;
- int exp = 0;
- byte rBytes[] = {1};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.pow(exp);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Exponentiation of a positive number.
- */
- public void testPowPositiveNum() {
- byte aBytes[] = {50, -26, 90, 69, 120, 32, 63, -103, -14, 35};
- int aSign = 1;
- int exp = 5;
- byte rBytes[] = {
- 20, 93, 41, 14, 126, -114, 49, 87, -116, 34, -4, -60, 91, -112, 74,
- -104, 41, -42, -35, 113, -100, 31, -106, 58, -128, -46, -109, -75, 92,
- -106, -34, -13, 4, 19, -18, 20, 118, 126, 114, -28, 121, -27, 66, -110,
- 124, -17, -92, 69, -109};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.pow(exp);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Exponentiation of a negative number to zero exponent.
- */
- public void testPowPositiveNumToZeroExp() {
- byte aBytes[] = {50, -26, 90, 69, 120, 32, 63, -103, -14, 35};
- int aSign = 1;
- int exp = 0;
- byte rBytes[] = {1};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.pow(exp);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-}
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerNotTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerNotTest.java
deleted file mode 100644
index 9a1b4f7..0000000
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerNotTest.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-/**
- * author Elena Semukhina
- */
-package com.google.gwt.emultest.java.math;
-
-import com.google.gwt.emultest.java.util.EmulTestBase;
-
-import java.math.BigInteger;
-
-/**
- * Class: java.math.BigInteger Methods: and, andNot
- */
-public class BigIntegerNotTest extends EmulTestBase {
- /**
- * andNot for two negative numbers; the first is longer
- */
- public void testAndNotNegNegFirstLonger() {
- byte aBytes[] = {
- -128, 9, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117, 23, 87,
- -25, -75};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = -1;
- int bSign = -1;
- byte rBytes[] = {73, -92, -48, 4, 12, 6, 4, 32, 48, 64, 0, 8, 2};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.andNot(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * andNot for two positive numbers; the first is longer
- */
- public void testAndNotPosPosFirstLonger() {
- byte aBytes[] = {
- -128, 9, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117, 23, 87,
- -25, -75};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {
- 0, -128, 9, 56, 100, 0, 0, 1, 1, 90, 1, -32, 0, 10, -126, 21, 82, -31,
- -96};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.andNot(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * andNot for two positive numbers; the first is shorter
- */
- public void testAndNotPosPosFirstShorter() {
- byte aBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- byte bBytes[] = {
- -128, 9, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117, 23, 87,
- -25, -75};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {73, -92, -48, 4, 12, 6, 4, 32, 48, 64, 0, 8, 2};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.andNot(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * andNot for a negative and a positive numbers; the first is longer
- */
- public void testNegPosFirstLonger() {
- byte aBytes[] = {
- -128, 9, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117, 23, 87,
- -25, -75};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[] = {
- -1, 127, -10, -57, -101, 1, 2, 2, 2, -96, -16, 8, -40, -59, 68, -88,
- -88, 16, 72};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.andNot(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Not for a negative number
- */
- public void testNotNeg() {
- byte aBytes[] = {-128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117};
- int aSign = -1;
- byte rBytes[] = {
- 0, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -118};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.not();
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Not for ONE
- */
- public void testNotOne() {
- byte rBytes[] = {-2};
- BigInteger aNumber = BigInteger.ONE;
- BigInteger result = aNumber.not();
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Not for a positive number
- */
- public void testNotPos() {
- byte aBytes[] = {-128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117};
- int aSign = 1;
- byte rBytes[] = {
- -1, 127, -57, -101, 1, 75, -90, -46, -92, -4, 14, -36, -27, 116};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.not();
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Not for a negative number
- */
-
- public void testNotSpecialCase() {
- byte aBytes[] = {-1, -1, -1, -1};
- int aSign = 1;
- byte rBytes[] = {-1, 0, 0, 0, 0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.not();
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Not for ZERO
- */
- public void testNotZero() {
- byte rBytes[] = {-1};
- BigInteger aNumber = BigInteger.ZERO;
- BigInteger result = aNumber.not();
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-}
\ No newline at end of file
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerOperateBitsTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerOperateBitsTest.java
deleted file mode 100644
index 3e62f59..0000000
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerOperateBitsTest.java
+++ /dev/null
@@ -1,1418 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-/**
- * author Elena Semukhina
- */
-package com.google.gwt.emultest.java.math;
-
-import com.google.gwt.emultest.java.util.EmulTestBase;
-
-import java.math.BigInteger;
-
-/**
- * Class: java.math.BigInteger Methods: bitLength, shiftLeft, shiftRight,
- * clearBit, flipBit, setBit, testBit
- */
-public class BigIntegerOperateBitsTest extends EmulTestBase {
- /**
- * bitCount() of a negative number.
- */
- public void testBitCountNeg() {
- BigInteger aNumber = new BigInteger(
- "-12378634756382937873487638746283767238657872368748726875");
- assertEquals(87, aNumber.bitCount());
- }
-
- /**
- * bitCount() of a negative number.
- */
- public void testBitCountPos() {
- BigInteger aNumber = new BigInteger(
- "12378634756343564757582937873487638746283767238657872368748726875");
- assertEquals(107, aNumber.bitCount());
- }
-
- /**
- * bitCount() of zero.
- */
- public void testBitCountZero() {
- BigInteger aNumber = new BigInteger("0");
- assertEquals(0, aNumber.bitCount());
- }
-
- /**
- * bitLength() of a negative number.
- */
- public void testBitLengthNegative1() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = -1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- assertEquals(108, aNumber.bitLength());
- }
-
- /**
- * bitLength() of a negative number with the leftmost bit set
- */
- public void testBitLengthNegative2() {
- byte aBytes[] = {-128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = -1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- assertEquals(96, aNumber.bitLength());
- }
-
- /**
- * bitLength() of a negative number which is a power of 2
- */
- public void testBitLengthNegative3() {
- byte aBytes[] = {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
- int aSign = -1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- assertEquals(80, aNumber.bitLength());
- }
-
- /**
- * bitLength() of a positive number.
- */
- public void testBitLengthPositive1() {
- byte aBytes[] = {12, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, 3, 91};
- int aSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- assertEquals(108, aNumber.bitLength());
- }
-
- /**
- * bitLength() of a positive number with the leftmost bit set
- */
- public void testBitLengthPositive2() {
- byte aBytes[] = {-128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- assertEquals(96, aNumber.bitLength());
- }
-
- /**
- * bitLength() of a positive number which is a power of 2
- */
- public void testBitLengthPositive3() {
- byte aBytes[] = {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
- int aSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- assertEquals(81, aNumber.bitLength());
- }
-
- /**
- * bitLength() of zero.
- */
- public void testBitLengthZero() {
- BigInteger aNumber = new BigInteger("0");
- assertEquals(0, aNumber.bitLength());
- }
-
- /**
- * clearBit(int n) of a negative n
- */
- public void testClearBitException() {
- byte aBytes[] = {-1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = -7;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- try {
- aNumber.clearBit(number);
- fail("ArithmeticException has not been caught");
- } catch (ArithmeticException e) {
- assertEquals("Improper exception message", "Negative bit address",
- e.getMessage());
- }
- }
-
- /**
- * clearBit(int n) inside a negative number
- */
- public void testClearBitNegativeInside1() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = -1;
- int number = 15;
- byte rBytes[] = {-2, 127, -57, -101, 1, 75, -90, -46, -92, -4, 14, 92, -26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.clearBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * clearBit(int n) inside a negative number
- */
- public void testClearBitNegativeInside2() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = -1;
- int number = 44;
- byte rBytes[] = {-2, 127, -57, -101, 1, 75, -90, -62, -92, -4, 14, -36, -26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.clearBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * clearBit(2) in the negative number with all ones in bit representation
- */
- public void testClearBitNegativeInside3() {
- String as = "-18446744073709551615";
- int number = 2;
- BigInteger aNumber = new BigInteger(as);
- BigInteger result = aNumber.clearBit(number);
- assertEquals(as, result.toString());
- }
-
- /**
- * clearBit(0) in the negative number of length 1 with all ones in bit
- * representation. the resulting number's length is 2.
- */
- public void testClearBitNegativeInside4() {
- String as = "-4294967295";
- String res = "-4294967296";
- int number = 0;
- BigInteger aNumber = new BigInteger(as);
- BigInteger result = aNumber.clearBit(number);
- assertEquals(res, result.toString());
- }
-
- /**
- * clearBit(0) in the negative number of length 2 with all ones in bit
- * representation. the resulting number's length is 3.
- */
- public void testClearBitNegativeInside5() {
- String as = "-18446744073709551615";
- String res = "-18446744073709551616";
- int number = 0;
- BigInteger aNumber = new BigInteger(as);
- BigInteger result = aNumber.clearBit(number);
- assertEquals(res, result.toString());
- }
-
- /**
- * clearBit(int n) outside a negative number
- */
- public void testClearBitNegativeOutside1() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = -1;
- int number = 150;
- byte rBytes[] = {
- -65, -1, -1, -1, -1, -1, -2, 127, -57, -101, 1, 75, -90, -46, -92, -4,
- 14, -36, -26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.clearBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * clearBit(int n) outside a negative number
- */
- public void testClearBitNegativeOutside2() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = -1;
- int number = 165;
- byte rBytes[] = {
- -33, -1, -1, -1, -1, -1, -1, -1, -2, 127, -57, -101, 1, 75, -90, -46,
- -92, -4, 14, -36, -26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.clearBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * clearBit(int n) inside a positive number
- */
- public void testClearBitPositiveInside1() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 20;
- byte rBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -31, 35, 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.clearBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * clearBit(int n) inside a positive number
- */
- public void testClearBitPositiveInside2() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 17;
- byte rBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.clearBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * clearBit(int n) inside a positive number
- */
- public void testClearBitPositiveInside3() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 45;
- byte rBytes[] = {1, -128, 56, 100, -2, -76, 89, 13, 91, 3, -15, 35, 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.clearBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * clearBit(int n) inside a positive number
- */
- public void testClearBitPositiveInside4() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 50;
- byte rBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.clearBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * clearBit(int n) inside a positive number
- */
- public void testClearBitPositiveInside5() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 63;
- byte rBytes[] = {1, -128, 56, 100, -2, 52, 89, 45, 91, 3, -15, 35, 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.clearBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * clearBit(int n) outside a positive number
- */
- public void testClearBitPositiveOutside1() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 150;
- byte rBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.clearBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * clearBit(int n) outside a positive number
- */
- public void testClearBitPositiveOutside2() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 191;
- byte rBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.clearBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * clearBit(int n) the leftmost bit in a negative number
- */
- public void testClearBitTopNegative() {
- byte aBytes[] = {1, -128, 56, 100, -15, 35, 26};
- int aSign = -1;
- int number = 63;
- byte rBytes[] = {-1, 127, -2, 127, -57, -101, 14, -36, -26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.clearBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * clearBit(int n) outside zero
- */
- public void testClearBitZero() {
- byte aBytes[] = {0};
- int aSign = 0;
- int number = 0;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.clearBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-
- /**
- * clearBit(int n) outside zero
- */
- public void testClearBitZeroOutside1() {
- byte aBytes[] = {0};
- int aSign = 0;
- int number = 95;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.clearBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-
- /**
- * flipBit(int n) of a negative n
- */
- public void testFlipBitException() {
- byte aBytes[] = {-1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = -7;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- try {
- aNumber.flipBit(number);
- fail("ArithmeticException has not been caught");
- } catch (ArithmeticException e) {
- assertEquals("Improper exception message", "Negative bit address",
- e.getMessage());
- }
- }
-
- /**
- * flipBit(int n) the leftmost bit in a negative number
- */
- public void testFlipBitLeftmostNegative() {
- byte aBytes[] = {1, -128, 56, 100, -15, 35, 26};
- int aSign = -1;
- int number = 48;
- byte rBytes[] = {-1, 127, -57, -101, 14, -36, -26, 49};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.flipBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * flipBit(int n) the leftmost bit in a positive number
- */
- public void testFlipBitLeftmostPositive() {
- byte aBytes[] = {1, -128, 56, 100, -15, 35, 26};
- int aSign = 1;
- int number = 48;
- byte rBytes[] = {0, -128, 56, 100, -15, 35, 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.flipBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * flipBit(int n) inside a negative number
- */
- public void testFlipBitNegativeInside1() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = -1;
- int number = 15;
- byte rBytes[] = {-2, 127, -57, -101, 1, 75, -90, -46, -92, -4, 14, 92, -26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.flipBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * flipBit(int n) inside a negative number
- */
- public void testFlipBitNegativeInside2() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = -1;
- int number = 45;
- byte rBytes[] = {-2, 127, -57, -101, 1, 75, -90, -14, -92, -4, 14, -36, -26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.flipBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * flipBit(int n) inside a negative number with all ones in bit representation
- */
- public void testFlipBitNegativeInside3() {
- String as = "-18446744073709551615";
- String res = "-18446744073709551611";
- int number = 2;
- BigInteger aNumber = new BigInteger(as);
- BigInteger result = aNumber.flipBit(number);
- assertEquals(res, result.toString());
- }
-
- /**
- * flipBit(0) in the negative number of length 1 with all ones in bit
- * representation. the resulting number's length is 2.
- */
- public void testFlipBitNegativeInside4() {
- String as = "-4294967295";
- String res = "-4294967296";
- int number = 0;
- BigInteger aNumber = new BigInteger(as);
- BigInteger result = aNumber.flipBit(number);
- assertEquals(res, result.toString());
- }
-
- /**
- * flipBit(0) in the negative number of length 2 with all ones in bit
- * representation. the resulting number's length is 3.
- */
- public void testFlipBitNegativeInside5() {
- String as = "-18446744073709551615";
- String res = "-18446744073709551616";
- int number = 0;
- BigInteger aNumber = new BigInteger(as);
- BigInteger result = aNumber.flipBit(number);
- assertEquals(res, result.toString());
- }
-
- /**
- * flipBit(int n) outside a negative number
- */
- public void testFlipBitNegativeOutside1() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = -1;
- int number = 150;
- byte rBytes[] = {
- -65, -1, -1, -1, -1, -1, -2, 127, -57, -101, 1, 75, -90, -46, -92, -4,
- 14, -36, -26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.flipBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * flipBit(int n) outside a negative number
- */
- public void testFlipBitNegativeOutside2() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = -1;
- int number = 191;
- byte rBytes[] = {
- -1, 127, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, 127, -57, -101, 1,
- 75, -90, -46, -92, -4, 14, -36, -26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.flipBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * flipBit(int n) inside a positive number
- */
- public void testFlipBitPositiveInside1() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 15;
- byte rBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, -93, 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.flipBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * flipBit(int n) inside a positive number
- */
- public void testFlipBitPositiveInside2() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 45;
- byte rBytes[] = {1, -128, 56, 100, -2, -76, 89, 13, 91, 3, -15, 35, 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.flipBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * flipBit(int n) outside a positive number
- */
- public void testFlipBitPositiveOutside1() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 150;
- byte rBytes[] = {
- 64, 0, 0, 0, 0, 0, 1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35,
- 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.flipBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * flipBit(int n) outside a positive number
- */
- public void testFlipBitPositiveOutside2() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 191;
- byte rBytes[] = {
- 0, -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -128, 56, 100, -2, -76, 89,
- 45, 91, 3, -15, 35, 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.flipBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * flipBit(int n) zero
- */
- public void testFlipBitZero() {
- byte aBytes[] = {0};
- int aSign = 0;
- int number = 0;
- byte rBytes[] = {1};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.flipBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * flipBit(int n) outside zero
- */
- public void testFlipBitZeroOutside1() {
- byte aBytes[] = {0};
- int aSign = 0;
- int number = 62;
- byte rBytes[] = {64, 0, 0, 0, 0, 0, 0, 0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.flipBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue("incorrect value", resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * flipBit(int n) outside zero
- */
- public void testFlipBitZeroOutside2() {
- byte aBytes[] = {0};
- int aSign = 0;
- int number = 63;
- byte rBytes[] = {0, -128, 0, 0, 0, 0, 0, 0, 0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.flipBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue("incorrect value", resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * setBit: check the case when the number of bit to be set can be represented
- * as n * 32 + 31, where n is an arbitrary integer. Here 191 = 5 * 32 + 31
- */
- public void testSetBitBug1331() {
- BigInteger result = BigInteger.valueOf(0L).setBit(191);
- assertEquals("incorrect value",
- "3138550867693340381917894711603833208051177722232017256448",
- result.toString());
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * setBit(int n) of a negative n
- */
- public void testSetBitException() {
- byte aBytes[] = {-1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = -7;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- try {
- aNumber.setBit(number);
- fail("ArithmeticException has not been caught");
- } catch (ArithmeticException e) {
- assertEquals("Improper exception message", "Negative bit address",
- e.getMessage());
- }
- }
-
- /**
- * setBit(int n) the leftmost bit in a negative number
- */
- public void testSetBitLeftmostNegative() {
- byte aBytes[] = {1, -128, 56, 100, -15, 35, 26};
- int aSign = -1;
- int number = 48;
- byte rBytes[] = {-1, 127, -57, -101, 14, -36, -26, 49};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.setBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * setBit(int n) inside a negative number
- */
- public void testSetBitNegativeInside1() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = -1;
- int number = 15;
- byte rBytes[] = {-2, 127, -57, -101, 1, 75, -90, -46, -92, -4, 14, -36, -26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.setBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * setBit(int n) inside a negative number
- */
- public void testSetBitNegativeInside2() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = -1;
- int number = 44;
- byte rBytes[] = {-2, 127, -57, -101, 1, 75, -90, -46, -92, -4, 14, -36, -26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.setBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * setBit(int n) inside a negative number with all ones in bit representation
- */
- public void testSetBitNegativeInside3() {
- String as = "-18446744073709551615";
- String res = "-18446744073709551611";
- int number = 2;
- BigInteger aNumber = new BigInteger(as);
- BigInteger result = aNumber.setBit(number);
- assertEquals(res, result.toString());
- }
-
- /**
- * setBit(0) in the negative number of length 1 with all ones in bit
- * representation. the resulting number's length is 2.
- */
- public void testSetBitNegativeInside4() {
- String as = "-4294967295";
- int number = 0;
- BigInteger aNumber = new BigInteger(as);
- BigInteger result = aNumber.setBit(number);
- assertEquals(as, result.toString());
- }
-
- /**
- * setBit(0) in the negative number of length 2 with all ones in bit
- * representation. the resulting number's length is 3.
- */
- public void testSetBitNegativeInside5() {
- String as = "-18446744073709551615";
- int number = 0;
- BigInteger aNumber = new BigInteger(as);
- BigInteger result = aNumber.setBit(number);
- assertEquals(as, result.toString());
- }
-
- /**
- * setBit(int n) outside a negative number
- */
- public void testSetBitNegativeOutside1() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = -1;
- int number = 150;
- byte rBytes[] = {-2, 127, -57, -101, 1, 75, -90, -46, -92, -4, 14, -36, -26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.setBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * setBit(int n) outside a negative number
- */
- public void testSetBitNegativeOutside2() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = -1;
- int number = 191;
- byte rBytes[] = {-2, 127, -57, -101, 1, 75, -90, -46, -92, -4, 14, -36, -26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.setBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * setBit(int n) inside a positive number
- */
- public void testSetBitPositiveInside1() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 20;
- byte rBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.setBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * setBit(int n) inside a positive number
- */
- public void testSetBitPositiveInside2() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 17;
- byte rBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -13, 35, 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.setBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * setBit(int n) inside a positive number
- */
- public void testSetBitPositiveInside3() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 45;
- byte rBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.setBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * setBit(int n) inside a positive number
- */
- public void testSetBitPositiveInside4() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 50;
- byte rBytes[] = {1, -128, 56, 100, -2, -76, 93, 45, 91, 3, -15, 35, 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.setBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * setBit(int n) outside a positive number
- */
- public void testSetBitPositiveOutside1() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 150;
- byte rBytes[] = {
- 64, 0, 0, 0, 0, 0, 1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35,
- 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.setBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * setBit(int n) outside a positive number
- */
- public void testSetBitPositiveOutside2() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 223;
- byte rBytes[] = {
- 0, -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -128, 56, 100,
- -2, -76, 89, 45, 91, 3, -15, 35, 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.setBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * setBit(int n) the leftmost bit in a positive number
- */
- public void testSetBitTopPositive() {
- byte aBytes[] = {1, -128, 56, 100, -15, 35, 26};
- int aSign = 1;
- int number = 63;
- byte rBytes[] = {0, -128, 1, -128, 56, 100, -15, 35, 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.setBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * setBit(int n) outside zero
- */
- public void testSetBitZero() {
- byte aBytes[] = {0};
- int aSign = 0;
- int number = 0;
- byte rBytes[] = {1};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.setBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * setBit(int n) outside zero
- */
- public void testSetBitZeroOutside1() {
- byte aBytes[] = {0};
- int aSign = 0;
- int number = 95;
- byte rBytes[] = {0, -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.setBit(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * shiftLeft(int n), n = 0
- */
- public void testShiftLeft1() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 0;
- byte rBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.shiftLeft(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * shiftLeft(int n), n < 0
- */
- public void testShiftLeft2() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = -27;
- byte rBytes[] = {48, 7, 12, -97, -42, -117, 37, -85, 96};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.shiftLeft(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * shiftLeft(int n) a positive number, n > 0
- */
- public void testShiftLeft3() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 27;
- byte rBytes[] = {
- 12, 1, -61, 39, -11, -94, -55, 106, -40, 31, -119, 24, -48, 0, 0, 0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.shiftLeft(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * shiftLeft(int n) a positive number, n > 0
- */
- public void testShiftLeft4() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 45;
- byte rBytes[] = {
- 48, 7, 12, -97, -42, -117, 37, -85, 96, 126, 36, 99, 64, 0, 0, 0, 0, 0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.shiftLeft(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * shiftLeft(int n) a negative number, n > 0
- */
- public void testShiftLeft5() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = -1;
- int number = 45;
- byte rBytes[] = {
- -49, -8, -13, 96, 41, 116, -38, 84, -97, -127, -37, -100, -64, 0, 0, 0,
- 0, 0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.shiftLeft(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * shiftRight(int n), n = 0
- */
- public void testShiftRight1() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 0;
- byte rBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.shiftRight(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * shiftRight(int n), n < 0
- */
- public void testShiftRight2() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = -27;
- byte rBytes[] = {
- 12, 1, -61, 39, -11, -94, -55, 106, -40, 31, -119, 24, -48, 0, 0, 0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.shiftRight(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * shiftRight(int n), 0 < n < 32
- */
- public void testShiftRight3() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 27;
- byte rBytes[] = {48, 7, 12, -97, -42, -117, 37, -85, 96};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.shiftRight(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * shiftRight(int n), n > 32
- */
- public void testShiftRight4() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 45;
- byte rBytes[] = {12, 1, -61, 39, -11, -94, -55};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.shiftRight(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * shiftRight(int n), n is greater than bitLength()
- */
- public void testShiftRight5() {
- byte aBytes[] = {1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 300;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.shiftRight(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-
- /**
- * shiftRight a negative number; shift distance is NOT multiple of 32; shifted
- * bits are NOT zeroes.
- */
- public void testShiftRightNegNonZeroes() {
- byte aBytes[] = {
- 1, -128, 56, 100, -2, -76, 89, 45, 91, 0, 0, 0, 0, 0, 0, 0, 0};
- int aSign = -1;
- int number = 68;
- byte rBytes[] = {-25, -4, 121, -80, 20, -70, 109, 42};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.shiftRight(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * shiftRight a negative number; shift distance is multiple of 32; shifted
- * bits are NOT zeroes.
- */
- public void testShiftRightNegNonZeroesMul32() {
- byte aBytes[] = {
- 1, -128, 56, 100, -2, -76, 89, 45, 91, 1, 0, 0, 0, 0, 0, 0, 0};
- int aSign = -1;
- int number = 64;
- byte rBytes[] = {-2, 127, -57, -101, 1, 75, -90, -46, -92};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.shiftRight(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * shiftRight a negative number; shift distance is NOT multiple of 32; shifted
- * bits are zeroes.
- */
- public void testShiftRightNegZeroes() {
- byte aBytes[] = {
- 1, -128, 56, 100, -2, -76, 89, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0};
- int aSign = -1;
- int number = 68;
- byte rBytes[] = {-25, -4, 121, -80, 20, -70, 109, 48};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.shiftRight(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * shiftRight a negative number; shift distance is multiple of 32; shifted
- * bits are zeroes.
- */
- public void testShiftRightNegZeroesMul32() {
- byte aBytes[] = {
- 1, -128, 56, 100, -2, -76, 89, 45, 91, 0, 0, 0, 0, 0, 0, 0, 0};
- int aSign = -1;
- int number = 64;
- byte rBytes[] = {-2, 127, -57, -101, 1, 75, -90, -46, -91};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger result = aNumber.shiftRight(number);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * testBit(int n) of a negative n
- */
- public void testTestBitException() {
- byte aBytes[] = {-1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = -7;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- try {
- aNumber.testBit(number);
- fail("ArithmeticException has not been caught");
- } catch (ArithmeticException e) {
- assertEquals("Improper exception message", "Negative bit address",
- e.getMessage());
- }
- }
-
- /**
- * testBit(int n) of a negative number
- */
- public void testTestBitNegative1() {
- byte aBytes[] = {-1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = -1;
- int number = 7;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- assertTrue(aNumber.testBit(number));
- }
-
- /**
- * testBit(int n) of a positive n
- */
- public void testTestBitNegative2() {
- byte aBytes[] = {-1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = -1;
- int number = 45;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- assertTrue(!aNumber.testBit(number));
- }
-
- /**
- * testBit(int n) of a positive n, n > bitLength()
- */
- public void testTestBitNegative3() {
- byte aBytes[] = {-1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = -1;
- int number = 300;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- assertTrue(aNumber.testBit(number));
- }
-
- /**
- * testBit(int n) of a positive number
- */
- public void testTestBitPositive1() {
- byte aBytes[] = {-1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 7;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- assertTrue(!aNumber.testBit(number));
- }
-
- /**
- * testBit(int n) of a positive number
- */
- public void testTestBitPositive2() {
- byte aBytes[] = {-1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 45;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- assertTrue(aNumber.testBit(number));
- }
-
- /**
- * testBit(int n) of a positive number, n > bitLength()
- */
- public void testTestBitPositive3() {
- byte aBytes[] = {-1, -128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26};
- int aSign = 1;
- int number = 300;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- assertTrue(!aNumber.testBit(number));
- }
-}
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerOrTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerOrTest.java
deleted file mode 100644
index e67cb2e..0000000
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerOrTest.java
+++ /dev/null
@@ -1,467 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-/**
- * author Elena Semukhina
- */
-package com.google.gwt.emultest.java.math;
-
-import com.google.gwt.emultest.java.util.EmulTestBase;
-
-import java.math.BigInteger;
-
-/**
- * Class: java.math.BigInteger Method: or
- */
-public class BigIntegerOrTest extends EmulTestBase {
- /**
- * Or for two negative numbers; the first is longer
- */
- public void testNegNegFirstLonger() {
- byte aBytes[] = {
- -128, 9, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117, 23, 87,
- -25, -75};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = -1;
- int bSign = -1;
- byte rBytes[] = {
- -1, 1, 75, -89, -45, -2, -3, -18, -36, -17, -10, -3, -6, -7, -21};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.or(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Or for two negative numbers; the first is shorter
- */
- public void testNegNegFirstShorter() {
- byte aBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- byte bBytes[] = {
- -128, 9, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117, 23, 87,
- -25, -75};
- int aSign = -1;
- int bSign = -1;
- byte rBytes[] = {
- -1, 1, 75, -89, -45, -2, -3, -18, -36, -17, -10, -3, -6, -7, -21};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.or(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Or for two negative numbers of the same length
- */
- public void testNegNegSameLength() {
- byte aBytes[] = {-128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = -1;
- int bSign = -1;
- byte rBytes[] = {
- -1, 127, -57, -101, -5, -5, -18, -38, -17, -2, -65, -2, -11, -3};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.or(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Or for a negative number and zero
- */
- public void testNegPos() {
- byte aBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- byte bBytes[] = {0};
- int aSign = -1;
- int bSign = 0;
- byte rBytes[] = {
- -1, 1, 2, 3, 3, -6, -15, -24, -40, -49, -58, -67, -6, -15, -23};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.or(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Or for a negative and a positive numbers; the first is longer
- */
- public void testNegPosFirstLonger() {
- byte aBytes[] = {
- -128, 9, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117, 23, 87,
- -25, -75};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[] = {
- -1, 127, -10, -57, -101, -1, -1, -2, -2, -91, -2, 31, -1, -11, 125,
- -22, -83, 30, 95};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.or(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Or for two negative numbers; the first is shorter
- */
- public void testNegPosFirstShorter() {
- byte aBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- byte bBytes[] = {
- -128, 9, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117, 23, 87,
- -25, -75};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[] = {-74, 91, 47, -5, -13, -7, -5, -33, -49, -65, -1, -9, -3};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.or(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Or for two numbers of different signs and the same length
- */
- public void testNegPosSameLength() {
- byte aBytes[] = {-128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[] = {-1, 5, 79, -73, -9, -76, -3, 78, -35, -17, 119};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.or(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Or for one and one
- */
- public void testOneOne() {
- byte aBytes[] = {1};
- byte bBytes[] = {1};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {1};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.or(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Or for a positive and a negative numbers; the first is longer
- */
- public void testPosNegFirstLonger() {
- byte aBytes[] = {
- -128, 9, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117, 23, 87,
- -25, -75};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {-74, 91, 47, -5, -13, -7, -5, -33, -49, -65, -1, -9, -3};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.or(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Or for a positive and a negative number; the first is shorter
- */
- public void testPosNegFirstShorter() {
- byte aBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- byte bBytes[] = {
- -128, 9, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117, 23, 87,
- -25, -75};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {
- -1, 127, -10, -57, -101, -1, -1, -2, -2, -91, -2, 31, -1, -11, 125,
- -22, -83, 30, 95};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.or(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Or for two numbers of different signs and the same length
- */
- public void testPosNegSameLength() {
- byte aBytes[] = {-128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {
- -1, 1, -126, 59, 103, -2, -11, -7, -3, -33, -57, -3, -5, -5, -21};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.or(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Or for two positive numbers; the first is longer
- */
- public void testPosPosFirstLonger() {
- byte aBytes[] = {
- -128, 9, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117, 23, 87,
- -25, -75};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {
- 0, -128, 9, 56, 100, -2, -3, -3, -3, 95, 15, -9, 39, 58, -69, 87, 87,
- -17, -73};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.or(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Or for two positive numbers; the first is shorter
- */
- public void testPosPosFirstShorter() {
- byte aBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- byte bBytes[] = {
- -128, 9, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117, 23, 87,
- -25, -75};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {
- 0, -128, 9, 56, 100, -2, -3, -3, -3, 95, 15, -9, 39, 58, -69, 87, 87,
- -17, -73};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.or(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Or for two positive numbers of the same length
- */
- public void testPosPosSameLength() {
- byte aBytes[] = {-128, 56, 100, -2, -76, 89, 45, 91, 3, -15, 35, 26, -117};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {
- 0, -2, -3, -4, -4, -1, -66, 95, 47, 123, 59, -13, 39, 30, -97};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.or(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Or for a positive number and zero
- */
- public void testPosZero() {
- byte aBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- byte bBytes[] = {0};
- int aSign = 1;
- int bSign = 0;
- byte rBytes[] = {0, -2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.or(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- public void testRegression() {
- // Regression test for HARMONY-1996
- BigInteger x = new BigInteger("-1023");
- BigInteger r1 = x.and((BigInteger.ZERO.not()).shiftLeft(32));
- BigInteger r3 = x.and((BigInteger.ZERO.not().shiftLeft(32)).not());
- BigInteger result = r1.or(r3);
- assertEquals(x, result);
- }
-
- /**
- * Or for zero and a negative number
- */
- public void testZeroNeg() {
- byte aBytes[] = {0};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = 0;
- int bSign = -1;
- byte rBytes[] = {
- -1, 1, 2, 3, 3, -6, -15, -24, -40, -49, -58, -67, -6, -15, -23};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.or(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", -1, result.signum());
- }
-
- /**
- * Or for zero and one
- */
- public void testZeroOne() {
- byte aBytes[] = {0};
- byte bBytes[] = {1};
- int aSign = 0;
- int bSign = 1;
- byte rBytes[] = {1};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.or(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Or for zero and a positive number
- */
- public void testZeroPos() {
- byte aBytes[] = {0};
- byte bBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- int aSign = 0;
- int bSign = 1;
- byte rBytes[] = {0, -2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.or(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 1, result.signum());
- }
-
- /**
- * Or for zero and zero
- */
- public void testZeroZero() {
- byte aBytes[] = {0};
- byte bBytes[] = {0};
- int aSign = 0;
- int bSign = 0;
- byte rBytes[] = {0};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.or(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals("incorrect sign", 0, result.signum());
- }
-}
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerSubtractTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerSubtractTest.java
deleted file mode 100644
index 8e6290a..0000000
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerSubtractTest.java
+++ /dev/null
@@ -1,547 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-/**
- * author Elena Semukhina
- */
-package com.google.gwt.emultest.java.math;
-
-import com.google.gwt.emultest.java.util.EmulTestBase;
-
-import java.math.BigInteger;
-
-/**
- * Class: java.math.BigInteger Method: subtract
- */
-public class BigIntegerSubtractTest extends EmulTestBase {
- /**
- * Subtract two positive numbers of the same length. The first is greater.
- */
- public void testCase1() {
- byte aBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- byte bBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {9, 18, 27, 36, 45, 54, 63, 9, 18, 27};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(1, result.signum());
- }
-
- /**
- * Subtract two positive numbers of different length. The second is longer.
- */
- public void testCase10() {
- byte aBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- byte bBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(-1, result.signum());
- }
-
- /**
- * Subtract two numbers of different length and different signs. The first is
- * positive. The first is greater in absolute value.
- */
- public void testCase11() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {1, 2, 3, 4, 15, 26, 37, 41, 52, 63, 74, 15, 26, 37};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(1, result.signum());
- }
-
- /**
- * Subtract two numbers of the same length and different signs. The first is
- * positive. The second is greater in absolute value.
- */
- public void testCase12() {
- byte aBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- byte bBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {1, 2, 3, 4, 15, 26, 37, 41, 52, 63, 74, 15, 26, 37};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(1, result.signum());
- }
-
- /**
- * Subtract two numbers of different length and different signs. The first is
- * negative. The first is longer.
- */
- public void testCase13() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[] = {
- -2, -3, -4, -5, -16, -27, -38, -42, -53, -64, -75, -16, -27, -37};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(-1, result.signum());
- }
-
- /**
- * Subtract two numbers of the same length and different signs. The first is
- * negative. The second is longer.
- */
- public void testCase14() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[] = {
- -2, -3, -4, -5, -16, -27, -38, -42, -53, -64, -75, -16, -27, -37};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(-1, result.signum());
- }
-
- /**
- * Subtract two negative numbers of different length. The first is longer.
- */
- public void testCase15() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = -1;
- int bSign = -1;
- byte rBytes[] = {-2, -3, -4, -4, 5, 14, 23, 39, 48, 57, 66, 5, 14, 23};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(-1, result.signum());
- }
-
- /**
- * Subtract two negative numbers of different length. The second is longer.
- */
- public void testCase16() {
- byte aBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- byte bBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
- int aSign = -1;
- int bSign = -1;
- byte rBytes[] = {1, 2, 3, 3, -6, -15, -24, -40, -49, -58, -67, -6, -15, -23};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(1, result.signum());
- }
-
- /**
- * Subtract two positive equal in absolute value numbers.
- */
- public void testCase17() {
- byte aBytes[] = {-120, 34, 78, -23, -111, 45, 127, 23, 45, -3};
- byte bBytes[] = {-120, 34, 78, -23, -111, 45, 127, 23, 45, -3};
- byte rBytes[] = {0};
- int aSign = 1;
- int bSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(0, result.signum());
- }
-
- /**
- * Subtract zero from a number. The number is positive.
- */
- public void testCase18() {
- byte aBytes[] = {120, 34, 78, -23, -111, 45, 127, 23, 45, -3};
- byte bBytes[] = {0};
- byte rBytes[] = {120, 34, 78, -23, -111, 45, 127, 23, 45, -3};
- int aSign = 1;
- int bSign = 0;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(1, result.signum());
- }
-
- /**
- * Subtract a number from zero. The number is negative.
- */
- public void testCase19() {
- byte aBytes[] = {0};
- byte bBytes[] = {120, 34, 78, -23, -111, 45, 127, 23, 45, -3};
- byte rBytes[] = {120, 34, 78, -23, -111, 45, 127, 23, 45, -3};
- int aSign = 0;
- int bSign = -1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(1, result.signum());
- }
-
- /**
- * Subtract two positive numbers of the same length. The second is greater.
- */
- public void testCase2() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {-10, -19, -28, -37, -46, -55, -64, -10, -19, -27};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(-1, result.signum());
- }
-
- /**
- * Subtract zero from zero.
- */
- public void testCase20() {
- byte aBytes[] = {0};
- byte bBytes[] = {0};
- byte rBytes[] = {0};
- int aSign = 0;
- int bSign = 0;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(0, result.signum());
- }
-
- /**
- * Subtract ZERO from a number. The number is positive.
- */
- public void testCase21() {
- byte aBytes[] = {120, 34, 78, -23, -111, 45, 127, 23, 45, -3};
- byte rBytes[] = {120, 34, 78, -23, -111, 45, 127, 23, 45, -3};
- int aSign = 1;
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = BigInteger.ZERO;
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(1, result.signum());
- }
-
- /**
- * Subtract a number from ZERO. The number is negative.
- */
- public void testCase22() {
- byte bBytes[] = {120, 34, 78, -23, -111, 45, 127, 23, 45, -3};
- byte rBytes[] = {120, 34, 78, -23, -111, 45, 127, 23, 45, -3};
- int bSign = -1;
- BigInteger aNumber = BigInteger.ZERO;
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(1, result.signum());
- }
-
- /**
- * Subtract ZERO from ZERO.
- */
- public void testCase23() {
- byte rBytes[] = {0};
- BigInteger aNumber = BigInteger.ZERO;
- BigInteger bNumber = BigInteger.ZERO;
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(0, result.signum());
- }
-
- /**
- * Subtract ONE from ONE.
- */
- public void testCase24() {
- byte rBytes[] = {0};
- BigInteger aNumber = BigInteger.ONE;
- BigInteger bNumber = BigInteger.ONE;
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(0, result.signum());
- }
-
- /**
- * Subtract two numbers so that borrow is 1.
- */
- public void testCase25() {
- byte aBytes[] = {-1, -1, -1, -1, -1, -1, -1, -1};
- byte bBytes[] = {-128, -128, -128, -128, -128, -128, -128, -128, -128};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {-128, 127, 127, 127, 127, 127, 127, 127, 127};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(-1, result.signum());
- }
-
- /**
- * Subtract two numbers of the same length and different signs. The first is
- * positive. The first is greater in absolute value.
- */
- public void testCase3() {
- byte aBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- byte bBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {11, 22, 33, 44, 55, 66, 77, 11, 22, 33};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(1, result.signum());
- }
-
- /**
- * Subtract two numbers of the same length and different signs. The first is
- * positive. The second is greater in absolute value.
- */
- public void testCase4() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = 1;
- int bSign = -1;
- byte rBytes[] = {11, 22, 33, 44, 55, 66, 77, 11, 22, 33};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(1, result.signum());
- }
-
- /**
- * Subtract two negative numbers of the same length. The first is greater in
- * absolute value.
- */
- public void testCase5() {
- byte aBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- byte bBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3};
- int aSign = -1;
- int bSign = -1;
- byte rBytes[] = {-10, -19, -28, -37, -46, -55, -64, -10, -19, -27};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(-1, result.signum());
- }
-
- /**
- * Subtract two negative numbers of the same length. The second is greater in
- * absolute value.
- */
- public void testCase6() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = -1;
- int bSign = -1;
- byte rBytes[] = {9, 18, 27, 36, 45, 54, 63, 9, 18, 27};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(1, result.signum());
- }
-
- /**
- * Subtract two numbers of the same length and different signs. The first is
- * negative. The first is greater in absolute value.
- */
- public void testCase7() {
- byte aBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- byte bBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[] = {-12, -23, -34, -45, -56, -67, -78, -12, -23, -33};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(-1, result.signum());
- }
-
- /**
- * Subtract two numbers of the same length and different signs. The first is
- * negative. The second is greater in absolute value.
- */
- public void testCase8() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = -1;
- int bSign = 1;
- byte rBytes[] = {-12, -23, -34, -45, -56, -67, -78, -12, -23, -33};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(-1, result.signum());
- }
-
- /**
- * Subtract two positive numbers of different length. The first is longer.
- */
- public void testCase9() {
- byte aBytes[] = {1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7};
- byte bBytes[] = {10, 20, 30, 40, 50, 60, 70, 10, 20, 30};
- int aSign = 1;
- int bSign = 1;
- byte rBytes[] = {1, 2, 3, 3, -6, -15, -24, -40, -49, -58, -67, -6, -15, -23};
- BigInteger aNumber = new BigInteger(aSign, aBytes);
- BigInteger bNumber = new BigInteger(bSign, bBytes);
- BigInteger result = aNumber.subtract(bNumber);
- byte resBytes[] = new byte[rBytes.length];
- resBytes = result.toByteArray();
- for (int i = 0; i < resBytes.length; i++) {
- assertTrue(resBytes[i] == rBytes[i]);
- }
- assertEquals(1, result.signum());
- }
-}
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerToStringTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerToStringTest.java
deleted file mode 100644
index 958025c..0000000
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerToStringTest.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-/**
- * author Elena Semukhina
- */
-package com.google.gwt.emultest.java.math;
-
-import com.google.gwt.emultest.java.util.EmulTestBase;
-
-import java.math.BigInteger;
-
-/**
- * Class: java.math.BigInteger Method: toString(int radix)
- */
-public class BigIntegerToStringTest extends EmulTestBase {
- /**
- * test negative number of radix 10
- */
- public void testRadix10Neg() {
- String value = "-2489756308572364789878394872984";
- int radix = 16;
- BigInteger aNumber = new BigInteger(value, radix);
- String result = aNumber.toString(radix);
- assertTrue(result.equals(value));
- }
-
- /**
- * test positive number of radix 10
- */
- public void testRadix10Pos() {
- String value = "2387627892347567398736473476";
- int radix = 16;
- BigInteger aNumber = new BigInteger(value, radix);
- String result = aNumber.toString(radix);
- assertTrue(result.equals(value));
- }
-
- /**
- * test negative number of radix 16
- */
- public void testRadix16Neg() {
- String value = "-287628a883451b800865c67e8d7ff20";
- int radix = 16;
- BigInteger aNumber = new BigInteger(value, radix);
- String result = aNumber.toString(radix);
- assertTrue(result.equals(value));
- }
-
- /**
- * test positive number of radix 16
- */
- public void testRadix16Pos() {
- String value = "287628a883451b800865c67e8d7ff20";
- int radix = 16;
- BigInteger aNumber = new BigInteger(value, radix);
- String result = aNumber.toString(radix);
- assertTrue(result.equals(value));
- }
-
- /**
- * test negative number of radix 24
- */
- public void testRadix24Neg() {
- String value = "-287628a88gmn3451b8ijk00865c67e8d7ff20";
- int radix = 24;
- BigInteger aNumber = new BigInteger(value, radix);
- String result = aNumber.toString(radix);
- assertTrue(result.equals(value));
- }
-
- /**
- * test positive number of radix 24
- */
- public void testRadix24Pos() {
- String value = "287628a883451bg80ijhk0865c67e8d7ff20";
- int radix = 24;
- BigInteger aNumber = new BigInteger(value, radix);
- String result = aNumber.toString(radix);
- assertTrue(result.equals(value));
- }
-
- /**
- * test negative number of radix 2
- */
- public void testRadix2Neg() {
- String value = "-101001100010010001001010101110000101010110001010010101010101010101010101010101010101010101010010101";
- int radix = 2;
- BigInteger aNumber = new BigInteger(value, radix);
- String result = aNumber.toString(radix);
- assertTrue(result.equals(value));
- }
-
- /**
- * test positive number of radix 2
- */
- public void testRadix2Pos() {
- String value = "101000011111000000110101010101010101010001001010101010101010010101010101010000100010010";
- int radix = 2;
- BigInteger aNumber = new BigInteger(value, radix);
- String result = aNumber.toString(radix);
- assertTrue(result.equals(value));
- }
-
- /**
- * test negative number of radix 24
- */
- public void testRadix36Neg() {
- String value = "-uhguweut98iu4h3478tq3985pq98yeiuth33485yq4aiuhalai485yiaehasdkr8tywi5uhslei8";
- int radix = 36;
- BigInteger aNumber = new BigInteger(value, radix);
- String result = aNumber.toString(radix);
- assertTrue(result.equals(value));
- }
-
- /**
- * test positive number of radix 24
- */
- public void testRadix36Pos() {
- String value = "23895lt45y6vhgliuwhgi45y845htsuerhsi4586ysuerhtsio5y68peruhgsil4568ypeorihtse48y6";
- int radix = 36;
- BigInteger aNumber = new BigInteger(value, radix);
- String result = aNumber.toString(radix);
- assertTrue(result.equals(value));
- }
-
- /**
- * If 36 < radix < 2 it should be set to 10
- */
- public void testRadixOutOfRange() {
- String value = "442429234853876401";
- int radix = 10;
- BigInteger aNumber = new BigInteger(value, radix);
- String result = aNumber.toString(45);
- assertTrue(result.equals(value));
- }
-}
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerXorTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerXorTest.java
deleted file mode 100644
index 028fdfa..0000000
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerXorTest.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-/**
- * author Elena Semukhina
- */
-package com.google.gwt.emultest.java.math;
-
-import com.google.gwt.emultest.java.util.EmulTestBase;
-
-import java.math.BigInteger;
-
-/**
- * Class: java.math.BigInteger Method: xor
- */
-public class BigIntegerXorTest extends EmulTestBase {
- /**
- * Xor for two negative numbers; the first is longer
- */
- public void testNegNegFirstLonger() {
- String numA = "-2837462783428374767845648748973847593874837948575684767";
- String numB = "-293478573489347658763745839457637";
- String res = "2837462783428374767845615168483972194300564226167553530";
- BigInteger aNumber = new BigInteger(numA);
- BigInteger bNumber = new BigInteger(numB);
- BigInteger result = aNumber.xor(bNumber);
- assertTrue(res.equals(result.toString()));
- }
-
- /**
- * Xor for two negative numbers; the first is shorter
- */
- public void testNegNegFirstShorter() {
- String numA = "293478573489347658763745839457637";
- String numB = "2837462783428374767845648748973847593874837948575684767";
- String res = "2837462783428374767845615168483972194300564226167553530";
- BigInteger aNumber = new BigInteger(numA);
- BigInteger bNumber = new BigInteger(numB);
- BigInteger result = aNumber.xor(bNumber);
- assertTrue(res.equals(result.toString()));
- }
-
- /**
- * Xor for two negative numbers of the same length
- */
- public void testNegNegSameLength() {
- String numA = "-283746278342837476784564875684767";
- String numB = "-293478573489347658763745839457637";
- String res = "71412358434940908477702819237626";
- BigInteger aNumber = new BigInteger(numA);
- BigInteger bNumber = new BigInteger(numB);
- BigInteger result = aNumber.xor(bNumber);
- assertTrue(res.equals(result.toString()));
- }
-
- /**
- * Xor for a negative number and zero
- */
- public void testNegPos() {
- String numA = "-27384627835298756289327365";
- String numB = "0";
- String res = "-27384627835298756289327365";
- BigInteger aNumber = new BigInteger(numA);
- BigInteger bNumber = new BigInteger(numB);
- BigInteger result = aNumber.xor(bNumber);
- assertTrue(res.equals(result.toString()));
- }
-
- /**
- * Xor for a negative and a positive numbers; the first is longer
- */
- public void testNegPosFirstLonger() {
- String numA = "-2837462783428374767845648748973847593874837948575684767";
- String numB = "293478573489347658763745839457637";
- String res = "-2837462783428374767845615168483972194300564226167553532";
- BigInteger aNumber = new BigInteger(numA);
- BigInteger bNumber = new BigInteger(numB);
- BigInteger result = aNumber.xor(bNumber);
- assertTrue(res.equals(result.toString()));
- }
-
- /**
- * Xor for two negative numbers; the first is shorter
- */
- public void testNegPosFirstShorter() {
- String numA = "-293478573489347658763745839457637";
- String numB = "2837462783428374767845648748973847593874837948575684767";
- String res = "-2837462783428374767845615168483972194300564226167553532";
- BigInteger aNumber = new BigInteger(numA);
- BigInteger bNumber = new BigInteger(numB);
- BigInteger result = aNumber.xor(bNumber);
- assertTrue(res.equals(result.toString()));
- }
-
- /**
- * Xor for two numbers of different signs and the same length
- */
- public void testNegPosSameLength() {
- String numA = "-283746278342837476784564875684767";
- String numB = "293478573489347658763745839457637";
- String res = "-71412358434940908477702819237628";
- BigInteger aNumber = new BigInteger(numA);
- BigInteger bNumber = new BigInteger(numB);
- BigInteger result = aNumber.xor(bNumber);
- assertTrue(res.equals(result.toString()));
- }
-
- /**
- * Xor for one and one
- */
- public void testOneOne() {
- String numA = "1";
- String numB = "1";
- String res = "0";
- BigInteger aNumber = new BigInteger(numA);
- BigInteger bNumber = new BigInteger(numB);
- BigInteger result = aNumber.xor(bNumber);
- assertTrue(res.equals(result.toString()));
- }
-
- /**
- * Xor for a positive and a negative numbers; the first is longer
- */
- public void testPosNegFirstLonger() {
- String numA = "2837462783428374767845648748973847593874837948575684767";
- String numB = "-293478573489347658763745839457637";
- String res = "-2837462783428374767845615168483972194300564226167553532";
- BigInteger aNumber = new BigInteger(numA);
- BigInteger bNumber = new BigInteger(numB);
- BigInteger result = aNumber.xor(bNumber);
- assertTrue(res.equals(result.toString()));
- }
-
- /**
- * Xor for a positive and a negative number; the first is shorter
- */
- public void testPosNegFirstShorter() {
- String numA = "293478573489347658763745839457637";
- String numB = "-2837462783428374767845648748973847593874837948575684767";
- String res = "-2837462783428374767845615168483972194300564226167553532";
- BigInteger aNumber = new BigInteger(numA);
- BigInteger bNumber = new BigInteger(numB);
- BigInteger result = aNumber.xor(bNumber);
- assertTrue(res.equals(result.toString()));
- }
-
- /**
- * Xor for two numbers of different signs and the same length
- */
- public void testPosNegSameLength() {
- String numA = "283746278342837476784564875684767";
- String numB = "-293478573489347658763745839457637";
- String res = "-71412358434940908477702819237628";
- BigInteger aNumber = new BigInteger(numA);
- BigInteger bNumber = new BigInteger(numB);
- BigInteger result = aNumber.xor(bNumber);
- assertTrue(res.equals(result.toString()));
- }
-
- /**
- * Xor for two positive numbers; the first is longer
- */
- public void testPosPosFirstLonger() {
- String numA = "2837462783428374767845648748973847593874837948575684767";
- String numB = "293478573489347658763745839457637";
- String res = "2837462783428374767845615168483972194300564226167553530";
- BigInteger aNumber = new BigInteger(numA);
- BigInteger bNumber = new BigInteger(numB);
- BigInteger result = aNumber.xor(bNumber);
- assertTrue(res.equals(result.toString()));
- }
-
- /**
- * Xor for two positive numbers; the first is shorter
- */
- public void testPosPosFirstShorter() {
- String numA = "293478573489347658763745839457637";
- String numB = "2837462783428374767845648748973847593874837948575684767";
- String res = "2837462783428374767845615168483972194300564226167553530";
- BigInteger aNumber = new BigInteger(numA);
- BigInteger bNumber = new BigInteger(numB);
- BigInteger result = aNumber.xor(bNumber);
- assertTrue(res.equals(result.toString()));
- }
-
- /**
- * Xor for two positive numbers of the same length
- */
- public void testPosPosSameLength() {
- String numA = "283746278342837476784564875684767";
- String numB = "293478573489347658763745839457637";
- String res = "71412358434940908477702819237626";
- BigInteger aNumber = new BigInteger(numA);
- BigInteger bNumber = new BigInteger(numB);
- BigInteger result = aNumber.xor(bNumber);
- assertTrue(res.equals(result.toString()));
- }
-
- /**
- * Xor for a positive number and zero
- */
- public void testPosZero() {
- String numA = "27384627835298756289327365";
- String numB = "0";
- String res = "27384627835298756289327365";
- BigInteger aNumber = new BigInteger(numA);
- BigInteger bNumber = new BigInteger(numB);
- BigInteger result = aNumber.xor(bNumber);
- assertTrue(res.equals(result.toString()));
- }
-
- /**
- * Xor for zero and a negative number
- */
- public void testZeroNeg() {
- String numA = "0";
- String numB = "-27384627835298756289327365";
- String res = "-27384627835298756289327365";
- BigInteger aNumber = new BigInteger(numA);
- BigInteger bNumber = new BigInteger(numB);
- BigInteger result = aNumber.xor(bNumber);
- assertTrue(res.equals(result.toString()));
- }
-
- /**
- * Xor for zero and one
- */
- public void testZeroOne() {
- String numA = "0";
- String numB = "1";
- String res = "1";
- BigInteger aNumber = new BigInteger(numA);
- BigInteger bNumber = new BigInteger(numB);
- BigInteger result = aNumber.xor(bNumber);
- assertTrue(res.equals(result.toString()));
- }
-
- /**
- * Xor for zero and a positive number
- */
- public void testZeroPos() {
- String numA = "0";
- String numB = "27384627835298756289327365";
- String res = "27384627835298756289327365";
- BigInteger aNumber = new BigInteger(numA);
- BigInteger bNumber = new BigInteger(numB);
- BigInteger result = aNumber.xor(bNumber);
- assertTrue(res.equals(result.toString()));
- }
-
- /**
- * Xor for zero and zero
- */
- public void testZeroZero() {
- String numA = "0";
- String numB = "0";
- String res = "0";
- BigInteger aNumber = new BigInteger(numA);
- BigInteger bNumber = new BigInteger(numB);
- BigInteger result = aNumber.xor(bNumber);
- assertTrue(res.equals(result.toString()));
- }
-}
diff --git a/user/test/com/google/gwt/emultest/java/util/RandomTest.java b/user/test/com/google/gwt/emultest/java/util/RandomTest.java
deleted file mode 100644
index 04a7985..0000000
--- a/user/test/com/google/gwt/emultest/java/util/RandomTest.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- *
- * INCLUDES MODIFICATIONS BY GOOGLE.
- */
-package com.google.gwt.emultest.java.util;
-
-import com.google.gwt.junit.client.GWTTestCase;
-
-import java.util.Random;
-
-/**
- * Test java.util.Random.
- */
-public class RandomTest extends GWTTestCase {
-
- private Random r = new Random();
-
- @Override
- public String getModuleName() {
- return "com.google.gwt.emultest.EmulSuite";
- }
-
- /**
- * Tests that two generators with the same seed produce the same sequence of
- * values.
- */
- public void test_ConstructorJ() {
- Random r = new Random(8409238L);
- Random r2 = new Random(8409238L);
- for (int i = 0; i < 100; i++) {
- assertEquals("Values from randoms with same seed don't match",
- r.nextInt(), r2.nextInt());
- }
- }
-
- /**
- * Tests {@link java.util.Random#nextBoolean()}.
- */
- public void test_nextBoolean() {
- boolean falseAppeared = false, trueAppeared = false;
- for (int counter = 0; counter < 100; counter++)
- if (r.nextBoolean()) {
- trueAppeared = true;
- } else {
- falseAppeared = true;
- }
- assertTrue("Calling nextBoolean() 100 times resulted in all trues",
- falseAppeared);
- assertTrue("Calling nextBoolean() 100 times resulted in all falses",
- trueAppeared);
- }
-
- /**
- * Tests {@link java.util.Random#nextBytes(byte[])}.
- */
- public void test_nextBytes$B() {
- boolean someDifferent = false;
- byte[] randomBytes = new byte[100];
- r.nextBytes(randomBytes);
- byte firstByte = randomBytes[0];
- for (int counter = 1; counter < randomBytes.length; counter++) {
- if (randomBytes[counter] != firstByte) {
- someDifferent = true;
- }
- }
- assertTrue("nextBytes() returned an array of length 100 of the same byte",
- someDifferent);
- }
-
- /**
- * Tests {@link java.util.Random#nextDouble()}.
- */
- public void test_nextDouble() {
- double lastNum = r.nextDouble();
- double nextNum;
- boolean someDifferent = false;
- boolean inRange = true;
- for (int counter = 0; counter < 100; counter++) {
- nextNum = r.nextDouble();
- if (nextNum != lastNum) {
- someDifferent = true;
- }
- if (!(0 <= nextNum && nextNum < 1.0)) {
- inRange = false;
- }
- lastNum = nextNum;
- }
- assertTrue("Calling nextDouble 100 times resulted in same number",
- someDifferent);
- assertTrue("Calling nextDouble resulted in a number out of range [0,1)",
- inRange);
- }
-
- /**
- * Tests {@link java.util.Random#nextFloat()}.
- */
- public void test_nextFloat() {
- float lastNum = r.nextFloat();
- float nextNum;
- boolean someDifferent = false;
- boolean inRange = true;
- for (int counter = 0; counter < 100; counter++) {
- nextNum = r.nextFloat();
- if (nextNum != lastNum) {
- someDifferent = true;
- }
- if (!(0 <= nextNum && nextNum < 1.0)) {
- inRange = false;
- }
- lastNum = nextNum;
- }
- assertTrue("Calling nextFloat 100 times resulted in same number",
- someDifferent);
- assertTrue("Calling nextFloat resulted in a number out of range [0,1)",
- inRange);
- }
-
- /**
- * Tests {@link java.util.Random#nextGaussian()}.
- */
- public void test_nextGaussian() {
- double lastNum = r.nextGaussian();
- double nextNum;
- boolean someDifferent = false;
- boolean someInsideStd = false;
- for (int counter = 0; counter < 100; counter++) {
- nextNum = r.nextGaussian();
- if (nextNum != lastNum) {
- someDifferent = true;
- }
- if (-1.0 <= nextNum && nextNum <= 1.0) {
- someInsideStd = true;
- }
- lastNum = nextNum;
- }
- assertTrue("Calling nextGaussian 100 times resulted in same number",
- someDifferent);
- assertTrue(
- "Calling nextGaussian 100 times resulted in no number within 1 std. deviation of mean",
- someInsideStd);
- }
-
- /**
- * Tests {@link java.util.Random#nextInt()}.
- */
- public void test_nextInt() {
- int lastNum = r.nextInt();
- int nextNum;
- boolean someDifferent = false;
- for (int counter = 0; counter < 100; counter++) {
- nextNum = r.nextInt();
- if (nextNum != lastNum) {
- someDifferent = true;
- }
- lastNum = nextNum;
- }
- assertTrue("Calling nextInt 100 times resulted in same number",
- someDifferent);
- }
-
- /**
- * Tests {@link java.util.Random#nextInt(int)}.
- */
- public void test_nextIntI() {
- final int range = 10;
- int lastNum = r.nextInt(range);
- int nextNum;
- boolean someDifferent = false;
- boolean inRange = true;
- for (int counter = 0; counter < 100; counter++) {
- nextNum = r.nextInt(range);
- if (nextNum != lastNum) {
- someDifferent = true;
- }
- if (!(0 <= nextNum && nextNum < range)) {
- inRange = false;
- }
- lastNum = nextNum;
- }
- assertTrue("Calling nextInt (range) 100 times resulted in same number",
- someDifferent);
- assertTrue("Calling nextInt (range) resulted in a number outside of [0, range)",
- inRange);
- }
-
- /**
- * Tests {@link java.util.Random#nextLong()}.
- */
- public void test_nextLong() {
- long lastNum = r.nextLong();
- long nextNum;
- boolean someDifferent = false;
- for (int counter = 0; counter < 100; counter++) {
- nextNum = r.nextLong();
- if (nextNum != lastNum) {
- someDifferent = true;
- }
- lastNum = nextNum;
- }
- assertTrue("Calling nextLong 100 times resulted in same number",
- someDifferent);
- }
-
- // two random create at a time should also generated different results
- // regression test for Harmony 4616
- public void test_random_generate() throws Exception {
- for (int i = 0; i < 100; i++) {
- Random random1 = new Random();
- Random random2 = new Random();
- assertFalse(random1.nextLong() == random2.nextLong());
- }
- }
-
- /**
- * Tests {@link java.util.Random#setSeed(long)}.
- */
- public void test_setSeedJ() {
- long[] randomArray = new long[100];
- boolean someDifferent = false;
- long firstSeed = 1000;
- long aLong, anotherLong, yetAnotherLong;
- Random aRandom = new Random();
- Random anotherRandom = new Random();
- Random yetAnotherRandom = new Random();
- aRandom.setSeed(firstSeed);
- anotherRandom.setSeed(firstSeed);
- for (int counter = 0; counter < randomArray.length; counter++) {
- aLong = aRandom.nextLong();
- anotherLong = anotherRandom.nextLong();
- assertEquals("Two randoms with same seeds gave differing nextLong values",
- aLong, anotherLong);
- yetAnotherLong = yetAnotherRandom.nextLong();
- randomArray[counter] = aLong;
- if (aLong != yetAnotherLong) {
- someDifferent = true;
- }
- }
- assertTrue("Two randoms with the different seeds gave the same chain of values",
- someDifferent);
- aRandom.setSeed(firstSeed);
- for (long element : randomArray) {
- assertEquals(
- "Reseting a random to its old seed did not result in the same chain of values as it gave before",
- element, aRandom.nextLong());
- }
- }
-}
diff --git a/user/test/com/google/gwt/i18n/client/I18NTest.java b/user/test/com/google/gwt/i18n/client/I18NTest.java
index 51a10ec..48d6f3a 100644
--- a/user/test/com/google/gwt/i18n/client/I18NTest.java
+++ b/user/test/com/google/gwt/i18n/client/I18NTest.java
@@ -33,8 +33,6 @@
import com.google.gwt.i18n.client.resolutiontest.Inners.InnerClass.LocalizableInnerInner;
import com.google.gwt.junit.client.GWTTestCase;
-import java.math.BigDecimal;
-import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
@@ -561,21 +559,6 @@
assertEquals("estednay underscoray", m.nestedUnderscore());
}
- /**
- * Test that messages works with Number subclasses.
- */
- public void testNumber() {
- TestAnnotatedMessages m = GWT.create(TestAnnotatedMessages.class);
- BigInteger intVal = new BigInteger("1000000000000000000");
- assertEquals("Total is US$1,000,000,000,000,000,000.00",
- m.withNumberCurrency(intVal));
- BigDecimal decVal = new BigDecimal("1000000000000000000.01");
- assertEquals("Total is US$1,000,000,000,000,000,000.01",
- m.withNumberCurrency(decVal));
- assertEquals("Distance is 1.0E18", m.withNumberExponent(intVal));
- assertEquals("Distance is 100.0E6", m.withNumberExponent(1e8f));
- }
-
public void testShapesFamily() {
Shapes shapes = GWT.create(Shapes.class);
// test overload
diff --git a/user/test/com/google/gwt/i18n/client/NumberFormat_en_Test.java b/user/test/com/google/gwt/i18n/client/NumberFormat_en_Test.java
index 8c1c338..b729c16 100644
--- a/user/test/com/google/gwt/i18n/client/NumberFormat_en_Test.java
+++ b/user/test/com/google/gwt/i18n/client/NumberFormat_en_Test.java
@@ -13,15 +13,13 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
+
package com.google.gwt.i18n.client;
import com.google.gwt.junit.client.GWTTestCase;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
/**
- * Test {@link NumberFormat} in the {@code en} locale.
+ * GWT JUnit tests must extend GWTTestCase.
*/
public class NumberFormat_en_Test extends GWTTestCase {
@@ -54,39 +52,18 @@
assertEquals("R$123,456.79", str);
}
+ /**
+ * Add as many tests as you like.
+ */
public void testBasicFormat() {
String str = NumberFormat.getFormat("0.0000").format(123.45789179565757f);
assertEquals("123.4579", str);
-
+
// tests for overflow of mantissa bits during formatting
str = NumberFormat.getFormat("#,##0.000").format(112589990684262.5);
assertEquals("112,589,990,684,262.500", str);
}
- public void testBigDecimal() {
- BigDecimal decVal = new BigDecimal("1000000000000000000000000");
- String str = NumberFormat.getFormat("0.000").format(decVal);
- assertEquals("1000000000000000000000000.000", str);
-
- decVal = decVal.add(new BigDecimal(".1"));
- str = NumberFormat.getFormat("#,##0.000").format(decVal);
- assertEquals("1,000,000,000,000,000,000,000,000.100", str);
-
- decVal = new BigDecimal(".1499999999999999999999");
- str = NumberFormat.getFormat(".0").format(decVal);
- assertEquals(".1", str);
-}
-
- public void testBigInteger() {
- BigInteger intVal = new BigInteger("1000000000000000000000000");
- String str = NumberFormat.getFormat("#,##0").format(intVal);
- assertEquals("1,000,000,000,000,000,000,000,000", str);
-
- intVal = intVal.add(BigInteger.ONE);
- str = NumberFormat.getFormat("#,##0").format(intVal);
- assertEquals("1,000,000,000,000,000,000,000,001", str);
- }
-
public void testCurrency() {
String str;
@@ -117,7 +94,7 @@
assertEquals("BRL 1,234.56", str);
str = formatter.format(-1234.56);
assertEquals("(BRL 1,234.56)", str);
-
+
// Test using a deprecated currency.
formatter = NumberFormat.getCurrencyFormat("ITL");
str = formatter.format(1234.556);
@@ -261,6 +238,18 @@
assertTrue(value == 12345.0);
}
+ public void testGrouping() {
+ String str;
+
+ str = NumberFormat.getFormat("#,###").format(1234567890);
+ assertEquals("1,234,567,890", str);
+ str = NumberFormat.getFormat("#,####").format(1234567890);
+ assertEquals("12,3456,7890", str);
+
+ str = NumberFormat.getFormat("#").format(1234567890);
+ assertEquals("1234567890", str);
+ }
+
public void testForceLatin() {
assertFalse(NumberFormat.forcedLatinDigits());
NumberFormat.setForcedLatinDigits(true);
@@ -274,51 +263,10 @@
NumberFormat unforced = NumberFormat.getDecimalFormat();
assertEquals("3.14", unforced.format(3.14));
}
-
- public void testGrouping() {
- String str;
-
- str = NumberFormat.getFormat("#,###").format(1234567890);
- assertEquals("1,234,567,890", str);
- str = NumberFormat.getFormat("#,####").format(1234567890);
- assertEquals("12,3456,7890", str);
-
- str = NumberFormat.getFormat("#").format(1234567890);
- assertEquals("1234567890", str);
- }
-
- // See external issue 3140
- public void testLeadingZeros() {
- String str;
-
- str = NumberFormat.getFormat("0,000,000,000.#").format(123456789.489123);
- assertEquals("0,123,456,789.5", str);
-
- str = NumberFormat.getFormat("#,###.####").format(0.414014);
- assertEquals("0.414", str); // why leading 0?
-
- str = NumberFormat.getFormat("#.####").format(0.414014);
- assertEquals("0.414", str); // why leading 0?
-
- str = NumberFormat.getFormat("#.0###").format(0.414014);
- assertEquals(".414", str);
-
- str = NumberFormat.getFormat("0.0###").format(0.414014);
- assertEquals("0.414", str);
-
- str = NumberFormat.getFormat("0.####").format(0.414014);
- assertEquals("0.414", str);
-
- str = NumberFormat.getFormat("0.0000").format(0.414014);
- assertEquals("0.4140", str);
-
- str = NumberFormat.getFormat("#.0000").format(0.414014);
- assertEquals(".4140", str);
- }
-
+
public void testNegative() {
String str;
-
+
// verify default negative pattern
str = NumberFormat.getFormat("#,##0.0").format(-0.15);
assertEquals("-0.2", str);
@@ -326,7 +274,7 @@
assertEquals("-15.3%", str);
str = NumberFormat.getFormat("X #,##0.0%").format(-0.1534);
assertEquals("-X 15.3%", str);
-
+
// verify we can specify percent/permille suffixes in both parts
str = NumberFormat.getFormat("#,##0.0%;#,##0.0%-").format(-0.152);
assertEquals("15.2%-", str);
@@ -340,7 +288,7 @@
public void testParseNotANumber() {
try {
- NumberFormat.getDecimalFormat().parse("blue");
+ double d = NumberFormat.getDecimalFormat().parse("blue");
fail("Expected a NumberFormatException");
} catch (NumberFormatException e) {
assertEquals("blue", e.getMessage());
@@ -375,67 +323,6 @@
assertEquals("a'b123", str);
}
- public void testRounding() {
- String str;
-
- str = NumberFormat.getFormat("#0.##").format(0.555);
- assertEquals("0.56", str);
-
- str = NumberFormat.getFormat("#.##").format(30.555);
- assertEquals("30.56", str);
-
- str = NumberFormat.getFormat("#.00").format(0.997);
- assertEquals("1.00", str);
-
- str = NumberFormat.getFormat("#.00").format(-0.997);
- assertEquals("-1.00", str);
-
- str = NumberFormat.getFormat("#.00").format(27.997);
- assertEquals("28.00", str);
-
- str = NumberFormat.getFormat("#.00").format(-27.997);
- assertEquals("-28.00", str);
-
- str = NumberFormat.getFormat("#0.00000").format(1.23456789E-03);
- assertEquals("0.00123", str);
-
- str = NumberFormat.getFormat("#0.0000000").format(1.23456789E-03);
- assertEquals("0.0012346", str);
-
- str = NumberFormat.getFormat("#0.0000").format(1.2E-03);
- assertEquals("0.0012", str);
-
- str = NumberFormat.getFormat("#0.000").format(1.2E-03);
- assertEquals("0.001", str);
-
- str = NumberFormat.getFormat("#0.00").format(1.2E-03);
- assertEquals("0.00", str);
-
- str = NumberFormat.getFormat("#0.0").format(1.2E-03);
- assertEquals("0.0", str);
-
- str = NumberFormat.getFormat("#0.00").format(11.2E-03);
- assertEquals("0.01", str);
-
- str = NumberFormat.getFormat("#0.00").format(111.2E-03);
- assertEquals("0.11", str);
-
- str = NumberFormat.getFormat("#0.00").format(1111.2E-03);
- assertEquals("1.11", str);
-
- str = NumberFormat.getFormat("#0.00000").format(1.23456789E-05);
- assertEquals("0.00001", str);
-
- str = NumberFormat.getFormat("#0.0000000").format(1.23456789E-05);
- assertEquals("0.0000123", str);
-
- str = NumberFormat.getFormat("#0.0000000").format(1.23756789E-05);
- assertEquals("0.0000124", str);
-
- str = NumberFormat.getFormat("#,##,###,##0.00000000000").format(111.18);
- assertEquals("111.18000000000", str);
- }
-
public void testStandardFormat() {
String str;
@@ -449,19 +336,6 @@
assertEquals("1E3", str);
}
- public void testToScaledString() {
- StringBuilder buf = new StringBuilder();
- int scale = NumberFormat.toScaledString(buf, .1);
- String str = buf.toString();
- assertStartsWith("100", str.substring(str.length() + scale));
- assertAllZeros(str, str.length() + scale);
- buf = new StringBuilder();
- scale = NumberFormat.toScaledString(buf, 12345e38);
- str = buf.toString();
- assertStartsWith("12345", str);
- assertEquals(43, scale + str.length());
- }
-
public void testZeros() {
String str;
@@ -483,17 +357,62 @@
str = NumberFormat.getFormat("#").format(0);
assertEquals("0", str);
}
-
- private void assertAllZeros(String str, int prefixLen) {
- if (prefixLen > str.length()) {
- prefixLen = str.length();
- }
- for (int i = 0; i < prefixLen; ++i) {
- assertEquals('0', str.charAt(i));
- }
- }
-
- private void assertStartsWith(String prefix, String str) {
- assertTrue(str + " does not start with " + prefix, str.startsWith(prefix));
+
+ public void testRounding() {
+ String str;
+
+ str = NumberFormat.getFormat("#0.##").format(0.555);
+ assertEquals("0.56", str);
+
+ str = NumberFormat.getFormat("#.##").format(30.555);
+ assertEquals("30.56", str);
+
+ str = NumberFormat.getFormat("#.00").format(0.997);
+ assertEquals("1.00", str);
+
+ str = NumberFormat.getFormat("#.00").format(-0.997);
+ assertEquals("-1.00", str);
+
+ str = NumberFormat.getFormat("#.00").format(27.997);
+ assertEquals("28.00", str);
+
+ str = NumberFormat.getFormat("#.00").format(-27.997);
+ assertEquals("-28.00", str);
+
+ str = NumberFormat.getFormat("#0.00000").format(1.23456789E-03);
+ assertEquals("0.00123", str);
+
+ str = NumberFormat.getFormat("#0.0000000").format(1.23456789E-03);
+ assertEquals("0.0012346", str);
+
+ str = NumberFormat.getFormat("#0.0000").format(1.2E-03);
+ assertEquals("0.0012", str);
+
+ str = NumberFormat.getFormat("#0.000").format(1.2E-03);
+ assertEquals("0.001", str);
+
+ str = NumberFormat.getFormat("#0.00").format(1.2E-03);
+ assertEquals("0.00", str);
+
+ str = NumberFormat.getFormat("#0.0").format(1.2E-03);
+ assertEquals("0.0", str);
+
+ str = NumberFormat.getFormat("#0.00").format(11.2E-03);
+ assertEquals("0.01", str);
+
+ str = NumberFormat.getFormat("#0.00").format(111.2E-03);
+ assertEquals("0.11", str);
+
+ str = NumberFormat.getFormat("#0.00").format(1111.2E-03);
+ assertEquals("1.11", str);
+
+ str = NumberFormat.getFormat("#0.00000").format(1.23456789E-05);
+ assertEquals("0.00001", str);
+
+ str = NumberFormat.getFormat("#0.0000000").format(1.23456789E-05);
+ assertEquals("0.0000123", str);
+
+ str = NumberFormat.getFormat("#0.0000000").format(1.23756789E-05);
+ assertEquals("0.0000124", str);
}
}
diff --git a/user/test/com/google/gwt/i18n/client/TestAnnotatedMessages.java b/user/test/com/google/gwt/i18n/client/TestAnnotatedMessages.java
index 0892190..55210ce 100644
--- a/user/test/com/google/gwt/i18n/client/TestAnnotatedMessages.java
+++ b/user/test/com/google/gwt/i18n/client/TestAnnotatedMessages.java
@@ -88,10 +88,4 @@
@PluralText({"one", "A {0}"})
String twoParamPlural(String name, @PluralCount
int count);
-
- @DefaultMessage("Total is {0,number,currency}")
- String withNumberCurrency(Number value);
-
- @DefaultMessage("Distance is {0,number,##0.0##E0}")
- String withNumberExponent(Number value);
}