浮点数转换为二进制存储
根据IEEE754标准,单精度float类型使用32比特存储,其中1位表示符号,8位表示指数,23位表示尾数;双精度double类型使用64比特存储,1位符号位,11位指数位,52位尾数位。
尾数:M是一个二进制小数,因为是二进制,所以科学计数法中这个值范围是:1≤M
尾数:M是一个二进制小数,因为是二进制,所以科学计数法中这个值范围是:1≤M
IEEE754对有效数字M和指数E,还有一些特别规定。1≤M<2,也就是说,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。IEEE754规定,在计算机内部保存 M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01B的时候,只保存01B,等到读取的时候,再把第一位的1加上去。
单精度浮点数最小正整数为M=0.000 0000 0000 0000 0000 0001B
1/(2^23)=0.0000001192,所以十进制单精度浮点数的有效位数只有7位;
当M=1111111111111.0000000001B=8191.00098,可精确到0.001
当M=11111111111111.000000001B=16383.0019
当M=111111111111111.00000001B=32767.0039
当M=1111111111111111.0000001B=65535.0078,可精确到0.01
当M=11111111111111111.000001B=131071.016
当M=111111111111111111.00001B=262143.031
当M=1111111111111111111.0001B=524287.063,可精确到0.1,有效位数为7位
当M=11111111111111111111.001B=1048575.142,可精确到1,有效位数为7位
双精度浮点数最小正整数为
M=0.0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001B
1/(2^52)=0.0000,0000,0000,000,222,所以十进制双精度浮点数的有效位数只有16位
1、将“二进制的浮点数”转换浮点数:
在上图中
指数为0111 1100B,对应的十进制数124,则二进制指数为124-127=-3
尾数为0.01B,则M=1.01B
浮点数值为1.01B*[2(-3)]=0.00101B=1/8+1/32=0.15625
2、单精度浮点数转换为二进制存储:
十进制数78.375=78+0.375
整数十进制数78=100 1110B
小数十进制数0.375=3/8=1/4+1/8=2^(-2)+ 2^(-3)=0.011B
十进制数78.375=100 1110B+0.011B=100 1110.011B=1.001110011B*(2^6)
十进制数78.375在计算机中以二进制存储,
指数为6,则6+127=133=1000 0101B,
尾数为0.001110011B
因此符号为0,指数8位为1000 0101B,尾数23位为00111001100,0000,0000,0000;
十进制数0.5=0+0. 5
整数十进制数0=0B
小数十进制数0.5=1/2=2^(-1)=0.1B
十进制数0.5=0B+0.1B=0.1B=1.0B*[2^(-1)]
十进制数0.5在计算机中以二进制存储,
其指数为-1,则-1+127=126=0111 1110B,
尾数为0.0B
因此符号为0,指数8位为0111 1110B,尾数23位为000,0000,0000,0000,0000,0000;
3、双精度浮点数转换为二进制存储:
十进制数78.375=78+0.375
整数十进制数78=100 1110B
小数十进制数0.375=3/8=1/4+1/8=2^(-2)+ 2^(-3)=0.011B
十进制数78.375=100 1110B+0.011B=100 1110.011B=1.001110011B*(2^6)
十进制数78.375在计算机中以二进制存储,
指数为6,则6+1023=1029=100 0000 0101B,
尾数为0.001110011B
因此符号为0,
指数11位为100 0000 0101B,
尾数52位为001110011000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000;
十进制数0.5=0+0. 5
整数十进制数0=0B
小数十进制数0.5=1/2=2^(-1)=0.1B
十进制数0.5=0B+0.1B=0.1B=1.0B*[2^(-1)]
十进制数0.5在计算机中以二进制存储,
其指数为-1,则-1+1023=1022=11 1111 1110B,
尾数为0.0B
因此符号为0,
指数11位为11 1111 1110B,
尾数52位为0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000;
union float_define
{
uint32_t dat;
float f;
};
union float_define union_float;
union double_define
{
uint64_t dat;
double f;
};
union double_define union_double;
void FloatTest(void)
{
union_float.f=78.375;
union_float.f=0.5;
}
void DoubleTest(void)
{
union_double.f=78.375;
union_double.f=0.5;
}
4、浮点数无法精确表示0,只能近似表示为0.0,永远不可能等于0;
注意:浮点数可以做除数,不用担心为0导致错误;
单精度浮点数0.0
浮点数0的M=1.000,0000,0000,0000,0000,0000B,
为了表示近似等于0,就使用1.000,0000,0000,0000,0000,0000B*[2(-127)]来表示;
浮点数0的指数为-127+127=00000000B,尾数为000,0000,0000,0000,0000,0000B,
因此符号为0,指数8位为00000000B,尾数23位为000,0000,0000,0000,0000,0000B;
编译器采用四舍五入显示,所以这里看到的是0;
双精度浮点数0.0
浮点数0的M=1.0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000B,
为了表示近似等于0,就使用
1.0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000B *[2(-1023)]来表示;
浮点数0的指数为-1023+1023=000,0000,0000B,
浮点数0的尾数为0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000B,
因此符号为0,指数11位为000,0000,0000B,尾数52位
为0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000B;
编译器采用四舍五入显示,所以这里看到的是0;
5、十进制整数转换为二进制整数
十进制整数转换为二进制整数:采用“除2取余,逆序排列”法。
6、十进制小数转换为二进制小数
十进制小数转换成二进制小数:采用“乘2取整,顺序排列”法。
单精度浮点数取值范围: