浮点数(floating-point number)二进制存储格式
定义
浮点数就是小数点位置不固定的数,也就是说与定点数不一样,浮点数的小数点后的小数位数可以是任意的,根据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)二进制存储格式的更多相关文章
- 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 ...
- 复合文档的二进制存储格式研究[ole存储结构](word,xls,ppt...)[转]
复合文档文件格式研究 前 言 复合文档(Compound Document) 是一种不仅包含文本而且包括图形.电子表格数据.声音.视频图象以及其它信息的文档.可以把复合文档想象成一个所有者,它装着 ...
- 【zzuli-2266】number(二进制处理)
题目描述 某人刚学习了数位DP,他在某天忽然思考如下问题: 给定n,问有多少数对<x, y>满足: x, y∈[1, n], x < y x, y中出现的[0, 9]的数码种类相同 ...
- 代码之髓读后感——名字&作用域&类型
名字和作用域 为什么要取名 看着代码中遍地都是的变量,函数,或多或少的我们都应该想过,为什么会有这些名字呢? 我们知道,计算机将数据存储到对应的物理内存中去.我们的操作就是基于数据的.我们需要使用这些 ...
- 笨办法学Python - 习题3: Numbers and Math
目录 习题 3: 数字和数学计算 算术运算符 加分习题: 我的答案: 总结: 扩展: Python比较运算符 Python赋值运算符 Python位运算符 Python逻辑运算符 Python成员运算 ...
- C语言中你可能不熟悉的头文件(stdlib.h)
C语言中你可能不熟悉的头文件<cstdlib>(stdlib.h) C Standard General Utilities Library (header) C标准通用工具库(头文件) ...
- 笨办法学Python(三)
习题 3: 数字和数学计算 每一种编程语言都包含处理数字和进行数学计算的方法.不必担心,程序员经常撒谎说他们是多么牛的数学天才,其实他们根本不是.如果他们真是数学天才,他们早就去从事数学相关的行业了, ...
- Java中浮点数的基础知识
偶然查看Math.round的JDK public static int round(float a) { if (a != 0x1.fffffep-2f) // greatest float val ...
- 如何避开JavaScript浮点数计算精度问题(如0.1+0.2!==0.3)
不知道大家在使用JS的过程中有没有发现某些浮点数运算的时候,得到的结果存在精度问题:比如0.1 + 0.2 = 0.30000000000000004以及7 * 0.8 = 5.60000000000 ...
随机推荐
- 通过xshell在linux上安装mysql5.7(终极版)
通过xshell在linux上安装mysql5.7(终极版) 0)通过xshell连接到远程服务器 1)彻底删除原来安装的mysql 首先查看:rpm -qa|grep -i mysql 删除操作(一 ...
- JavaScript 时间对象 date()
getYear() 获得的是距离1900年过了多少年 var d = new Date(); document.write(d+"<br />"); document. ...
- 坑爹的jquery ui datepicker
1.坑爹的jquery ui datepicker 竟然不支持选取时分秒,害的我Format半天 期间尝试了bootstrap的ditepicker,但是不起作用,发现被jquery ui 覆盖了, ...
- TinyMCE插件:FileManager [4.x-6.x] 配置及BUG处理
FileManager最新版已升级到9.x,9.x新增了对文件的批量处理,但仍然有部分同学在继续使用6.x,这里大叔整理了一份自己在配置6.x时,遇到的问题和解决方案. 安装 下载安装包解压后,在根目 ...
- git创建使用1https://blog.csdn.net/Hanani_Jia/article/details/77950594
这篇文章是我自己写的关于GitHub的内容,从我刚听到这个直到设置成功每一步都有详细的步骤来解释,其中有一些截图或者代码来自于网上. 首先,我先对GitHub来一个简单的介绍,GitHub有一个很强大 ...
- laydate5.0 设置最大最小值
由于新版的laydate时间插件在初始化时已设置时间最大最小范围,且生成对象,无法重新渲染改变其日期最大最小值. 有网友经实验贴出如下方法可达成目的,故做记录. //开始时间 var startDat ...
- yii学习笔记(5),视图操作
在控制器调用$this->render()方法来输出视图 function actionLogin(){ $name = "admin"; // 加载视图 return $t ...
- exynos4412—UART裸板复习
我们通过RS232来做实验. 通过电平转换芯片, 连接至核心板: 即:GPA0_0 GPA0_1 配置引脚为串口专用模式: 然后看 ULCONn [31:0] 0x3 设置串口 ...
- Python基本语法元素
静态语言(C/C++.Java):脚本语言(python.JavaScript.PHP) IPO(Input.Process.Output) #:python中的注释符号:''' ''':多 ...
- Java:break和continue关键字的作用
二者的作用和区别 1. break:直接跳出当前循环体(while.for.do while)或程序块(switch).其中switch case执行时,一定会先进行匹配,匹配成功返回当前case的值 ...