#if REAL_T_IS_DOUBLE using real_t = System.Double; #else using real_t = System.Single; #endif using System; namespace Godot { public static partial class Mathf { // Define constants with Decimal precision and cast down to double or float. /// /// The natural number `e`. /// public const real_t E = (real_t)2.7182818284590452353602874714M; // 2.7182817f and 2.718281828459045 /// /// The square root of 2. /// public const real_t Sqrt2 = (real_t)1.4142135623730950488016887242M; // 1.4142136f and 1.414213562373095 /// /// A very small number used for float comparison with error tolerance. /// 1e-06 with single-precision floats, but 1e-14 if `REAL_T_IS_DOUBLE`. /// #if REAL_T_IS_DOUBLE public const real_t Epsilon = 1e-14; // Epsilon size should depend on the precision used. #else public const real_t Epsilon = 1e-06f; #endif /// /// Returns the amount of digits after the decimal place. /// /// The input value. /// The amount of digits. public static int DecimalCount(real_t s) { return DecimalCount((decimal)s); } /// /// Returns the amount of digits after the decimal place. /// /// The input value. /// The amount of digits. public static int DecimalCount(decimal s) { return BitConverter.GetBytes(decimal.GetBits(s)[3])[2]; } /// /// Rounds `s` upward (towards positive infinity). /// /// This is the same as , but returns an `int`. /// /// The number to ceil. /// The smallest whole number that is not less than `s`. public static int CeilToInt(real_t s) { return (int)Math.Ceiling(s); } /// /// Rounds `s` downward (towards negative infinity). /// /// This is the same as , but returns an `int`. /// /// The number to floor. /// The largest whole number that is not more than `s`. public static int FloorToInt(real_t s) { return (int)Math.Floor(s); } /// /// /// /// /// public static int RoundToInt(real_t s) { return (int)Math.Round(s); } /// /// Returns true if `a` and `b` are approximately equal to each other. /// The comparison is done using the provided tolerance value. /// If you want the tolerance to be calculated for you, use . /// /// One of the values. /// The other value. /// The pre-calculated tolerance value. /// A bool for whether or not the two values are equal. public static bool IsEqualApprox(real_t a, real_t b, real_t tolerance) { // Check for exact equality first, required to handle "infinity" values. if (a == b) { return true; } // Then check for approximate equality. return Abs(a - b) < tolerance; } } }