2011-01-24 2 views
2

Мне нужно сохранить число, содержащее десятичные места (то есть 1.5) внутри двоичного файла, проблема в том, что я не знаю, как преобразовать байты обратно в число, когда я хочу прочитать этот файл, я знаю, что для целых чисел мне нужно только это сделать: byte[0] << 24 | byte[1] << 16 | byte[2] << 8 | byte[3] для Int32 в форме большой буквы. Какой способ сделать это для реального числа?Как реальные числа представлены в двоичной форме?

+0

Ну, я знал о классе BitConverter, но я хочу сделать это для учебных целей только. – user487102

ответ

3

Посмотрите на класс BitConverter. Он содержит методы преобразования различных базовых типов в и из массивов байтов. Таким образом, вам не нужно знать, как числа с плавающей запятой представлены в двоичном формате.

Если вы действительно хотите это знать, я думаю, что статья в Википедии на floating-point - хорошее место, чтобы узнать об этом.

-2

Вы не можете хранить реальные числа как биты. Данные, сообщающие компьютеру о том, что номер подписан или неподписанный, также сообщают ему, какой уровень суб-целочисленной точности он поддерживает. Компьютер выполняет задачу простого деления.

+2

«Вы не можете хранить реальные числа как биты» ..? Они ничего, но * биты. * Все * в компьютере хранится как биты. Этот ответ не имеет смысла. – cHao

0

Плавающая точка (реальные номера) Схема кодирования чисел с плавающей запятой сложнее, чем для фиксированной точки. Основная идея такая же, как и в научной нотации, где мантисса умножается на десять поднятых до некоторого показателя. Например, 5.4321 × 106, где 5.4321 - мантисса, а 6 - показатель степени. Научная нотация исключительна при представлении очень больших и очень малых чисел. Например: 1,2 × 1050, количество атомов в земле или 2,6 × 10-23, расстояние, которое черепаха ползает за одну секунду, по сравнению с диаметром нашей галактики. Обратите внимание, что числа, представленные в научной нотации, нормализуются, так что есть только одна ненулевая цифра слева от десятичной точки. Это достигается путем корректировки экспоненты по мере необходимости.

Плавающее представление точки похоже на научную нотацию, за исключением того, что все выполняется в базе два, а не в основании десяти. Хотя используется несколько подобных форматов, наиболее распространенным является ANSI/IEEE Std. 754-1985. Этот стандарт определяет формат для 32-битных номеров, называемых одиночной точностью, а также 64-разрядные номера, называемые двойной точностью. Как показано на фиг.4-2, 32 бита, используемые в одиночной точности, делятся на три отдельные группы: биты с 0 по 22 образуют мантисса, биты с 23 по 30 образуют показатель, а бит 31 является битом знака. Эти биты образуют число с плавающей запятой, v, следующим соотношением:

Термин: (-1) S означает, что знак знака S равен 0 для положительного числа и 1 для отрицательного числа. Переменная E - это число от 0 до 255, представляемое восемью битами экспоненты. Вычитание 127 из этого числа позволяет использовать коэффициент экспоненты от. Другими словами, показатель сохраняется в смещенном двоичном формате со смещением 127.

Мантисса, М, формируется из 23 бит как двоичная дробь. Например, десятичная дробь: 2,783, интерпретируется: 2 + 7/10 + 8/100 + 3/1000. Двоичная дробь: 1.0101, означает: 1 + 0/2 + 1/4 + 0/8 + 1/16. Числа с плавающей запятой нормируются так же, как и научная нотация, т. Е. Имеется только одна ненулевая цифра слева от десятичной точки (называемая двоичной точкой в ​​

основание 2). Поскольку единственное ненулевое число, которое существует в базе два, равно 1, ведущая цифра в мантиссе всегда будет 1, и поэтому ее не нужно хранить. Удаление этой избыточности позволяет номеру иметь еще один бит точности. 23 сохраненных бита, обозначаемые обозначениями: m22, m21, m21, ..., m0, образуют мантису в соответствии с:

Иными словами, M = 1 + m222-1 + m212-2 + m202-3 .... Если биты с 0 по 22 - все нули, M принимает значение единицы. Если биты от 0 до 22 - все, M - всего лишь волосы под двумя, то есть 2-2-23.

Используя эту схему кодирования, наибольшее число, которое может быть представлено: ± (2-2-23) × 2128 = ± 6,8 × 1038. Точно так же наименьшее число, которое может быть представлено: ± 1,0 × 2- 127 = ± 5,9 × 10-39. Стандарт IEEE немного уменьшает этот диапазон до бесплатных битовых шаблонов, которым назначены специальные значения. В частности, наибольшие и наименьшие числа, допустимые в стандарте, составляют ± 3,4 × 1038 и? 1,2? 10-38 соответственно. Свободные битовые шаблоны допускают три специальных класса чисел: (1) ± 0 определяется как все биты мантиссы и экспоненты равными нулю. (2) ± ∞ определяется как все биты мантиссы равными нулю, а все биты экспоненты равны единице. (3) Группа очень малых ненормализованных чисел между? 1.2? 10-38 и & le; 1,4 & le; 10-45. Это более низкие значения точности, полученные путем устранения требования о том, чтобы ведущая цифра в мантиссе была одной. Помимо этих трех специальных классов, существуют битовые шаблоны, которым не присваивается значение, обычно называемое NAN (Not A Number).

Стандарт IEEE для двойной точности просто добавляет больше бит в формат одной точности. Из 64 бит, используемых для хранения числа двойной точности, биты с 0 по 51 являются мантиссой, биты с 52 по 62 являются показателем, а бит 63 является знаковым битом. Как и раньше, мантисса находится между одним и чуть ниже двух, то есть M = 1 + m512-1 + m502-2 + m492-3 .... 11 битов экспоненты образуют число от 0 до 2047 с смещением 1023, что позволяет экспонентам от 2-1023 до 21024. Максимальное и наименьшее допустимые числа составляют 1,8? 10308 и? 2,2? 10-308, соответственно. Это невероятно большие и маленькие цифры! Очень редко можно найти приложение, где одиночная точность не является адекватной. Вероятно, вы никогда не найдете случая, когда двойная точность ограничивает то, что вы хотите выполнить.

Извините за вопросительные знаки в случайных местах.

И я не могу добавить картинки, поэтому не возражайте, когда говорится «см. Рис 1».

Источник: http://www.dspguide.com/ch4/3.htm

Смежные вопросы