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),所以首位可以不记录
可能的情况:
阶码E != 0 & E != 255
:规格化的数,M = 1 + f ; E = (e – 127)阶码E = 0
:非规格化的数,M = f; E = 1 – (e – 127)阶码E = 255&尾数 M = 0
:无穷大阶码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;
}
版权申明:保持署名-自由转载-非商业-禁止衍生(创意共享4.0 国际许可协议)
本文来自博客园,作者:许小仙,转载请注明原文链接:https://www.cnblogs.com/ovins/p/16846473.html
本文来自博客园,作者:许小仙,转载请注明原文链接:https://www.cnblogs.com/ovins/p/16846473.html