文档库 最新最全的文档下载
当前位置:文档库 › 计算机32位浮点数编码实验C描述

计算机32位浮点数编码实验C描述

计算机32位浮点数编码实验C描述
计算机32位浮点数编码实验C描述

浮点数编码实验

1、提要

本篇讲解浮点数的编码,先介绍浮点数的编码规格,最后用C程序来实现将给定的整数编码转换成浮点数编码。

2、浮点数编码

在计算机中浮点数采用V = (-1)s×M×2E的形式来表示,在计算机中单精度浮点数是32位,双精度浮点数是64位,我们仅仅对单精度浮点数做说明。就单精度浮点数而言,计算机中保存了S,M和E 的编码,其中S表示符号位,0表示正数,1表示负数;M是学名叫尾数;E是阶码,它是指数加上一个偏置数,单精度浮点数的偏置数是127,之所以加上这个偏置数是为了便于浮点数的运算。

在单精度浮点数中,符号位占最高位1位,阶码占用紧接着的8位,尾数占用最后23位,如下图所示:

31 30 22 0 重点说一下尾数M,M隐含了小数点前面的1,举个例子,如果M是1010000000000011110000B,那么M的实际值是1#1010000000000011110000B,其中#表示小数点的位置;然后说说阶码E,假定解码E是10001001B,十进制值位137,E需要再减去偏置127,才能得到指数137-127=10,最后假定S是0,那么这个例子中所描述的浮点数表示的值是:1.1010000000000011110000B × 210也

就是:

11010000000.000011110000B。

3、将一个十进制数转成浮点数表示

举个例子,十进制数-12.75转换成浮点数表示,首先确定符号位是1,将12.75转成二进制表示1100.11B = 1.10011×23,可以确定尾数M是100 1100 0000 0000 0000 0000B,阶码E=3+127 = 130 = 1000 0010B,其浮点数表示为

1#1000 0010#100 1100 0000 0000 0000 0000B =C14C0000H。其中#分割S、E和M。

4、一些非规格浮点数的表示

上面部分说的是浮点数的规格表示,还有一些非规格表示。首先是0的表示,对于0来讲,符号位S是0是1都可以,阶码和尾数全部为0。

+∞和-∞的表示,对于+∞符号位是0表示正,阶码全为1,尾数全部为0,-∞和+∞只有符号不同,因此-∞符号位为1表示负,阶码和尾数与+∞相同全是0。

然后就是非数的表示,非数,就是不是数,符号位忽略,阶码全为1,尾数是非零的数。非数主要用来表示一些非法运算的结果,例如-∞++∞就等于非数。

最后,是阶码全部为0,但是尾数不为0的情况,此时尾数没有隐含的1,也就是原来规格化的数是1.M,现在是0.M,阶码E是-126,再按照浮点数的表示公式V = (-1)s×M×2E来计算浮点数的值。

5、进位

当将一个很大的整数转换成浮点数时,没有办法完全表示整数的有效位,就需要右移来舍掉后面的位数,浮点数的舍入默认采用向最接近的值舍入,此外还需要注意,要向偶数舍入,比如小数位是1/2,是进位还是舍弃,取决于前一位是偶数还是奇数,如果是偶数,就舍弃,是奇数就进位。仍然以一个例子来说明一个数K...XYYY,YYY是要舍掉的数,X是要接受进位的数,如果YYY正好是100B,也就是0.5,我们假定X也Y之间有个小数点,此外0.5是10进制值,是进位还是舍弃取决于X的值,如果X是1(二进制值),就进位,如果X 是0(二进制值)就舍掉,换句话说,当X是偶数时,就舍掉,X是奇数时就进位;如果YYY大于0.5(十进制值),也就是说YYY>100B,那么不管X是什么,都进位,如果YYY<0.5,也就是说YYY<100B,直接舍弃。

6、将一个整数编码转换成浮点数编码

将整数的编码用C语言转换成浮点数的编码,具体的解释会在代码中以注释形式出现。

unsigned float_i2f(int x)

{

unsigned s = 0;

unsigned r = 0;

unsigned e = 0, flag = 0, t;

int c = 0;

//0非规格化表示,直接返回0即可

if (x == 0)

return 0;

if (x < 0)

{

//转换成正整数

//并设置符号位

s = 0x80000000;

r = -x;

}

else r = x; //符号位为0

//确定尾数M,并记录左移的次数为计算阶码做准备while(!(r&0x80000000))

{

r = r<<1;

c = c+1;

}

//此处是进位处理此时r包含尾数的隐含位因此舍弃的正好

//是r的末尾8位,先得到末尾8位的值,如果大于0.5直接进//位,小于0.5直接舍弃,等于0.5时判断前面一位是0还是1,//来决定是否进位

t = r&0xFF;

if (t > 0x80)

flag = 1;

else if (t < 0x80)

flag = 0;

else if (t == 0x80)

if (r&0x100)

flag = 1;

else flag = 0;

//得到尾数,注意包含隐含位

r = r>>8;

//确定阶码为得到尾数将r左右成第31位为1,可以认为小数//点的位置在31位,输入的是整数,小数点在0的位置,而原来//小数点的位置就是31-c就是指数,

e = 31-c+127;

//进位

r = r+flag;

//考虑进位后是否会造成r最高位向左扩展

if(r&0x1000000)

{

r = r>>1;

e = e+1;

}

//舍掉隐含位

r = r&0x7fffff; r = r|(e<<23)|s; return r;

}

