Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перевод ЧПЗ, ЧФЗ 
:(
    Опции темы
n199a
  Дата 27.12.2013, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



ЧФЗ - число с фиксированной запятой.
ЧПЗ - число с плавающей запятой.

  • Как перевести число 125,25(десятичное) в ЧФЗ и ЧПЗ?
  • И как перевести число -125,25(десятичное) в ЧФЗ и ЧПЗ?

Искал, читал, непонятно  smile 

Как я понимаю:
125,25(10) = 011 1101, 000 0100 (2)
Получается, что, полученное число в двоичном формате уже есть ЧФЗ (число с фиксированной запятой) ?

PM MAIL   Вверх
tzirechnoy
Дата 31.12.2013, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Цитата
125,25(10) = 011 1101, 000 0100 (2)


Нет, 125(10) = 1111101(2), а 0.25(10) = 0.01(2)


Вообще, традицыонный алгоритм перевода цэлого числа в p-ичную систему -- это делить с остатком на p, остатки последовательно справа налево записываются в разряды p-ичного числа, результат делится опять пока не получится 0.
Перевод дробной части в p-ичную систему -- это умножать на p, цэлую часть получившэгося числа записывать в следующий слева направа после десятичной точки разряд p-ичного числа, дробную часть брать и опять умножать на p. Продолжать либо пока не получится 0, либо пока не получится число, которое ужэ было -- тогда запись периодическая, цыфры от предыдущей такой жэ дробной части до предыдущей полученной цыфры бесконечно повторяются.
Если число так или иначе ограниченного размера -- то перевод дробной части делается пока не упрёмся в ограничения размера числа.


Например, 
125_(10) ÷ 2 = 62 ост 1                                1_(2)
62_(10) ÷ 2 = 31 ост 0                                01_(2)
31_(10) ÷ 2 = 15 ост 1                               101_(2)
15_(10) ÷ 2 = 7 ост 1                               1101_(2)
7_(10) ÷ 2 = 3 ост 1                               11101_(2)
3_(10) ÷ 2 = 1 ост 1                             111101_(2)
1_(10) ÷ 2 = 0 ост 1                           1111101_(2) -- это результат перевода.

0.25_(10) × 2 = 0.5, целая часть -- 0          0.0_(2)
0.5_(10) × 2 - 1, целая часть -- 1                0.01_(2)
дробная часть 0, так что останавливаемся.
Результат: 125.25_(10)=1111101.01_(2)

Пример дроби, которая в системе исчисления 2 будет бесконечной периодической:
0.3_(10) × 2 = 0.6, [0.6]=9                        0.0_(2)
0.6_(10) × 2 = 1.2, [1.2]=1                        0.01_(2)
0.2_(10) × 2 = 0.4, [0.4]=0                        0.010_(2)
0.4_(10) × 2 = 0.8, [0.8]=0                        0.0100_(2)
0.8_(10) × 2 = 1.6, [1.6]=1                        0.01001_(2)
0.6 -- ужэ было, всё остальное будет повтором цыфр со второго шага: 0.3_(10) = 0.01001100110011001... = 0.0(1001)_(2)


Далее про фиксированную и плавающую точку: числа с фиксированной точкой -- так и записываются, сколько-то цыфр (в двоичной системе -- бит) до точки, сколько-то после. Кстати, поэтому можно прерывать вычисление дробной части после определённого количества шагов: сколько цыфр надо -- столько получил, остальное ненужно.
У чисел с плавающей точкой всё веселее: они записываются в виде дробного числа 0.xxxxxx, умножэнного на 2^n (это значок возведения в степень). Т.е. 1111101.01 будет 0.111110101_(2) * 2^7 = 0.111110101_(2) * 2^111_(2). Соответственно, в памяти компьютэра выделяется сколько-то бит на хранения мантиссы (вот этого 0.111110101, обычно при этом первая 1  -- не записывается, а подразумевается), и сколько-то на хренение характеристики (вот этого 111). И характеристика и мантисса, кстати, могут быть отрицательными -- т.е. на знак у них тожэ около одного бита выделяется.
Перевод внутри двоичной системы из фиксированной точки в плавающую -- довольно очевиден, сдвинуть значение на нужное число разрядов, чтобы получилось 0.1xxxx (т.е. чтобы цэлой части не было, а первая цыфра после точки была значащей), сдвиг записать в характеристику с обратным по отношэнию к обычному умножэнию на 2^n знаком -- т.е. если сдвигали вправо, то со знаком плюс.
 Напомню, кстати, что умножэние на 2^n в двоичной системе производится сдвигом цыфр -- ну, такжэ как в десятичной умножэние на 10^n (12*10^3 = 12000, 12/10^3 = 0.012).

 Около одного бита на знак, кстати -- это поскольку варианты хранения чисел со знаком могут быть разными, например, мне где-то встречался такой: характеристика хранится в виде положытельного цэлого, от 0 до 32767 -- а чтобы получить реальную характеристику -- из него вычитается 8192. Таким образом, доступны характеристики от -8192 до 24575 -- что бывает удобно, поскольку астрономически-большые числа нужны чаще.


Как-то так.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0379 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.