Esempio n. 1
0
  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;
  }
Esempio n. 2
0
 /** @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);
 }
Esempio n. 3
0
 /**
  * @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));
 }