文档章节

浮点数的基础知识

follitude
 follitude
发布于 2016/05/12 09:26
字数 1387
阅读 138
收藏 1

「深度学习福利」大神带你进阶工程师,立即查看>>>

1.浮点数的十进制表现形式

·我们知道,在 十进制中通常一个浮点数可以用科学计数法来表示,举例:

eg.1                            -306.5可以表示为-0.3065*10^3

其中是符号,指数3是阶或称阶码,0.3065是小数部分,左右两端非0包起来的部分是有效值,此例中的有效值是3065。由于小数部分也称为尾数,所以3065也是尾数。

eg.2                         -3.87

其中,有效值为387,尾数为87

 

·为什么称为浮点数呢?

因为他可以表示为 -3.065*10^2 也可以表示为 -0.03065*10^4 等,小数部分可以左右“浮动” ,但不管小数部分怎么移动,其有效值保持不变,都是3065(注意:尾数是变化的)。于是,两个浮点数相加就先要通过小数点的左右浮动,将阶码对齐后进行尾数相加。

(当阶码为固定值时,数的这种表示法称为定点表示,这样的数称为“定点数”;当阶码为可变时,数的这种表示法称为浮点表示,这样的数称为“浮点数”。)

·十进制浮点数规格化

为了使有效值和尾数能够统一,在空间上表达更有效率,有必要将所有浮点数规格化。

规格化标准:通过调整阶码将浮点数写成小数点前不含有有效数字,小数点后第一位由非0数字表示,举例-306.5规格化为-0.3065*10^3。 

 


 

2.十进制浮点数转换为二进制浮点数

在计算机内部,浮点数都是以二进制表示的。所以对于十进制浮点数,我们要把它先转换为二进制浮点数。

分两步走:

a.整数部分的转换,采用"除2取余法"。

b.小数部分采用"乘2取整法"。即把小数部分乘2(第一次计算),所得结果的整数部分作为小数的十分位,所得结果的小数部分再乘2(第二次计算),第二次计算所得结果的整数部分作为小数的百分位...以此类推,直到达到所需精度。

 


 

3.二进制浮点数的尾数及规格化

当十进制浮点数转换完成二进制浮点数后,就要像十进制数那样对二进制数规格化,以便于计算机表示。

·二进制浮点数的规格化

规格化标准:通过调整小数点的阶码使得该数的有效值在1和2之间,既二进制浮点数的整数部分为1。

例如:0.8125 = 0.1101(二进制) = 1.101*2^(-1)   

注意:上例末尾的(-1)是阶码,它也是二进制表示。然而,提到阶码就不得不提移码(增码),计算机移码就是在原有的补码的基础上对于符号取反。

·那么为什么会用移码来表示阶码呢?

因为用补码表示阶码的时候,当阶码无限小,产生了下溢的时候,阶码变成了0,那么这个浮点数的值变为了1。而实际上这个数是无限接近于零的。那么我们就需要取出其中的 "-0“ 值作为机器零。

 

4.计算机二进制浮点数表示过程

先看浮点数二进制表达的三个组成部分:

主要成分是:

  • Sign(1bit):表示浮点数是正数还是负数。0表示正数,1表示负数
  • Exponent(8bits):指数部分。类似于科计数法中的M*10^N中的N,只不过这里是以2为底数而不是10。需要注意的是,这部分中是以2^7-1即127,也即01111111代表2^0,转换时需要根据127作偏移调整。
  • Mantissa(23bits):尾数部分。浮点数具体数值的实际表示

实例:

Step 1 改写整数部分
以数值5.2为例。先不考虑指数部分,我们先单纯的将十进制数改写成二进制。
整数部分很简单,5.即101.。

Step 2 改写小数部分
小数部分我们相当于拆成是2^-1一直到2^-N的和。例如:
0.2 = 0.125+0.0625+0.007825+0.00390625即2^-3+2^-4+2^-7+2^-8….,也即.00110011001100110011

Step 3 规格化
现在我们已经有了这么一串二进制101.00110011001100110011。然后我们要将它规格化,也叫Normalize。其实原理很简单就是保证小数点前只有一个bit。于是我们就得到了以下表示:1.0100110011001100110011 * 2^2。到此为止我们已经把改写工作完成,接下来就是要把bit填充到三个组成部分中去了。

