Esempio n. 1
0
        static NumberHelper()
        {
            Instances     = new NumberHelper[MaxRadix + 1];
            InstancesLock = new object();

            Digitals          = (char *)Marshal.AllocHGlobal(MaxRadix * sizeof(char));
            Radixes           = (byte *)Marshal.AllocHGlobal((DigitalsMaxValue + 1) * sizeof(byte));
            IgnoreCaseRadixes = (byte *)Marshal.AllocHGlobal((DigitalsMaxValue + 1) * sizeof(byte));

            for (int i = 0; i < DigitalsMaxValue; i++)
            {
                Radixes[i]           = ErrorRadix;
                IgnoreCaseRadixes[i] = ErrorRadix;
            }

            Radixes[SplitSign]           = SplitRadix;
            IgnoreCaseRadixes[SplitSign] = SplitRadix;

            for (uint i = 0; i < MaxRadix; i++)
            {
                char digital = SlowToDigital(i);

                Digitals[i]                = digital;
                Radixes[digital]           = SlowToRadix(digital);
                IgnoreCaseRadixes[digital] = SlowToRadixIgnoreCase(digital);
            }

            Decimal = GetOrCreateInstance(DecimalRadix);

            DecimalThreeDigitals = Decimal.threeDigitals;
            DecimalUInt64Numbers = Decimal.uInt64Numbers;
        }
        static NumberHelper()
        {
            var size = 1000;

            threeChars = (ThreeChar *)Marshal.AllocHGlobal(size * sizeof(ThreeChar));
            threeBytes = (ThreeByte *)Marshal.AllocHGlobal(size * sizeof(ThreeByte));
            for (uint i = 100; i < size; i++)
            {
                var chs = i.ToString();
                threeChars[i].v1 = chs[0];
                threeChars[i].v2 = chs[1];
                threeChars[i].v3 = chs[2];

                threeBytes[i].v1 = (byte)chs[0];
                threeBytes[i].v2 = (byte)chs[1];
                threeBytes[i].v3 = (byte)chs[2];
            }
        }
Esempio n. 3
0
        /// <summary>
        /// 初始化实例。
        /// </summary>
        /// <param name="radix">指定进制</param>
        public NumberHelper(byte radix)
        {
            if (radix > MaxRadix || radix < MinRadix)
            {
                throw new ArgumentOutOfRangeException(nameof(radix));
            }

            this.radix = radix;

            /* binary no rounded. */
            rounded = (byte)(radix == 2 ? 2 : (radix + 1) / 2);

            if (radix <= IgnoreCaseMaxRadix)
            {
                radixes = IgnoreCaseRadixes;
            }
            else
            {
                radixes = Radixes;
            }

            threeDigitalsLength = (uint)SlowPow(radix, 3);
            threeDigitals       = (ThreeChar *)Marshal.AllocHGlobal((int)(threeDigitalsLength * sizeof(ThreeChar)));

            for (uint i = 0; i < threeDigitalsLength; i++)
            {
                threeDigitals[i] = SlowToThreeChar(i);
            }

            int64NumbersLength  = SlowGetLength(0x8000000000000000);
            uInt64NumbersLength = SlowGetLength(0xFFFFFFFFFFFFFFFF);
            uInt32NumbersLength = SlowGetLength(0xFFFFFFFF);

            uInt64Numbers = new ulong[uInt64NumbersLength];

            for (uint i = 0; i < uInt64NumbersLength; i++)
            {
                uInt64Numbers[i] = SlowPow(radix, i);
            }

            uInt32Numbers = new uint[uInt32NumbersLength];

            for (uint i = 0; i < uInt32NumbersLength; i++)
            {
                uInt32Numbers[i] = (uint)SlowPow(radix, i);
            }

            positiveExponentsLength = SlowGetLength(DoubleMaxPositive);
            positiveExponentsRight  = positiveExponentsLength - 1;

            positiveExponents = new double[positiveExponentsLength];

            for (int i = 0; i < positiveExponentsLength; i++)
            {
                positiveExponents[i] = Math.Pow(radix, i);
            }



            negativeExponentsLength = SlowGetFractionalLength(DoubleMinPositive);
            negativeExponentsRight  = negativeExponentsLength - 1;

            negativeExponents = new double[negativeExponentsLength];

            for (int i = 0; i < negativeExponentsLength; i++)
            {
                negativeExponents[i] = Math.Pow(radix, -i);
            }

            maxDoubleLength = SlowGetLength(0xFFFFFFFFFFFFF);
            maxSingleLength = SlowGetLength(0x7FFFFFFF);

            divisorLength = (byte)(uInt32NumbersLength - 1);
            divisor       = uInt32Numbers[divisorLength];
        }
Esempio n. 4
0
        /// <summary>
        /// 初始化实例。
        /// </summary>
        /// <param name="radix">指定进制</param>
        NumberHelper(byte radix)
        {
            if (radix > MaxRadix || radix < MinRadix)
            {
                throw new ArgumentOutOfRangeException(nameof(radix));
            }

            this.radix = radix;

            if (radix <= IgnoreCaseMaxRadix)
            {
                radixes = IgnoreCaseRadixes;
            }
            else
            {
                radixes = Radixes;
            }

            threeDigitalsLength = (uint)SlowPow(radix, 3);
            threeDigitals       = (ThreeChar *)Marshal.AllocHGlobal((int)(threeDigitalsLength * sizeof(ThreeChar)));

            for (uint i = 0; i < threeDigitalsLength; i++)
            {
                threeDigitals[i] = SlowToThreeChar(i);
            }

            int64NumbersLength  = SlowGetLength(0x8000000000000000);
            uInt64NumbersLength = SlowGetLength(0xFFFFFFFFFFFFFFFF);
            uInt32NumbersLength = SlowGetLength(0xFFFFFFFF);

            uInt64Numbers = new ulong[uInt64NumbersLength];

            for (uint i = 0; i < uInt64NumbersLength; i++)
            {
                uInt64Numbers[i] = SlowPow(radix, i);
            }

            uInt32Numbers = new uint[uInt32NumbersLength];

            for (uint i = 0; i < uInt32NumbersLength; i++)
            {
                uInt32Numbers[i] = (uint)SlowPow(radix, i);
            }

            positiveExponentsLength = SlowGetLength(DoubleMaxPositive);

            positiveExponents = new double[positiveExponentsLength];

            for (int i = 0; i < positiveExponentsLength; i++)
            {
                positiveExponents[i] = Math.Pow(radix, i);
            }



            negativeExponentsLength = SlowGetFractionalLength(DoubleMinPositive);

            negativeExponents = new double[negativeExponentsLength];

            for (int i = 0; i < negativeExponentsLength; i++)
            {
                negativeExponents[i] = Math.Pow(radix, -i);
            }

            maxDoubleDigitalsLength = SlowGetLength(0xFFFFFFFFFFFFF) + 1 /* Integer: 1 */;
            maxSingleDigitalsLength = SlowGetLength(0x7FFFFF) + 1 /* Integer: 1 */;

            MaxDoubleStringLength = maxDoubleDigitalsLength + 4 /* Sign + Dot + Exp + ExpSign */ + SlowGetLength(0x200);
            MaxSingleStringLength = maxSingleDigitalsLength + 4 /* Sign + Dot + Exp + ExpSign */ + SlowGetLength(0x80);

            divisorLength = (byte)(uInt32NumbersLength - 1);
            divisor       = uInt32Numbers[divisorLength];
        }