浮点数转换为二进制存储

浮点数转换为二进制存储

根据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取整,顺序排列”法。

单精度浮点数取值范围:

  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值