float一共32位,其结构定义如下:
|-------- 31 -------|------------ 30-23 ------------ |------------ 22-0 ------------|
符号位(sign) 指数部分(exp) 小数部分(mag)
sign:符号位就一位,0表示正数,1表示负数
exp: 指数部分,无符号正数
mag:小数部分,定点小数,小数点在最左边。
float的表达式 : pow(-1,sign) * (1+mag) * pow(2,exp-127)
示例程序:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc,char *argv[])
{
float f;
int i;
int sign;
int exp;
int mag;
float d_mag;
float f2;
sscanf(argv[1],"%f",&f);
//f=-0.12;
i = *(int*)&f;
sign = (i>>31)&0x01;
exp = (i>>23)&0xFF;
mag = i&0x7FFFFF;
d_mag = 1.0f*mag/0x800000;
f2 = (sign==0?1:-1)*(1+d_mag)*pow(2,exp-127);
printf("float:f=%f\n",f);
printf("sign=%X,exp=%X,mag=%X\n",sign,exp,mag);
printf("float:f2=%f\n",f2);
return 0;
}
参考文献:http://en.wikipedia.org/wiki/IEEE_754-1985
本文介绍了浮点数float的32位内存结构,包括符号位、指数部分和小数部分。按照IEEE 754标准,float的表示形式为:pow(-1, sign) * (1 + mag) * pow(2, exp - 127),其中sign为符号位,exp为无符号指数,mag为定点小数。示例程序和更多细节可参考相关文献。"
83149593,8076514,LeetCode Java算法题解析,"['算法', 'LeetCode', 'Java', '数据结构', '链表操作']
312

被折叠的 条评论
为什么被折叠?



