浮点数在计算机中的表示
文章目录
- IEEE 754 标准
- 浮点数例子
- 其他
IEEE 754 标准
在这个标准中,任意一个二进制浮点数 V
可以表示成下面这样的形式:
1. (-1)^s
表示符号位,当 s = 0
时, V
为正, s = 1
时,V
为负
2. M
表示有效数字,1 <= M < 2
3. E
表示指数,如 2^E
举个例子,对于十进制的 5.0
,写成二进制就是 101.0
,相当于 1.01 x 2^2
。
按照上面的标准,可以得出: s = 0
,M = 1.01
, E = 2
IEEE 754 规定,对于 32 位的浮点数,最高的 1
位是符号位 s
,接着的 8
位是指数 E
,剩下的 23
位为有效数字 M
:
对于 64位 的浮点数,最高的 1
位是符号位 S
,接着的 11
位是指数 E
,剩下的 52
位为有效数字 M
。
在 IEEE 754 标准中,对 M
和 E
还有一些特别的规定,用于应对一些极端情况。
对于M
,前面有提到, 1 <= M < 2
,也就是说, M
可以写成 1.xxxx
的形式,其中 xxxx
表示小数部分。既然我们知道计算机在保存 M
时第一位默认总是 1
,那么我们可以先省略这个数,只保存 xxxx
这样的小数部分,然后在最后的结果前再加上 1
,这样,我们就能多出一位来保存小数 xxxx
了。IEEE 754 中就是这样规定的。
对于E
,情况会复杂些:
首先,E
是一个无符号整数,若 E
为 8
位,它的取值范围就是 0 - 255
,若 E
为 11
位,它的取值范围就是 0 - 2047
,但是,在科学计数法中,指数位 E
是能取负值的,因此 IEEE 754 中规定,E
的真实值需要再减去一个中间数,相当于是一个偏置(bias),对于 8
位的 E
,这个偏置是 127
,对于 11
位的 E
,这个偏置是 1023
。
比如,2^10
的 E
是 10
,因此在保存为 32
位浮点数时,需要保存为 10 + 127 = 137
,即 10001001
(因为 E
在变成 10
之前,减去了一个偏置 127
)
E
还能分成三种情况讨论:
规格化:当
E
的二进制位不全为0
,也不全为1
时,二进制浮点数V
为规格化形式。这时
E
的计算就按上面的规则,减去127
或1023
。如E
为10000100
,则E = 132
,E
的真实值e = 132 - 127 = 5
。M
也是如之前所述,在左侧加上隐含位1
,也就是1.M
,如M
为1010...0
(101
后面共 20 个 0),则1.M = 1.101 = 1.625
非规格化:当
E
的二进制位全部为0
时,V
为非规格化形式。这时,
E
的计算就是1 - 127
(或1 - 1023
),这样做的目的主要是为了规格化数值和非规格化数值之间的平滑过渡。并且,有效数字M
不再加上第一位的1
,而是按原样输出:0.xxxx
。这样,我们就能表示±0
(具体看符号位s
)和一些非常逼近0
的小数了。特殊数值: 当E的二进制位全为
1
时为特殊数值。此时,若
M
的二进制位全为0
则表示±无穷大
(具体看符号位s
),而若M
的二进制位不全为0
的话,则表示NaN
(Not a Number),表示这不是一个合法实数或者该数未经初始化。
浮点数例子
有一段 C 代码是这样的:
int main() {int a = 9;float* pFloat = (float*)&a;printf("%f\n", a);printf("%d\n", a);*pFloat = 9.0;printf("%f\n", *pFloat);printf("%d\n", a);return 0;
}
程序的打印结果:
在上面的代码中,我们先申明了一个整型 a = 9
,然后申明了一个浮点指针 pFloat
指向 a
的地址。
1) 使用浮点数格式打印 a
时,发现为 0.000000
;
2) 然后我们根据 a
的地址 pFloat
修改它的值为 9.0
,此时再以整型来打印 a
,输出的却是 1091567616
。
首先来看 1)
,为什么整型的 9
以浮点格式输出时打印出来的是 0.000000
。
将 32 位的整型 9
转化为二进制形式,得到: 0 0000 0000 000 0000 0000 0000 0000 1001
根据前面的知识,可以知道 s = 0
,E = 0
,M = 0...1001
,指数 E
的二进制位全为 0
,因此是第二种非规格化的情况,因此浮点数 V
就写成:
V = (-1)^0 x 0.00000000000000000001001 x 2^(-126) = 1.001 x 2^(-146)
显然,V
是一个非常小的接近 0
的数,因此用十进制小数表示就是 0.000000
。
再来看看 2)
,为什么内存中的 9
变成 9.0
后,以整型格式打印,结果会是 1091567616
。
将浮点数 9.0
转换为二进制小数形式:1001.0
即 1.001 x 2^3
,那么,我们可以知道 s = 0
,E = 3 + 127 = 130
,二进制表示的话就是 10000010
,M = 100 1000 0000 0000 0000 0000
,因此,9.0
的二进制形式表示就是:s + E + M
,也就是:0 1000 0010 100 1000 0000 0000 0000 0000
,这个 32 位的二进制,用十进制表示就是:1,091,567,616
其他
很多小数不能准确表示成二进制形式。比如 0.4
,你就无法写出它的精确二进制形式(即 0.5
的各次幂的累加),我们只能不断接近 0.4
,而不能达到它。
因为 0.4
的二进制表示是:0.01100110011....
无限循环,因此我们只能逼近而不能精确表示。
REF:
https://ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html
https://blog.csdn.net/linven1911/article/details/2596038
https://www.zhoulujun.cn/html/theory/ComputerScienceTechnology/Constitution/2016_0714_7860.html
浮点数在计算机中的表示相关推荐
- 计算机浮点数格式化表示方法,浮点数在计算机中是如何表示的
原标题:浮点数在计算机中是如何表示的 来源:编程珠玑 前言 相比int等整型,float等浮点类型的表示和存储较为复杂,但它又是一个无法回避的话题,那么就有必要对浮点一探究竟了.在计算机中,一般用IE ...
- 计算机中浮点数的表示,浮点数在计算机中的表示
浮点数在计算机中的表示 最后编辑于:2010-4-13 计算机中数字是以0和1二进制保存的,我们熟悉的是整数的如何在计算机中表示,那么浮点数是如何表示的呢? 一. 转换 我们先来看看如何将十进制 ...
- 【编程基础】浮点数在计算机中的存储 —— IEEE 754标准
寻求更好的阅读体验,请移步 :浮点数在计算机中的存储 -[Mculover666的个人博客]. 用于存储小数的数据类型是有单精度浮点型(float)和双精度浮点型(double),那么,浮点数在计算机 ...
- 计算机浮点数科学计数法运算,浮点数在计算机中的表示
浮点数在计算机中的表示 最后编辑于:2010-4-13 计算机中数字是以0和1二进制保存的,我们熟悉的是整数的如何在计算机中表示,那么浮点数是如何表示的呢? 一. 转换 我们先来看看如何将十进制 ...
- 单精度在计算机中的存储,浮点数(单精度浮点数与双精度浮点数)在计算机中的存储...
浮点数在计算机中的存储 十进制浮点数格式: 浮点数格式使用科学计数法表示实数.科学计数法把数字表示为系数(coefficient)(也称为尾数(mantissa)),和指数 (exponent)两部分 ...
- 整数、浮点数在计算机中的存储,-128二进制怎么表示,
目录 1 计算机底层存储数据的基本原理 2 整数的存储 2.1 整数的基本概念 2.2 整数的编码方式 -128的二进制表示 3浮点数存储 3.1 二进制十进制间小数怎么转换 1 计算机底层存储数据的 ...
- 浮点数在计算机中是如何表示的
众所周知,计算机中的所有数据都是以二进制表示的,浮点数也不例外.然而浮点数的二进制表示法却不像定点数那么简单了. 先澄清一个概念,浮点数并不一定等于小数,定点数也并不一定就是整数.所谓浮点数就是小数点 ...
- matlabk大于等于0如何表示_【底层原理】浮点数在计算机中是如何表示
作者:阮一峰 编辑:www.ruanyifeng.com/blog/2010/06/ 码农有道 码农有道高质量技术文章目录整理(请戳我) 关于码农有道(请戳我) 前几天,面试的时候遇到一道C语言题: ...
- 浮点数在计算机中起什么作用,浮点数在计算机中的存储表示
今天在看面试宝典,注意到上面所说浮点数在内存里和整数的存储方式不同,但究竟有何不同呢? 在网上搜了一下: 在http://blog.csdn.net/djsl6071/archive/2007/03/ ...
- 浮点数在计算机中的表示方法
以下转载自:https://www.cnblogs.com/silentNight/p/5274714.html 一个哥们在qq群里问了一个关于浮点数的程序,然后行了行浮点数的知识.竟然忘了,所有找了 ...
最新文章
- box-shadow属性
- 松本行弘为什么要开发Ruby
- USB 2.0高速和全速的区别
- C++ OpenCV 问题
- 2021年是“三蛇闹春,十鼠抢粮,十一牛耕田”,啥意思?
- python中赋值与c语言区别,python中赋值与c语言区别
- HTTP协议详解(经典)
- InVEST实践及在生态系统服务供需、固碳、城市热岛、论文写作等实际项目中的具体应用
- 计算机培训校本研修心得,关于校本研修培训心得体会(精选10篇)
- php怎么获取图片信息,PHP 获取图片信息exif
- 服务器主板能配固态硬盘吗,旧主板洗洗还能用、Z490主板搭配PCIe4.0固态硬盘 测试...
- 科技业10大错误决定
- 微信小程序超出内容换行
- redis 经纬度_【SpringBoot DB 系列】Redis 高级特性之 GEO
- i.MX6ULL系统移植:Linux移植6 - Linux 内核移植
- 单招考计算机一般考什么科目,单招考试考什么内容 单招都考什么科目
- 《C语言入门》简单回文序列问题求解
- 深度学习实战教程(1)--手机跑目标检测(YOLO,从DarkNet到Caffe再到NCNN完整打通)
- 手把手开始ROS仿真小车(一)仿真环境及小车搭建
- db2数据库表修改列为主键