Размер float на моем компьютере равен 4 байтам или 32 битам:
Т.е. 1 бит отводится под знак, 8 бит отводится для представления целой части и оставшиеся 23 бита для представления дробной части. А само вычисление производится по формуле:
Пример: Возьмем число изображенное выше 1,2345. Согласно формуле (-1)^0=1, т.е. наше число положительно. Далее вычисляем показатель степени. Для этого переведем двоичное значение 8ми битного поля целой части в десятичное представление:
01111111 = 1*2^0+1*2^1+1*2^2+1*2^3+1*2^4+1*2^5+1*2^6+0*2^7=
cout << sizeof(float); // 4Согласно стандарту IEEE 754 формат представления float в памяти компьютера следующий:
0
|
0
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
0
|
0
|
1
|
1
|
1
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
1
|
1
|
0
|
0
|
1
|
| 1 | 8 | 23 | |||||||||||||||||||||||||||||
Это представление числа 1,2345.
Т.е. 1 бит отводится под знак, 8 бит отводится для представления целой части и оставшиеся 23 бита для представления дробной части. А само вычисление производится по формуле:

Пример: Возьмем число изображенное выше 1,2345. Согласно формуле (-1)^0=1, т.е. наше число положительно. Далее вычисляем показатель степени. Для этого переведем двоичное значение 8ми битного поля целой части в десятичное представление:
01111111 = 1*2^0+1*2^1+1*2^2+1*2^3+1*2^4+1*2^5+1*2^6+0*2^7=
=1+2+4+8+16+32+64=127
Вычисляем по формуле:
2^(127-127)=2^0=1
Осталось вычислить дробную часть:
00111100000010000011001=1*2^(-3)+1*2^(-4)+1*2^(-5)+1*2^(-6)+1*2^(-13)+1*2^(-19)+1*2^(-20)+1*2^(-23)=0,125+0,0625+0,03125+0,01563+0,00012+0,0000019073+0,0000009537+0.000000119=(приблизительно)0,2345
Окончательно имеем 1+0,2345=1,2345.
Для того что бы увидеть битовое представление float на компьютере можно воспользоваться маленькой программкой:
Для того что бы увидеть битовое представление float на компьютере можно воспользоваться маленькой программкой:
#include <iostream>
using namespace std;
// Печать одной байта в битах
void printInBinary(const unsigned char val)
{
for (int i = 7; i >= 0; --i)
if (val & (1 << i))
cout << "1";
else
cout << "0";
}
int main()
{
float f = 1.2345;
unsigned char *ucp =
reinterpret_cast<unsigned char*="">(&f);
for (int i = sizeof(float) - 1; i >= 0; --i)
printInBinary(ucp[i]);
}
Комментариев нет:
Отправить комментарий