您的位置:首页 > 其它

单双精度浮点数的IEEE标准格式

2012-09-08 20:24 204 查看
单双精度浮点数的IEEE标准格式

关键字:浮点数 IEEE标准

大多数高级语言按照IEEE-754标准来规定浮点数的存储格式。

IEEE-754规定 单精度浮点数用4字节存储,双精度浮点数用8字节存储,表示为三部分:符号位、阶和尾数。

S+E+M

S 符号位,尾数的符号位;

E 阶,即指数;

M 尾数,即有效小数位数;

单精度格式

符号位 1位, bit31

阶 8位,bit30~23

尾数 24位,bit22~0

双精度

符号位 1位,bit63

阶 11位,bit62~52

尾数 53位,bit51~0

省略位

二进制数的规格化表示中,小数点前的数(即二进制表示的最高位)为1,故省略之。

所以 float的M 用23位可以表示24位的值,double的M 用52位可以表示53位的值。

阶码

以移码的形式存储。对于float偏移量为127(7FH),对于double偏移量为1023(3FFH)。

存储浮点数的阶码之前,偏移量要先加到阶码上。原因如下:

float的值的二进制科学计数法表示中 阶的范围 ±127, 当一个数“无限”趋近于0,即为 浮点0.

为了保证 浮点0 与 机器0 的存储表示一样,阶在存储时加上偏移 127

eg

2^3,移码的结果 在单精度中为82H(130=3+127),在双精度中为402H(1026=3+1023)。

浮点数有两个例外

0.0存储为全零;

无限大数的阶码存储为全1,尾数部分全零,符号位指示正无穷或者负无穷。

例子:

float 十进制 规格化(S+E+M)

-12 -1.1x23 1 10000010 1000000 00000000 00000000

0.25 1.0x2-2 0 01111101 0000000 00000000 00000000

所有字节在内存中的排列顺序

intel的cpu按little endian顺序

motorola的cpu按big endian顺序排列。

常用的浮点数存储格式:32-bit IEEE-754 floating-point format

对于大小为32-bit的浮点数(32-bit为单精度,64-bit浮点数为双精度,80-bit为扩展精度浮点数),

1、其第31 bit为符号位,为0则表示正数,反之为复数,其读数值用s表示;

2、第30~23 bit为幂数,其读数值用e表示;

3、第22~0 bit共23 bit作为系数,视为二进制纯小数,假定该小数的十进制值为x;

十进制转浮点数的计算方法:则按照规定,十进制的值用浮点数表示为:

如果十进制为正,则s = 0,否则s = 1;将十进制数表示成二进制,然后将小数点向左移动,直到这个数变为1.x的形式即尾数,移动的个数即位指数。为了保证指数为正,将移动的个数都加上127,由于尾数的整数位始终为1,故舍去不做记忆。

对3.141592654来说,

1、正数,s = 0;

2、3.141592654的二进制形式为正数部分计算方法是除以二取整,即得11,小数部分的计算方法是乘以二取其整数,得0.0010 0100 0011 1111 0110 1010 1000,那么它的二进制数表示为11.0010 0100 0011 1111 0110 1010 1;

3、将小数点向左移一位,那么它就变为1.1001 0010 0001 1111 1011 0101 01,所以指数为1+127=128,e = 128 = 1000 0000;

4、舍掉尾数的整数部分1,尾数写成0.1001 0010 0001 1111 1011 0101 01,x = 921FB6

5、最后它的浮点是表示为0 1000 0000 1001 0010 0001 1111 1011 0101 = 40490FDA

浮点数转十进制的计算方法:

则按照规定,浮点数的值用十进制表示为:

= (-1)^s * (1 + x) * 2^(e - 127)

对于49E48E68来说,

1、其第31 bit为0,即s = 0

2、第30~23 bit依次为100 1001 1,读成十进制就是147,即e = 147。

3、第22~0 bit依次为110 0100 1000 1110 0110 1000,也就是二进制的纯小数0.110 0100 1000 1110 0110 1000,其十进制形式为(0.110 0100 1000 1110 0110 1000 * 2^23) / (2^23) = (0x49E48E68 & 0x007FFFFF) / (2^23) = (0x648E68) / (2^23) = 0.78559589385986328125,即x = 0.78559589385986328125。

这样,该浮点数的十进制表示

= (-1)^s * (1 + x) * 2^(e - 127)

= (-1)^0 * (1+ 0.78559589385986328125) * 2^(147-127)

= 1872333

浮点数有两个例外。数0.0存储为全零。无限大数的阶码存储为全1,尾数部分全零。符号位指示正无穷或者负无穷。

float型变量:根据IEEE的浮点标准,一个浮点数应该用下述形式来表示:

V=(-1)^s * M * 2^E (公式1)

在C语言中,32位的float型变量有着这样的规定:首位表示符号位s,接下来的8位(指数域)用于表示2的指数E,剩余的23位(小数域)表示M(取值范围为[1,2)或[0,1))。除了上述规定以外,根据指数域的二进制表示情况不同,被编码的float型数字又可以分成三种情况——

1、规格化值。当指数域的8个二进制数字既非全零又非全1时,float数值就是这种情况。设指数域的八位二进制所表示的十进制数为e, 则公式1中的E就是 E = e - (2^7 - 1) (公式2);

而且此时,将小数域所表示的二进制假设为(f22)(f21)...(f1)(f0) (注2) ,则该小数域所表示的值即为f = 0.(f22)(f21)...(f1)(f0).于是M = 1 + f

2. 非规格化值。当指数域的8个二进制数字为全0时,float数值就为这种情况。这时指数域所表示的十进制数为0,规定指数值为 E = 1 - (2^7 - 1),也就是E为定值-126;此时小数域的值仍表示f = 0.(f22)(f21)...(f1)(f0),但是M的值却变成M = f。

3. 特殊值。当指数域的8个二进制数字为全1时即为这种情况。当小数域为全零时,该float值根据符号位的不同表示正无穷或者负无穷;当小数域为非全零时,该float值为NaN(Not a Number)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: