博客
关于我
深度剖析数据在内存中的存储(补充)
阅读量: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/

    你可能感兴趣的文章
    NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
    查看>>
    NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
    查看>>
    NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
    查看>>
    NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
    查看>>