IEEE浮点数的表示方法及规则

计算机组成原理课程作业报告 解决的问题: IEEE浮点数的表示方法及规则 班级: 10021101 学号: 2011302610 姓名:最天使 日期: 2013年10月29日

一、什么是IEEE754标准 1.两种基本浮点格式:单精度和双精度; 2.两种扩展浮点格式:单精度扩展和双精度扩展; 3.浮点数运算的准确度要求:加、减、乘、除、平方、余数,将浮点格式的数舍入为整数值; 4.在十进制字符串和两种基本浮点格式之一的二进制浮点数格式之间的转换的准确度、单一性和一致性要求; 5.五种异常:乘、除、平方根、余数、在不同浮点格; 6.四种舍入方向: ①向最接近的可表示的值:Round(0.5) = 0; Round(1.5) = 2; Round(2.5) = 2; ②当有两个最接近的可表示的值时首选“偶数”值; ③向负无穷大(向下):floor(1.324) = 1 floor(-1.324) = -2 ④向正无穷大(向上)以及向(截断):C/C++ 函数ceil() ceil(1.324) = 2 Ceil(-1.324) = -1; 二、IEEE754表示浮点数的格式参数: 类型存储位数偏移值 数符S (位)阶码E (位) 尾数M (位) 总位数 (位) 十六进制十进制 短实数 1 8 23 32 0X7FH +127 长实数 1 11 52 64 0X3FFH +1023 临时实数 1 15 64 80 0X3FFFH +16383 特殊情况: 对于阶码为0或者255时,IEEE有特殊的规定: 1.如果E是0并且M是0,这个数+0(和符号位相关); 2.如果E=2-1并且M是0,这个数是正负无穷大(和符号相关); 3.如果E=2-1并且M不是0,这个数表示为不是一个数(NaN)。

浮点数结构详解

附录D What Every Computer Scientist Should Know About Floating-Point Arithmetic 注 – 本附录是对论文《What Every Computer Scientist Should Know About Floating- Point Arithmetic》(作者:David Goldberg,发表于 1991 年 3 月号的《Computing Surveys》)进行编辑之后的重印版本。版权所有 1991,Association for Computing Machinery, Inc.,经许可重印。 D.1摘要 许多人认为浮点运算是一个深奥的主题。这相当令人吃惊,因为浮点在计算机系统中是普 遍存在的。几乎每种语言都有浮点数据类型;从 PC 到超级计算机都有浮点加速器;多 数编译器可随时进行编译浮点算法;而且实际上,每种操作系统都必须对浮点异常(如 溢出)作出响应。本文将为您提供一个教程,涉及的方面包含对计算机系统设计人员产生 直接影响的浮点运算信息。它首先介绍有关浮点表示和舍入误差的背景知识,然后讨论 IEEE 浮点标准,最后列举了许多示例来说明计算机生成器如何更好地支持浮点。 类别和主题描述符:(主要)C.0 [计算机系统组织]:概论—指令集设计;D.3.4 [程 序设计语言]:处理器—编译器,优化;G.1.0 [数值分析]:概论—计算机运算,错 误分析,数值算法(次要) D.2.1 [软件工程]:要求/规范—语言;D.3.4 程序设计语言]:正式定义和理论— 语义;D.4.1 操作系统]:进程管理—同步。 一般术语:算法,设计,语言 其他关键字/词:非规格化数值,异常,浮点,浮点标准,渐进下溢,保护数位,NaN, 溢出,相对误差、舍入误差,舍入模式,ulp,下溢。 D-1

32位浮点数表示的范围

浮点数的理解 在定点数表示中存在的一个问题是,难以表示数值很大的数据和数值很小的数据。例如,电子的质量(9×10-28克)和太阳的质量(2×1033克)相差甚远,在定点计算机中无法直接表示,因为小数点只能固定在某一个位置上,从而限制了数据的表示范围。 为了表示更大范围的数据,数学上通常采用科学计数法,把数据表示成一个小数乘以一个以10为底的指数。 例如,在计算机中,电子的质量和太阳的质量可以分别取不同的比例因子,以使其数值部分的绝对值小于1,即: 9×10-28=0.9×10-27 2×1033=0.2×1034 这里的比例因子10-27和1034要分别存放在机器的某个单元中,以便以后对计算结果按此比例增大。显然,这要占用一定的存储空间和运算时间。 浮点表示法就是把一个数的有效数字和数的范围在计算机中分别予以表示。这种把数的范围和精度分别表示的方法,相当于数的小数点位置随比例因子的不同而在一定范围内自由浮动,改变指数部分的数值相当于改变小数点的位置。在这种表示法中,小数点的位置是可以浮动的,因此称为浮点表示法。 浮点数的一般表示形式为: 一个十进制数N可以写成:N = 10e×M 一个二进制数N可以写成:N = 2e×M 其中,M称为浮点数的尾数,是一个纯小数;e是比例因子的指数,称为浮点数的指数,是一个整数。在计算机中表示一个浮点数时,一是要给出尾数M,用小数形式表示;二是要给出指数e,用整数形式表示,常称为阶码。尾数部分给出有效数字的位数,因而决定了浮点数的表示精度;阶码部分指明了小数点在数据中的位置,因而决定了浮点数的表示范围。浮点数也是有符号数,带符号的浮点数的表示如图2-2所示。 其中,S为尾数的符号位,放在最高一位;E为阶码,紧跟在符号位之后,占m位;M为尾数,放在低位部分,占n位。 1. 规格化浮点数 若不对浮点数的表示做出明确规定,同一个浮点数的表示就不是惟一的。例如:

