/// <summary> /// Returns a random double from the full range of possible double values. /// The sign, mantissa and the exponent are independent random numbers, /// thus the distribution of numbers is not uniform. /// </summary> /// <returns></returns> public double NextDoubleFullRange() { long mantissa = NextLong(52); int exponent = _random.Next(-1023-52, 1024-52); int sign = NextBool() ? -1 : +1; // Gets us -1 or +1. double result = sign * (double)mantissa * (double)Math.Pow(2.0, exponent); var dc = new DoubleComponents(result); Debug.Assert(result == dc.CalcValue()); return result; }
/// <summary> /// Returns a random double from the full range of possible double values. /// The sign, mantissa and the exponent are independent random numbers, /// thus the distribution of numbers is not uniform. /// </summary> /// <returns></returns> public double NextDoubleFullRange() { long mantissa = NextLong(52); int exponent = _random.Next(-1023 - 52, 1024 - 52); int sign = NextBool() ? -1 : +1; // Gets us -1 or +1. double result = sign * (double)mantissa * (double)Math.Pow(2.0, exponent); var dc = new DoubleComponents(result); Debug.Assert(result == dc.CalcValue()); return(result); }
// Returns a double in the range where we expect the robust arithmetic to be valid // - exponents between -142 and 201. (According to S. p.3) public double NextDoubleValidRange() { double result = double.NaN; while (!(result.IsNumber() && result.IsInRange())) { long mantissa = NextLong(52); int exponent = _random.Next(-1023 - 52, 1024 - 52); int sign = NextBool() ? -1 : +1; // Gets us -1 or +1. result = sign * (double)mantissa * (double)Math.Pow(2.0, exponent); var dc = new DoubleComponents(result); Debug.Assert(result == dc.CalcValue()); } return result; }
// Returns a double in the range where we expect the robust arithmetic to be valid // - exponents between -142 and 201. (According to S. p.3) public double NextDoubleValidRange() { double result = double.NaN; while (!(result.IsNumber() && result.IsInRange())) { long mantissa = NextLong(52); int exponent = _random.Next(-1023 - 52, 1024 - 52); int sign = NextBool() ? -1 : +1; // Gets us -1 or +1. result = sign * (double)mantissa * (double)Math.Pow(2.0, exponent); var dc = new DoubleComponents(result); Debug.Assert(result == dc.CalcValue()); } return(result); }