C语言中关于浮点数的存储规则

根据国际标准IEEE(电气电子工程师学会)规定,任意一个二进制浮点数V可以写成

(-1)^S*M*2^E;

(-1)^S表示符号位;

当S=0时,V为正数;当S=1,V为负数;

M表示有效数字,大于等于1,小于2;

列如:

V=5.0f=1.01*2^2=(-1)^2^2

这里S=0;M=1;E=2;

IEEE74规定:

对于32位的浮点数,最高位的一位是符号位S,接着的8位是指数E。剩下的23位为有效数字M;

对于64位的浮点数,最高位的一位是符号位S,接着的11位是指数E。剩下的52位为有效数字M;

而且M存储时,只存小数点后面的位。

下面以V=5.5f为列子:

5.5f的二进制数为101.1;

所以写成标准式为(-1)^0*1.011*2^2

S=0,M=1.011,E=2;

对于单精度浮点数float,存储时E为:E(真实值)+127(中间值);上述加127即为2+127=129,对应的

二进制序列为1000 0001;

而对于双精度浮点型double来说,存储时E为:E(真实值)+1023(中间值);

然后,指数 E 从内存中取出还可以再分成三种情况:
E 不全为 0 或不全为 1
这时,浮点数就采用下面的规则表示,即指数 E 的计算值减去 127 (或 1023 ),得到真实值,再将
有效数字 M 前加上第一位的 1
比如:
0.5 1/2 )的二进制形式为 0.1 ,由于规定正数部分必须为 1 ,即将小数点右移 1 位,则1.0*2^(-1),其阶码为 -1+127=126 ,表示为 01111110,而尾数 1.0 去掉整数部分为 0 ,补齐 0 23 00000000000000000000000,则其二进制表示形式为: 0 01111110 00000000000000000000000
E 全为 0
这时,浮点数的指数 E 等于 1-127 (或者 1-1023 )即为真实值,
有效数字 M 不再加上第一位的 1 ,而是还原为 0.xxxxxx 的小数。这样做是为了表示 ±0 ,以及接近于
0 的很小的数字。
E 全为 1
这时,如果有效数字 M 全为 0 ,表示 ± 无穷大(正负取决于符号位 s );
  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值