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

单双精度浮点数的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)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以使用`Integer`和`Float`类来实现十六进制与IEEE754浮点数的互相转换,同时也支持双精度。 1. 十六进制转IEEE754浮点数: 首先,将十六进制字符串转换为整数,并使用`Integer.parseInt(hexString, 16)`进行转换。接下来,将得到的整数转换为浮点数的位表示。 对于精度浮点数,可以使用`Float.intBitsToFloat(intValue)`方法进行转换。 对于双精度浮点数,可以使用`Double.longBitsToDouble(longValue)`方法进行转换。 2. IEEE754浮点数转十六进制: 对于精度浮点数,可以使用`Float.floatToIntBits(floatValue)`方法将浮点数转换为整数的位表示。然后,使用`Integer.toHexString(intValue)`方法将整数转换为十六进制字符串。 对于双精度浮点数,可以使用`Double.doubleToLongBits(doubleValue)`方法将浮点数转换为长整数的位表示。然后,使用`Long.toHexString(longValue)`方法将长整数转换为十六进制字符串。 示例代码如下: ```java // 十六进制转IEEE754浮点数 String hexString = "3F800000"; // 精度浮点数1.0 int intValue = Integer.parseInt(hexString, 16); float floatValue = Float.intBitsToFloat(intValue); // IEEE754浮点数转十六进制 float value = 1.0f; int intValue = Float.floatToIntBits(value); String hexString = Integer.toHexString(intValue); ``` ```java // 十六进制转IEEE754浮点数 String hexString = "3FF0000000000000"; // 双精度浮点数1.0 long longValue = Long.parseLong(hexString, 16); double doubleValue = Double.longBitsToDouble(longValue); // IEEE754浮点数转十六进制 double value = 1.0; long longValue = Double.doubleToLongBits(value); String hexString = Long.toHexString(longValue); ``` 以上是使用Java进行十六进制与IEEE754浮点数转换的基本方法。具体的使用场景可以根据实际需要进行扩展和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值