根据http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html这个博客内容,写了一个float窥探程序。
#include <bitset>
#include <iostream>
struct float_view {
float_view(float a) {
memcpy(this, &a, sizeof(a));
}
void show(){
std::cout << "sign:" << (sign?'-':'+') << std::endl
<< "exponent:" << int(exponent - 127) << std::endl
<< "fraction:" << "1."<<std::bitset<23>(fraction) << std::endl;
}
private:
unsigned int fraction : 23;
unsigned int exponent : 8;
unsigned int sign : 1;
};
void main() {
float a = 0.125f;
float_view(a).show();
system("pause");
return;
}
浮点数要表示成计算机能理解的数据,要用到二进制科学计数法。
0.125换成二进制 ==> 0.001 。0.1表示0.5;0.01表示0.25;0.11111111111....无限接近1
0.001换成科学计数法==> +1.000 X 2^(-3)
正数sign=0,负数sign=1
指数部分-3+127=124为存储值,还原时要注意再减去127
有效值部分,因为必然是二进制1打头阵,所以存储时省略,还原时注意要再找回1.