• 计算机如何存储浮点数


    前言

    计算机使用二进制来存储所有数据,对于整数,直接转成二进制就可以了,如int类型的15,二进制表示为

    00000000 00000000 00000000 00001111
    

    对于浮点数,如何转换成二进制呢,答案是使用IEEE 754标准。

    原理

    IEEE 754规定,对于32位的浮点数,最高1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M。

    对于64位的浮点数,最高1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。

    以32位浮点数为例,计算公式为

    • S: 符号位,0表示正数,1表示负数。
    • E: 指数
    • M: 尾数

    以32位浮点数3.25为例,转为二进制为11.01,规范表示为1.101 * 21,所以
    S=0,
    E=1+127=128,二进制为10000000
    M=101(省略掉左侧的1之后),不足23位右侧补0,超过23位截取前23位,最终结果为

    0 10000000 10100000000000000000000
    

    十进制表示为1078984704。

    Java代码

    public class Client {
    
      public static void main(String[] args) {
        System.out.println(Float.floatToIntBits(3.25f));//1078984704
        System.out.println(Float.intBitsToFloat(1078984704));//3.25
        System.out.println(Double.doubleToLongBits(3.25f));//4614500768194494464
        System.out.println(Double.longBitsToDouble(4614500768194494464L));//3.25
      }
    
    }
    

    Java提供了符合IEEE 754标准的表示浮点数的方法,将整型数和浮点数进行转换。

    注意

    十进制转二进制,如3.25,整数部分采用除2取余,逆序排列法,小数部分采用乘2取整法,具体可以查看10进制转2进制
    小数部分在转换时,有可能剩余部分一直不为0,一直无限循环,我们只能根据精度取有限的位数,这也是浮点数会丢失精度的原因。如

    System.out.println(0.3 - 0.2);//0.09999999999999998
    

    结果不是预期的0.1。处理浮点数相关,推荐使用BigDecimal。

    参考

    IEEE 754浮点数标准详解
    10进制转2进制
    浮点数的二进制表示
    计算机如何存储浮点数

  • 相关阅读:
    [NOIp2009] $Hankson$ 的趣味题
    [洛谷P1730] 最小密度路径
    [NOIp2015] 运输计划
    [NOIp2012] 借教室
    [NOIp2012] 国王游戏
    [NOIp2016] 蚯蚓
    [洛谷P1272] 重建道路
    [洛谷P1273] 有线电视网
    [ZJOI2010] 数字计数
    ☆ [HDU2089] 不要62「数位DP」
  • 原文地址:https://www.cnblogs.com/strongmore/p/16287470.html
Copyright © 2020-2023  润新知