目录

前言

一、例题引入

二、浮点数的存放规则

1.概念陈述

2.通过案例分析

1)、转化为二进制

2)、存放的特殊规则

3)、读取时E的特殊规则

三、引例揭秘

四、浮点性存放精度丢失的问题


前言

在计算机语言中,除了整形,另外一大类型就是浮点型。它的存储方式和整形不尽相同,本文就仔细的带大家来了解浮点数存储的方法。


一、例题引入

int main()
{int n = 9;float *pFloat = (float *)&n;printf("n的值为:%d\n",n);printf("*pFloat的值为:%f\n",*pFloat);*pFloat = 9.0;printf("num的值为:%d\n",n);printf("*pFloat的值为:%f\n",*pFloat);return 0;
}

按照正常思路来讲,我们会认为第一个printf的输出值应该是9,第二个printf的输出值猜测为9.0;第三个printf的输出值猜测为9,第四个输出的值应当是9.0。(答案揭晓如下图)

由结果可见,在输入类型和输出类型相同时,打印出来的结果毫无疑问是正确的。但是,对于第二个和第三个的打印值却出乎大家的预料,其中的原因就是浮点数在内存中的存放方法和整形完全不同

二、浮点数的存放规则

1.概念陈述

浮点型数据的存放的规则是根据国际标准IEEE(电气和电子工程协会) 754来定义的。任意一个二进制浮点数可以表示成下面的形式:

(-1)^S * M * 2^E
(-1)^S 表示符号位,当 S=0 , V 为正数;当 S=1 , V 为负数。
M 表示有效数字大于等于 1小于 2
2^E 表示指数位

32位和64位数据的S、M、E的存放格式如下:

单精度

 双精度

2.通过案例分析

以单精度浮点型进行举例,双精度浮点型可以自行类推。

1)、转化为二进制

例:-5.5

由于是负数,所以需要使得(-1)^S为负数。由此可以见得浮点数的符号位S的存储类似整形:1表示负数,0表示正数。

然后计算有效数字位M,先把整数位转化为二进制,例子中的5就写成101,再把浮点数位转化为二进制,浮点数后每一位的权重是二分之一的n次方,0.5就是二分之一的一次放,所以浮点数的二进制就是1。将整形和浮点型合并,就得到了二进制形式的数字101.1。

但是需要注意的是M的范围是大于等于一,小于二的。我们把101.1写成二进制的科学计数法:1.011*2^2,由此我们得到M为1.011,E为2。

2)、存放的特殊规则

根据国际标准IEEE,我们得到了-5.5的存储写法(-1)^S * M * 2^E=(-1)^1*1.011*2^2。此后,我们需要考虑的是有效数字M指数位E的存放规则有一些特殊的规则

有效数字M:由于M的范围是大于等于1,小于2。所以,一切的有效数字都可以表示为1.xxxxxx;其次,我们由上图可知,单精度浮点型给有效数字M分配的存储空间是23个二进制位,如果1.xxxxxx的1存储进去,就会占用一个二进制位,我们不妨可以将1省去,只把小数点后的xxxxxx存储进M,这样就用23个二进制位存进了一个24位的有效数字。在之后读取的时候只要再把1重新加上即可。此处理可以提高数据的精度(具体为何后文会提及)。

指数位E:首先,E是一个无符号整形,这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出

现负数的,所以就有规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

知道了这些规则,我们就可以把-5.5的二进制数(-1)^1*1.011*2^2写入内存,写法就是把S E M按顺序拼接起来,所给位数没有填满的就用零补满

-5.5=(-1)^1*1.011*2^2=(S)1 (E)10000001 (M)011 0000 0000 0000 0000 0000

3)、读取时E的特殊规则