计算机中数值的表示

数值型数据由数字组成,表示数量,用于算术操作中。 3.5.1 定点数和浮点数的概念 在计算机中,数值型的数据有两种表示方法,一种叫做定点数,另一种叫做浮点数。 所谓定点数,就是在计算机中所有数的小数点位置固定不变。定点数有两种:定点小数和定点整数。定点小数将小数点固定在最高数据位的左边,因此,它只能表示小于1的纯小数。定点整数将小数点固定在最低数据位的右边,因此定点整数表示的也只是纯整数。由此可见,定点数表示数的范围较小。 为了扩大计算机中数值数据的表示范围,我们将12.34表示为0.1234×102,其中0.1234叫做尾数,10叫做基数,可以在计算机内固定下来。2叫做阶码,若阶码的大小发生变化,则意味着实际数据小数点的移动,我们把这种数据叫做浮点数。由于基数在计算机中固定不变,因此,我们可以用两个定点数分别表示尾数和阶码,从而表示这个浮点数。其中,尾数用定点小数表示,阶码用定点整数表示。 在计算机中,无论是定点数还是浮点数,都有正负之分。在表示数据时,专门有1位或2位表示符号,对单符号位来讲,通常用“1”表示负号;用“0”表示正号。对双符号位而言,则用“11”表示负号;“00”表示正号。通常情况下,符号位都处于数据的最高位。 3.5.2 定点数的表示 一个定点数,在计算机中可用不同的码制来表示,常用的码制有原码、反码和补码三种。不论用什么码制来表示,数据本身的值并不发生变化,数据本身所代表的值叫做真值。下面,我们就来讨论这三种码制的表示方法。 1. 原码 原码的表示方法为:如果真值是正数,则最高位为0,其它位保持不变;如果真值是负数,则最高位为1,其它位保持不变。 【例1】写出13和–13的原码(取8位码长) 解:因为13=(1101)2,所以13的原码是00001101,-13的原码是10001101。 采用原码,优点是转换非常简单,只要根据正负号将最高位置0或1即可。但原码表示在进行加减运算时很不方便,符号位不能参与运算,并且0的原码有两种表示方法:+0的原码是00000000,-0的原码是10000000。 2. 反码 反码的表示方法为:如果真值是正数,则最高位为0,其它位保持不变;如果真值是负数,则最高位为1,其它位按位求反。 【例2】写出13和–13的反码(取8位码长) 解:因为13=(1101)2,所以13的反码是00001101,-13的反码是11110010。 反码跟原码相比较,符号位虽然可以作为数值参与运算,但计算完后,仍需要根据符号位进行调整。另外0的反码同样也有两种表示方法:+0的反码是00000000,-0的反码是11111111。为了克服原码和反码的上述缺点,人们又引进了补码表示法。补码的作用在于能把减法运算化成加法运算,现代计算机中一般采用补码来表示定点数。 3. 补码 补码的表示方法为:若真值是正数,则最高位为0,其它位保持不变;若真值是负数,则最高位为1,其它位按位求反后再加1。 【例3】写出13和–13的补码(取8位码长) 解:因为13=(1101)2,所以13的补码是00001101,-13的补码是11110011。

浮点数的表示和基本运算

浮点数的表示和基本运算 1 浮点数的表示 通常,我们可以用下面的格式来表示浮点数 S P M 其中S是符号位,P是阶码,M是尾数 对于IBM-PC而言,单精度浮点数是32位(即4字节)的,双精度浮点数是64位(即8字节)的。两者的S,P,M所占的位数以及表示方法由下表可知 S P M表示公式偏移量 1823(-1)S*2(P-127)*1.M127 11152(-1)S*2(P-1023)*1.M1023 以单精度浮点数为例,可以得到其二进制的表示格式如下 S(第31位)P(30位到 23位) M(22位到 0位) 其中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+38 Console.WriteLine(float.MinValue); //-3.402823E+38 Console.WriteLine(float.Epsilon); // 1.401298E-45 //如果我们把它们转换成双精度类型,它们的值如下 Console.WriteLine(Convert.ToDouble(float.MaxValue)); // 3.40282346638529E+38 Console.WriteLine(Convert.ToDouble(float.MinValue)); //-3.40282346638529E+38 Console.WriteLine(Convert.ToDouble(float.Epsilon)); // 1.40129846432482E-45 那么这些值是如何求出来的呢? 根据上面的约定,我们可以知道阶码P的最大值是11111110(这个值是254,因为255用于特殊的约定,那么对于可以精确表示的数来说,254就是最大的阶码了)。尾数的最大值是11111111111111111111111。 那么这个最大值就是:0 11111110 11111111111111111111111。 也就是 2(254-127) * (1.11111111111111111111111)2 = 2127 * (1+1-2-23) = 3.40282346638529E+38 从上面的双精度表示可以看出,两者是一致的。最小的数自然就是- 3.40282346638529E+38。 对于最接近于0的数,根据IEEE754的约定,为了扩大对0值附近数据的表示能力,取阶码P = -126,尾数 M = (0.00000000000000000000001)2 。此时该数的二进制表示为:0 00000000 00000000000000000000001 也就是2-126 * 2-23 = 2-149 = 1.40129846432482E-45。这个数字和上面的Epsilon 是一致的。 如果我们要精确表示最接近于0的数字,它应该是 0 00000001 00000000000000000000000 也就是:2-126 * (1+0) = 1.17549435082229E-38。 3 浮点数的精度问题 浮点数以有限的32bit长度来反映无限的实数集合,因此大多数情况下都是一个近似值。同时,对于浮点数的运算还同时伴有误差扩散现象。特定精度下看似

