/// <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)); }
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); }