浮点数格式备忘
32位浮点数格式
32位浮点数从高位到低位依次是1bit符号位,8bits阶码和23bit尾数部分,其中尾数部分为纯小数,计算的时候需要加1。
浮点数1.0
浮点数1.0在C++程序中的存储方式为
0x3f 0x80, 0x00, 0x00
换算为二进制数据为
0011 1111 1000 0000 0000 0000 0000 0000
其中符号位为0,表明这是一个正数
阶码部分为01111111,换算为十进制为127,表明2的幂次为0
尾数部分为全零
浮点数2.0
浮点数2.0在C++程序中的存储方式为
0x40, 0x00, 0x00, 0x00
换算为二进制数据为
0010 0000 0000 0000 0000 0000 0000 0000
其中符号位为0,表明这是一个正数
阶码部分为10000000,换算为十进制数据为128,表明2的幂次为1
尾数部分为全零
浮点数-1.5
浮点数-1.5在C++程序中的存储方式为
0xbf, 0xc0, 0x00, 0x00
换算为二进制数据为
1011 1111 1100 0000 0000 0000 0000 0000
其中符号位为1,表明这是一个负数
阶码部分为01111111,换算为十进制数据为127,表明2的幂次为0
尾数部分为100 0000 0000 0000 0000 0000,换算为十进制数据为0.5
因此浮点数表示的值为-1.5
浮点数根号2
浮点数根号2的二进制表示为
0x3f, 0xb5, 0x04, 0xf3
换算为二进制数为
0011 1111 1011 0101 0000 0100 1111 0011
其中符号位为0,表明这是一个正数
阶码部分为0111 1111,换算为十进制数据为127,表明2的幂次为0
尾数部分为011 0101 0000 0100 1111 0011,因此这个数据的定点数表示为
1. 011 0101 0000 0100 1111 0011,换算为十进制数据为
11863283 / 8388608 = 1.414213538169861
测试程序
#include <iostream>
#include <cmath>
using namespace std;
union FloatNumber
{
float number;
unsigned char byteArray[4];
};
class FloatPointNumber
{
union FloatNumber floatNum;
public:
FloatPointNumber(float number)
{
floatNum.number = number;
}
public:
void setFloatPointNumber(float number)
{
floatNum.number = number;
}
public:
void printByteArray()
{
cout << hex << (int)floatNum.byteArray[3] <<" " << (int)floatNum.byteArray[2] <<" "
<< (int)floatNum.byteArray[1] <<" " << (int)floatNum.byteArray[0] << endl;
}
};
int main()
{
FloatPointNumber *pFloatPointNumber = new FloatPointNumber(float(sqrt(2.0)));
pFloatPointNumber ->printByteArray();
}