浮点数

不知道你们是不是也遇到过这样的情况,本来理解的很好的一个知识点被不同的人讲就是不同的理解,我就遇到了这样的情况之前听过一个老师讲浮点数如下图





但是他讲的是错的阶乘根本没有符号位,根据一个叫IEEE754的标准来说阶乘位从符号位后的第一位算起  8位[float型]  (11位[double型])应该是通过+127(或+1023)来实现的,而且这8位(11位)是unsigned int取值范围在0~255(如果是11位取值范围就是0~2047),即使出现负数也会被加成正的。所以他正确的表达式应该是

V = (-1)^s * M * 2^E (s是符号、M是尾数、E是阶乘)

  (1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。

  (2)M表示有效数字,1 <= M < 2。

  (3)2^E表示指数位。E可为负。


这是往计算机里存时的状态,从计算机中读取的时候规则也都差不多。
1》E不全为0或不全为1。这时,浮点数就采用上面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。

下面还有更复杂的情况:


2》E全为0。这时,浮点数的指数E等于1-127(或者1-1023),有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。

3》E全为1。这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);如果有效数字M不全为0,表示这个数不是一个数(NaN)。

下面有一段代码大家猜猜它的答案:

#include<stdio.h>
int main()
{
    int num = 9;
    float *pfloat = (float *)&num
    printf("num = %d\n",num);
    printf("*pfloat = %f\n",*pfloat);
    *pfloat = 9.0;
    printf("num = %d\n",num);
    printf("*pfloat = %f\n",*pfloat);
    return 0;
    
}
num  =  9
*pfloat = 0.000 000
num  =  1091517616
*pfloat  =  9.000 000
这样是不是就可以理解了








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值