龙空技术网

为什么计算机中不叫小数而叫浮点数?看完你就明白了

西施家PLC 2203

前言:

当前你们对“计算机里的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是什么意思