/// <summary>
        /// Method that converts the demical input into scientific notation and calls both
        /// converter methods.
        /// </summary>
        /// <param name="input">Decimal to convert</param>
        static void ConvertFloatingPoint(string input)
        {
            double number = Convert.ToDouble(input);

            // Calculates the sign bit
            int sign;

            if (number >= 0)
            {
                sign = 0;
            }
            else
            {
                sign = 1;
            }

            // Calculates the significand
            number = Math.Abs(number);
            int count = 0;

            if (number < 1 && number > 0)
            {
                while (number < 1)
                {
                    number *= 2;
                    count--;
                }
            }
            else
            {
                while (number >= 2)
                {
                    number /= 2;
                    count++;
                }
            }
            NumberNotation toConvert = new NumberNotation(sign, number, count);

            if (number.Equals(0))
            {
                toConvert.exponent = -127;
            }
            Convert32Bit(toConvert);
            if (number.Equals(0))
            {
                toConvert.exponent = -1023;
            }
            Convert64Bit(toConvert);
        }
        /// <summary>
        /// Converter logic that the 32 and 64 bit floating point converters share
        /// </summary>
        /// <param name="input">Number to convert</param>
        /// <param name="exp">Exponent value to add</param>
        /// <param name="loops">Number of loops to do in the mantissa</param>
        /// <returns>The converted string</returns>
        static string BaseConverter(NumberNotation input, int exp, int count, int loops)
        {
            // Adds the sign bit
            StringBuilder output = new StringBuilder();

            output.Append(input.sign);

            // Calculates the exponetial bits
            int           exponentField = input.exponent + exp;
            StringBuilder sb            = new StringBuilder();

            for (int i = 0; i < count; i++)
            {
                sb.Append(exponentField % 2);
                exponentField /= 2;
            }
            output.Append(Reverse(sb.ToString()));
            sb.Clear();

            // Calculates the mantissa bits
            double inputDecimal = input.significand - 1;

            for (int i = 0; i < loops; i++)
            {
                if (i == loops - 1 && input.significand * Math.Pow(2, input.exponent) < 1 && loops != 52)
                {
                    output.Append("1");
                    break;
                }
                inputDecimal *= 2;
                if (inputDecimal < 1)
                {
                    output.Append("0");
                }
                else
                {
                    output.Append("1");
                    inputDecimal -= 1;
                }
            }
            return(output.ToString());
        }
 /// <summary>
 /// Converts a decimal to 32bit floating point and prints it out
 /// </summary>
 /// <param name="input">Decimal to convert</param>
 static void Convert32Bit(NumberNotation input)
 {
     Console.WriteLine("32 bit: " + BaseConverter(input, 127, 8, 23));
 }
 /// <summary>
 /// Converts a decimal to 64bit floating point and prints it out
 /// </summary>
 /// <param name="input">Decimal to convert</param>
 static void Convert64Bit(NumberNotation input)
 {
     Console.WriteLine("64 bit: " + BaseConverter(input, 1023, 11, 52));
 }
Exemple #5
0
        protected NumberFormatDigitOptions GetNumberFormatDigitOptions(int minFractionDigits, int maxFractionDigits, NumberNotation notation)
        {
            NumberFormatDigitOptions info = new NumberFormatDigitOptions();

            info.MinimumIntegerDigits = GetOption(PropertyKey.MinimumIntegerDigits, 1, 21, 1);
            if (readOnly)
            {
                EcmaValue mnsd = options[PropertyKey.MinimumSignificantDigits];
                EcmaValue mxsd = options[PropertyKey.MaximumSignificantDigits];
                EcmaValue mnfd = options[PropertyKey.MinimumFractionDigits];
                EcmaValue mxfd = options[PropertyKey.MaximumFractionDigits];
                if (mnsd != default || mxsd != default)
                {
                    info.MinimumSignificantDigits = ParseNumberOption(PropertyKey.MinimumSignificantDigits, mnsd, 1, 21, 1);
                    info.MaximumSignificantDigits = ParseNumberOption(PropertyKey.MaximumSignificantDigits, mxsd, info.MinimumSignificantDigits, 21, 21);
                    info.UseSignificantDigits     = true;
                    info.RoundingType             = RoundingType.SignificantDigits;
                }
                else
                {
                    info.RoundingType          = notation == NumberNotation.Compact ? RoundingType.CompactRounding : RoundingType.FractionDigits;
                    info.MinimumFractionDigits = ParseNumberOption(PropertyKey.MinimumFractionDigits, mnfd, 0, 20, minFractionDigits);
                    info.MaximumFractionDigits = ParseNumberOption(PropertyKey.MaximumFractionDigits, mxfd, info.MinimumFractionDigits, 20, Math.Max(info.MinimumFractionDigits, maxFractionDigits));
                }
            }
            else
            {
                object mnsd, mxsd, mnfd, mxfd;
                parsedOptions.TryGetValue(PropertyKey.MinimumSignificantDigits, out mnsd);
                parsedOptions.TryGetValue(PropertyKey.MaximumSignificantDigits, out mxsd);
                parsedOptions.TryGetValue(PropertyKey.MinimumFractionDigits, out mnfd);
                parsedOptions.TryGetValue(PropertyKey.MaximumFractionDigits, out mxfd);
                if (mnsd != null || mxsd != null)
                {
                    info.MinimumSignificantDigits = ParseNumberOption(PropertyKey.MinimumSignificantDigits, new EcmaValue(mnsd), 1, 21, 1);
                    info.MaximumSignificantDigits = ParseNumberOption(PropertyKey.MaximumSignificantDigits, new EcmaValue(mxsd), info.MinimumSignificantDigits, 21, 21);
                    info.UseSignificantDigits     = true;
                }
                else
                {
                    info.RoundingType          = notation == NumberNotation.Compact ? RoundingType.CompactRounding : RoundingType.FractionDigits;
                    info.MinimumFractionDigits = ParseNumberOption(PropertyKey.MinimumFractionDigits, new EcmaValue(mnfd), 0, 20, minFractionDigits);
                    info.MaximumFractionDigits = ParseNumberOption(PropertyKey.MaximumFractionDigits, new EcmaValue(mxfd), info.MinimumFractionDigits, 20, Math.Max(info.MinimumFractionDigits, maxFractionDigits));
                }
            }
            return(info);
        }