C语言的数据类型→浮点型数据

C语言的数据类型→浮点型数据 一、浮点型常量的表示方法: C语言中的浮点数(floating point unmber)就是平常所说的实数。 浮点数有两种表示形式: (1)、十进制小数形式。它由数字和小数点组成(注意必须有小数点)。 如:0.123 、 123.、123.0、0.0 都是十进制小数形式。 (2)、指数形式。 如:123e3或123E3都代表123*103。 注意字母e(或E)之前必须有数字,且e后面的指数必须为整数,如e3、 2.1e 3.5、 e3、 e 等都不是合法的指数形式。 一个浮点数可以有多种指数表示形式。例如123.456e0、 12.3456e1、1.23456e2 、 0.123456e3 、 0.0123456e4 、 0.00123456e5等。其中的1.23456e2称为“规范化的指数形式”。即在字母e(或E)之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字。例如2.3478e2 、 3.099E5 、 6.46832E12都属于规范化的指数形式,而

12.908e10 、0.4578E3 、 756e0则不属于规范化的指数形式。一个浮点数在用指数形式输出时,是规范化的指数形式输出的。例如。若指定将实数5689.65按指数形式输出。输出的形式是5.68965e+003,而不会是0.568965e+004或56.8965e+002。 二、浮点型变量 一个浮点型数据一般在内存中4个字节(32位)。与整型数据的存储方式不同,浮点型数据是按照指数形式存储的。系统把一个浮点型数据分成小数部分和指数部分,分别存放。指数部分采用规范化的指数形式。例如:实数3.14159在内存中的存放形式可以用下图来表示: 1、浮点型变量在内存中的存放形式。 上图使用十进制数来表示的,实际上在计算机中是用二进制数来表示小数部分以及用2的幂次来表示指数部分的。

浮点数范围

任意精度的浮点数的二进制码的构成如下: 符号位|阶码|尾数 任意精度浮点数的二进制码转换成十进制数的计算公式: ()()12-符号值偏移阶码值浮点数=尾数值 其中: 1、符号位只占一位,只有“0”或“1”两个符号值,“0”表示浮点数为非负值,“1” 表 示浮点数为负值,所以有: 1)、当符号值为“0”时: () ()111-=-=符号值0 2)、当符号值为“1”时: ()()1111-=-=-符号值 2、“阶码”的位数随浮点数精度不同而不同,其作用是决定“尾数”小数点的最终位置: 1)、“阶码数字段”的值即为“阶码值”; 2)、2的“阶码位数减1”次方减1即为“阶码偏移量”: ()1-阶码数阶码偏移量=2位-1 3)、“阶码值”减去“阶码偏移量”即为“偏移阶码值”: () 1+阶码数偏移阶码值=阶码值-2位-1 3、“尾数”的位数随浮点数精度不同而不同,其主要作用是表示浮点数的有效数: 1)、“尾数字段”直接表示的“整型值”称为“尾码值”; 2)、机器默认浮点数的“尾数字段”前面带有省略的数符“1”和“.”(注:小数点), 小数字段“1.尾数”的值即为“尾数值”: ()()2尾数位数尾数位数尾数值=尾码值+2 -综上所述,可得: ()()()112??+????-阶码数阶码值尾数位数-2符号值尾数位数浮点数=尾码值+2-1-位

