如果使用前面介绍的定点数来进行数据的运算会存在一些问题:1.所能表示的数据范围有限,受计算机硬件字长的限制;2.参与运算的数据必须统一转化成纯小数或者纯整数,这样会损失精度或者产生溢出;3.数据统一转化成纯小数或者纯整数的过程中会产生大量的0,从而浪费存储空间。
所谓浮点数是指数据中的小数点位置是可以浮动的。目的就是兼顾数值的表示范围和精度的要求。
我们知道任何的实数都可以表示成±S*R^(±e)的形式。S称为尾数,代表所表示数字的有效数字;R称为基值,代表所表示数的进制,二进制数的基值就是2;e称为阶码,代表所表示数小数点所在的位置。
例如:值为345.5的十进制数可以按照上面的表现形式,表示成+0.3455*10^(+3);值为-110011.1的二进制数可以表示成-0.1100111*2^(+6)。但是显然它们的表示形式并不唯一。
如何使用一串连续的二进制数表示这么复杂的结构哪?在现实机器中,通常采用如下的表示格式:
数符(1位)
阶符(1位)
阶码(e)
尾数(S)
数符反映了尾数的符号,数符占用最高位,它和尾数组合在一起是一个纯小数,一般可以用补码或者移码表示;阶符反映了阶码的符号,占用第二位,它和阶码组合在一起是一个纯整数,一般可以用补码或者原码表示。基数是一个隐含的常数,不用在数据格式中显示的给出。
例如:假设我们使用16位二进制数表示一个浮点数,规定阶码和阶符占用8位,采用纯整数原码表示,尾数和尾符占用8位,采用纯小数原码表示。设计一个浮点数,
0 1 1100110 0000110 蓝色是阶码,红色是尾码,它表示+(0.0000110)*2^(-1100110)=+(0.046875)*2^(-102)
以上是我们自己设计的浮点数表示格式。现实中还要考虑两个问题:1.要可能多的保留有效数字;2.保证浮点数的表示唯一。所以在计算机中,浮点数通常都采用规格化表示方法,它的原则是:1.尽可能占满尾数的位数,以保留更多的有效数字;2.格式固定,保证浮点数表示的唯一性。
1.占满尾数。若尾数采用原码表示,尾数具有0.1...或者1.1...的形式会使有效数字最长(既,要求位数S满足(1/2)<=|S|<1),因为这种形式省略了第一个1之前所有的0;但是如果是使用补码表示则要求位数具有0.1...或则1.0...的形式(既,满足-1<=S<(-1/2)或者(1/2)<=S<1,这样才会将小数中第一位1之前的0省略掉)。
2.浮点数都采用规格化的浮点数存储和参加运算,保证了同一个数的表示形式是唯一的。
有了浮点数的概念我们可以讨论两个问题:
1.浮点数的表示范围。机器数因为受表示长度的限制是不连续的,对纯整数和纯小数我们可以讨论最大最小值;浮点数则存在最小负数、最大负数、最小正数、最大正数,以及由它们作为边界构成的上溢区、下溢区。
2.从浮点数的数据格式中可以看出来,尾数的位数决定了数据表示的精度,增加尾数的尾数可以增加有效数字的位数,提高数据表示的精度。阶码的位数决定了数据表示的范围,增加阶码的位数可以扩大数据表示的范围。因此在字长一定的条件下,合理的分配阶码和尾码的位数以达到表示精度和表示范围的平衡。为此在很多机器中设置了单精度(一个字长表示一个浮点数)和双精度浮点数(两个字长表示一个浮点数)格式。
分享:
所谓浮点数是指数据中的小数点位置是可以浮动的。目的就是兼顾数值的表示范围和精度的要求。
我们知道任何的实数都可以表示成±S*R^(±e)的形式。S称为尾数,代表所表示数字的有效数字;R称为基值,代表所表示数的进制,二进制数的基值就是2;e称为阶码,代表所表示数小数点所在的位置。
例如:值为345.5的十进制数可以按照上面的表现形式,表示成+0.3455*10^(+3);值为-110011.1的二进制数可以表示成-0.1100111*2^(+6)。但是显然它们的表示形式并不唯一。
如何使用一串连续的二进制数表示这么复杂的结构哪?在现实机器中,通常采用如下的表示格式:
数符(1位)
阶符(1位)
阶码(e)
尾数(S)
数符反映了尾数的符号,数符占用最高位,它和尾数组合在一起是一个纯小数,一般可以用补码或者移码表示;阶符反映了阶码的符号,占用第二位,它和阶码组合在一起是一个纯整数,一般可以用补码或者原码表示。基数是一个隐含的常数,不用在数据格式中显示的给出。
例如:假设我们使用16位二进制数表示一个浮点数,规定阶码和阶符占用8位,采用纯整数原码表示,尾数和尾符占用8位,采用纯小数原码表示。设计一个浮点数,
0 1 1100110 0000110 蓝色是阶码,红色是尾码,它表示+(0.0000110)*2^(-1100110)=+(0.046875)*2^(-102)
以上是我们自己设计的浮点数表示格式。现实中还要考虑两个问题:1.要可能多的保留有效数字;2.保证浮点数的表示唯一。所以在计算机中,浮点数通常都采用规格化表示方法,它的原则是:1.尽可能占满尾数的位数,以保留更多的有效数字;2.格式固定,保证浮点数表示的唯一性。
1.占满尾数。若尾数采用原码表示,尾数具有0.1...或者1.1...的形式会使有效数字最长(既,要求位数S满足(1/2)<=|S|<1),因为这种形式省略了第一个1之前所有的0;但是如果是使用补码表示则要求位数具有0.1...或则1.0...的形式(既,满足-1<=S<(-1/2)或者(1/2)<=S<1,这样才会将小数中第一位1之前的0省略掉)。
2.浮点数都采用规格化的浮点数存储和参加运算,保证了同一个数的表示形式是唯一的。
有了浮点数的概念我们可以讨论两个问题:
1.浮点数的表示范围。机器数因为受表示长度的限制是不连续的,对纯整数和纯小数我们可以讨论最大最小值;浮点数则存在最小负数、最大负数、最小正数、最大正数,以及由它们作为边界构成的上溢区、下溢区。
2.从浮点数的数据格式中可以看出来,尾数的位数决定了数据表示的精度,增加尾数的尾数可以增加有效数字的位数,提高数据表示的精度。阶码的位数决定了数据表示的范围,增加阶码的位数可以扩大数据表示的范围。因此在字长一定的条件下,合理的分配阶码和尾码的位数以达到表示精度和表示范围的平衡。为此在很多机器中设置了单精度(一个字长表示一个浮点数)和双精度浮点数(两个字长表示一个浮点数)格式。
分享: