/// <summary> /// Computes log(exp(x) - exp(y)) to high accuracy. /// </summary> /// <param name="x">Any real number from -Inf to Inf, or NaN. Must be greater or equal to y.</param> /// <param name="y">Any real number from -Inf to Inf, or NaN. Must be less or equal to x.</param> /// <returns></returns> /// <remarks>This function provides higher accuracy than a direct evaluation of <c>log(exp(x)-exp(y))</c>.</remarks> public static double LogDifferenceOfExp(double x, double y) { if (x == y) { return(Double.NegativeInfinity); } if (Double.IsNegativeInfinity(y)) { return(x); } return(x + MMath.Log1MinusExp(y - x)); }
/// <summary> /// Computes exp(x)-exp(y) to high accuracy. /// </summary> /// <param name="x">Any real number</param> /// <param name="y">Any real number</param> /// <returns>exp(x)-exp(y)</returns> public static double DifferenceOfExp(double x, double y) { if (x == y) { return(0.0); } else if (x > y) { return(Math.Exp(x + MMath.Log1MinusExp(y - x))); } else { return(-DifferenceOfExp(y, x)); } }