2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Представление вещественного числа в памяти
Сообщение08.01.2012, 16:16 
Доброго времени суток.

Пытаюсь разобраться с представлением числа с плавающей точкой в нормализованной форме с одинарной точностью на примере числа -1.7

Действую так:
  • перевожу в двоичную систему счисления и в нормализованный вид: --1,7_{10} = -1,10(1100)_{2} = -1,10(1100)_{2} \cdot 2^0
  • вычисляю избыток в смещенном коде: $2^7 - 1 = 127$
  • представляю порядок в смещенном коде с избытком 127 используя 8 разрядов: $0_{10} = (0 + 127)_{\text{10 (изб. 127)}} = 01111111_{2}$
  • заполняю разрядную сетку, состоящую из 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 10011010

Собственно не могу понять почему последние 2 бита имеют такие значения.

Заранее благодарен помощи.

-- Вс янв 08, 2012 16:39:03 --

Кажется разобрался сам. Дробь бесконечная, а за пределами разрядной сетки есть единица, поэтому последний разряд округляется в большую сторону — происходит сложение с еще одной единицей.

 
 
 [ 1 сообщение ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group