定义

浮点数就是小数点位置不固定的数,也就是说与定点数不一样,浮点数的小数点后的小数位数可以是任意的,根据IEEE754-1985(也叫IEEE Standard for Binary Floating-Point Arithmetic)的定义,浮点数的类型有两种:单精度类型(用4字节存储)和双精度类型(用8字节存储)。

存储方式

要理解浮点数的存储方式,首先要从科学技术法讲起。

对于十进制数345.67用科学计数法可以表示为3.4567 * 10^2,其中3.4567有很多英文叫法,有叫fraction part,或者叫characteristic,或者mantissa,但是大多数习惯叫significand。我们这里统一称这一部分为significand。345.67除了可以表示为3.4567 * 10^2,还可以表示为0.34567 * 10^3,0.034567 * 10^4,但是通常情况下,把sigificand介于[1, 10)的形式称为标准形式(nomalized form)。

对于二进制,也有类似的情形。比如二进制小数101.1101 = 1.011101 * 2^2 = 0.1011101 * 2^3 = 0.01011101 * 2^4,其中把significand介于[1, 2)之间的形式称为标准形式,1.011101 * 2^2就是101.1101科学计数法的标准形式。

有了上面的理解,那么我们就可以把任何二进制浮点数都化成如下标准形式:

(+/-).f * ^e

其中(+/-)表示正负号,f表示signifcand的小数部分,e表示指数。而二进制的浮点数(无论是单精度,还是双精度)在计算机内部的存储格式就是依据上述的标准形式,被划分成3部分:

一 单精度

对于单精度浮点数,s使用1bit存储,0表示正数,1表示负数,e使用8bit存储,值范围是[0, 255],由于单精度总共使用4字节32bit存储,那么f就使用剩余的23bit存储。不用存储二进制标准形式1.f中的"1"的原因是,在标准形式下,它总是1,所以尽管单精度只存储了1.f中的23bit,但实际上它可以表示的精度是24bit(23bit + 没有存储的"1")。

上述存储形式中,需要特殊主意的指数e。

首先,这里的指数e是有偏的(biased),就是说,e是在实际指数的基础上加了一个偏移量(bias)对于单精度浮点数来说,这个偏移量 = 127(即2^(e的存储位数 - 1) - 1)。换句话说,有单精度浮点数的存储形式反推单精度浮点数的二进制标准科学计数法的公式为:

(-)^s * .f * ^(e - )

其中s是符号位的值,当s = 0时,是一个正的单精度浮点数,当s = 1时,是一个负的单精度浮点数。

其次,对于e = 0和e = 255,有特殊的意义,总结如下:

1)e = 0 & f = 0

此时表示的单精度浮点数就是0,可以是正0,也可以是负0。负0的表明表示的实际上是一个非常小的负数,但是这个数已经无法用单精度的存储方式来表示了,比如1.11 * 2^(-129)已经无法用单精度表示了,因为即使-129加了127的偏移量,仍然落在了e的值区间[0, 255]之外。

2) e = 0 & f != 0

此时表示的数可有下面的工时推出:

(-)^s * .f * ^(-)

其中s仍然表示符号位,这种形式被称为非标准形式

3) e = 255 & f = 0

此时表示正无穷或者负无穷,依据符号位决定

4) e = 255 & f != 0

此时表示NaN

二 双精度

双精度和单精度的存储类似,只是在bit位数有有点不一样。s使用1bit存储,e使用11bit存储,因此bias是1023,f使用52bit存储,因此可以表示的精度是53bit。

由双精度浮点数存储形式反推的双精度浮点数标准二进制科学表示公式为:

(-)^s * .f * ^(e - )

对于指数e也有和单精度一样的情形。

