Размер 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]); }
Комментариев нет:
Отправить комментарий