Помощь - Поиск - Пользователи - Календарь
Полная версия: Двоичные дроби
Форум «Всё о Паскале» > Разработка ПО, алгоритмы, общие вопросы > Алгоритмы
ShpateL
Извиняюсь, если подобная тема поднималась, но я почти нефига не нашел(((
Проблема вот в чем: надо написать курсовик по системам исчисления (конкретней - по двоичной). С простым переводом и отрицательными числами все понятно. Но вот с дробями... В принципе, и с этим вроде как все ясно, но как двоичные числа видит процессор (я еще думал в раздел асм написать)? Каким образом производится деление? Какие бывают дроби?

ЗЫ опыт программирования в асме не большой, но простенькую мат. прогу напишу
Lapp
Цитата(ShpateL @ 12.03.2007 23:13) *

как двоичные числа видит процессор? Каким образом производится деление? Какие бывают дроби?

А разве процессор види какие-то другие числа, кроме двоичных?.. blink.gif
Дроби бывают только одни: двоичные. Я хочу сказать, что в обычном мире есть двухэтажные дроби (с дробной чертой) и десятичные. В машинном представлении двухэтажных нет, а есть только "N-ичные". А поскольку для машин (пока) всегда N=2, то двоичные.

Если тебе нужно обрабатывать двоичные числа, это не обязательно делать на ассемблере - все можно сделать на том же Паскале.
М
Наверное, теме больше подобает быть в алгоритмах, куда я ее и переношу..

ShpateL
Хм, сорри, немного не правильно задал вопрос: как проц видит двоичные дроби? К примеру я разделю 0101 на 0010. Какой получится ответ? И как его увидит проц? Ведь он же не будет ставить запятую после целой части? А как тогда он определяет целое число или дробное?

Зы: виндовский калькулятор при делении, допустим, 111 на 10 упорно выдает 11, без всякой дробной части... nea.gif
Lapp
Цитата(ShpateL @ 13.03.2007 15:35) *

Хм, сорри, немного не правильно задал вопрос: как проц видит двоичные дроби? К примеру я разделю 0101 на 0010. Какой получится ответ? И как его увидит проц? Ведь он же не будет ставить запятую после целой части? А как тогда он определяет целое число или дробное?

Зы: виндовский калькулятор при делении, допустим, 111 на 10 упорно выдает 11, без всякой дробной части... nea.gif

В двоичной системе

Все зависит от выбранного способа представления чисел в компьютере.
Если выбрано целое представление, то ни о каких дробях не может быть и речи; если производится деление - то только нацело, остаток отбрасывается. При этом число записывается насквозь в несколько байтов (сколько выбрано - один, два, четыре, восемь...). Отрицательные числа записываются в т.н. дополнительном коде.

Другое представление - т.н. "с плавающей точкой" (иначе говоря - действительное число). Оно также использует несколько байт. Все пространство делится на две части: одна под запись мантиссы (обычно, бОльшая), другая под запись порядка (на сколько разрядов сдвинуть точку в мантиссе. Например, тебе надо представить 129 как действительное. Мантисса равна .129 , а порядок 3, то есть все число есть 0.129*10^6 или .129e6. Это в дестичной записи. В двоичной будет так:
мантисса: .10000001 (реально записываются, конечно, только цифры, то есть биты - точка подразумевается. Мантисса должна быть обязательно меньше 1 и больше либо равна 1/2, то есть 0.1 в двоичной записи);
порядок (равен в данном случае числу знаков в мантиссе) : 8 .

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

Таким образом, все зависит от того какую операцию ты производишь: над целыми числами или над действительными. Если над целыми, то получишь целый результат, с отброшенным остатком. Если тебе нужно поделить целые числа как действительные, то их нужно сначала привести к виду с плавающей точкой, а потом делить (смотри, например, как работают правила преобразования типов в Паскале). Виндовый калькулятор вообще не имеет действительных чисел в двоичном представлении, все двоичные числа (то есть те, которые в его боксе записаны как двоичные) он понимает как целые. Отсюда и результат.. smile.gif Ты можешь, если хочешь, набрать число в двоичном виде, запомнить его в единственную ячейку памяти этого калькулятора, затем нажать знак деления, затем ввести делитель в двоичном коде, а потом перейти в десятичные числа и выполнить деление - все будет поделено с дробями, так как ты явно выполнил преобразование типов smile.gif.
ShpateL
Спасибо за ответ, вроде разобрался yes2.gif
Есть правда еще некоторые непонятные вещи, но, думаю, разберусь.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.