В стандарте 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?;
Это именно "этот" алгоритм. Только у вас в подсчетах ошибка
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
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости