“关于浮点数详解”乐创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、爱学习的童鞋。

推荐指数:

(0)

相关推荐