随笔全个人原创,转载请申明作者

IEEE的浮点数表示

  • 存储格式如下(32位的float为例):
31 30~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;//取得8位阶码值

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

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

    return res * sign;
}
posted @ 2022-11-01 02:38  许小仙  阅读(88)  评论(0编辑  收藏  举报