浮点数

来源:互联网 发布:服装设计图纸软件 编辑:程序博客网 时间:2024/04/29 14:53

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





但是他讲的是错的阶乘根本没有符号位,根据一个叫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 0
原创粉丝点击