Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Перевод числа с плавающей точкой в 2-ый код


Автор: SIMarOK 15.9.2005, 18:02
Помогите пожалуйста, кто знает, перевести число 27.00141 в дваичный код, желательно расписывать действия, а то калькулятор только ответ выводит smile

Спасибо

Автор: Mayk 15.9.2005, 18:16
Тебе нужно перевести число в двоичную систуму счисления, или узнать как его(число) хранит в памяти комп?

Автор: SIMarOK 15.9.2005, 18:22
Цитата(Mayk @ 15.9.2005, 18:16)
Тебе нужно перевести число в двоичную систуму счисления, или узнать как его(число) хранит в памяти комп?

И перевести, и как располагается, очень был бы признателенsmile

Автор: esperant0 15.9.2005, 19:01
0.4 переведем в бинарный код.

для этого нужно умножать на два и смотреть на целую часть.

0.4*2=0.8 (целая часть ноль)
0.8*2=1.6 ( целеая часть 1 откинем ее)
0.6*2=1.2( целеая часть 1 откинем ее)
0.2*2=0.4 ( получили уже встречающееся число, значит запись переодическая)

0.4=0.011011011


В записи числа после точки, идут(сверху вниз) получавшиеся целые части.

Автор: Mayk 15.9.2005, 19:10
Относительно перевода.
В начале переводишь целую часть, потом складываешь.
Пусть надо перевести 2570.00142

Алгоритм перевода целой части из 10ной в любую, берем ... (СЮРПРИЗ) 10-ную(так легче понять соль)
Делишь на основание системы, то есть 10.
2570/10 = 257 остаток 0. 0 - цифра числа в требуемой системе
257/10 = 25 остаток 7. 7 - цифра числа в требуемой системе
25/10 = 2 остаток 5. 5 - цифра числа в требуемой системе
2/10 = 0 остаток 2. 2 - цифра числа в требуемой сс
0 - хватит делить, все цифры получены

Как видно на каждом шаге мы делим на основание сс, "сдвигая" всё число на один разряд. Чтобы получить число, полученные цифры в остатках следует записать в обратном порядке(то есть 2,5,7,0 - получится 2570)
2570=2570. Тип топ.
Если хочешь получить число в двоичной, то поступаешь так же, но вместо 10ки делишь на два.

Алгоритм перевода дробной части из 10ной в любую, берем ... (БАЯН) 10-ную.
Итак, узнаеи цифры в числе .00142.
Если раньше последовательно делили, то теперь последовательно умножаем на основание СС, выдвигая таким образом нужную нам цифру.
.00141 * 10 = 0.0142 0 - цифра числа в требуемой системе
.0141 * 10 = 0.142. 0 - цифира числа в требуемой системе
.141 * 10 = 1.42. 1 - цифра числа в требуемой системе
.41 * 10 = 4.2. 4 - цифра числа в требуемой системе
.2*10 = 2.0, 2 - цифра числа.
Как видно в данном случае найденный цифры числа идут сверху вниз.
.00142 = .00142. Верно.

Переведем по подобному алгоритму 33.25.

33 / 2 = 16 остаток 1
16 / 2 = 8 остаток 0
8 / 2 = 4 остаток 0
4 / 2 = 2 остаток 0
2 / 2 = 1 остаток 0
1 / 2 = 0 остаток 1
сл-но 33 - это 100001 в двоичной(что есть правда)

или то же самое в двоичной системе

100001 / 10 = 10000 остаток 1
10000 / 10 = 1000 остаток 0
1000 / 10 = 100 остаток 0
100 / 10 = 10 остаток 0
10 / 10 = 1 остаток 0
1 / 10 = 0 остаток 1


То есть благодаря делению в остаток заносится 1 цифра исходного числа.

Переводим 0.25
0.25 * 2 = 0.5
0.5 * 2 = 1.0
Таким образом в двоичной сс 0.25 выглядит как 0.01.

Переведём двоичное 0.01 в двоичное:
0.01 * 10 = 0.1
0.1 * 10 = 1.0
Как видно при умножении на 2 в целые числа попадает цифра исходного числа.

Переводы из Nной СС(системы счисления) в Nную СС хорошо покаывают как данный алгоритм получает цифры исходного числа).

Кстати не все дробные числа нормально переводятся между сс. Так например при переводе одной десятой в двоичную получится бесконечная дробь
(как и при переводе из 0.1 в троичной в десятичную (3 в степени -1 - это бесконечная дробь))


-----------------------------------------

Про хранения флоатов в памяти советую почитать например http://prometey.bsuir.unibel.by/update/open/confrc/oiivt/2_3.html.

Если в кратце, то в памяти хранятся все двоичные цифры числа, кроме первой(которая равна единице), позиция запятой и знак.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)