internal static int GetCachedPower(int e, int alpha, int gamma, DiyFp cMk) { const int kQ = DiyFp.KSignificandSize; double k = System.Math.Ceiling((alpha - e + kQ - 1) * Kd1Log210); int index = (GrisuCacheOffset + (int)k - 1) / CachedPowersSpacing + 1; CachedPower cachedPower = CACHED_POWERS[index]; cMk.F = cachedPower.Significand; cMk.E = cachedPower.BinaryExponent; Debug.Assert((alpha <= cMk.E + e) && (cMk.E + e <= gamma)); return(cachedPower.DecimalExponent); }
public static int GetCachedPower(int e, int alpha, int gamma, NumberDiyFp c_mk) { int kQ = NumberDiyFp.kSignificandSize; double k = Math.Ceiling((alpha - e + kQ - 1) * kD_1_LOG2_10); int index = (GRISU_CACHE_OFFSET + (int)k - 1) / CACHED_POWERS_SPACING + 1; CachedPower cachedPower = CACHED_POWERS[index]; c_mk.SetF(cachedPower.significand); c_mk.SetE(cachedPower.binaryExponent); Debug.Assert((alpha <= c_mk.E() + e) && (c_mk.E() + e <= gamma)); return(cachedPower.decimalExponent); }
internal static GetCachedPowerResult GetCachedPowerForBinaryExponentRange(int min_exponent, int max_exponent) { const int kQ = DiyFp.KSignificandSize; double k = System.Math.Ceiling((min_exponent + kQ - 1) * Kd1Log210); int foo = kCachedPowersOffset; int index = (foo + (int)k - 1) / kDecimalExponentDistance + 1; CachedPower cachedPower = CACHED_POWERS[index]; var cMk = new DiyFp(cachedPower.Significand, cachedPower.BinaryExponent); return(new GetCachedPowerResult(cachedPower.DecimalExponent, cMk)); }
// Returns a cached power of ten x ~= 10^k such that // k <= decimal_exponent < k + kCachedPowersDecimalDistance. // The given decimal_exponent must satisfy // kMinDecimalExponent <= requested_exponent, and // requested_exponent < kMaxDecimalExponent + kDecimalExponentDistance. public static void GetCachedPowerForDecimalExponent(int requested_exponent, out DiyFp power, out int found_exponent) { Debug.Assert(kMinDecimalExponent <= requested_exponent); Debug.Assert(requested_exponent < kMaxDecimalExponent + kDecimalExponentDistance); int index = (requested_exponent + kCachedPowersOffset) / kDecimalExponentDistance; CachedPower cached_power = kCachedPowers[index]; power = new DiyFp(cached_power.significand, cached_power.binary_exponent); found_exponent = cached_power.decimal_exponent; Debug.Assert(found_exponent <= requested_exponent); Debug.Assert(requested_exponent < found_exponent + kDecimalExponentDistance); }
// Returns a cached power-of-ten with a binary exponent in the range // [min_exponent; max_exponent] (boundaries included). public static void GetCachedPowerForBinaryExponentRange(int min_exponent, int max_exponent, out DiyFp power, out int decimal_exponent) { int kQ = DiyFp.kSignificandSize; double k = Math.Ceiling((min_exponent + kQ - 1) * kD_1_LOG2_10); int foo = kCachedPowersOffset; int index = (foo + (int)(k) - 1) / kDecimalExponentDistance + 1; Debug.Assert(0 <= index && index < kCachedPowers.Length); CachedPower cached_power = kCachedPowers[index]; Debug.Assert(min_exponent <= cached_power.binary_exponent); Debug.Assert(cached_power.binary_exponent <= max_exponent); decimal_exponent = cached_power.decimal_exponent; power = new DiyFp(cached_power.significand, cached_power.binary_exponent); }