public static List range(BigInteger start, BigInteger end) { List l = new List(); long st = start.longValue(); long en = start.longValue(); if (BigInteger.valueOf(st).equals(start) && BigInteger.valueOf(en).equals(end)) { int dir = st < en ? 1 : -1; while (st != en) { l.add(BigInteger.valueOf(st)); st = st + dir; } } else { BigInteger dir; if (start.compareTo(end) < 0) { dir = BigInteger.ONE; } else { dir = BigInteger.valueOf(-1); } while (!start.equals(end)) { l.add(start); start = start.add(dir); } } return l; }
/** @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); }
/** * @return whether a BigDecimal is a valid Farrago decimal. If a BigDecimal's unscaled value * overflows a long, then it is not a valid Farrago decimal. */ public static boolean isValidDecimal(BigDecimal bd) { BigInteger usv = bd.unscaledValue(); long usvl = usv.longValue(); return usv.equals(BigInteger.valueOf(usvl)); }