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

    你可能感兴趣的文章
    P2158 [SDOI2008]仪仗队
    查看>>
    P2260 [清华集训2012]模积和
    查看>>
    P3203 [HNOI2010]弹飞绵羊 —— 懒标记?分块?
    查看>>
    P3240 [HNOI2015]实验比较 树形DP
    查看>>
    P3950部落冲突
    查看>>
    P4313 文理分科
    查看>>
    P4491 [HAOI2018] 染色
    查看>>
    SpringBoot中集成LiteFlow(轻量、快速、稳定可编排的组件式规则引擎)实现复杂业务解耦、动态编排、高可扩展
    查看>>
    P5-js python中的map()函数
    查看>>
    SpringBoot中集成influxdb-java实现连接并操作Windows上安装配置的influxDB(时序数据库)
    查看>>
    P8738 [蓝桥杯 2020 国 C] 天干地支
    查看>>
    PA
    查看>>
    Package Header Cursor
    查看>>
    package,source folder,folder相互转换
    查看>>
    SpringBoot中集成Flyway实现数据库sql版本管理入门以及遇到的那些坑
    查看>>
    package.json文件常用指令说明
    查看>>
    SpringBoot中集成eclipse.paho.client.mqttv3实现mqtt客户端并支持断线重连、线程池高并发改造、存储入库mqsql和redis示例业务流程,附资源下载
    查看>>
    Padding
    查看>>
    paddlehub安装及对口罩检测
    查看>>
    SpringBoot中集成Actuator实现监控系统运行状态
    查看>>