数据表示(浮点)

先说说历史:

    众所周知,浮点数是用来表示远远大于或者小于0的数以及无限趋近于1的数,在近似计算中也扮演着重要的角色。20世纪80年代初,各个计算机生产厂家都发明了自己的一套表示和运算浮点数的规则,当时他们认为易实现比精度更为重要。这个现象直到80年代中期,IEEE 754标准出来才得到改善。754标准始于1976年,Intel雇佣伯克利大学教授William Kahan作为开发8087浮点芯片的顾问,后来IEEE采用了近似Kahan开发出的一套标准作为754标准。我们今天几乎所有的计算机采用的都是754标准。

开始动手:

    给定浮点数:10.12510

    二进制表示为:1010.001   (1*23+0*22+1*21+0*20+0*2-1+0*2-2+1*2-3 = 10.125)

 IEEE表示法可以用下面的公式:

    V = (-1)s * M * 2E

 其中:s:MSB,数据的最高位

          M:区间[0,1)的值

          E:2的指数值

图表表示为(针对float)



 

 1010.0012科学计数法为:1.010001右移了3位,所以E=3;

则e = E + bias = 3 + 127 = 130 = 0x82  (对于float类型 bias为127)

M = 1 + f,所以f = M -1 = 0.010001

那么1010.0012完整的标准浮点数表示为:


用IEEE表示法来验证下:

s = 0

E = 0x82 - 127 = 3

M = f + 1 = 1.0010001

V = (-1)0*(1*20+0*2-1+1*2-2+0*2-3+0*2-4+0*2-5+1*2-6)*23=10.125 
 

下面用程序来验证下:

#include <stdio.h>
#define BITSOFONEBYTE (8)
void show_bits(unsigned char v)
{
    int i = BITSOFONEBYTE -1;
    for(i; i >= 0; i--)
    {
        printf("%u", (v>>i)&0x01);
    }
    printf(" ");
}
void show_bytes(unsigned char* v, unsigned int len)
{
    int i = 0;
    for(i = len -1; i >= 0; i--)
    {
        printf("%.2X ", v[i]);
    }
    printf("\n");
    for(i = len -1; i >= 0; i--)
    {
        show_bits(v[i]);
    }
    printf("\n");
}


void main()
{
    float a = 10.125;
    show_bytes((unsigned char*)&a, sizeof(float));
}

 运行结果如下:

41 22 00 00 
01000001 00100010 00000000 00000000 

猜你喜欢

转载自becomebetter.iteye.com/blog/2205032
今日推荐