Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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));
        }
Пример #4
0
        // 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);
        }
Пример #5
0
        // 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);
        }