Step 4 填充
指数部分(Exponent):之前说过需要以127作为偏移量调整。因此2的2次方,指数部分偏移成2+127即129,表示成10000001填入。
尾数部分(Mantissa):除了简单的填入外,需要特别解释的地方是1.010011中的整数部分1在填充时被舍去了。因为规格化后的数值整部部分总是为1。那大家可能有疑问了,省略整数部分后岂不是1.010011和0.010011就混淆了么?其实并不会,如果你仔细看下后者:会发现他并不是一个规格化的二进制,可以改写成1.0011 * 2^-2。所以省略小数点前的一个bit不会造成任何两个浮点数的混淆。

follitude
粉丝 6
博文 118
码字总数 4956
作品 0
浦东
私信 提问
加载中
请先登录后再评论。
高效 Java Web 开发框架--JessMA

JessMA 是功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hibernate、MyBatis 与 JDBC DAO 组件),集成了 Action 拦截...

伤神小怪兽
2012/11/13
9.2K
3
[译] WPF MVVM 循序渐进(从基础到高级)

本文翻译自Shivprasad koirala在CodeProject上的文章:[WPF MVVM step by step (Basics to Advance Level)][1] 简介 从我们还是儿童到学习成长为成年人, 生命一直都在演变。 对于软件架构, ...

不插电码农
2015/11/27
1.5K
1
Java工程师如何在Docker上进行开发

Java工程师如何在Docker上进行开发?本文能让你以最小的日常开支和预备知识就可以把Docker和Java结合使用。 安装 现在有很多的Java Web框架,挑选一个非常小的框架,选择Spark吧!它是一款基...

dockerer
2015/12/04
8.3K
20
Supporting Python 3(支持python3)——为Python 3做准备

为Python3作准备 在开始添加Python 3的支持前,为了能够尽可能地顺利过度到Python 3,你应该通过修改对2to3来说很难苦的东西来给你的代码做一些准备。即使你现在不打算迁移到Python 3,有一些...

在湖闻樟
2015/09/15
1.2K
0
[基础]iOS 单元测试(一)入门与配置

所有文章目录:http://my.oschina.net/ChenTF/blog/677112 本篇文章地址: http://my.oschina.net/ChenTF/blog/677309 会持续的更新所有历史文章, 所以收藏的话请收藏上面的地址。 workspace ...

advancer_chen
2016/05/18
1.1K
1

没有更多内容

加载失败,请刷新页面

加载更多

倒计时一周,HOLOS千人大会即将召开!

8月10日消息,Holos霍洛斯星际云自由能源将于2020年8月17日在深圳召开千人媒体发布会。据了解,此次发布会将请到众多行业领袖、区块链技术精英、数十位国家级专科院士以及多位能源行业重量级...

osc_njd5t1rw
44分钟前
17
0
Goroutine 泄露排查

我们在发布一个 go 应用时,默认都会启用两个 http handler: 一个是 pprof,方便线上动态追踪问题;另外一个是 prometheus 的 metrics,这样就可以通过 grafana 准实时的监控当前 runtime 信...

ms2008
2019/06/03
0
0
如何在Python中打印到stderr? - How to print to stderr in Python?

问题: There are several ways to write to stderr: 有几种写stderr的方法: # Note: this first one does not work in Python 3print >> sys.stderr, "spam"sys.stderr.write("spam\n")......

法国红酒甜
46分钟前
27
0
关于JWT Token 自动续期的解决方案

前言 在前后端分离的开发模式下,前端用户登录成功后后端服务会给用户颁发一个jwt token。前端(如vue)在接收到jwt token后会将token存储到LocalStorage中。 后续每次请求都会将此token放在请...

飘渺Jam
07/16
20
0
5G时代会不会导致编程语言大灭绝,JS的前景是否会更好-诺禾

首先,5G打开了工业互联网的大门,同时5G也会推动一系列技术的发展,包括物联网、大数据、边缘计算、人工智能等等,而这些技术的发展又会推动各种技术平台的发展,从而形成以技术平台为基础来...

osc_jo2m8l1r
46分钟前
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部