浮点型的float和double在底层如何存储

浮点型的float和double在底层如何存储

  1. 首先我们来看一下小数由几部分构成:
    以3.14为例会发现小数由一下四部分组成:

    1. 正负号
    2. 整数部分
    3. 小数点
    4. 小数部分
    
  2. 那么小数是怎么转换为二进制存储的呢?

    以3.14为例

    1. 正负号:用一位来保存,0代表正,1代表负。(3.14的正负号为正,则使用二进制的0代替)
    2. 整数部分:除2取余(3.14整数部分为3,二进制格式为11)
    3. 小数部分:乘2取整数部分(3.14小数部分为0.14,二进制转换后为:00100.......)
    4. 指数部分:在经过前三布处理后,抛去正负号,3.14的二进制转换为11.00100.......,我们需要进行一个科学计数法表示,保证整数部分只剩下1,指数位+(float偏移127,double偏移量1023)
    5. 抛去正负号部分,由于第一位都是1,这样我们就可以把第一位和小数点舍去。
    

    我们以一张图来只管展示一下
    float如下图所示:
    在这里插入图片描述double如下所示:
    在这里插入图片描述奇怪输出结果:
    在这里插入图片描述
    首先我们看看2.25的单精度存储方式,2.25 --> 10.01 --> 1.00121
    符号位0,指数部分1+127 --> 10000000
    尾数部分:001 0000 0000 0000 0000 0000
    很简单 0 1000 0000 001 0000 0000 0000 0000 0000,
    而2.25的双精度表示为:0 100 0000 0000 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000,这样2.25在进行强制转换的时候,数值是不会变的
    而我们再看看2.2呢
    发现小数部分的二进制是一个无限循环的排列 00110011001100110011…
    对于单精度数据来说,尾数只能表示23bit的精度,所以2.2的float存储为:
    2.2 --> 10.0011001100110011001100 -->1.00011001100110011001100
    21
    符号位0,指数部分1+127 --> 1000 0000
    尾数部分:00011001100110011001100
    0 1000 0000 00011001100110011001100
    但是这样存储方式,换算成十进制的值,却不会是2.2的
    因为十进制在转换为二进制的时候可能会不准确,如2.2,而double类型的数据也存在同样的问题,所以在浮点数表示中会产生些许的误差,在单精度转换为双精度的时候,也会存在误差的问题

了解:
(1)浮点类型不精确,因为十进制的小数部分转二进制会需要舍去
(2)float类型的4个字节能表示的数字范围比long类型的8个字节还要大
因为浮点型底层存的是指数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值