/// <summary> /// Переводит число в формат IEEE754 /// </summary> /// <param name="num"></param> /// <returns></returns> public String Code(double num) { double number = num; // Сохраняем число String sing = ToBinarySign(num); // Находим знак числа number = Math.Abs(number); // Избавляемся от знака String whole = ""; // Целая часть числа if (Math.Truncate(number) != 0) // Если целая часть != 0 { whole = new BinaryCoder().Code(Math.Truncate(number)); // Переводим целую часть числа whole = GetWriteMantiss(whole); } String frac = ToBinaryFrac(number - Math.Truncate(number), whole); // Переводим дробную часть числа String manitss = whole + frac; while (manitss.Length < _mantissCount) { manitss = "0" + manitss; } // Если целая часть равна нулю, то мантисса записана неправильно, переписываем if (Math.Truncate(number) == 0) { manitss = GetWriteMantiss(manitss); // Сохраняем записываему мантиссу } int shift = GetShift(num, whole, frac); // Считаем сдвиг мантиссы String exp = ToBinaryExp(shift); // Находим экспоненту return(sing + exp + manitss); }
public string Code(double num) { int g = (int)((num - _min) * (Math.Pow(2, _count) - 1) / (_max - _min)); // Вычисляем штуку String code = new BinaryCoder().Code(g); // Кодируем в двоичный вид return(code); }
/// <summary> /// Находим экспоненту /// </summary> /// <param name="wh"></param> /// <param name="num"></param> /// <returns></returns> private string ToBinaryExp(int num) { // http://alexanderkobelev.blogspot.ru/2013/05/ieee-754.html?m=1 String expS = ""; int shift = Convert.ToInt32(Math.Pow(2, _expCount - 1) + (num) - 1); expS = new BinaryCoder().Code(shift); while (expS.Length < _expCount) { expS = "0" + expS; } return(expS); }
public double DeCode(string num) { double temp = new BinaryCoder().DeCode(num); return(temp * (_max - _min) / (Math.Pow(2, _count) - 1) + _min); }