E 不全为 0 或不全为 1
这时,浮点数就采用下面的规则表示,即指数 E 的计算值减去 127(或1023 ,得到真实值,再将有效数字M 前加上第一位的 1
E 全为 0
这时,浮点数的指数 E 等于 1-127 (或者 1-1023 )即为真实值,由于2^(1-127)这样的数数字极其的小,有效数字M 不必再加上第一位的1 ,而是还原为 0.xxxxxx 的小数。这样做是为了表示 ±0 ,以及接近于0的很小的数字。
E 全为 1
这时,如果有效数字 M 全为 0 ,表示 ± 无穷大(正负取决于符号位 s)

三、引例揭秘

int main()
{int n = 9;float *pFloat = (float *)&n;printf("n的值为:%d\n",n);printf("*pFloat的值为:%f\n",*pFloat);*pFloat = 9.0;printf("num的值为:%d\n",n);printf("*pFloat的值为:%f\n",*pFloat);return 0;
}

本题中,n为整形,所以在内存中存储的数字为:

00000000 00000000 00000000 00001001

如果将他以单精度浮点型打印出来,第一个0为符号位(S)表示整数,符号位后面的八个0表示指数位(E),由于全是零,根据E读取的特殊规则,打印出来的结果就显示的时0.000000。

*pFloat为浮点形,所以在内存中存储的数字为:

(S)0 (E)10000010 (M)001 0000 0000 0000 0000 000000

将这个浮点型二进制存放数字用整形的形式表达出来就形成了一个很大的数字,用计算器算出结果可见和输出的结果是一致的

四、浮点性存放精度丢失的问题

由于浮点型在转化为二进制时,小数点后的十进制数字,要通过权重为二分之一的数字来拼凑实现,就会出现不能刚好凑出的情况。如下面的例子所示,结果只能无限逼近0.65,永远无法得到0.65本身,这就造成了浮点型精度丢失的问题,因此更多的有效位存放空间(M)可以提高精度。

例:5.65

0.65=1*1/2^1(0.5)+0*1/2^2(0,25)+1*1/2^3(0.125)+…………

数据的存储(浮点型篇)相关推荐

  1. 赶紧进来修内功--- 详细讲解在内存中数据的存储方式(整形篇)

    本文详细介绍了所有整形家族类型的取值范围;整形数据在内存中的存储方式(大小端存储方式)以及对应的解析,介绍讲解判断当前机器的存储方式代码练习题,掌握后编程基础更进一步牢固!!! 数据的存储 一.整形数 ...

  2. 详细浮点型数据的存储讲解

    在引入知识之前,先来看一个案例,就知道了解浮点型数据存储的重要性与必要性. 举个例子: ​ #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h&g ...

  3. C语言数据存储-浮点型

    C语言数据存储-浮点型 浮点型 浮点型的种类和表示范围 储存方式 二进制转化 浮点数的储存 (IEEE 745) 一个实例 关于E的一些注意点 浮点型 浮点型的种类和表示范围 1.float:3.4E ...

  4. 澄清大数据存储——系统集成商篇

    大数据考验整合能力 大数据在带来新的商机和用户的同时,也带来了诸多挑战. 大数据存储主要考验的是技术整合能力和资源整合能力. 大数据是一项持久的工程,也是一个不断迭代的过程,不能一蹴而就. 业务集中在 ...

  5. 【C语言进阶】从入门到入土(数据的存储)

    前言: 这一篇我们来深度剖析数据在内存中的存储,让我们走进数据在内存中到底是任何进行存储的,不同的数据类型有何差异. 进阶之数据的存储: 一.数据类型详细介绍及归类 1.数据类型介绍 2.类型的基本归 ...

  6. 《大数据之路:阿里巴巴大数据实践》第二篇 数据模型篇-读书笔记

    目录 8.大数据领域建模综述 8.1 为什么需要数据建模 8.2 关系数据库系统和数据仓库 8.3 从OLTP和OLAP系统的区别看模型方法论的选择 8.4 典型的数据仓库建模方法论 8.4.1 ER ...

  7. Android学习 —— 数据的存储与访问方式一: 文件存取

    笔记摘要: 在Android中主要提供了四种数据存储与访问的方式,文件.SharedPreference(偏好参数保存).SOLite数据库.内容提供者(Content provider)和网络, 本 ...

  8. TableStore: 海量结构化数据分层存储方案

    2019独角兽企业重金招聘Python工程师标准>>> 前言 表格存储是阿里云自研分布式存储系统,可以用来存储海量结构化.半结构化的数据.表格存储支持高性能和容量型两种实例类型.高性 ...

  9. Docker 数据卷之进阶篇

    Docker 数据卷之进阶篇 原文:Docker 数据卷之进阶篇 笔者在<Docker 基础 : 数据管理>一文中介绍了 docker 数据卷(volume) 的基本用法.随着使用的深入, ...

  10. 详解 Python 如何将爬取到的数据分别存储到 txt、excel、mysql 中!

    作者 | 黄伟呢 来源 | 数据分析与统计学之美 1. 页面分析 我爬取的页面是腾讯体育,链接如下: https://nba.stats.qq.com/player/list.htm 观察上图:左边展 ...

最新文章

  1. AI大咖山世光:AlphaGo Zero的成功并不能复制到人脸识别!
  2. 《大话操作系统——做坚实的project实践派》(3)
  3. tensorflow的tf.transpose()简单使用
  4. [vue] 什么是虚拟DOM?
  5. canvas笔记-文本水平垂直对齐与度量
  6. C#中async/await中的异常处理
  7. 即时系统和非即时系统的区别?_企业即时通讯系统拥有哪些二次开发能力?
  8. 分区字段必须包含在主键字段_十年Java开发经验分享:24 个必须掌握的数据库面试问题...
  9. 056 日志的正则式方式加载
  10. Windows系统清理随记
  11. 【Python】一键爬取金庸连载版/三联版/世纪新修版小说
  12. codeforces1549 F1 - Gregor and the Odd Cows (Easy)(皮克公式)
  13. 基于Nonebot2搭建QQ机器人(二)编写一个自动回复插件
  14. 用AI如何预测《权力的游戏》死亡名单?真是神了!
  15. 【前端】你真的理解JavaScript中的变量和数据类型吗
  16. Android开发技术框架和编码规范
  17. 关于文件not found 的几个常见排查点的总结
  18. VirtualBox Installation failed! Error :安装时发生严重错误
  19. unity技术补全计划
  20. Matlab实现 乘幂法反幂法

热门文章

  1. FEC生鲜配送软件8大功能简述_功能列表
  2. 【Java学习笔记】38.Java 发送邮件
  3. 解线性方程组——高斯消元の板子
  4. idea 集成python
  5. XX健康:预约管理-套餐管理图片上传与预览Redis实现定时清理垃圾图片
  6. 软考程序员c语言、Java和c++考点
  7. 如何去掉a标签的下划线 各种样式详解
  8. LabVIEW编程实例:如何通过TCP协议进行数据通信
  9. 圆的周长,面积,球的体积和表面积
  10. 安装libjpeg库后提示libjpeg.so.8不存在(linux环境)