Как я пошел бы о ручном изменении десятичного числа (базируйтесь 10), число в IEEE 754 формат с плавающей точкой с одинарной точностью? Я понимаю, что существует три части к нему, знак, экспонента и мантисса. Я просто не полностью понимаю то, что на самом деле представляют последние две части.
Найдите наибольшую степень двойки, которая меньше вашего числа, например, если вы начинаете с x = 10,0, то 2 3 = 8, поэтому показатель степени равен 3. Показатель степени смещен на 127, так что это означает, что показатель степени будет представлен как 127 + 3 = 130. Мантисса тогда будет 10,0 / 8 = 1,25. 1 является неявной, поэтому нам просто нужно представить 0,25, что составляет 010 0000 0000 0000 0000 0000, когда оно выражается как 23-битное дробное количество без знака. Знаковый бит равен 0 для положительного. Итак, у нас есть:
s | exp [130] | mantissa [(1).25] |
0 | 100 0001 0 | 010 0000 0000 0000 0000 0000 |
0x41200000
Вы можете протестировать представление с помощью простой программы на C, например
#include <stdio.h>
typedef union
{
int i;
float f;
} U;
int main(void)
{
U u;
u.f = 10.0;
printf("%g = %#x\n", u.f, u.i);
return 0;
}
Число с плавающей запятой - это просто научная нотация. Допустим, я попросил вас выразить окружность Земли в метрах, используя научную нотацию. Вы бы написали:
4.007516×107м
Экспонента экспонента - это именно она: сила десяти. Мантисса - это собственно цифры числа. А знак, конечно же, просто положительный или отрицательный. Так что в данном случае экспонента равна 7, а мантисса - 4.007516.
Единственное существенное различие между IEEE754 и школьной научной нотацией заключается в том, что числа с плавающей запятой находятся в основании 2, поэтому они не умножаются на десять, а умножаются на два. Поэтому там, где, скажем, 256 в обычной научной нотации записывается как:
2.56×102 (мантисса 2.56 и экспонента 2),
в IEEE754 это
1×28 - мантисса равна 1, а экспонента 8.