“关于浮点数详解”乐创DIY C语言讲义——1.4节 1.5节
这一章节里面公式比较多,不支持编辑,所以截图上传,等我第一章写完之后,我会把高清版的PDF奉上,各位看官老爷见谅。二进制和其他进制的转换,虽然现在转换起来非常简单,大家打开Windows操作系统的计算器,切换成“程序猿”模式即可以,但是对于这些转换的方式还是要熟记于心。
利用Windows操作系统进行进制转换的方式很简单,点击“开始”菜单就可以找到计算器了。刚打开计算器时,默认界面是“标准”模式,大家只需要点击左上方的
图标,就可以找到“程序猿”模式了,如下图所示。
1.5 浮点数
前面讲述了二进制和任意进制的转换,这种转换都是基于整数形式的,对于一些小数,上述的方式显然变得不可使用。计算机里面引入了一种巧妙地方式来表示这些小数,即“浮点数”的方式。
一个浮点数a由两个数m和e来表示:a = m × b^e。在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。m(即尾数)是形如±d.ddd...ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。如果m的第一位是非0整数,m称作规格化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。
如十进制32.89可以写成0.3289*10^(2)的形式。这个式子中,按照a = m× b^e的形式可以得知a=32.89,m=0.3289,b=10,e=-2,假设我们跟一个没有小数点的民族做生意,买一斤苹果32.89元,他们对小数的计算方式是用一个10位的十进制表示的,其基数为10。格式如下:
符号(1位)正:0,负:1 |
阶数(4位) |
尾数(5位) |
那把32.89按照上图的格式排列在表中:
符号S |
阶数e |
尾数m |
0 |
2 |
0.3289 |
有人说,那用这样的方式来计算数据实在是太笨了,但真的是这样吗,我们来看看用这种方式来存储的数据最大能表示多少范围,让我们来取其最大值。
符号S |
阶数e |
尾数m |
0 |
9999 |
99999 |
最大值就是0.9999*10^9999=-9.9999e^9998~+9.9999e^9998。这样的存储范围远远超过了这个10位十进制数所能表示的最大整数范围。
在计算机中同样如此,用浮点数形式存储二进制小数不仅可以解决小数点问题,还可以让这个数据范围变得非常大,在C语言中所有的数据类型中,浮点数的范围最大(双精度)。
计算机中存储浮点数有一个公用的标准,叫做“IEEE754”。具体规定如下:
32位浮点数:
31 (1bit) |
30~23位(8bits) |
22~0位(32bits) |
S,符号位,0:正,1:负 |
E:阶码 |
M:尾数 |
64位浮点数:
63位(1bit) |
62~52位(11bits) |
51~0位(52bits) |
S,符号位,0:正,1:负 |
E:阶码 |
M:尾数 |
以上就是“IEEE754”浮点数格式,首先大家要知道其基数为2。这里还有一点需要知道的是,这边的阶码和上面的阶数不同,阶码是阶数加上一个特定值之后的结果,这个结果叫做阶码。32位机中阶码=阶数+127,64位机中阶码=阶数+1024。最后一个值得注意的是,“IEEE754”中的尾数需要保留整数的1,如二进制数1101.1101,它应该先写成1.1011101的形式,再取其尾数为1011101。接下来我们来对一个十进制数进行转换,还是上例中的32.89,转成32位浮点数。
先将其转换为二进制,首先整数部分(32)d=(100000)b,小数部分尽可能多取,(0.89)d=(0.111000111101011100)b,可以得出:
(32.89)d=(100000.111000111101011100)b
写成浮点的形式时,需要将小数点往左移5位,二进制就是左移(0101)b位。可以写出:
(100000.111000111101011100)b = (1.00000111000111101011100)b*(10)b^(0101)b
将其放入“IEEE754”格式时:
由于是正数=> S = 0;
左移5位,阶数是5,阶码是127+5=132,二进制为=> E = 1000 0100;
尾数位00000111000111101011100;
因此这个二进制浮点数放置如下:
63位(1bit) |
62~52位(11bits) |
51~0位(52bits) |
1 |
1000 0100 |
00000111000111101011100 |
最后得出:32.89 =(01000010000000111000111101011100)b= (42038F5C)H。
以上就是浮点数的存储,由上面的推算过程可以看出,一个浮点数虽然存储的数据宽度非常广,但是它需要移位操作,因此在做浮点数强制转换时会占用较多的时间。
+++++++好书推荐+++++++
推荐理由:微机原理40多年的发展,到现在还在沿用X86架构,这本书中的内容非常详细,深入浅出
适应人群:
1、软件开发人员的理论加深;
2、计算机从业人员;
3、爱学习的童鞋。
推荐指数: