Доброго времени суток.
Пытаюсь разобраться с представлением числа с плавающей точкой в нормализованной форме с одинарной точностью на примере числа
-1.7Действую так:
- перевожу в двоичную систему счисления и в нормализованный вид:
- вычисляю избыток в смещенном коде:
- представляю порядок в смещенном коде с избытком 127 используя 8 разрядов:
- заполняю разрядную сетку, состоящую из 32 разрядов: 1 01111111 10110011001100110011001
Попробовал посмотреть что в реальности творится в памяти, написав следующую программу:
Код:
#include <stdio.h>
#define LITTLE_ENDIAN
typedef unsigned char u8;
void print_byte(u8 num)
{
u8 i, x;
for (i = 0; i < 8; ++i) {
x = num;
x <<= i;
x >>= 7;
printf("%d", (int)x);
}
}
void print_memory(void *v, size_t size)
{
size_t i;
#ifdef LITTLE_ENDIAN
for (i = size-1; i != -1; --i)
#else
for (i = 0; i < size; ++i)
#endif
{
print_byte(((u8 *)v)[i]);
printf(" ");
}
printf("\n");
}
int main()
{
float a = -1.7;
print_memory(&a, sizeof(a));
return 0;
}
Вывод выглядит так: 10111111 11011001 10011001 100110
10Собственно не могу понять почему последние 2 бита имеют такие значения.
Заранее благодарен помощи.
-- Вс янв 08, 2012 16:39:03 --Кажется разобрался сам. Дробь бесконечная, а за пределами разрядной сетки есть единица, поэтому последний разряд округляется в большую сторону — происходит сложение с еще одной единицей.