Задание №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