单精度浮点数: 单精度浮点数的二进制码构成如下: 符号位1位|阶码8位|尾数23位 ()()()()()() 71-15012183886082+--?阶码值23-2符号值23符号值阶码值单精度浮点数=尾码值+2单精度浮点数=尾码值+- 1、(十进制:0.0)等效于(十六进制:00000000) 等效于(二进制:00000000000000000000000000000000) 2、(十进制:1.0)等效于(十六进制:3F800000) 等效于(二进制:00111111100000000000000000000000) 3、最大值为(十进制:3.402823E+038)等效于(十六进制:7F7FFFFF) 等效于(二进制:01111111011111111111111111111111) 4、最小值为(十进制:-3.402823E+038)等效于(十六进制:FF7FFFFF 等效于(二进制:11111111011111111111111111111111) 双精度浮点数: 双精度浮点数的二进制码构成如下: 符号位1位|阶码11位|尾数52位 ()()()()()() 101--107512145035996273704962+--?阶码值52-2符号值52符号值阶码值单精度浮点数=尾码值+2单精度浮点数=尾码值+- 1、(十进制:0.0)等效于(十六进制:0000000000000000) 等效于(二进制: 0000000000000000000000000000000000000000000000000000000000000000) 2、(十进制:1.0)等效于(十六进制:3FF0000000000000) 等效于(二进制: 0011111111110000000000000000000000000000000000000000000000000000) 3、最大值为(十进制:1.797693E+308)等效于(十六进制:7FEFFFFFFFFFFFFF) 等效于(二进制: 0111111111101111111111111111111111111111111111111111111111111111) 4、最小值为(十进制:-1.797693E+308)等效于(十六进制:FFEFFFFFFFFFFFFF) 等效于(二进制: 1111111111101111111111111111111111111111111111111111111111111111)

浮点数的表示和运算(范围计算)

浮点数的表示和运算 浮点数的表示和基本运算 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+38 Console.WriteLine(float.MinValue); //-3.402823E+38 Console.WriteLine(float.Epsilon); // 1.401298E-45 //如果我们把它们转换成双精度类型,它们的值如下 Console.WriteLine(Convert.ToDouble(float.MaxValue)); // 3.40282346638529E+38 Console.WriteLine(Convert.ToDouble(float.MinValue)); //-3.40282346638529E+38 Console.WriteLine(Convert.ToDouble(float.Epsilon)); // 1.40129846432482E-45 那么这些值是如何求出来的呢?

浮点数在内存中的表示方法

浮点数在内存中的表示方法 浮点数保存的字节格式如下: 地址+0 +1 +2 +3 内容SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 这里 S 代表符号位,1是负,0是正 E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。 M 24位的尾数保存在23位中,只存储23位,最高位固定为1。此方法用最较少的位数实现了 较高的有效位数,提高了精度。 零是一个特定值,幂是0 尾数也是0。 浮点数-12.5作为一个十六进制数0xC1480000保存在存储区中,这个值如下:地址+0 +1 +2 +3 内容0xC1 0x48 0x00 0x00 浮点数和十六进制等效保存值之间的转换相当简单。下面的例子说明上面的值-12.5如何转换。浮点保存值不是一个直接的格式,要转换为一个浮点数,位必须按上面的浮点数保存格式表 所列的那样分开,例如: 地址+0 +1 +2 +3 格式SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 二进制11000001 01001000 00000000 00000000 十六进制C1 48 00 00 从这个例子可以得到下面的信息: 符号位是1 表示一个负数 幂是二进制10000010或十进制130,130减去127是3,就是实际的幂。尾数是后面的二进制数10010000000000000000000 在尾数的左边有一个省略的小数点和1,这个1在浮点数的保存中经常省略,加上一个1和小数 点到尾数的开头,得到尾数值如下: 1.10010000000000000000000

接着,根据指数调整尾数.一个负的指数向左移动小数点.一个正的指数向右移动 小数点.因为 指数是3,尾数调整如下: 1100.10000000000000000000 结果是一个二进制浮点数,小数点左边的二进制数代表所处位置的2的幂,例如:1100表示 (1*2^3)+(1*2^2)+(0*2^1)+(0*2^0)=12。 小数点的右边也代表所处位置的2的幂,只是幂是负的。例如:.100...表示 (1*2^(-1))+ (0*2^(-2))+(0*2^(-2))...=0.5。 这些值的和是12.5。因为设置的符号位表示这数是负的,因此十六进制值 0xC1480000表示-12.5。 所有的C/C++编译器都是按照IEEE(国际电子电器工程师协会)制定的IEE E 浮点数表示法来进行运算的。这种结构是一种科学表示法,用符号(正或负)、指数和尾数来表示,底数被确定为2,也就是说是把一个浮点数表示为尾数乘以2的指数次方再加上符号。下面来看一下具体的规格: 符号位指数位小数部分 指数偏移量单精度浮点数 1 位[31] 8位 [30-23] 23位 [22-00] 127 双精度浮点数 1 位[63] 11 位[62-52] 52 位[51-00] 1023 我们以单精度浮点数来说明: 指数是8位,可表达的范围是0到255 而对应的实际的指数是-127到+128 这里特殊说明,-127和+128这两个数据在IEEE当中是保留的用作多种用途的 -127表示的数字是0 128和其他位数组合表示多种意义,最典型的就是NAN状态

浮点数1

浮点数在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。 浮点计算是指浮点数参与的运算,这种运算通常伴随着因为无法精确表示而进行的近似或舍入。 一个浮点数a由两个数m和e来表示:a = m × be。在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。m(即尾数)是形如±d.ddd...ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。如果m的第一位是非0整数,m称作规格化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。 这种设计可以在某个固定长度的存储空间内表示定点数无法表示的更大范围的数。 例如,一个指数范围为±4的4位十进制浮点数可以用来表示43210,4.321或0.0004321,但是没有足够的精度来表示432.123和43212.3(必须近似为432.1和43210)。当然,实际使用的位数通常远大于4。 此外,浮点数表示法通常还包括一些特别的数值:+∞和?∞(正负无穷大)以及NaN('Not a Number')。无穷大用于数太大而无法表示的时候,NaN则指示非法操作或者无法定义的结果。 大部份计算机采用二进制(b=2)的表示方法。位(bit)是衡量浮点数所需存储空间的单位,通常为32位或64位,分别被叫作单精度和双精度。有一些计算机提供更大的浮点数,例如英特尔公司的浮点运算单元Intel8087协处理器(以及其被集成进x86处理器中的后代产品)提供80位长的浮点数,用于存储浮点运算的中间结果。还有一些系统提供128位的浮点数 浮点数的表示 在实际应用中,往往会使用实数,例如下面的一些十进制实数: 179.2356=0.1792356x10^3 0.000000001=0.1x10^8 3155760000=0.215576x10^6 很明显,上述第一个数既有整数也有小数,不能用定点数格式化直接表示,后两个数则可能超出了定点数的表示范围,所以计算机引入了类似与科学表示法来标示实数。 (1)典型的浮点数格式 在机器中,典型的浮点数格式如图所示 浮点数代码由两部分组成:阶码E和尾数M。浮点数真值为: N=+/-(R^E)xM R是阶码的底。在机器中一般规定R为2,4,8或16,与尾数的基数相同。例如尾数为二进制,则R也为2。同一种机器的R值是固定不变的,所以不需要在浮点数代码中表示出来,他是隐含约定的。因此,机器中的浮点数只需表示出阶码和尾数部分。 E是阶码,即指数值,为带符号整数,常用移码或补码表示。 M是尾数,通常是纯小数,常用原码或补码表示。

浮点数的表示和计算

《计算机组成原理》实验报告

sw $aO, O($fp) #calculate the first nu mber andi $s2, $s0, 0x80000000 # s2 is the sig n srl $s2, $s2, 31 andi $s3, $s0, 0x7f800000 # s3 is the exp onent srl $s3, $s3, 23 andi $s4, $s0, 0x007fffff # s4 is the fractio n addi $s4, $s4, 0x00800000 #calculate the seco nd number andi $s5, $s1, 0x80000000 # s5 is the sig n srl $s5, $s5, 31 andi $s6, $s1, 0x7f800000 # s6 is the exp onent srl $s6, $s6, 23 andi $s7, $s1, 0x007fffff # s7 is the fractio n addi $s7, $s7, 0x00800000 sub $t0, $s3, $s6 bit $t0, 0, sumL1 # add sub bgt $t0, 0, sumL2 # sub add beq $t0, 0, sumL3 2.减法指令如下: mysub: subu $sp, $sp, 32 sw $ra, 20($sp) sw $fp, 16($sp) addiu $fp, $sp, 28 sw $a0, 0($fp) #calculate the first nu mber andi $s2, $s0, 0x80000000 # s2 is the sig n srl $s2, $s2, 31 andi $s3, $s0, 0x7f800000 # s3 is the exp onent srl $s3, $s3, 23 andi $s4, $s0, 0x007fffff # s4 is the fractio n addi $s4, $s4, 0x00800000 #calculate the seco nd number xori $s5, $s1, 0x80000000 # s5 is the sig n srl $s5, $s5, 31 andi $s6, $s1, 0x7f800000 # s6 is the exp onent srl $s6, $s6, 23 andi $s7, $s1, 0x007fffff # s7 is the fractio n addi $s7, $s7, 0x00800000 sub $t0, $s3, $s6 blt $t0, 0, subL1 # +,- bgt $t0, 0, subL2 # -,+ beq $t0, 0, subL3 # +,+ or -,- 3.乘法指令如下: mutilStart: srl $t2, $s0, 31 srl $t3, $s1, 31 sll $t4, $s0, 1

浮点数表示方法的分析研究

浮点数表示方法的分析研究.txt13母爱是迷惘时苦口婆心的规劝;母爱是远行时一声殷切的叮咛;母爱是孤苦无助时慈祥的微笑。 浮点数表示方法的分析研究 [日期:2006-06-10] 来源:作者: [字体:大中小] 摘要:在《计算机组成原理》课程的教学中,浮点数的表示与运算是一个重点,也是难点。本文对浮点数的一般表示及标准表示的方法、范围、存储格式等进行了比较深入地比较、分析和研究,力求给读者一个清晰的概述。 关键词:浮点数,表示方法,符号,尾数,阶码,范围 《计算机组成原理》课程是计算机科学与技术专业的一门必修专业基础课,主要是讲述计算机系统几大硬件的组成结构和工作原理。在其核心部件——运算器(Arithmetician)的运算机制中,浮点数(Floating-point)的表示与运算方法是一个重点,也是难点,笔者在查阅了大量中外文文献的基础上,根据多年的教学实践经验,对浮点数的表示方法、规格化处理方法、表示范围进行了比较详细地分析研究,以方便学生的学习,共同行们参考。 1、浮点数的一般表示方法 在数学中,表示一个浮点数需要三要素:尾数(mantissa)、指数(exponent,又称阶码)和基数(base),都用其第一个字母来表示的话,那么任意一个浮点数N可以表示成下列形式:N=M×BE,例如N1=1.234×10-6, N2= -0.001011×2011等,同样的数字对于不同的基数是不相同的,移动小数点的位置,其指数相应地跟着变化。在计算机中,表示一个浮点数,同样需要以上三要素,只是阶码与尾数一同存储,基数常有2、8、16等数值,下面的讨论以2为基数进行。 将浮点数放在计算机中存储时,尾数M用定点(Fixed-point)小数的形式,阶码E用有符号整数形式,改变M中小数点的位置,同时需要修改E的值,可以给出有效数字(significant number)的位数,因此M和E决定了浮点数的精度(precision),E指明小数点在B进制数据中的位置,因而E和B决定了浮点数的表示范围(range),浮点数的符号(Sign)是单独考虑,设阶码有m+1位,尾数有n+1位,则一般浮点数的表示方法如图1所示,其中,下标s代表符号位,下标数字代表数字所处的位数,尾数的小数点默认最高数字位M1之前。图(b)是将尾数的符号位提在最前面,其它部分与图(a)一样,是目前常用的一种表示形式。 图1 浮点数的一般表示形式 在这种表示方法中,阶码的二进制编码(binary code)一般是原码(sign magnitude)、补码(twos complement)或移码(bias),尾数的编码一般是原码或补码。 2、浮点数的规格化处理 在浮点数系统中,小数点的浮动使数值的表示不能惟一,从而给数据处理带来困难,因此有必要使浮点数的表示与存储有一定的标准,考虑到阶码、尾数之间的关系,常将尾数的最高数字位是有效值的数值称为规格化(normalization),由于尾数可以是原码或补码,所以有两种规格化的形式,如表1所示。

浮点数表示方法与运算

在计算机系统的发展过程中,曾经提出过多种方法表达实数,典型的比如定点数。在定点数表达方式中,小数点位置固定,而计算机字长有限,所以定点数无法表达很大和很小的实数。最终,计算机科学发展出了表达范围更大的表达方式——浮点数,浮点数也是对实数的一种近似表达。 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的数称为规格化数。即当尾数的最高有效位S 1=1,[S]原=S f 1S 2S 3…S n ,表示该浮点数为规格化数。对0.001001×25进行规格化后,表示为0.100100×23。 3.浮点数的表示范围 求浮点数的表示范围,实质是求浮点数所能表示的最小负数、最大负数、最小正数和最大正数。

16位浮点数编码器

一、实验名称:16位浮点数编码器 二、实验要求: 1) 将一个16位的二进制数转化为含有4位有效数、4为指数的浮点数。 2) 输入为16为的二进制数,输出为4位尾数部和4位指数,暂时不考虑截断误 差。 三、实验原理: 1) 浮点数理论 浮点数的表示由两部分组成,第一部分为尾数部,第二部分为指数部。例如,0.0031207表示为浮点数就是323.12100.31210--??或者,其中,前者中的3.12和后者中的0.312为尾数部,前者中的-3和后者中的-2为指数部。但是由于忽略了后面的部分,所以会产生截断误差。 同理,二级制数转化为浮点数,就是把尾数部和指数部都表示为二进制形式,而且指数的底数也是2,例如: 1101011010001000=1101×2∧1100+011010001000 0010010111100000=1001×2∧1010+0111100000 0000000001010000=1010×2∧0011+0 其中,1101、1001、1010为尾数部,1100、1010、0011为指数部。统一表示为 E B M 2+T =?。 3) 设计思路 a) 如何确定第一个“1”的位置? 解答:使用16-4优先编码器, 16-4编码可以使用两个74X148优先编码器构成。如右图1所示 b) 如何确定4位指数? 解答:优先编码器的输出可以实现指数部的输出。为此,定点数最高位B15应该接在优先编码器的I12,而优先编码器的I0接定点数的B3。从B15到B3依次只有到B3还没有出现1时,浮点数的指数才为0。 c) 如何从第一个“1”开始依次选出4位M3M2M1M0? 解答:通常M3=1,只有当B15-B3全为0时,M3=0,因此M3可由GS 端获得。正常输出为正逻辑1。使用16选1多路复用器,分别改变16-4优先编码器的数据输入端连接可以得到M2M1M0。16选1多路复用器可以由两个72X151来实现。如图2所示

