public static double GetMidpoint(double lower, double upper) { double midpoint; if (double.IsNegativeInfinity(lower)) { if (double.IsPositiveInfinity(upper)) { midpoint = 0.0; } else if (upper > 0) { midpoint = -upper; } else if (upper < 0) { midpoint = 2 * upper; } else { midpoint = -1; } } else if (double.IsPositiveInfinity(upper)) { if (lower > 0) { midpoint = 2 * lower; } else if (lower < 0) { midpoint = -lower; } else { midpoint = 1; } } else { midpoint = MMath.Average(lower, upper); } return(midpoint); }
private static double RepresentationMidpoint(double lower, double upper) { if (lower == 0) { if (upper < 0) { return(-RepresentationMidpoint(-lower, -upper)); } else if (upper == 0) { return(lower); } // fall through } else if (lower < 0) { if (upper <= 0) { return(-RepresentationMidpoint(-lower, -upper)); } else { return(0); // upper > 0 } } else if (upper < 0) { return(0); // lower > 0 } // must have lower >= 0, upper >= 0 long lowerBits = BitConverter.DoubleToInt64Bits(lower); long upperBits = BitConverter.DoubleToInt64Bits(upper); long midpoint = MMath.Average(lowerBits, upperBits); return(BitConverter.Int64BitsToDouble(midpoint)); }