public override double doubleValue() { bool neg = num.isNegative (); if (den.isZero()) return (neg ? Double.NegativeInfinity : num.isZero() ? Double.NaN : Double.PositiveInfinity); IntNum n = num; if (neg) n = IntNum.neg (n); int num_len = n.intLength (); int den_len = den.intLength (); int exp = 0; if (num_len < den_len + 54) { exp = den_len + 54 - num_len; n = IntNum.shift (n, exp); exp = - exp; } // Divide n (which is shifted num) by den, using truncating division, // and return quot and remainder. IntNum quot = new IntNum (); IntNum remainder = new IntNum (); IntNum.divide (n, den, quot, remainder, TRUNCATE); quot = quot.canonicalize (); remainder = remainder.canonicalize (); return quot.roundToDouble (exp, neg, !remainder.isZero ()); }