数的定点表示和浮点表示

计算机处理的数值数据多数带有小数,小数点在计算机中通常有两种表示方法,一种是约定所有数值数据的小数点隐含在某一个固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。 1. 定点数表示法(fixed-point) 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。在计算机中通常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数,后者为定点整数。 定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据x的形式为x=x0.x1x2… xn(其中x0为符号位,x1~xn是数值的有效部分,也称为尾数,x1为最高有效位),则在计算机中的表示形式为: 一般说来,如果最末位xn= 1,前面各位都为0,则数的绝对值最小,即|x|min= 2-n。如果各位均为1,则数的绝对值最大,即|x|max=1-2-n。所以定点小数的表示范围是:

2-n≤|x|≤1 -2-n 定点整数是纯整数,约定的小数点位置在有效数值部分最低位之后。若数据x的形式为x=x0x1x2…xn(其中x0为符号位,x1~xn是尾数,xn为最低有效位),则在计算机中的表示形式为: 定点整数的表示范围是: 1≤|x|≤2n-1 当数据小于定点数能表示的最小值时,计算机将它们作0处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出。 计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据比例因子,还原

IEEE浮点数表示法

IEEE浮点数表示法 ------------------------------------------------- float 共计32位(4字节) 由最高到最低位分别是第31、30、29、 0 31位是符号位,1表示该数为负,0反之 30~23位,一共8位是指数位(-128~127) 22~ 0位,一共23位是尾数位 每8位分为一组,分成4组,分别是A组、B组、C组、D组 每一组是一个字节,在内存中逆序存储,即: DCBA 31 30 23 22 0 |-|--------|-----------------------| | | || |-|--------|-----------------------| 注: 尾数的存储位为23位,由于没有存储最高位的1,所以实际有效位为24位。如果其中20位都用来表示小数部分,能表示的最大值为0.999999 我们先不考虑逆序存储的问题,因为那样会把读者彻底搞晕,所以我先按照顺序的来讲,最后再把他们翻过来就行了。

