Exemplo n.º 1
0
        /// <summary>
        /// Computes the product of two double double numbers.
        /// </summary>
        /// <param name="x">The first number.</param>
        /// <param name="y">The second number.</param>
        /// <returns>The product of <paramref name="x"/> and <paramref name="y"/>.</returns>
        public static DoubleDouble operator *(DoubleDouble x, DoubleDouble y)
        {
            ExtendedMath.TwoProduct(x.hi, y.hi, out double p0, out double p1);

            if (p0 == 0.0 || ExtendedMath.IsNotFinite(p0))
            {
                return((DoubleDouble)p0);
            }

            ExtendedMath.TwoProduct(x.hi, y.lo, out double p2, out double p4);

            ExtendedMath.TwoProduct(x.lo, y.hi, out double p3, out double p5);

            double p6 = x.lo * y.lo;

            ExtendedMath.ThreeSum(p1, p2, p3, out double t1, out double t2);

            t2 += p4 + p5 + p6;

            ExtendedMath.ThreeSum(p0, t1, t2, out double pHi, out double pLo);

            return(new DoubleDouble(pHi, pLo));

            /*
             * double zHi, zLo;
             * ExtendedMath.TwoProduct(a.hi, b.hi, out zHi, out zLo);
             * zLo = (zLo + a.hi * b.lo) + a.lo * b.hi;
             * //zLo = (a.hi * b.lo + a.lo * b.hi) + zLo;
             *
             * return new DoubleDouble(zHi, zLo);
             */
        }
Exemplo n.º 2
0
        /// <summary>
        /// Computes the product of two double double numbers.
        /// </summary>
        /// <param name="a">The first number.</param>
        /// <param name="b">The second number.</param>
        /// <returns>The product of <paramref name="a"/> and <paramref name="b"/>.</returns>
        public static DoubleDouble operator *(DoubleDouble a, DoubleDouble b)
        {
            double p0, p1;

            ExtendedMath.TwoProduct(a.hi, b.hi, out p0, out p1);

            double p2, p4;

            ExtendedMath.TwoProduct(a.hi, b.lo, out p2, out p4);

            double p3, p5;

            ExtendedMath.TwoProduct(a.lo, b.hi, out p3, out p5);

            double p6 = a.lo * b.lo;

            double t1, t2;

            ExtendedMath.ThreeSum(p1, p2, p3, out t1, out t2);

            t2 += p4 + p5 + p6;

            double pHi, pLo;

            ExtendedMath.ThreeSum(p0, t1, t2, out pHi, out pLo);

            return(new DoubleDouble(pHi, pLo));

            /*
             * double zHi, zLo;
             * ExtendedMath.TwoProduct(a.hi, b.hi, out zHi, out zLo);
             * zLo = (zLo + a.hi * b.lo) + a.lo * b.hi;
             * //zLo = (a.hi * b.lo + a.lo * b.hi) + zLo;
             *
             * return new DoubleDouble(zHi, zLo);
             */
        }