浮点数(floating-point number)二进制存储格式的更多相关文章

  1. matlab里textread出现错误“Trouble reading floating point number from file (row 1, field 1)”

    matlab里textread出现错误“Trouble reading floating point number from file (row 1, field 1)” 解决办法:traindata ...

  2. 复合文档的二进制存储格式研究[ole存储结构](word,xls,ppt...)[转]

    复合文档文件格式研究   前 言 复合文档(Compound Document) 是一种不仅包含文本而且包括图形.电子表格数据.声音.视频图象以及其它信息的文档.可以把复合文档想象成一个所有者,它装着 ...

  3. 【zzuli-2266】number(二进制处理)

    题目描述 某人刚学习了数位DP,他在某天忽然思考如下问题: 给定n,问有多少数对<x, y>满足: x, y∈[1, n], x < y x, y中出现的[0, 9]的数码种类相同 ...

  4. 代码之髓读后感——名字&作用域&类型

    名字和作用域 为什么要取名 看着代码中遍地都是的变量,函数,或多或少的我们都应该想过,为什么会有这些名字呢? 我们知道,计算机将数据存储到对应的物理内存中去.我们的操作就是基于数据的.我们需要使用这些 ...

  5. 笨办法学Python - 习题3: Numbers and Math

    目录 习题 3: 数字和数学计算 算术运算符 加分习题: 我的答案: 总结: 扩展: Python比较运算符 Python赋值运算符 Python位运算符 Python逻辑运算符 Python成员运算 ...

  6. C语言中你可能不熟悉的头文件(stdlib.h)

    C语言中你可能不熟悉的头文件<cstdlib>(stdlib.h) C Standard General Utilities Library (header) C标准通用工具库(头文件) ...

  7. 笨办法学Python(三)

    习题 3: 数字和数学计算 每一种编程语言都包含处理数字和进行数学计算的方法.不必担心,程序员经常撒谎说他们是多么牛的数学天才,其实他们根本不是.如果他们真是数学天才,他们早就去从事数学相关的行业了, ...

  8. Java中浮点数的基础知识

    偶然查看Math.round的JDK public static int round(float a) { if (a != 0x1.fffffep-2f) // greatest float val ...

  9. 如何避开JavaScript浮点数计算精度问题(如0.1+0.2!==0.3)

    不知道大家在使用JS的过程中有没有发现某些浮点数运算的时候,得到的结果存在精度问题:比如0.1 + 0.2 = 0.30000000000000004以及7 * 0.8 = 5.60000000000 ...

随机推荐

  1. UDP实现网络通信程序

    VC6.0创建基于UDP协议的网络聊天程序 只有一个工程UDP,服务器和客户端都是这个工程,因为UDP中C/S区分不强化 只讲关键部分,避免累赘 1.为对话框添加控件 2.为控件绑定变量和消息函数 启 ...

  2. redis的主从配置

    redis的主备配置比较简单,只需要在配置上新增slaveof属性即可,如果主节点需要密码验证,则在加上masterauth属性. 测试安装一个备用redis,备份前一章的节点redis的docker ...

  3. 大数据学习--day03(运算符、流程控制语句)

    运算符.流程控制语句 自增自减容易出错的地方: 扩展的赋值运算符  a+=b 等同于 a = a+b;  扩展的赋值运算符 隐含了一个类型的强制转换 & && 有何区别   & ...

  4. Python递归二分法

    # lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963] # 时间复杂度. n# # 让用户输入一个数n. 判断这个n是否出现在lst中# n = ...

  5. 爬虫-windows下安装Scrapy及scrapy模块介绍

    一:安装wheel  wheel介绍 二:安装twisted twisted是由python编写的一款基于事件驱动的网络引擎,使用twisted模块将python的异步请求(异步模型介绍)成为可能且简 ...

  6. 爬虫-爬虫介绍及Scrapy简介

    在编写案例之前首先理解几个问题,1:什么是爬虫2:为什么说python是门友好的爬虫语言?3:选用哪种框架编写爬虫程序 一:什么是爬虫? 爬虫 webSpider 也称之为网络蜘蛛,是使用一段编写好的 ...

  7. mysql自动提交

    MySQL的autocommit(自动提交)默认是开启,其对mysql的性能有一定影响,举个例子来说,如果你插入了1000条数据,mysql会commit1000次的,如果我们把autocommit关 ...

  8. 结合《需求征集系统》谈MVC框架

    结合<需求征集系统>分析MVC框架. 六个质量属性: 可用性:在系统压力过大时,会提示系统繁忙. 可修改性:使用配置文件,修改配置文件即可.对于一些公共的方法,进行封装,修改时,只需修改封 ...

  9. 【BZOJ5290】[HNOI2018]道路(动态规划)

    [BZOJ5290][HNOI2018]道路(动态规划) 题面 BZOJ 洛谷 题目直接到洛谷上看吧 题解 开始写写今年省选的题目 考场上我写了一个模拟退火骗了\(90\)分...然而重测后只剩下45 ...

  10. 北京Uber优步司机奖励政策(1月19日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...