纯整数的表示方法 ------------------------------------------------- 现在让我们按照IEEE浮点数表示法,一步步的将float型浮点数123456.0f转换为十六进制代码。在处理这种不带小数的浮点数时,直接将整数部转化为二进制表示: 1 11100010 01000000 也可以这样表示: 1 11100010 01000000.0 然后将小数点向左移,一直移到离最高位只有1位: 1.11100010 01000000 一共移动了16位,在布耳运算中小数点每向左移一位就等于在以2为底的科学计算法表示中指数+1,所以原数就等于这样 1 11100010 01000000 = 1.11100010 01000000 * (2^16) 现在我们要的尾数和指数都出来了。显而易见,最高位永远是1,因为你不可能把买了16个鸡蛋说成是买了0016个鸡蛋吧?(呵呵,可别拿你买的臭鸡蛋甩我),所以这个1我们还有必要保留他吗?(众:没有!)好的,我们删掉他。这样尾数的二进制就变成了: 11100010

计算机组成原理-浮点数表述范围

以32位的浮点数为例 浮点数有一般的格式和IEEE754的格式两种。 一般的格式符合2进制数机器码(包括定点整数和定点小数)的规定规则 IEEE表示则是为了实现上的方便,做了一些约定的格式改变。 先说说问题的描述方式: 1、一个32位的二进制数来表示的浮点数。都是由阶和尾数两部分组成。阶和尾数都带有一位符号位,分别称为阶符和数符。 2、从图例表示可以有两种方式: (1)一种是阶和尾数分别带着符号位表示,依次为阶符(ES)、阶(E)、数符(MS)和尾数(M) (2)另一种是把数符提前到整个浮点数的最前面,表示整个浮点数的符号位,标记为S。 这两种表示方式是一致的。前者比较直接明了地分隔成“阶”(包括阶符和阶)和“尾数”(包括数符和尾数)两部分;后者则是为了便于软件移植的格式。 比较流行的教材的新版本都倾向于使用后一种表示方式。 因此,下面开始,我们都采用后一种方式叙述。

