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

    你可能感兴趣的文章
    mysql 使用sql文件恢复数据库
    查看>>
    mysql 修改默认字符集为utf8
    查看>>
    Mysql 共享锁
    查看>>
    MySQL 内核深度优化
    查看>>
    mysql 内连接、自然连接、外连接的区别
    查看>>
    mysql 写入慢优化
    查看>>
    mysql 分组统计SQL语句
    查看>>
    Mysql 分页
    查看>>
    Mysql 分页语句 Limit原理
    查看>>
    MySql 创建函数 Error Code : 1418
    查看>>
    MySQL 创建新用户及授予权限的完整流程
    查看>>
    mysql 创建表,不能包含关键字values 以及 表id自增问题
    查看>>
    mysql 删除日志文件详解
    查看>>
    mysql 判断表字段是否存在,然后修改
    查看>>
    MySQL 到底能不能放到 Docker 里跑?
    查看>>
    mysql 前缀索引 命令_11 | Mysql怎么给字符串字段加索引?
    查看>>
    MySQL 加锁处理分析
    查看>>
    mysql 协议的退出命令包及解析
    查看>>
    mysql 参数 innodb_flush_log_at_trx_commit
    查看>>
    mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
    查看>>