首页 > 其他分享 >IEEE的浮点数表示

IEEE的浮点数表示

时间:2022-11-01 02:44:22浏览次数:34  
标签:表示 阶码 temp 23 int 浮点数 float IEEE

  • 存储格式如下(32位的float为例):
32 31~23 22~0
S E M

数值计算公式:V = (-1)^S * M * 2^E
类似数学中的科学表示法,但是换成二进制的,

  • S 是符号,用来表示正负(0/1),占一个bit
  • E 是阶码,float中占 8 bit ; double中占11 bit;
  • M是尾数,float中占23bit ; double中占52位

注意:尾数用于表示数值,但是由于首位始终为1(比如 0.1*10^3完全可以表示为 1^10^2,首位一直为1),所以首位可以不记录

可能的情况:

  1. 阶码E != 0 & E != 255:规格化的数,M = 1 + f ; E = (e – 127)
  2. 阶码E = 0:非规格化的数,M = f; E = 1 – (e – 127)
  3. 阶码E = 255&位数 M = 0:无穷大
  4. 阶码E = 255&位数 M != 0:NaN

验证

根据上面的理论知识,我们可以自己编写代码,验证计算机的存储结构,比如自己实现浮点数到整数的转化:

int float_to_int(float f) {
    int* p = (int*)&f;

    int temp = *p;

    int sign = -1;
    if ((temp & 0x80000000) == 0) {//0b 1000 0000 ... 0000,确定符号位
        sign = 1;
    }

    int exp;
    exp = ((temp >> 23) & 0xFF) - 127;

    int tail = ((temp & 0x7FFFFF)|0x800000);//先取后23位,再拼上未记录的首位

    int res = (tail >> (23 - exp));

    return res * sign;
}

标签:表示,阶码,temp,23,int,浮点数,float,IEEE
From: https://www.cnblogs.com/ovins/p/16846473.html

相关文章