浮点数变量在计算机内存中占用4个字节(Byte), 即32-bits。目前,C/C++编译器标准都且遵循IEEE-754格式标准进行float\double运算。这种格式是一种科学计数法,用符号、指数和尾数来表示。
浮点数可以表示为:x=+-2^e*m.
float\double的具体bits分配如下:
符号位 指数 尾数 总长度
float 1 8 23 32
double 1 11 52 64
将一个float型转化为内存存储格式的步骤为:
(1)先将这个实数的绝对值化为二进制格式
(2)将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边
(3)从小数点右边第一位开始数出二十三位数字放入第22到第0位
(4)如果实数是正的,则在第31位放入“0”,否则放入“1”
(5)如果n是左移得到的,说明指数是正的,第30位放入“1”。如果n是右移得到的或者n=0,则第30位放入“0”
(6)如果n是左移动得到的,则将n减去1后化为二进制,并在左边加“0”补足7位,放入29到23位。如果n是右移得到的或n=0,则将n化为二进制后在左边加“0”补足七位,再各位求反,再放入第29到第23位。
将一个内存存储的float二进制格式转化为十进制的步骤:
(1)将22位到第0位的二进制数写出来,在最左面补一位“1”,得到24位有效数字。将小数点点在最左边那个“1”的右边
(2)取出第29位到第23位所表示的值n。当30位是“0”时将n各位求反。当30位是“1”时将n增1
(3)将小数点左移n位(当30位是“0”时)或者右移n位(当30位是“1”时),得到一个二进制表示的实数
(4)将这个二进制实数化为十进制,并根据第31位是“0”还是“1”加上正号或负号即可。
小数的二进制表示问题:
(1)十进制整数如何转化为二进制数
算法很简单。举个例子,11表示成2进制:
11/2=5 ......1
5/2=2 .......1
2/2=1 .......0
1/2=0..........1(0结束)
11转化为的二进制数为1011
这里提示一点:只要遇到除以后的结果为0了就结束了,所有的整数除以2一定能够最终得到0。所以,整数永远可以用二进制精确表示。
(2)十进制小数如何转化为二进制数
算法是乘以2直到没有了小数为止。举个例子,0.9表示成二进制数
0.9*2=1.8..........1
0.8(1.8的小数部分)*2=1.6 ......1
0.6*2=1.2...........1
0.2*2=0.4............0
0.4*2=0.8............0
0.8*2=1.6.............1
0.6*2=1.2.............1
. ........0.9的二进制表示为(从上往下):1110011....
注意:上面的计算过程循环了,也就是说*2永远不可能消除小数部分,这样算法将无限下去。很显然,小数的二进制表示有时是不可能精确的。