Beispiel #1
0
        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 ());
        }