Перевод дробного числа в IEEE754

257
14 января 2018, 05:20

В стандарте IEEE754 дробные числа представляются следующим образом:

 (-1)^s × 1.M × 2^E

где s - знак, M - мантисса и E - порядок.

Допустим у нас есть число float f = 12.34 в памяти оно будет представлено так:

0100 0001 0100 0101 0111 0000 1010 0100

Как получить из него обратно десятичное дробное число понятно: старший бит 0 это знак, следующие восемь бит порядок со смещением равным 127: 1000 0010, то есть порядок в данном случае 3. Мантисса 1.100 0101 0111 0000 1010 0100 что в десятичной системе равно 1.54250002.

Таким образом 1.54250002 * 2^3 = 12.34000016;

А вот обратный алгоритм мне не понятен как получить из 12.34 представление в двоичном виде.

Есть такой алгоритм: 12 в двоичной это 1100 дробная часть ищется так:

 0.34 * 2 = 0.68
 0.68 * 2 = 1.36
 0.36 * 2 = 0.72
 0.72 * 2 = 1.44
 0.44 * 2 = 0.88
 0.88 * 2 = 1.76
 0.76 * 2 = 1.52
 0.52 * 2 = 1.4
 0.4  * 2 = 0.8
 0.8  * 2 = 1.6
 0.6  * 2 = 0.2
 0.2  * 2 = 0.4
 0.4  * 2 = 0.8 //здесь началось зацикливание 

и 12.34 = 1100.0101011101000.... Но это явно не этот алгоритм.

В общем вопрос: как из 12.34 получить представление в IEEE754?;

Answer 1

Это именно "этот" алгоритм. Только у вас в подсчетах ошибка

0.52 * 2 = 1.04 // а не 1.4
...

Так что у вас при правильном переводе получится

12.34 = 1100.010101110000101001002... = 1.100010101110000101001002... * 23

А также надо помнить, что в памяти для типов float и double ведущая единица мантиссы "подразумевается", т.е. явно не хранится. Мантисса в памяти будет храниться как

10001010111000010100100

Экспонента в памяти будет храниться как 3 + 127 = 130

10000010

Все в точности совпадает с вашим фактическим представлением в памяти

0 | 100 0001 0 | 100 0101 0111 0000 1010 0100
READ ALSO
Как запустить программу в другой папке? - C++

Как запустить программу в другой папке? - C++

Существует у меня функция, которая создает логКак бы я не крутился - файл создается в папке, где запустили программу

217
Центр фигуры смещается в сторону при увеличении

Центр фигуры смещается в сторону при увеличении

Почему центр фигуры смещается в сторону при увеличении значения радиуса?

187
Ошибка в c++ коде - сбивается ссылка

Ошибка в c++ коде - сбивается ссылка

Здравствуйте! У меня не работает код:

211
Алгоритм перебора

Алгоритм перебора

Вчера я написал вопрос об этой же задаче, слегка улучшил свой алгоритм, но всё таки хотел бы узнать как можно решить её алгоритмом перебора

207