Lecture 3 运算器-浮点数的表示
- 格式:ppt
- 大小:1.03 MB
- 文档页数:36
浮点数的表示方法
一、浮点数表示
一个数的浮点形式(设基数是2)可写成:
N = M × 2E
其中:M代表尾数,E代表阶码。
计算机中浮点数只用尾数和阶码表示,其形式如下:
浮点数的精度由尾数决定,数的表示范围由阶码的位数决定。
为了最大限度提高精度,尾数采用规格化形式,既1/2≤M<1。
采用二进制表示时,若尾数大于零,则规格化数应该是01XXXX的形式;若尾数小于零,则规格化数应为10XXXX的形式。
二、机器零
当浮点数的尾数为0或阶码为最小值时,计算机通常把该数当作零,因此程序中进行浮点运算时,判断某数是否为零,通常可以用小于某个极小值来代替。
三、实例
【例1】设X=0.0110×23 ,用补码、浮点数形式表示阶码为X j=011,尾数为00110,这时由于X 尾数不符合01XXXX的形式,因此不是规格化数,必须先进行规格化处理。
方法:若尾数小于1/2,把尾数左移一位(不包括符号位),观察结果是否满足规格化条件,满足则在把阶码减1即可,否则继续左移和调整阶码;若尾数大于1,则把尾数右移一位(不包括符号位),观察结果是否满足规格化条件,满足则在把阶码加1即可,否则继续右移和调整阶码。
上例中,00110左移一位为01100,符合规则化标准,此时阶码减1,为010即得到浮点表示形式。
这个数具体在计算机中如何表示要看计算机中规定的阶码和尾数的位数,若阶码和尾数均为16位,则上面的数X在计算机内部表示就是00000000000000100110000000000000 ,不足
均用零填充。
浮点数的表示和运算浮点数的表示和基本运算1 浮点数的表示通常,我们可以用下面的格式来表示浮点数其中S是符号位,P是阶码,M是尾数对于IBM-PC而言,单精度浮点数是32位(即4字节)的,双精度浮点数是64位(即8字节)的。
两者的S,P,M所占的位数以及表示方法由下表可知以单精度浮点数为例,可以得到其二进制的表示格式如下其中S是符号位,只有0和1,分别表示正负;P是阶码,通常使用移码表示(移码和补码只有符号位相反,其余都一样。
对于正数而言,原码,反码和补码都一样;对于负数而言,补码就是其绝对值的原码全部取反,然后加1.)为了简单起见,本文都只讨论单精度浮点数,双精度浮点数也是用一样的方式存储和表示的。
2 浮点数的表示约定单精度浮点数和双精度浮点数都是用IEEE754标准定义的,其中有一些特殊约定。
(1)当P = 0, M = 0时,表示0。
(2)当P = 255, M = 0时,表示无穷大,用符号位来确定是正无穷大还是负无穷大。
(3)当P = 255, M != 0时,表示NaN(Not a Number,不是一个数)。
当我们使用.Net Framework的时候,我们通常会用到下面三个常量Console.WriteLine(float.MaxValue); // 3.402823E+38Console.WriteLine(float.MinValue); //-3.402823E+38Console.WriteLine(float.Epsilon); // 1.401298E-45//如果我们把它们转换成双精度类型,它们的值如下Console.WriteLine(Convert.ToDouble(float.MaxValue)); // 3.40282346638529E+38Console.WriteLine(Convert.ToDouble(float.MinValue)); //-3.40282346638529E+38Console.WriteLine(Convert.ToDouble(float.Epsilon)); // 1.40129846432482E-45那么这些值是如何求出来的呢?根据上面的约定,我们可以知道阶码P的最大值是11111110(这个值是254,因为255用于特殊的约定,那么对于可以精确表示的数来说,254就是最大的阶码了)。
浮点数表示方式总结王春桃定点数的表示范围有限,为此需要采用浮点数表示。
所谓浮点表示,即先将某一待表示数值写成二进制指数形式,然后在表示时只记录数的指数及尾数部分,这样能在有限的二进制位数情况下表示很大范围内的数值。
如对于十进制数值(20.59375)10,写成二进制指数形式为0.1010010011×24,在表示是只记录尾数0.1010010011和指数100即可。
总体而言,浮点数的表示形式主要有一般格式和IEEE754格式这两种。
其中,一般格式指满足一般的二进制数机器码(包括定点整数和定点小数)的规定规则;而IEEE754格式则在一般格式上进一步做了一些约定,以便表示数时比较方便和高效。
下面以32位的浮点数表示作为例子来说明。
1.浮点表示的一般格式根据浮点表示的目的可知,浮点数需要在有限长的二进制位数(如32位)内表示尾数和指数。
也就是说,在有限位数内需要包含尾数和指数两部分信息,进一步考虑到这两部分都有正负之分,因此浮点表示的一般格式可以设计为:图1 浮点表示的一般格式其中阶码就是指数,阶符就是指数的符号;数符是指尾数的符号。
至于它们之间各占多少位,取决于表示范围、表示精度等方面的权衡。
如对于32位长的浮点数,阶符和数符各用1位,阶码可以用7位,尾数23位;阶符和阶码也可以结合起来,用一个8位来表达。
图1中,将数符放在中间部分,这与定点表示格式不一致,而且在计算机处理时也不够方便,因此实际中一般采用图2所示的浮点表示格式。
数符阶码尾数图2 实际使用中的浮点表示一般格式其中,阶符已经包含在阶码中了。
例如,对于32位长的浮点数,数符用1位,0表示正数,1表示负数;阶码用8位,通常用移码表示以方便用硬件实现指数运算,因这时表示范围为正数范围0~255,减去偏移量128得到实际的指数范围为-128~127;尾数为23位,用原码或补码纯小数表示均可。
为了使得浮点数表示的范围尽可能大及表示的效率尽可能高,尾数需要进行规格化。
浮点数在计算机中是如何表⽰的前⾔相⽐int等整型,float等浮点类型的表⽰和存储较为复杂,但它⼜是⼀个⽆法回避的话题,那么就有必要对浮点⼀探究竟了。
在计算机中,⼀般⽤IEEE浮点近似表⽰任意⼀个实数,那么它实际上⼜是如何表⽰的呢?下⾯的表达式⾥,i的值是多少,为什么?如果你不确定答案,那么你应该好好看看本⽂。
float f = 8.25f;int i = *(int*)&f;IEEE浮点表⽰IEEE浮点标准⽤的形式近似表⽰⼀个数。
并且将浮点数的位表⽰划分为三个字段:符号(sign)s决定这个数是负数(s=1)还是正数(s=0)。
可以⽤⼀个单独的符号s直接编码符号s。
尾数(signficand)M是⼀个⼆进制⼩数,它的范围是1~2-ξ或者是0~1-ξ。
n位⼩数字段编码尾数M。
阶码(exponent)E的作⽤是对浮点数加权,这个权重是2的E次幂(可能是负数)。
k位的阶码字段编码阶码E。
在单精度浮点格式(c语⾔的float)中,s,exp和frac字段分别为1位,8位和23位,⽽双精度浮点格式(c语⾔中的double)中,s,exp和frac 字段分别为1位,11位和52位。
⼀个浮点数的常见⽐特位表⽰如下:单精度双精度⽽根据exp的值,被编码的值可以分为三⼤类不同的情况。
下⾯进⾏⼀⼀解释。
情况1:规格化的值即最普遍的情况,当exp,即阶码域既不为全0,也不为全1的情况。
在这种情况下,阶码字段解释为以偏置(biased)形式表⽰有符号整数,即E=exp-Bias,exp是⽆符号数(1~254)。
Bias是⼀个等于的偏置值,对于单精度来说,k=23,Bias=127,因此E的范围是-126~+127。
frac被描述为⼩数值,且0≤frac<1,其⼆进制表⽰为0.frac。
尾数定义为 M=1+frac ,则M=1.frac。
那么就有1≤M<2,由于总是能够调整阶码E,使得M在范围1≤M<2,所以不需要显⽰的表⽰它,这样还能获得⼀个额外的精度位。
计算机浮点数表示
计算机中的浮点数表示基于IEEE 754标准。
该标准定义了两
种浮点数表示格式:单精度和双精度。
在单精度表示中,一个浮点数占32位,分为三个部分:符号位、指数位和尾数位。
具体格式如下:
1位符号位 | 8位指数位 | 23位尾数位
其中,符号位用来表示数的正负,0表示正数,1表示负数。
指数位用来表示浮点数的指数部分,尾数位用来表示浮点数的有效位数部分。
指数位和尾数位都采用二进制表示。
在双精度表示中,一个浮点数占64位,分为三个部分:符号位、指数位和尾数位。
具体格式如下:
1位符号位 | 11位指数位 | 52位尾数位
双精度表示相较于单精度表示,指数位和尾数位的位数更多,因此具有更高的精度和范围。
浮点数的实数值通过以下公式计算得到:
值 = (-1)^符号位 × (1 + 尾数位) × 2^(指数位 - 偏移值)
其中,符号位决定了浮点数的正负,尾数位决定了浮点数的有效位数,指数位决定了浮点数的幂的大小。
偏移值是一个常数,
用来对指数进行偏移,以保持浮点数的标准化表示。
偏移值在单精度和双精度中分别为127和1023。
通过以上表示和计算方式,计算机可以对浮点数进行存储和运算。
然而,由于浮点数的表示是有限的,因此在进行浮点数运算时可能会出现舍入误差。
计算机中数据的表示之关于浮点数1.关于浮点数的问题 浮点数的一般格式:格式(1) 格式(2)注意:(1)一般浮点数尾数采用纯小数(隐含位为0)来表示,即尾数M 与定点小数表示方法相同,由于尾数的符号位决定整个浮点数的符号,故有时采用格式(2)的形式;(2)当尾数真值为0(不论阶码何值),或阶码的值比能在机器中表示的最小值还小,计算机把该浮点数看成零值,称为机器零,即浮点数表示不了真值绝对值很接近0的数,只能看成0处理; (3)尾数通常用原码或补码表示,阶码一般用移码或补码表示,如无特别说明,采用课本44页移码表示方法。
浮点数表示范围:⨯最大阶码最大正数=最大正尾数2 ⨯最小阶码最小正数=最小正尾数2 ⨯最小阶码最大负数=最大负尾数2 ⨯最大阶码最小负数=最小负尾数2那么给定一浮点数的表示形式,包括符号、阶码、尾数各占位数及其采用哪种机器码表示,如求其能表示最大负数,转化为求这种表示形式的能表示的最大负尾数,最小阶码。
浮点数规格化表示:为了提高数据的表示精度,当浮点数尾数的真值不为 0 时,满足条件112≤≤尾数真值,称为一般浮点数的规格化表示。
如没特别说明,指的是一般的非规格化浮点数。
注意规格化浮点数与一般浮点数一样,隐含位也是0,仅仅对尾数真值加上这一约束条件而已。
对于不同码制,特征如下: (1)尾数原码表示: (采用形式(1),按照尾数数值位为n 位)①尾数>0时,其尾数部分形式尾数符号1位尾数数值n 位01XXXXXXXXXXXXXXXXXX称为规格化最大:尾数部分0111…11,真值为12n--;最小:尾数部分0100…00,真值为12;②尾数<0时,其尾数部分形式尾数符号1位尾数数值n 位11XXXXXXXXXXXXXXXXXX称为规格化最大:尾数部分1100…00,真值为12-; 最小:尾数部分1111…11,真值为(12)n---;(2)尾数补码表示: (采用形式(1),按照尾数数值位为n 位)阶码符号尾数符号数值阶码符号尾数符号0①尾数>0时,其尾数部分形式尾数符号1位尾数数值n位01XXXXXXXXXXXXXXXXXX称为规格化最大:尾数部分0111…11,真值为12n--;最小:尾数部分0100…00,真值为12;②尾数<0时,其尾数部分形式尾数符号1位尾数数值n位10XXXXXXXXXXXXXXXXXX称为规格化(注意:某些书上对此含糊其辞,参考清华(郑纬民:计算机系统结构)与上交大的书,以此为准!)最大:尾数部分1011…11,真值为1(2) 2n--+;最小:尾数部分1000…00,真值为-1;关于IEEE745浮点数:表示形式数值1位(1)IEEE754浮点数短浮点数和长浮点数尾数隐含位为1,临时浮点数没有隐含位,注意阶码的偏置值与一般浮点数不同,对于单精度和双精度数(1) 1.2sm Em-=-⨯⨯偏置值表示真值;短浮点数和长浮点数尾数采用隐含位为1称之为规格化的IEEE短浮点数与长浮点数(注意区别一般的规格化浮点数)。
浮点数表示方式
浮点数表示方式有多种,以下是几种常见的表示方式:
1、规格化表示法:将浮点数表示为一个定点数的指数形式,
即 N = M * r^E,其中 M 是尾数(或有效数字),E 是指数,r 是基数。
在计算机中,通常使用定点数表示法,即将浮点数表示为一个整数,它的小数点位置是固定的。
2、非规格化表示法:将浮点数表示为一个非定点数的指数形式,即 N = M * r^E,其中 M 和 E 的含义与规格化表示法相同,但是 M 不是一个定点数,而是任意一个实数。
3、混合表示法:将浮点数表示为一个定点数的指数形式,但
是同时保留一个非定点数的尾数,即 N = M * r^E,其中 M 的
含义与规格化表示法相同,但是 E 不是一个定点数,而是任
意一个实数。
4、符号整数表示法:将浮点数表示为一个符号整数,即 N =
S * 2^E,其中 S 是符号位,E 是指数。
这种表示方式通常用
于表示整数类型的浮点数。
总之,浮点数的表示方式有很多种,不同的表示方式适用于不同的应用场景。
在计算机中,通常使用规格化表示法或混合表示法来处理浮点数。
浮点数在计算机中的表示法浮点数在计算机中的表示法是一种用于表示带有小数点的数字的方法。
浮点数表示法通常用于表示实数,如3.14159。
在计算机中,浮点数通常用二进制表示。
下面将详细介绍浮点数在计算机中的表示法。
一、二进制小数计算机内部存储和处理的所有数据最终都被转换为二进制形式。
浮点数是一种特殊的数据类型,用于表示带有小数部分的数字。
浮点数由三个部分组成:符号位、指数位和尾数位。
1.符号位:符号位用于表示数字的符号。
它可以是0或1。
0表示正数,1表示负数。
2.指数位:指数位用于表示数字的小数点位置。
它是一个偏移量,从某个标准值开始计算。
标准值取决于所使用的浮点数表示法。
3.尾数位:尾数位用于表示数字的小数部分。
它是二进制形式的小数,通常采用定点表示法。
二、浮点数表示法计算机中常用的浮点数表示法有单精度浮点数(float)和双精度浮点数(double)。
1.单精度浮点数(float):它使用32位(4字节)来表示一个浮点数。
其中,符号位占1位,指数位占8位,尾数位占23位。
单精度浮点数可以提供大约6位十进制精度的数值表示。
2.双精度浮点数(double):它使用64位(8字节)来表示一个浮点数。
其中,符号位占1位,指数位占11位,尾数位占52位。
双精度浮点数可以提供大约15位十进制精度的数值表示。
三、浮点数的存储和表示在计算机中存储和表示浮点数时,首先将浮点数的符号位存储在计算机的内存中。
然后,使用指数位来确定小数点的位置,并将尾数位存储在内存中。
指数位和尾数位的存储方式取决于所使用的浮点数表示法。
四、浮点数的运算浮点数的运算包括加法、减法、乘法和除法等。
在进行浮点数运算时,需要遵循以下步骤:1.对齐:首先对齐两个浮点数的指数位和小数位,以确保它们具有相同的精度。
2.符号运算:根据符号位的值进行相应的运算(加法、减法等)。
3.指数运算:根据指数位的值进行相应的运算(乘法、除法等)。
4.尾数运算:根据尾数位的值进行相应的运算(乘法、除法等)。
浮点数表示方法与运算在计算机系统的发展过程中,曾经提出过多种方法表达实数,典型的比如定点数。
在定点数表达方式中,小数点位置固定,而计算机字长有限,所以定点数无法表达很大和很小的实数。
最终,计算机科学发展出了表达范围更大的表达方式——浮点数,浮点数也是对实数的一种近似表达。
1.浮点数表达方式我们知道任何一个R 进制数N 均可用下面的形式表示:N R =±S ×R ±e其中,S—尾数,代表N 的有效数字;R—基值,通常取2、8、16;e—阶码,代表N 的小数点的实际位置(相当于数学中的指数)。
比如一个十进制数的浮点表达1.2345×102,其中1.2345为尾数,10为基数,2为阶码。
一个二进制数的浮点表达0.001001×25,0.001001为尾数,2为基数,5为阶码;同时0.001001×25也可以表示成0.100100×23,0.100100为尾数,2为基数,3为阶码。
浮点数就是利用阶码e 的变化达到浮动小数点的效果,从而灵活地表达更大范围的实数。
2.浮点数的规格化一个数用浮点表示时,存在两个问题:一是如何尽可能多得保留有效数字;二是如何保证浮点表示的唯一。
对于数0.001001×25,可以表示成0.100100×23、0.00001001×27等等,所以对于同一个数,浮点有多种表示(也就是不能唯一表示)。
另外,如果规定尾数的位数为6位,则0.00001001×27会丢掉有效数字,变成0.000010×27。
因此在计算机中,浮点数通常采用规格化表示方法。
当浮点数的基数R 为2,即采用二进制数时,规格化尾数的定义为:1/2<=|S|<1。
若尾数采用原码(1位符号位+n 位数值)表示,[S]原=S f S 1S 2S 3…S n (S f 为符号位的数符),则满足S 1=1的数称为规格化数。
计算机中浮点数的表⽰形式IEEE 浮点表⽰IEEE 浮点标准:V = (-1)s * M * 2E表⽰⼀个浮点数:符号(sign) s 决定V的正(s=0)或负(s=1),对于 0 后⾯会有说明尾数(Mantissa) ⼆进制⼩数阶码(Exponent) E 的作⽤是对浮点数加权,这个权重是 2 的 E 次幂将浮点数的位分为 3 个部分:1 位的符号位 s 表⽰ sk 位的阶码字段 exp = e k-1...e1e0表⽰ En 位的⼩数字段 frac = f n-1...f1f0表⽰ M以 C 语⾔为例,不同的精度下,s、exp、frac 有不同的位数:单精度:31 30 23 22 0+---+---------+-----------------------------------------+| s | exp | frac |+---+---------+-----------------------------------------+双精度:63 62 52 51 32+---+----------------+----------------------------------+| s | exp | frac(51:32) |+---+----------------+----------------------------------+31 0+-------------------------------------------------------+| frac(31:0) |+-------------------------------------------------------+float:s 1位、exp 的 k=8位、frac=23位,合计 32位double:s 1位、exp 的 k=11位、frac=52位,合计 64位分类以 C 语⾔单精度为例,根据 exp 存储的位的不同,所表⽰的浮点数可以分成 3 中不同的情况,⽽最后⼀种情况中情况分两个变种:1. 规格化+-------------------------------------------------------+| s | exp!=0 & exp!=255 | frac |+-------------------------------------------------------+这是最常见的情况,exp 的位模式既不为全 0,也不为全 1规格化的值有两点需要特别注意:1. 阶码 E 包含⼀定的偏置 Bias,也就是说E = exp - Bias,exp 是⽆符号数,Bias = 2k-1 - 1,偏置的作⽤是为了在规格化取值范围与⾮规格化取值范围之间平滑过渡2. 尾数 M 的值并不是 frac 所表⽰的⼩数值,实际情况是M = 1 + frac通常情况下,⼆进制整数部分通过调整⼩数点(也就是修改 E)来变成 1,所以 IEEE 的表⽰法直接将这⼀位的1省去,这样⼆进制⼩数部分就能多存储⼀位,提⾼了精度,也就是说这个 frac 隐含了开头的 1举个例⼦:假设 frac 有 5 位,现在要存储⼀个⼆进制数 b,b 的值是 0.101011(2),调整⼀下权重:1.01011 * 2-1(2),farc 存储的就是⼩数点后⾯的这 5 位010112. ⾮规格化+-------------------------------------------------------+| s | exp=0 | frac |+-------------------------------------------------------+exp 位模式全为 0,E = exp - Bias,M = frac规格化数因 frac 隐含开头的 1,M >= 1,故⽽⽆法表⽰ 0 这个数。