IEEE制定的浮点数表示规则
本文摘自:http://blog.csdn.net/chen_lady/article/details/51105443
IEEE制定的浮点数表示规则;
了解:
目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格:
符号位 阶码 尾数 长度
float 1 8 23 32
double 1 11 52 64
以下通过几个例子讲解浮点数如何转换为二进制数
例一:
已知:double类型38414.4。
求:其对应的二进制表示。
分析:
double类型共计64位
最高位(第63位)是符号位,1表示该数为负,0表示该数为正;
62-52位,一共11位是指数位;
51-0位,一共52位是尾数位。
步骤:
按照IEEE浮点数表示法,下面先把38414.4转换为十六进制数。把整数部和小数部分开处理:
整数部直接化十六进制:960E 即: 1001011000001110
小数的处理:
0.4=0.5*0+0.25*1+0.125*1+0.0625*0+……
实际上这永远算不完!这就是著名的浮点数精度问题。
手工算到53位那么是:38414.4(10) = 1001011000001110.0110011001100110011001100110011001100(2)
科学记数法为:1.001011000001110 0110011001100110011001100110011001100,左移了15位,指数为15。
阶码:
按IEEE标准一共11位,可以表示范围是-1024 ~ 1023。为了便于计算,iEEE规定都先加上1023(2^10-1),
阶码:15+1023=1038。二进制表示为:100 00001110;
符号位:
因为38414.4为正,对应为0;
结果:(尾数二进制最高位的1不要):
|-- 尾数 --|
符号位 阶码 |--尾数中的整数部分 -| |-- 尾数中的小数部分 --|
0 1000000 1110 0010 11000001 110 01100 11001100 11001100 11001100 11001100
例二:
已知:整数3490593(16进制表示为0x354321)。
求:其对应的浮点数3490593.0的二进制表示。
解法如下:
先求出整数3490593的二进制表示:
1.1010101000011001000012×221
阶码:
同上例,阶码值 = 实际指数值 + 127 ,那么本例子的阶码值为: 148 = 127 + 21 ;
将148转为二进制表示为10010100
结果:(尾数二进制最高位的1不要):
符号位 阶码 尾数
0 10010100 101010100001100100001