3、从真值的表示方式来说有多种不同的情况 符号位统一都是:(-1)s 一般表示法的阶:e=E-128(完全符合机器码的移码规则)。该部分在真值中表示为2E-128,注意,E为带符号位的阶所表示的无符号数大小。比如8位阶(包含一位符号位),以移码表示,以11111111为例,E=255,而e=127,在真值中表示为2127。 IEEE表示法的阶:e=E-127(是IEEE的一个约定,不符合机器码的移码规则)。该部分在真值中表示为2E-127,注意,E为带符号位的阶所表示的无符号数大小。比如8位阶(包含一位符号位),以移码表示,以11111111为例,E=255,而e=128,在真值中表示为2128。 一般表示法的尾数:M,该部分在真值中以M表示,规划化处理是使得M 的最高位和符号位不同值,或者说用异或判断结果为1(其本质在于使得该数值的绝对值≥0.5)。 IEEE表示法的尾数:1.M,该部分在真值中以1.M表示,因为IEEE表示方式本来就是一种标准格式,所以不存在不是规格化的数。其中尾数域的小数点前约定的那个1不予存储,默认其隐藏在小数点的左边。 因此,一般表示法和IEEE表示法就可以组成四种组合真值表示。 (1)纯一般表示法(阶和尾数都是一般表示法)真值表示为:(-1)s?M?2E-128 (2)纯IEEE表示法(阶和尾数都是IEEE表示法)真值表示为:(-1)s?(1.M)?2E-127 (3)混合表示法A(阶位一般表示法,尾数都是IEEE表示法)真值表示为:(-1)s?(1.M)?2E-128,课本例9就是用了这种混合表示法。 (2) 混合表示法B(阶位IEEE表示法,尾数都是一般表示法)真值表示为:(-1)s?M?2E-127 注意:如果题目没有做明确描述。就默认其采用的是“纯一般表示法”。 弄清楚问题的描述方式后,我们来看看各种表示方法的表数范围。 分别从一般表示法的阶和尾数,IEEE的阶和尾数,4个组成部分来分析。

相关文档
相关文档 最新文档