Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otchyot_po_laboratornoy_rabote_1_SVT.doc
Скачиваний:
8
Добавлен:
18.03.2015
Размер:
421.89 Кб
Скачать

Задание №6

Код программы:

void convertFloatNumbers(int numEx)

{

printf("============================\n");

printf("Example %d: Parse float number s*m*2^e\n", numEx);

ParsedFloat ft;

// ft.value = -25.625;

ft.value = 155.625;

// ft.value = -6.2598534E18f;

// ft.value = -0.34375f;

// Прямое

printf("Float number = %f\n", ft.value);

printf("s_16 = %x\ts_10 = %u\n", ft.ieee.sign, ft.ieee.sign);

printf("e_16 = %x\te_10 = %u\n", ft.ieee.exponenta, ft.ieee.exponenta);

printf("m_16 = %x\tm_10 = %u\n", ft.ieee.mantissa, ft.ieee.mantissa);

// Обратное:

long s = (ft.ieee.sign) ? -1 : 1;

long e = ft.ieee.exponenta - 127;

long m = ft.ieee.mantissa;

printf("Back composed float number = %f\t[pow]\n", s * (1 + m / pow(2.0, 23)) * pow(2.0, e)); // Строки эквиваленты

printf("Back composed float number = %f\t[shifts]\n", s * (1 + m / (2 << 23)) * (2 << e)); // Строки эквиваленты

ft.value = -25.625;

// Прямое

printf("Float number = %f\n", ft.value);

printf("s_16 = %x\ts_10 = %u\n", ft.ieee.sign, ft.ieee.sign);

printf("e_16 = %x\te_10 = %u\n", ft.ieee.exponenta, ft.ieee.exponenta);

printf("m_16 = %x\tm_10 = %u\n", ft.ieee.mantissa, ft.ieee.mantissa);

// Обратное:

s = (ft.ieee.sign) ? -1 : 1;

e = ft.ieee.exponenta - 127;

m = ft.ieee.mantissa;

printf("Back composed float number = %f\t[pow]\n", s * (1 + m / pow(2.0, 23)) * pow(2.0, e)); // Строки эквиваленты

printf("Back composed float number = %f\t[shifts]\n", s * (1 + m / (2 << 23)) * (2 << e)); // Строки эквиваленты

ft.value = -6.2598534E18f;

// Прямое

printf("Float number = %f\n", ft.value);

printf("s_16 = %x\ts_10 = %u\n", ft.ieee.sign, ft.ieee.sign);

printf("e_16 = %x\te_10 = %u\n", ft.ieee.exponenta, ft.ieee.exponenta);

printf("m_16 = %x\tm_10 = %u\n", ft.ieee.mantissa, ft.ieee.mantissa);

// Обратное:

s = (ft.ieee.sign) ? -1 : 1;

e = ft.ieee.exponenta - 127;

m = ft.ieee.mantissa;

printf("Back composed float number = %f\t[pow]\n", s * (1 + m / pow(2.0, 23)) * pow(2.0, e)); // Строки эквиваленты

printf("Back composed float number = %f\t[shifts]\n", s * (1 + m / (2 << 23)) * (2 << e)); // Строки эквиваленты

ft.value = -0.34375f;

// Прямое

printf("Float number = %f\n", ft.value);

printf("s_16 = %x\ts_10 = %u\n", ft.ieee.sign, ft.ieee.sign);

printf("e_16 = %x\te_10 = %u\n", ft.ieee.exponenta, ft.ieee.exponenta);

printf("m_16 = %x\tm_10 = %u\n", ft.ieee.mantissa, ft.ieee.mantissa);

// Обратное:

s = (ft.ieee.sign) ? -1 : 1;

e = ft.ieee.exponenta - 127;

m = ft.ieee.mantissa;

printf("Back composed float number = %f\t[pow]\n", s * (1 + m / pow(2.0, 23)) * pow(2.0, e)); // Строки эквиваленты

printf("Back composed float number = %f\t[shifts]\n", s * (1 + m / (2 << 23)) * (2 << e)); // Строки эквиваленты

// Печать числа в виде октетов в 16 ричном представлении

printParsedFloatToHex(ft);

}

Результат работы:

Example 3: Parse float number s*m*2^e

Float number = 155.625000

s_16 = 0 s_10 = 0

e_16 = 86 e_10 = 134

m_16 = 1ba000 m_10 = 1810432

Back composed float number = 155.625000 [pow]

Back composed float number = 155.625000 [shifts]

Float number = -25.625000

s_16 = 1 s_10 = 1

e_16 = 83 e_10 = 131

m_16 = 4d0000 m_10 = 5046272

Back composed float number = -25.625000 [pow]

Back composed float number = -25.625015 [shifts]

Float number = -6259853398707798000.000000

s_16 = 1 s_10 = 1

e_16 = bd e_10 = 189

m_16 = 2dbeef m_10 = 2997999

Back composed float number = -6259853398707798000.000000 [pow]

Back composed float number = -6259851749440356400.000000 [shifts]

Float number = -0.343750

s_16 = 1 s_10 = 1

e_16 = 7d e_10 = 125

m_16 = 300000 m_10 = 3145728

Back composed float number = -0.343750 [pow]

Back composed float number = -0.343750 [shifts]

Float number: dec = -0.343750, hex = 0xBE 0xB0 0x00 0x00

Проверим например число -25.625

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

31 бит единица, т.к.число отрицательное

Смещенная экспонента 131 т.к. знаков до запятой (131-127)=4потому что 25=11001 или 25=1,1001*2^4

Остаток от мантиссы 5046272=1001101и тд

Подставим в формулу :

-1^1*2^(131-127)(1+5046272/2^23)= -2^4*1,60156=-25,625

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]