Как реальные числа представляются в двоичной форме? - PullRequest
2 голосов
/ 24 января 2011

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

Ответы [ 3 ]

3 голосов
/ 24 января 2011

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

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

0 голосов
/ 26 февраля 2013

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

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

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

Мантисса M сформирована из 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 все нули, М принимает значение один. Если все биты с 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 и? 1.4? 10-45. Это числа с более низкой точностью, получаемые при снятии требования, чтобы первая цифра в мантиссе была единица. Помимо этих трех специальных классов, существуют битовые комбинации, которым не присваивается значение, обычно называемое NAN (не число).

Стандарт IEEEДля двойной точности просто добавьте больше битов в формат одинарной точности.Из 64 битов, используемых для хранения числа двойной точности, биты с 0 по 51 являются мантиссой, биты с 52 по 62 являются показателем степени, а бит 63 является знаковым битом.Как и прежде, мантисса находится между одним и чуть менее двух, т. Е. М = 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

0 голосов
/ 24 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...