/// <summary> /// Rounds a number upwards to the next integer. (Towards positive infinity) /// </summary> /// <param name="x">The number to round.</param> /// <returns>Returns x rounded upwards to the next integer.</returns> public static Accum Ceil(Accum x) { return(Accum.MakeAccum( (x.Value < 0) ? (x.Value & unchecked ((long)0xFFFFFFFFFFFF0000)) : ((x.Value + (Accum.FracUnit - 1)) & unchecked ((long)0xFFFFFFFFFFFF0000)) )); }
// Square root /// <summary> /// Returns the square root of a number /// </summary> /// <param name="x">A number</param> public static Accum Sqrt(Accum x) { if (x == Accum.One) { return(new Accum(Accum.FracUnit)); } if (x <= Accum.Zero) { return(Accum.Zero); } long val = 150 * Accum.FracUnit, xVal = x.Value; for (int i = 0; i < 15; i++) { val = (val + Accum.SafeDivision(xVal, val)) >> 1; } return(Accum.MakeAccum(val)); }
public static Accum WrapAngle(Accum x) { const int val = 360 << 16; // Just to make sure it doesn't calculate 360 << 16 on every WrapAngle call... return(Accum.MakeAccum(x.Value % val)); }
/// <summary> /// Clamps a number between a minimum and a maximum. /// </summary> /// <param name="n">The number to clamp.</param> /// <param name="min">The minimum allowed value.</param> /// <param name="max">The maximum allowed value.</param> /// <returns>min, if n is lower than min; max, if n is higher than max; n otherwise.</returns> public static Accum ClampInt(Accum n, int min, int max) { return(Accum.MakeAccum(Math.Max(Math.Min(n.Value, max << 16), min << 16))); }
// Clamping /// <summary> /// Clamps a number between a minimum and a maximum. /// </summary> /// <param name="n">The number to clamp.</param> /// <param name="min">The minimum allowed value.</param> /// <param name="max">The maximum allowed value.</param> /// <returns>min, if n is lower than min; max, if n is higher than max; n otherwise.</returns> public static Accum Clamp(Accum n, Accum min, Accum max) { return(Accum.MakeAccum(Math.Max(Math.Min(n.Value, max.Value), min.Value))); }