博客
关于我
深度剖析数据在内存中的存储(补充)
阅读量:794 次
发布时间:2019-03-25

本文共 1454 字,大约阅读时间需要 4 分钟。

浮点型在内存中的存储

浮点型是一种常见的数据类型,能够代表说大或小的数值。它的存储方式在计算机内部遵循IEEE 754标准,这为浮点数的表示提供了统一的规范。在近几十年来,尤其是随着计算机的普及,浮点型成为了程序设计中极为基础且重要的数据类型。

有效数字与指数的存储

浮点数主要由三个部分组成:

  • 符号位(Sign bit):决定数值是正数还是负数,当符号位为0时数值为正,符号位为1时数值为负。
  • 有效数字部分(Strictly fractional部分):存储决定数值大小的有效数字部分,IEEE 754标准规定,如果以二进制形式表示,有效数字的第一位总是会被舍去,以节省存储空间。这意味着有效数字的存储长度更短。
  • 指数位(Exponent):决定数值的有效位偏移幅度。对于32位浮点型,指数位占用8位。
  • IEEE 754标准详解

    按照IEEE 754标准,任意一个32位浮点数的存储模式可以表示为以下形式:

    [ V = (-1)^S \times M \times 2^E ]

    • S:符号位,当S=0时数值为正,S=1时数值为负。
    • M:有效数字部分,大小在1(包含)到2(不包含)之间。
    • E:指数部分,执行的是2的幂次运算。

    对于一个具体的浮点数值,通过这样的模型就可以将其转换为7-23位有效数字和指数值的组合。

    有效数字的存储优化

    为了使存储长度更加紧凑,IEEE 754有一个关键优化:

    • 当处理有效数字时,永远记录的第一位是紧随小数点后的数字的第一位。

    比如,当要存储的有效数字是101.23时,仅会存储10123,而不包括前面的1。之后在解析时,1会被自动补充回来。

    这种方法虽然节省了一个有效数字的存储位,但会对原始数值产生轻微的误差,偏差范围通常可以忽略不计。

    指数值的近似存储

    指数部分也是分别按照偏移量来存储的。对于32位浮点型,指数占8位,取值范围是0到255。但是,单独存储时,往往需要考虑的话可能超出了有效指数范围的一半。

    为了解决这个问题,IEEE 754选择使用一种"转换"方法:

    • 如果指数值是E,则实际存储的值为原始值加上中移值(bias)。具体来说:

    • 8位指数的中移值是127。

    • 11位指数的中移值是1023。

    在读取时,这个中移值就被减掉,从而得到了准确的指数值。

    特殊情况处理

    浮点型还有一些特殊情况需要注意:

  • 零点:如果指数部分的值为0,有效数字部分为0,则数值为0。

  • 无穷大:如果有效数字部分不为0,而指数部分的值为最大值(即全部位都为1),则数值为无穷大或负无穷大。

  • 不定值或零点附近误差(Denormalized numbers):如果指数部分全部为0,而有效数字部分不为0,则数值非常接近于零,这样的数值称为"不定值"。

  • 实例解析

    举个例子,数值5.5的浮点型存储如下:

  • 十进制的5.5,转换为二进制可写作:101.1。
  • 将其转换为科学计数法:1.011×2^2.
  • 符号位S=0,有效数字部分M=011,指数位E=2 + 127=129.
  • 二进制表示为:0 01000000000110000000000000.
  • 这里0表示符号位,01为有效数字的前半部分,129为指数部分。

    结论

    浮点型在内存中的存储方式采用了一种高效的编码方式。通过将数值的大小和位置信息分开存储,反而实现了一种更高效的数据表示方式。在实际应用中,正确理解和处理浮点型的存储方式至关重要,尤其当需要进行数值计算或者在内存中进行数值运算时。这不仅关系到程序的性能,也直接影响到计算结果的准确性。

    转载地址:http://uqeuk.baihongyu.com/

    你可能感兴趣的文章
    ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
    查看>>
    ngrok内网穿透可以实现资源共享吗?快解析更加简洁
    查看>>
    ngrok内网穿透可以实现资源共享吗?快解析更加简洁
    查看>>
    NHibernate动态添加表
    查看>>
    NHibernate学习[1]
    查看>>
    NHibernate异常:No persister for的解决办法
    查看>>
    Nhibernate的第一个实例
    查看>>
    NHibernate示例
    查看>>
    nid修改oracle11gR2数据库名
    查看>>
    NIFI1.21.0/NIFI1.22.0/NIFI1.24.0/NIFI1.26.0_2024-06-11最新版本安装_采用HTTP方式_搭建集群_实际操作---大数据之Nifi工作笔记0050
    查看>>
    NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_插入时如果目标表中已存在该数据则自动改为更新数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0058
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0_Postgresql和Mysql同时指定库_指定多表_全量同步到Mysql数据库以及Hbase数据库中---大数据之Nifi工作笔记0060
    查看>>
    NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
    查看>>
    NIFI1.21.0最新版本安装_配置使用HTTP登录_默认是用HTTPS登录的_Https登录需要输入用户名密码_HTTP不需要---大数据之Nifi工作笔记0051
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增加修改实时同步_使用JsonPath及自定义Python脚本_03---大数据之Nifi工作笔记0055
    查看>>