/// <summary> /// Computes the square root of a double double value. /// </summary> /// <param name="x">The value of which the square root will be computed.</param> /// <returns>The value of the square root of x.</returns> public static DoubleDouble Sqrt(DoubleDouble x) { if (Double.IsNaN(x.hi)) { return(x); } if (x.hi < 0.0) { return(Double.NaN); } if (x.hi == 0.0) { return(0.0); } double yHi = Math.Sqrt(x.hi); double uHi, uLo; ExtendedMath.TwoProduct(yHi, yHi, out uHi, out uLo); double yLo = (((x.hi - uHi) - uLo) + x.lo) / (2.0 * yHi); return(new DoubleDouble(yHi, yLo)); }
/// <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); */ }
/// <summary> /// Computes the square root of a double double value. /// </summary> /// <param name="x">The value of which the square root will be computed.</param> /// <returns>The value of the square root of x.</returns> public static DoubleDouble Sqrt(DoubleDouble x) { if (x.hi == 0.0) { return(0.0); } double yHi = Math.Sqrt(x.hi); if (ExtendedMath.IsNotFinite(yHi)) { return((DoubleDouble)yHi); } ExtendedMath.TwoProduct(yHi, yHi, out double uHi, out double uLo); double yLo = (((x.hi - uHi) - uLo) + x.lo) / (2.0 * yHi); return(new DoubleDouble(yHi, yLo)); }
/// <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); */ }