前言:
当前你们对“计算机里的m是什么意思”可能比较着重,看官们都想要了解一些“计算机里的m是什么意思”的相关内容。那么小编在网上搜集了一些对于“计算机里的m是什么意思””的相关内容,希望姐妹们能喜欢,我们快快来了解一下吧!1、什么是浮点数?
我们知道,数学中并没有浮点数的概念,虽然小数看起来像浮点数,但从不这么叫。那为什么计算机中不叫小数而叫浮点数呢?
因为资源的限制,数学中的小数无法直接在计算机中准确表示,为了更好地表示它,计算机科学家们发明了浮点数,这是对小数的近似表示。
2、IEEE754是什么?
知道了浮点数的概念,但需要确定一套具体的表示、运算标准,其中最有名的就是IEEE754标准。
本文的讨论都基于IEEE754标准,这也是目前各大编程语言和硬件使用的标准。
3、浮点数的构成
浮点数是指用符号、尾数、基数和指数这四部分来表示的小数。
根据浮点数的组成,因为是在计算机中表示浮点数,基数自然是2(不存储),因此IEEE754浮点数只关注符号、尾数和指数三部分。
浮点数在计算机中的存储方式遵循IEEE754浮点数计数标准,可以表示为:
类似于数学课本上所学的科学计数法表示方式:有效数字+指数位。
因此,只要给出:符号(S)、阶码部分(E)、尾数部分(M)这三个信息,一个浮点数的表示就确定下来了。一般IEEE754浮点数有两种类型,单精度浮点数(float)和双精度浮点数(double),还有其他的,不常用。单精度浮点数使用4字节表示,双精度浮点数使用8字节表示。所以float和double这两种类型的浮点数在计算机中的存储结构如下图:
符号位:0表示正数,1表示负数。
阶码部分(指数部分):对于float型浮点数,指数部分8位,我们知道,在十进制的科学计数法中,指数可以是负数,而计算机存储浮点数的“指数部分”又是一个无符号的整数,因此,IEEE754标准规定,指数必须减去一个偏移值而得到真实的“指数值”。
偏移值的计算公式:2^(e-1) -1, e为阶码(指数)的位数,即为8,因此偏移值是2^(8-1) -1=127。
IEEE754规定,2^(e-1) -1的值是 0,小于这个值表示负数,大于这个值表示正数。因此,对于单精度浮点数而言, 2⁸⁻¹-1= 127 是 0;双精度浮点数,2¹¹⁻¹-1 = 1023 是 0。
没看懂?举个栗子。
比如十进制数 0.15625,转为二进制是 0.00101。为了让第 1 位为 1,执行逻辑右移 3 位,尾数部分成为 1.01,因为右移了 3 位,所以指数部分是 -3。
根据 IEEE754 的定义,单精度浮点数情况下,-3 的实际值是 127 - 3 = 124。明白了吗?127 表示 0,124 就表示 -3 了。
如果你还不理解,想想这个问题。
如果让你用扑克牌(A ~ K,也就是 1 ~ 13)来表示支持负数的。怎么办?我们会选择一个中间的数,比如 7 当做 0,因此 10 就是 +3,4 就是 -3。现在理解了吧!
那为什么单精度浮点数指数偏移值是127呢?
由于篇幅有限,这个留给大家自行查找资料。
尾数部分:浮点数的名称由来在于小数点的位置是浮动的,比如 7.5x10、0.75 x10² 等表示法,值一样,但小数点位置不一样。在具体存储时,需要固定一种形式,这叫做尾数的标准化。
IEEE754 规定,在二进制数中,通过移位,将小数点前面的值固定为 1。IEEE754 称这种形式的浮点数为规范化浮点数。
因为IEEE754规定第 1 位永远为 1,因此可以省略不存。
对于float型浮点数,尾数部分23位,换算成十进制就是2^23=8388608,所以十进制精度最多7位。
4、实例讲解
讲解之前先熟悉一下进制转换:
二进制转十进制
和整数转换一样,采用各位数值和位权相乘。比如:
(0.101)₂ = 1×2⁻¹ + 0×2⁻² + 1×2⁻³ = (0.625)₁₀
记住小数点后第一位是从 -1 开始即可。
十进制转二进制
十进制整数转二进制采用“除 2 取余,逆序排列”法。例如十进制数 11 转为二进制:
11/2=5 … 余1
5/2=2 … 余1
2/2=1 … 余0
1/2=0 … 余1 (1除以2不够除,也就是商为0,余数为1-0=1)
所以 (11)₁₀ 的二进制是 (1011)₂
但如果十进制是小数,转为二进制小数如何做?
采用“乘 2 取整,顺序排列”。让小数一直乘2,小于1则用结果继续乘,大于1则用结果减1继续乘,等于1则结束。
例如十进制小数 0.625 转为二进制小数:
0.625*2=1.25 … 取整数部分1
0.25*2=0.5 … 取整数部分0
0.5*2=1 … 取整数部分1
顺序排列,所以 (0.625)₁₀ = (0.101)₂
如果一直不能等于1怎么办,会有什么影响?
暂且搁置不讲。
开始讲解实例:例如 178.125
1、分别把浮点数的整数部分和小数部分转换成2进制。
整数部分:
178/2=89 … 余0
89/2=44 … 余1
44/2=22 … 余0
22/2=11 … 余0
11/2=5 … 余1
5/2=2 … 余1
2/2=1 … 余0
1/2=0 … 余1
逆序排列,所以 (178)₁₀ 的二进制是 (10110010)₂
小数部分:
0.125*2=0.25 … 取整数部分0
0.25*2=0.5 … 取整数部分0
0.5*2=1 … 取整数部分1
顺序排列,所以 (0.125)₁₀ = (0.001)₂
合起来即是:10110010.001
2、转换成计算机存储形式的二进制浮点数
把小数点移动到整数位只有1,即为:1.0110010001*2^111,111是二进制,换算成十进制为7,由于左移了7位,所以是111。
3、阶码(指数)
阶码(指数)的计算公式:阶数(指数)+偏移量(单精度浮点数指数偏移值是127)
即:111+01111111=10000110 (7+127=134)
4、尾数
小数点后面的数,即0110010001
小数点前面的1去哪里了?由于尾数部分是规格化表示的,最高位总是1,所以省略不存。这样尾数部分多了 1 位,提高了精度。
5、符号位
由于浮点数是正数,故为0(负数为1)
6、结果
最终结果为:
(178.125)₁₀ = (01000011001100100010000000000000)₂
单精度浮点数为32位,不够32位后面补0。
0为什么补在后面?
因为是尾数部分,补在后面比补在前面对实际数值影响比较小。
(178.125)₁₀ = (01000011001100100010000000000000)₂
2进制转换16进制如下:
0100 4
0011 3
0011 3
0010 2
0010 2
0000 0
0000 0
0000 0
16进制为43322000
参考了网络上有关浮点数转换的文章,加上个人的理解,整理成文!
如有侵权,请告知!谢谢!
标签: #计算机里的m是什么意思