public static double TruncateToPowerOfTwo(double d) { DoubleBits db = new DoubleBits(d); db.ZeroLowerBits(52); return(db.GetDouble()); }
private void ComputeKey(int level, Envelope itemEnv) { double quadSize = DoubleBits.PowerOf2(level); pt.X = Math.Floor(itemEnv.MinX / quadSize) * quadSize; pt.Y = Math.Floor(itemEnv.MinY / quadSize) * quadSize; env.Initialize(pt.X, pt.X + quadSize, pt.Y, pt.Y + quadSize); }
public static int ComputeQuadLevel(Envelope env) { double dx = env.Width; double dy = env.Height; double dMax = dx > dy ? dx : dy; int level = DoubleBits.Exponent(dMax) + 1; return(level); }
/// <summary> This computes the number of common most-significant bits in the mantissa. /// It does not count the hidden bit, which is always 1. /// It does not determine whether the numbers have the same exponent - if they do /// not, the value computed by this function is meaningless. /// </summary> /// <param name="">db /// </param> /// <returns> the number of common most-significant mantissa bits /// </returns> public int NumCommonMantissaBits(DoubleBits db) { for (int i = 0; i < 52; i++) { // int bitIndex = i + 12; if (GetBit(i) != db.GetBit(i)) { return(i); } } return(52); }
/// <summary> Computes whether the interval [min, max] is effectively zero width. /// I.e. the width of the interval is so much less than the /// location of the interval that the midpoint of the interval cannot be /// represented precisely. /// </summary> public static bool IsZeroWidth(double min, double max) { double width = max - min; if (width == 0.0) { return(true); } double maxAbs = Math.Max(Math.Abs(min), Math.Abs(max)); double scaledInterval = width / maxAbs; int level = DoubleBits.Exponent(scaledInterval); return(level <= MinBinaryExponent); }
public static double MaximumCommonMantissa(double d1, double d2) { if (d1 == 0.0 || d2 == 0.0) { return(0.0); } DoubleBits db1 = new DoubleBits(d1); DoubleBits db2 = new DoubleBits(d2); if (db1.GetExponent() != db2.GetExponent()) { return(0.0); } int maxCommon = db1.NumCommonMantissaBits(db2); db1.ZeroLowerBits(64 - (12 + maxCommon)); return(db1.GetDouble()); }
public static string ToBinaryString(double d) { DoubleBits db = new DoubleBits(d); return(db.ToString()); }
public static int Exponent(double d) { DoubleBits db = new DoubleBits(d); return(db.GetExponent()); }