PDA

Показать полную графическую версию : перевод из десятичной в двоичную отрицательных чисел с дробной частью


meisme
24-03-2014, 19:18
В задании нужно перевести из десятичной в двоичную систему исчисления отрицательное число с дробной частью. Проблема в том, что я не понимаю вот это:
как лучше представить число в двоичной СС:
1) отрицательное число пишется так же, как и положительное, но стоит "-" или бит знака?
2) или переводить число в дополненный код? и если переводить, то после инверсии куда прибавлять единицу? к дробной части или целой?
3) кому не сложно, переведите для примера число -125,635, желательно с объяснением.

pva
22-04-2014, 14:59
meisme, Есть несколько способов представления дробных двоичных чисел. То же самое мы делаем с десятичными.
1. Фиксированная точка - мы храним в памяти целые числа в виде x = f*a, где f - наше число, a - точность, с которой мы сохраняем дробную часть. Чтобы получить дробное число f, берём из памяти целое x, делим на a.

допустим a = 1000
123567 = 123.567 * 1000
^ это пишем в память, т.к. в памяти только целые числа


т.о. для записи с фиксированной запятой нам нужно знать, сколько мы используем для дробной части.

Хитрый ход: если взять `a' кратно 2^8 = 256, то десятичная точка всегда будет попадать на границу байта. В памяти мы будем видеть целую часть в неизменном виде (чтобы понять надо поиграться самому).

XXXX = 123.567 * (2^16) = 123.567 * 65536 = 8098086
^ это пишем в память, т.к. в памяти только целые числа

В память запишется: 00 7B 91 26
Имейте в виду, что 123 - это 7B


2. Плавающая точка.
Храним в памяти целое число `x' и каким-то образом закодированное `a'. Например первые 11 бит - степень двойки для `a', остальное = число `x'. Подробнее можно прочитать здесь http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%B4%D0%B2%D0%BE%D0%B9%D0%BD%D0%BE%D0%B9_%D1%82%D0%BE%D1%87%D0%BD%D 0%BE%D1%81%D1%82%D0%B8 (там же есть примеры)

Tau_0
22-04-2014, 23:22
meisme, и я рекомендую вот это почитать:
IEEE 754 - стандарт двоичной арифметики
с плавающей точкой (http://www.softelectro.ru/ieee754.html)

Представление чисел с плавающей точкой (http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%8 7%D0%B8%D1%81%D0%B5%D0%BB_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE %D1%87%D0%BA%D0%BE%D0%B9)

Генри С. Уоррен, Алгоритмические трюки для программистов (http://dl.dropboxusercontent.com/u/22837445/books/programming/Henry_S_Warren_Jr_-_Hackers_Delight/Henry_S_Warren_Jr_-_Hackers_Delight.pdf)

Habetdin
23-04-2014, 20:07
как лучше представить число в двоичной СС »
Заставить ПК вывести бинарный вид нашего числа с помощью битовых операций :)
Другой вопрос - что делать с дробными числами, для которых недоступны эти самые битовые операции? Можно объединить их в памяти с целочисленными форматами, подходящими по размеру:
union {
float flt;
long lng;
} x;
x.flt = 15.675;
// вывести в двоичном виде, используя x.lng

А дальше всё зависит от вашей реализации перевода в двоичный вид (http://lh8.net/archives/12), пример - на ideone (http://ideone.com/ShSJaQ).
P.S.: Ну и проверка размеров типов данных, объединенных в примере на ideone
(ибо они зависят от компилятора/платформы) - здесь (http://ideone.com/u3XZrd) (эх, 43 days ago, а вроде недавно задавали...)




© OSzone.net 2001-2012