浮点数(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 ...
随机推荐
- windows10上安装mysql
环境:windwos 10(1511) 64bit.mysql 5.7.14 一.下载mysql 1. 在浏览器里打开mysql的官网http://www.mysql.com/ 2. 进入页面顶部的& ...
- PHPStorm等编辑器debug调试(包括使用postman、soapUI)
很多人在开发的时候,需要进行断点调试,但是很多人配置了很多,还是调试不了,其实是不需要这么麻烦的. 注意:PHPStorm等编辑器debug的配置不用进行任何配置,默认配置就好 实质上,断点调试的时候 ...
- Jqgrid利用正则匹配表达式正确移除html标签
在使用JqGrid表格插件过程中,遇到一个问题:后台取出来的字段是带有Html标签的,于是将内容填充到表格之后,带有的html标签会把表格撑开或者每一行的内容显示不统一,导致非常难看,就像下图所示: ...
- Manjaro Linux KDE个人的一些安装配置
安装manjaro kde linux的个人步骤 1 换源 1.1 自动寻找最快的源 sudo pacman-mirrors -i -c China -m rank 1.2 修改源文件 sudo ge ...
- fiddler请求报文的headers属性详解
fiddler请求报文的headers属性详解 headers的属性包含以下几部分. (1)Cache头域 在Cache头域中,通常会出现以下属性. 1. Cache-Control 用来指定Resp ...
- SQL盲注
一.首先输入1和-1 查看输入正确和不正确两种情况 二.三种注入POC LOW等级 ... where user_id =$id 输入 真 and 假 = 假 (1)...where u ...
- python教程(一)·简介
先简单介绍下python.(真的很简单) python是什么? Python是Guido van Rossum发布于1991年的一种计算机程序设计语言.是一种动态的.面向对象的脚本语言,是一种解释型的 ...
- 组播___IGMP
一.基本概念: 1.协议概述: 是运行在主机和与主机直连的路由器之间,其实现的功能是双向的:一方面,主机通过IGMP通知路由器希望接收某个特定组播组的信息:另一方面,路由器通过IGMP周期性地查询局域 ...
- 谁能笑到最后,约瑟夫环-Josephus问题求解
一. 简述Josephus问题 N个人站成一环,从1号开始,用刀将环中后面一个人“消灭“”掉,之后再将刀递给下一个人,这样依次处理,最后留下一个幸存者. 二. 求解方法 1. 约瑟夫问题如果使用 ...
- 论文翻译第二弹--用python(或Markdown)对论文复制文本进行处理
图中这种论文你想进行文本复制放入翻译软件进行翻译时,会发现是这种形式: 句子之间是断开的,这时普遍的方法,也是我之前一直用的方法就是打开一个文档编辑器,复制上去后一行行地继续调整.昨天不想这样了,就打 ...