浮点数规格化和教案
- 格式:doc
- 大小:52.51 KB
- 文档页数:6
竭诚为您提供优质文档/双击可除二进制浮点数规范化篇一:浮点数的二进制表示浮点数的二进制表示1.前几天,我在读一本c语言教材,有一道例题:#includevoidmain(void){intnum=9;/*num是整型变量,设为9*/float*pFloat=/*pFloat表示num的内存地址,但是设为浮点数*/printf("num的值为:%d\n",num);/*显示num的整型值*/printf("*pFloat的值为:%f\n",*pFloat);/*显示num 的浮点值*/*pFloat=9.0;/*将num的值改为浮点数*/printf("num的值为:%d\n",num);/*显示num的整型值*/printf("*pFloat的值为:%f\n",*pFloat);/*显示num 的浮点值*/}运行结果如下:num的值为:9*pFloat的值为:0.000000num的值为:1091567616*pFloat的值为:9.000000我很惊讶,num和*pFloat在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大?要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法。
我读了一些资料,下面就是我的笔记。
2.在讨论浮点数之前,先看一下整数在计算机内部是怎样表示的。
intnum=9;上面这条命令,声明了一个整数变量,类型为int,值为9(二进制写法为1001)。
普通的32位计算机,用4个字节表示int变量,所以9就被保存为00000000000000000000000000001001,写成16进制就是0x00000009。
那么,我们的问题就简化成:为什么0x00000009还原成浮点数,就成了0.000000?3.根据国际标准ieee754,任意一个二进制浮点数V可以表示成下面的形式:V=(-1)^s×m×2^e(1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
规格化浮点数第一章第四节浮点数的表示方法一、浮点数表示一个数的浮点形式(设基数是2)可写成:N = (+ -)M 2E其中:M代表尾数,E代表阶码。
计算机中浮点数只用尾数和阶码表示,其形式如下:为了最大限度提高精度,尾数采用规格化形式,既1/2≤M<1。
采用二进制表示时,若尾数大于零,则规格化数应该是01XXXX的形式;若尾数小于零,则规格化数应为10XXXX 的形式。
二、实例【例1】设X=0.0110×23 ,用补码、浮点数形式表示阶码为Xj=011,尾数为00110,这时由于X尾数不符合01XXXX的形式,因此不是规格化数,必须先进行规格化处理。
方法:若尾数小于1/2,把尾数左移一位(不包括符号位),观察结果是否满足规格化条件,满足则在把阶码减1即可,否则继续左移和调整阶码;若尾数大于1,则把尾数右移一位(不包括符号位),观察结果是否满足规格化条件,满足则在把阶码加1即可,否则继续右移和调整阶码。
上例中,00110左移一位为01100,符合规则化标准,此时阶码减1,为010即得到浮点表示形式。
一个浮点数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必须是正的在浮点表示方法中,小数点的位置是浮动的,阶码可取不同的数值。
为了便于计算机中小数点的表示,规定将浮点数写成规格化的形式,即尾数的绝对值大于等于0.1并且小于1,从而唯一规定了小数点的位置。
尾数的长度将影响数的精度,其符号将决定数的符号。
浮点数的阶码相当于数学中的指数,其大小将决定数的表示范围。
例题1:表示-13/128这个数的二进制规格化数(阶用移码,尾数用补码)?-13/128=(-1/128)+(-1/32)+(-1/16)=2^-4+2^-5+2^-7=-(0.0000001+0.00001+0.0001)=-(0.0001101)规格化后为:-0.11001*2^(-3)=-0.11001*2^(-11)即阶码=-11尾码=-0.1101设阶码为4位,尾码为10位,阶符与数符各取1位,则:阶码移码= 1 0011原=1 1100反=1 1101补=0 1101移尾码补码= 1 1101000000 原= 1 0010111111反=1 0011000000补如果规格化数格式为: 符号阶码数符,尾数,则结果应为:0 1101 1 001100 0000例题2:十进制数7.5表示成二进制浮点规格化数是多少?要求是:阶符1位,阶码2位,数符1位,尾数4位。
概述浮点数的表示形式、表示范围、规格化一、引言在计算机科学领域中,浮点数是一种用于表示实数的数据类型。
它在科学计算、工程领域以及计算机图形学中应用广泛。
浮点数的表示形式、表示范围以及规格化是计算机科学中的重要概念,对于理解计算机中的数值运算和精度控制具有重要意义。
二、浮点数的表示形式在计算机中,浮点数通常由符号位、尾数和指数位组成。
而浮点数的表示形式可分为单精度浮点数和双精度浮点数两种。
单精度浮点数通常由32位组成,包括1位符号位、8位指数位和23位尾数;双精度浮点数通常由64位组成,包括1位符号位、11位指数位和52位尾数。
在计算机中,浮点数采用二进制表示。
由于浮点数采用有限的位数表示,因此在表示大范围的实数时,会存在精度损失的问题。
这也导致了浮点数运算中的舍入误差和精度问题。
三、浮点数的表示范围由于浮点数采用有限的位数表示,因此其表示范围是有限的。
单精度浮点数的表示范围约为1.4x10^-45 到 3.4x10^38,而双精度浮点数的表示范围约为5.0x10^-324 到 1.7x10^308。
在实际应用中,我们需要根据具体的场景选择合适的精度,以兼顾精度和性能。
四、浮点数的规格化在浮点数的表示中,规格化是一种重要的概念。
规格化可以使浮点数的表示更加紧凑,也有利于进行浮点数的比较和运算。
在浮点数的规格化表示中,尾数部分通常采用1.xxxxx的形式来表示,其中xxxxx表示尾数的二进制部分。
指数部分通常采用偏移表示法,这意味着在实际存储中,指数部分的值会进行一定的偏移。
这种规格化表示使得浮点数的表示更加紧凑,也有利于进行浮点数的运算和比较。
五、个人观点和理解浮点数的表示形式、表示范围以及规格化是计算机科学中非常基础和重要的概念。
深入理解浮点数的表示和规格化对于理解计算机中的数值运算和精度控制至关重要。
在实际应用中,我们需要根据具体的场景选择合适的精度,以兼顾精度和性能。
另外,对于浮点数运算中的舍入误差和精度问题,需要进行充分的理解和处理。
浮点数表示方式
浮点数表示方式有多种,以下是几种常见的表示方式:
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 是指数。
这种表示方式通常用
于表示整数类型的浮点数。
总之,浮点数的表示方式有很多种,不同的表示方式适用于不同的应用场景。
在计算机中,通常使用规格化表示法或混合表示法来处理浮点数。
规格化浮点运算
规格化浮点运算是指将浮点数表示为规格化形式的过程。
在计算机中,浮点数由尾数、指数和符号位组成,规格化就是将尾数调整为满足特定规则的形式,以便更好地进行运算。
具体而言,对于二进制浮点数,规格化要求尾数的最高位必须为1,而指数的范围要求是一个固定的区间。
如果浮点数不满足规格化要求,则需要进行调整。
规格化浮点运算的步骤如下:
1. 如果浮点数为零,则尾数和指数都置为零。
2. 如果浮点数不是零,则将其转换为二进制表示。
3. 将尾数的整数部分移到尾数的最高位,使其成为规格化形式。
4. 调整指数的值,使其在规定的范围内。
如果指数超过了规定的范围,则需要进行溢出的处理。
5. 将符号位设为正确的值。
通过规格化浮点运算,可以使浮点数在计算中更加准确和可靠,提高了浮点运算的精度和有效性。
第一节X=(-1)S×(1.M)×2E-127e=E-127X=(-1)S×(1.M)×2E-1023 e=E-1023我承认以前对这俩公式避之不及不予深究努力自己说服自己而未能得逞,部分原因是跟“移码与真值的关系”扯上关系,这“移码与真值的关系”想搞清先得把引入移码的充分理由给我个说法,不幸玩过头正事误了。
上回说了“补码省心移码悦目”能算是今时不同往日了吧,现在轮到对IEEE754浮点数规格化表示法杀无赦去死吧。
首先,“IEEE规格化形式”是对“传统规格化形式”进一步严格要求来的。
IEEE规格化形式唯一,而浮点数记法多种多样。
(1.75)10=1.11×20 (IEEE规格化表示)=0.111×21 (传统规格化表示)=0.0111×22=0.00111×23其次,既然IEEE想到对“传统规格化形式”进一步修订当然有目的,你以为作无用功呐,关键目的是什么?规格化的目的同理。
修改阶码同时左右移小数点使尾数域最高有效位固定为1,尾数就以ta所可能变化成的最大形式出现,即使遭遇类似截断的操作仍可保持尽可能高的精度。
有类错误我这种大秀逗极善于犯!就是不理会左右关系不经过大脑直接作问题少女状问很白的问题:“‘移码和真值的关系’是E=27(或210)+X,那X=E-27(或210),在怎么着里面数该是128(或1024),咋是127(或1023)?”当E=M=全0E(移码)=全0,对应真值-128M(补码)=全0,对应真值0E=M=全0,真值X=0-128=0结合符号位S 为0或1分正零和负零当E=全1,M=全0E(移码)=全1,对应真值+127M(补码)=全0,对应真值0E=全1,M=全0,真值X=0127=∞结合符号位S 为0或1分+∞和-∞要除去表示零和无穷大这2种特殊情况指数偏移值不选128(10000000),而选127(01111111)对IEEE32位规格化浮点数8位移码(隐含1位符号位)原本表示范围是-128 →+127(除去全1(+127)全0(-128)剩下-127 →+126 ???)实际可用指数值(即阶码真值)e范围是-126→+127加上偏移值后,阶码E的范围变为1→254以10的幂表示,绝对值的范围是10-38→1038假设由S,E,M三个域组成的一个32位二进制字所表示的非零规格化浮点数x,真值表示为:x=(-1)s×(1.M)×2E-128它所表示的规格化的最大正数、最小正数、最大负数、最小负数是多少?第二节1、什么是IEEE754标准用来规范化浮点数,其格式是(1)32位x=(-1)s ×(1.M)×2E-127 e =E-127(2)64位 x=(-1)s ×(1.M)×2E-1023 e =E-1023其中,s 是符号位,M 是尾数,E 是阶码,e 是实际的指数值表 三种形式的IEEE754浮点数格式参数单精度浮点数 双精度浮点数 扩充精度浮点数 浮点数字长32 64 80 尾数长度P23 52 64 符号位S1 1 1 指数长度E8 11 15 最大指数+127 +1023 +16383 最小指数-126 -1022 -16382 指数偏移量 +127 +1023 +16383可表示的实数范围 10-38~1038 10-308~10308 10-4932~1049322、为什么阶码的偏移量是127?先看下什么机器零:(1)当浮点数尾数M=0,无论阶码E 为何值,则该浮点数为0值(2)当阶码的值遇到比它所能表示的最小值还小时,不管尾数M 为何值,则浮点数为0值(1)、(2)中的零值称为机器零以32位浮点数为例:"当阶码E 为全0且尾数M 也为全0时,表示的真值x 为零,结合符号位S 为0或1,有正零和负零之分。
规格化浮点数第一章第四节浮点数的表示方法一、浮点数表示一个数的浮点形式(设基数是2)可写成:N =(+ -)M 2其中:M代表尾数,E代表阶码。
计算机中浮点数只用尾数和阶码表示,其形式如下:阶符阶码尾数符号尾数E浮点数的精度由尾数决定,数的表示范围由阶码的位数决定。
为了最大限度提高精度,尾数采用规格化形式,既1/2≤M<1。
采用二进制表示时,若尾数大于零,则规格化数应该是01XX的形式;若尾数小于零,则规格化数应为10XX的形式。
二、实例【例1】设X=0.0110×23,用补码、浮点数形式表示阶码为Xj=011,尾数为00110,这时由于X尾数不符合01XX的形式,因此不是规格化数,必须先进行规格化处理。
方法:若尾数小于1/2,把尾数左移一位(不包括符号位),观察结果是否满足规格化条件,满足则在把阶码减1即可,否则继续左移和调整阶码;若尾数大于1,则把尾数右移一位(不包括符号位),观察结果是否满足规格化条件,满足则在把阶码加1即可,否则继续右移和调整阶码。
上例中,00110左移一位为01100,符合规则化标准,此时阶码减1,为010即得到浮点表示形式。
一个浮点数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必须是正的在浮点表示方法中,小数点的位置是浮动的,阶码可取不同的数值。
为了便于计算机中小数点的表示,规定将浮点数写成规格化的形式,即尾数的绝对值大于等于0.1并且小于1,从而唯一规定了小数点的位置。
尾数的长度将影响数的精度,其符号将决定数的符号。
浮点数的阶码相当于数学中的指数,其大小将决定数的表示范围。
浮点数规格化的方法
浮点数规格化是将一个浮点数表示为标准化形式的过程,其目的是使得浮点数可以方便地进行比较和运算。
浮点数规格化的方法如下:
1. 确定符号位:将符号位取出,用0表示正数,用1表示负数。
2. 确定指数位:将原始指数加上一个常数(偏置)来得到实际指数,常见的偏置值包括127和1023。
3. 确定尾数位:将原始尾数移到小数点后面的第一位,即将小数点右移或左移若干位,直至小数点移到尾数的最高位。
4. 确定隐藏位:在标准化后的尾数前面增加一位,称为隐藏位,其值为1,这样可避免在运算过程中损失精度。
5. 确定舍入规则:根据需求确定舍入规则,常见的有向上舍入、向下舍入和向最近偶数舍入等。
6. 舍入结果:根据所确定的舍入规则将浮点数进行舍入,得到最终的规格化结果。
需要注意的是,不同的浮点数规格化方法可能会导致不同的舍入误差,因此在进
行浮点数运算时需要进行有效的误差估计和处理。
第二节 DSP 的浮点运算方法这是一条提取指数的指令,所提取的指数保存在T 寄存器中。
如果累加器A=0,则0→T ;否则,累加器A 的冗余符号位数减8→T 。
累加器A 中的内容不变。
C54x DSP 用16位表示数字,其对浮点数的表IEEE 754-1985标准的32位表示法略有不同。
采用一个单元保存指数和一个单元保存尾数的两个16位表示法。
例5-16提取A=FF FFFF FFCB中的指数值。
执行指令:EXP A执行前执行后A=FF FFFF FFCB A=FF FFFF FFCBT= 0000 T= 0019 (25)本例中,由于A≠0,需要先求出A的冗余符号位并减去8。
A=F F F F F F F F C B1111 1111 1111 1111 1111 1111 1111 1111 1100 101133位冗余符号位1,33-8=25=0x0019例5-17 提取B=07 8543 2105中的指数值。
执行指令:EXP B执行前执行后B=07 8543 2105 B=07 8543 2105T= 0007 T= FFFC (-4)本例中,由于B≠0,需要先求出B的冗余符号位并减去8。
A= 0 7 8 5 4 3 2 1 0 50000 0111 1000 0101 0100 0011 0010 0001 0000 01014位冗余符号位0,4-8=-4=0xFFFC-4=-(0x0004)=(1111 1111 1111 1011+1)补=(0xFFFC)补按T寄存器中的内容对累加器A进行归一化处理。
这里的将定点数转换成浮点数所进行的归一化处理,指通过左移或右移,使一个二进制数变为一个小数,且小数点后的第一个数不为零,移动的位数用指数表示。
例如:0.3=(0.010011)2×2-0=(0.10011)2×2-1,-0.8=-0.8×2-0=-(0.110011) 2×2-0,-0.24=-(0.001111)×2-0=-(0.1111)2×2-2。
浮点数的规格化为了使计算机在运行过程中,不丢失有效数字,提高运算的精度,在计算机中,浮点数通常都采用规格化数的表示方法。
对二进制浮点数2J×S,若尾数S满足1/2≤|S|<1时,则为“规格化的数”,否则就是非规格化的数。
要使浮点数规格化只要移动尾数并改变阶的值就可以实现。
对补码来说,规格化的数意味着什么呢?如果是正数,尾数的第一位数字为“1”;如果是负数,尾数的第一个数字应为“0”(即1.0×…×),或为“1”而以后各位全为“0”(即1.10…0);前者小于-1/2,后者正好等于-1/2。
为了机器判断方便,在补码表示中,往往不把-1/2列入规格化的数。
这样,补码规格化数规定如下:对正数x≥0,如果1 >x ≥1/2,称为规格化数,其补码表示形式为:0.1x…x。
对负数x<0,如果-1/2>x ≥-1,称为规格化数,其补码表示形式为:1.0x (x)其中x表示可任取“0”或“1”。
因此,机器只要判断运算结果的符号位与第一位数字是否相同,便可知道是否是规格化的数。
例1:将(-18.75)10转换为二进制浮点规格化数,基数为2,阶符、阶码(用补码表示)共4位,数符(尾符)、尾数(用补码表示)共8位。
解:-18.75D = -10010.11B = -1.001011B×24 ; {-1.001011B < -1}= -0.1001011B×25阶码:+5 = 0101B,补码:0101尾数:[ -0.1001011]补= 1.0110101浮点数:0 101 1 0110101例2:设某计算机用双字表示一浮点数,其中阶符、阶码8位,用原码表示,数符、尾数共8位,用补码表示,求能表示的最大正数为多少?解:最大正数的浮点表示为:01111111 0 1111111阶码:+1111111=2+127尾数:+0.1111111=1-2-7最大正数为:(1-2-7)×2+127浮点加减法运算要经过对阶、尾数加减运算、规格化和舍入四步才能完成。
【转载】浮点数运算的的规格化
在尾数⽤表⽰时,规格化浮点数应满⾜尾数最⾼数位与符号位不同,如相同就是不满⾜规格化。
尾数⽤双符号位补码表⽰,经过加/减运算之后,可能出现以下六种情况,即
① 00.1 x x (x)
② 11.0 x x (x)
③ 00.0 x x (x)
④ 11.1 x x (x)
⑤ 01.x x x (x)
⑥ 10.x x x … x 第①、②种情况,符合规格化数的定义,已是规格化数。
第③、④种情况不是规格化数,需要使尾数左移以实现规格化,这个过程称为左规。
尾
数每左移⼀位,阶码相应减 1,直⾄成为规格化数为⽌。
左规可以进⾏多次。
第⑤、⑥种情况在定点加减运算中称为溢出,但在浮点加减运算中,只表明此时尾数的绝对值⼤于 1,⽽并⾮真正的溢出。
这种情况应将尾数右移以实现规格化。
这个过程称为右规。
尾数每右移⼀位,阶码相应加 1。
右规最多只有⼀次。
总结:左规处理,及时数往⼩数点左边⾛,阶码-1,右规反之。
浮点数规格化例题讲解浮点数规格化是计算机体系结构中一个非常重要的概念,它用于将浮点数表示成机器码或者字节序列,以便于计算机内部进行处理。
下面是一个简单的浮点数规格化例题,供参考:例题:计算一个浮点数的二进制表示假设有一个浮点数 `f` 表示为:```f = 0x3f1f3f1f```要计算它的二进制表示,可以将其转换为 8 位二进制数,然后求出每一位的值:```b = f / 10000000; // 将浮点数除以 10000000 得到商和余数的二进制表示bin =掩码(b, 2); // 将二进制表示转换为十进制数 ```掩码函数 `掩码` 用于将二进制数的每一位与对应的位取反,然后将它们相加得到总和。
具体实现如下:```function掩码(b, n:uint):uint;var掩码1:uint = 1 / n;var掩码2:uint = 0 / n;var i:uint;for(i = 0; i < n; i++) {b = b &掩码1;b = b >> 1;b = b &掩码2;b = b >> 1;}return b;```上述函数中的掩码1和掩码2分别表示取反每一位二进制数对应的位和除以 n 得到的商,而 i 表示当前需要取反的位的个数。
将上述函数中得到的二进制表示与 8 位二进制数 `bin` 相加即可得到最终的二进制表示:```bin_out = f + bin;```最终输出即为:```bin_out = 0x100000000 00000000000000000000000000000000 ```以上就是浮点数规格化的一个重要例题,通过这个例题可以更好地理解如何进行浮点数的规格化。
规格化浮点数第一章第四节浮点数的表示方法一、浮点数表示一个数的浮点形式(设基数是2)可写成:N = (+ -)M 2E其中:M代表尾数,E代表阶码。
计算机中浮点数只用尾数和阶码表示,其形式如下:为了最大限度提高精度,尾数采用规格化形式,既1/2≤M<1。
采用二进制表示时,若尾数大于零,则规格化数应该是01XXXX的形式;若尾数小于零,则规格化数应为10XXXX 的形式。
二、实例【例1】设X=0.0110×23 ,用补码、浮点数形式表示阶码为Xj=011,尾数为00110,这时由于X尾数不符合01XXXX的形式,因此不是规格化数,必须先进行规格化处理。
方法:若尾数小于1/2,把尾数左移一位(不包括符号位),观察结果是否满足规格化条件,满足则在把阶码减1即可,否则继续左移和调整阶码;若尾数大于1,则把尾数右移一位(不包括符号位),观察结果是否满足规格化条件,满足则在把阶码加1即可,否则继续右移和调整阶码。
上例中,00110左移一位为01100,符合规则化标准,此时阶码减1,为010即得到浮点表示形式。
一个浮点数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必须是正的在浮点表示方法中,小数点的位置是浮动的,阶码可取不同的数值。
为了便于计算机中小数点的表示,规定将浮点数写成规格化的形式,即尾数的绝对值大于等于0.1并且小于1,从而唯一规定了小数点的位置。
尾数的长度将影响数的精度,其符号将决定数的符号。
浮点数的阶码相当于数学中的指数,其大小将决定数的表示范围。
例题1:表示-13/128这个数的二进制规格化数(阶用移码,尾数用补码)?-13/128=(-1/128)+(-1/32)+(-1/16)=2^-4+2^-5+2^-7=-(0.0000001+0.00001+0.0001)=-(0.0001101)规格化后为:-0.11001*2^(-3)=-0.11001*2^(-11)即阶码=-11尾码=-0.1101设阶码为4位,尾码为10位,阶符与数符各取1位,则:阶码移码= 1 0011原=1 1100反=1 1101补=0 1101移尾码补码= 1 1101000000 原= 1 0010111111反=1 0011000000补如果规格化数格式为: 符号阶码数符,尾数,则结果应为:0 1101 1 001100 0000例题2:十进制数7.5表示成二进制浮点规格化数是多少?要求是:阶符1位,阶码2位,数符1位,尾数4位。
第一节X=(-1)S×(1.M)×2E-127e=E-127X=(-1)S×(1.M)×2E-1023 e=E-1023我承认以前对这俩公式避之不及不予深究努力自己说服自己而未能得逞,部分原因是跟“移码与真值的关系”扯上关系,这“移码与真值的关系”想搞清先得把引入移码的充分理由给我个说法,不幸玩过头正事误了。
上回说了“补码省心移码悦目”能算是今时不同往日了吧,现在轮到对IEEE754浮点数规格化表示法杀无赦去死吧。
首先,“IEEE规格化形式”是对“传统规格化形式”进一步严格要求来的。
IEEE规格化形式唯一,而浮点数记法多种多样。
(1.75)10=1.11×20 (IEEE规格化表示)=0.111×21 (传统规格化表示)=0.0111×22=0.00111×23其次,既然IEEE想到对“传统规格化形式”进一步修订当然有目的,你以为作无用功呐,关键目的是什么?规格化的目的同理。
修改阶码同时左右移小数点使尾数域最高有效位固定为1,尾数就以ta所可能变化成的最大形式出现,即使遭遇类似截断的操作仍可保持尽可能高的精度。
有类错误我这种大秀逗极善于犯!就是不理会左右关系不经过大脑直接作问题少女状问很白的问题:“‘移码和真值的关系’是E=27(或210)+X,那X=E-27(或210),在怎么着里面数该是128(或1024),咋是127(或1023)?”当E=M=全0E(移码)=全0,对应真值-128M(补码)=全0,对应真值0E=M=全0,真值X=0-128=0结合符号位S 为0或1分正零和负零当E=全1,M=全0E(移码)=全1,对应真值+127M(补码)=全0,对应真值0E=全1,M=全0,真值X=0127=∞结合符号位S 为0或1分+∞和-∞要除去表示零和无穷大这2种特殊情况指数偏移值不选128(10000000),而选127(01111111)对IEEE32位规格化浮点数8位移码(隐含1位符号位)原本表示范围是-128 →+127(除去全1(+127)全0(-128)剩下-127 →+126 ???)实际可用指数值(即阶码真值)e范围是-126→+127加上偏移值后,阶码E的范围变为1→254以10的幂表示,绝对值的范围是10-38→1038假设由S,E,M三个域组成的一个32位二进制字所表示的非零规格化浮点数x,真值表示为:x=(-1)s×(1.M)×2E-128它所表示的规格化的最大正数、最小正数、最大负数、最小负数是多少?第二节1、什么是IEEE754标准用来规范化浮点数,其格式是(1)32位x=(-1)s ×(1.M)×2E-127 e =E-127(2)64位 x=(-1)s ×(1.M)×2E-1023 e =E-1023其中,s 是符号位,M 是尾数,E 是阶码,e 是实际的指数值表 三种形式的IEEE754浮点数格式参数单精度浮点数 双精度浮点数 扩充精度浮点数 浮点数字长32 64 80 尾数长度P23 52 64 符号位S1 1 1 指数长度E8 11 15 最大指数+127 +1023 +16383 最小指数-126 -1022 -16382 指数偏移量 +127 +1023 +16383可表示的实数范围 10-38~1038 10-308~10308 10-4932~1049322、为什么阶码的偏移量是127?先看下什么机器零:(1)当浮点数尾数M=0,无论阶码E 为何值,则该浮点数为0值(2)当阶码的值遇到比它所能表示的最小值还小时,不管尾数M 为何值,则浮点数为0值(1)、(2)中的零值称为机器零以32位浮点数为例:"当阶码E 为全0且尾数M 也为全0时,表示的真值x 为零,结合符号位S 为0或1,有正零和负零之分。
当阶码E 为全1且尾数M 为全0时,表示的真值x 为无穷大,结合符号位S 为0或1,也有+∞和-∞之分。
这样在32位浮点数表示中,要除去E 用全0(-128)和全1(255)10表示零和无穷大的特殊情况,指数的偏移值不选128(10000000),而选127(01111111)。
对于规格化浮点数,E 的范围变为1到254,真正的指数值e则为-126到+127。
因此32位浮点数表示的绝对值的范围是10-38~1038(以10的幂表示)。
"——引自白中英<<计算机组成原理>>S(1位) E(8位) M(23位) N(32位)符0 0 (-1)S *2E-127·(1.M) 为规格化数0 不等于0 (-1)S*2-126*(0.M) 为非规格化数号1到254之间不等于0 (-1)S*2E-127*(1.M) 为规格化数255 不等于0 NaN(非数值)位255 0 无穷大其中红色字0、1表示隐含位,注意当数字N为非规格化数或是0时,隐含位是0。
如果选择偏移值128时,假设指数(不是阶码)为+127,则阶码为127+128=255,全为1 ,由上表可知N为NaN和无穷大假设指数为0(包括正0和负0),正0+128=128,负0(补码)+128=0,由上可知E=0时,存在非规格化数由于8位E中,7位表示有效数字,不能从这7位下手,只能更改偏移值为127(可以是0~127,I EEE745规定为127)3、为什么阶码表示的最小指数是-126呢?有2中描述可以得到,当偏移量为127时,若最小指数是-127,则127+(-127)=0,E=0,存在非规格化数故取-126,这也符合E的表示范围1~254。
二进制浮点数的表示,由于不同机器所选的基值、尾数位长度和阶码位长度不同,因此对浮点数表示有较大差别,这就不利于软件在不同计算机间的移植。
美国IEEE(电子及电子工程师协会)为此提出了一个从系统结构角度支持浮点数的表示方法,称之为IEEE标准754(IEEE,1985),当今流行的计算机几乎都采用这一标准。
IEEE 754在标识符点数时,每个浮点数均由3个部分组成:符号位S,指数部分E和尾数部分M。
浮点数可采用以下四种基本格式:(1)单精度格式(32位):E=8位,M=23位。
(2)扩展单精度格式:E≥11位,M≥31位。
(3)双精度格式(64)位:E=11位,M=52位。
(4)扩展双精度格式(64位):E≥15位,M≥63位。
其中,单精度格式(32位)中的阶码为8位,另有一位尾数的符号位S,处在最高位。
如图4.2.1所示。
应该指出的是,浮点数的分数部分与有效位部分两者是不同的,由于IEEE754标准约定在小数点左部有一位隐含位,从而使其有效位实际有24位,这样便使尾数的有效值变为1.M。
阶码部分采用移码表示,移码值为127,从而使阶码值的范围由原来的1到254,经移码后变为-126到+127。
IEEE 754标准的单精度和双精度浮点数表示格式。
其中,阶码值0和255分别用来表示特殊数值:当阶码值为255时,若分数部分为0,则表示无穷大;若分数部分不为0,则认为这是一个‘非数值’。
当阶码和尾数均为0时则表示该数值为0,因为非零数的有效位总是≥1,因此特别约定,这表示为0。
当阶码为0,尾数不为0时,该数绝对值较小,允许采用比最小规格化数还要小的数表示。
概括起来,由32位单精度所表示的IEEE 754标准浮点数N可以有如下的解释:若E=0,且M=0,则N为0。
若E=0,且M≠0,则N=(-1)S·2-126·(0.M)。
为非规格化数。
若1≤E≤254,则N=(-1)S·2E-127·(1.M)。
为规格化数。
若E=255,且M≠0,则N=NaN(‘非数值’)。
若E=255,且M=0,则N=(-1)S∝(无穷大)。
由此可见,IEEE 754标准使0有了精确表示,同时也明确地表示了无穷大,所以,当a/0(a≠0)时得到结果值为±∞;当0/0时得到结果值较小的数,为了避免下溢而损失精度,允许采用比最小规格化数还要小的数来表示,这些数称为非规格化数(Denormalnumber)。
应注意的是,非规格化数和正、负零的隐含位值不是1而是0。
下面举两个例子来说明IEEE 754标准浮点数的表示:(1)N=-1.5,它的单精度格式表示为:1 01111111 10000000000000000000000其中,S=1,E=127,M=0.5,因此N=-1.5。
(2)以下的32位数所表示的单精度浮点数为多少?1 10000001 01000000000000000000000其中,S=1,E=129,M=0.25,由公式可知N=-5。
第1次课(第1章第1讲)授课章节课程简介第1章计算机系统概论1.1 计算机的分类1.2 计算机的发展简史1.3 计算机的硬件学时安排课程简介-------------------------- 0.5学时第1章计算机系统概论1.1 计算机的分类1.2 计算机的发展简史-------------------------- 0.5学时1.3 计算机的硬件-------------------------- 1学时教学目的本次课的主要内容为有关计算机系统的组织和构成进行概要性介绍,为以后的进一步学习打下基础。
通过本次课的学习,要求学生:1. 明确本课程的地位和作用;2. 了解计算机的分类和发展简史;3. 理解计算机硬件系统的构成,以及计算机进行数据处理的过程。
教学难点和重点本次课的教学难点在于:计算机硬件系统的构成和作用。
这点对于建立整机思想相当重要,类比人的计算处理过程进行介绍。
授课安排本次课为课程的第一次课,首先要对课程在整个教学体系中的地位和作用进行讲解。
同时该课程是本专业的考研统考课程,因此对于考研的要求也应结合考研大纲进行说明。
在此次课程中,主要对第一章的部分内容进行介绍。
在介绍课本知识之前,要先带领学生一起认识计算机硬件各部件,并熟悉计算机硬件的功能划分。
然后对于计算机的分类和发展简史,这些内容应该在以前的引论课程中已经介绍,可以简单地回顾下,但这里有关计算机性能指标的部分应该着重介绍下。
1.3节计算机的硬件部分是本次课的重点内容。
这部分内容首先从手工计算开始分析,将完成一次计算所需的设备一一对应到计算机系统中。
然后按照计算机中各部件——运算器、存储器、控制器、IO设备的功能,进行概要性的介绍。
在课程的最后引入下次课要补充讲解的内容——计算机简化模型的基本概念。
考核要点1. 冯诺依曼的计算机结构体系;2. 计算机中各部件——运算器、存储器、控制器、IO设备的功能和结构;3. 计算机各部件配合工作的大致情况;。