文档库 最新最全的文档下载
当前位置:文档库 › 算机浮点数算术运算的舍入误差研究

算机浮点数算术运算的舍入误差研究

算机浮点数算术运算的舍入误差研究
算机浮点数算术运算的舍入误差研究

位单精度浮点数的IEEE表示法

32位单精度浮点数的IEEE表示法 float 共计32位(4字节) 31位是符号位,1表示该数为负,0反之 30~23位,一共8位是指数位(-128~127) 22~ 0位,一共23位是尾数位,尾数的编码一般是原码和补码 IEEE标准从逻辑上用三元组{S,E,M}表示一个数N,如下图所示: n,s,e,m分别为N,S,E,M对应的实际数值,而N,S,E,M仅仅是一串二进制位。其中, S(sign)表示N的符号位。对应值s满足:n>0时,s=0; n<0时,s=1。E(exponent)表示N的指数位,位于S和M之间的若干位。对应值e值也可正可负。 M(mantissa)表示N的尾数位,恰好,它位于N末尾。M也叫有效数字位(sinificand)、系数位(coefficient), 甚至被称作“小数”。

IEEE标准754规定了三种浮点数格式:单精度、双精度、扩展精度。前两者正好对应C语言里头的float、double或者FORTRAN里头的real、double精度类型。限于篇幅,本文仅介绍单精度、双精度浮点格式。★单精度:N共32位,其中S占1位,E占8位,M占23位。 ★双精度:N共64位,其中S占1位,E占11位,M占52位。 值得注意的是,M虽然是23位或者52位,但它们只是表示小数点之后的二进制位数,也就是说,假定 M为“010110011...”, 在二进制数值上其实是“.010110011...”。而事实上,标准规定小数点左边还有一个隐含位,这个隐含位通常,哦不,应该说绝大多数情况下是1,那什么情况下是0呢?答案是N 对应的n非常小的时候,比如小于 2^(-126)(32位单精度浮点数)。不要困惑怎么计算出来的,看到后面你就会明白。总之,隐含位算是赚来了一位精度,于是M对应的m最后结果可能是"m=1.010110011...”或者“m=0.010110011...” 计算e、m 首先将提到令初学者头疼的“规格化(normalized)”、“非规格化(denormalized)”。掌握它以后你会发现一切都很优雅,更美妙的是,规格化、 非规格化本身的概念几乎不怎么重要。请牢记这句话:规格化与否全看指数E! 下面分三种情况讨论E,并分别计算e和m: 1、规格化:当E的二进制位不全为0,也不全为1时,N为规格化形式。此时e被解释为表示偏置(biased)形式的整数,e值计算公式如下图所示: 上图中,|E|表示E的二进制序列表示的整数值,例如E为"10000100",则 |E|=132,e=132-127=5 。 k则表示E的位数,对单精度来说,k=8,则bias=127,对双精度来说,k=11,则bias=1023。 此时m的计算公式如下图所示: 标准规定此时小数点左侧的隐含位为1,那么m=|1.M|。如M="101",则 |1.M|=|1.101|=1.625,即 m=1.625 2、非规格化:当E的二进制位全部为0时,N为非规格化形式。此时e,m 的计算都非常简单。

浮点数的表示和基本运算

浮点数的表示和基本运算 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长度来反映无限的实数集合,因此大多数情况下都是一个近似值。同时,对于浮点数的运算还同时伴有误差扩散现象。特定精度下看似

单精度浮点数与机器精度解析

单精度浮点数与机器精度解析 一、单精度浮点数 先来简单了解一下浮点数在计算机中的存储方式。根据IEEE 754标准,单精度浮点数格式如下(所有位取0): 各部分解释 单精度浮点数有32个二进制位,左侧是高位,右侧是低位。最高位被指定为符号位,0代表正数,1代表负数。指数部分将是2的幂次,其编码值(即上表指数部分对应的八个二进制位)规定为指数的实际值加上偏移值2^7-1=127,这是为了避免负数,将[-127, 128]映射到[0, 255],这样指数部分编码就可以简单地编排为[00000000, 11111111]。例如指数部分为00001000,十进制为8。那么其所代表的实际指数是8-127=-119,即要乘上2-119。最后23位尾数是不包含整数位的实际有效小数位。规约数的整数位是1,非规约数的整数位是0。 规约形式的浮点数与非规约形式的浮点数 指数部分的编码值在[1, 2e-2]内,且尾数部分的整数位是1,这样的浮点数被称为规约形式的浮点数。 指数部分的编码值为0,尾数非零,这样的浮点数被称为非规约形式的浮点数。 规约浮点数的尾数∈[1, 2),而非规约浮点数的尾数∈(0, 1)。需要注意,非规约数指数编码为00000000,但指数实际值是-126,而非-127。非规约浮点数被IEEE 754-1985标准采用是因为它的渐进式下溢出,而规约浮点数将导致突然式下溢出,具体原理不再展开。 实际计算 设符号位为s。sign(s)确定正负:sign(0)=1,sign(1)=-1;指数部分为e;尾数部分为f。用(N)2表示二进制数N。 规约形式:sign(s)*2e-127*(1.f)2 非规约形式:sign(s)*2-126*(0.f)2 特殊值和极值

浮点数

浮点数 浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。 浮点计算是指浮点数参与的运算,这种运算通常伴随着因为无法精确表示而进行的近似或舍入。 一个浮点数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是指数。 由此可以看出,在计算机中表示一个浮点数,其结构如下: 这种设计可以在某个固定长度的存储空间内表示定点数无法表示的更大范围的数。 例如,一个指数范围为±4的4位十进制浮点数可以用来表示43210,4.321或0. 0004321,但是没有足够的精度来表示432.123和43212.3(必须近似为432.1和4 3210)。当然,实际使用的位数通常远大于4。 此外,浮点数表示法通常还包括一些特别的数值:+∞和?∞(正负无穷大)以及NaN('Not a Number')。无穷大用于数太大而无法表示的时候,NaN则指示非法操作或者无法定义的结果。 众所周知,计算机中的所有数据都是以二进制表示的,浮点数也不例外。然而浮点数的二进制表示法却不像定点数那么简单了。 先澄清一个概念,浮点数并不一定等于小数,定点数也并不一定就是整数。所谓浮点数就是小数点在逻辑上是不固定的,而定点数只能表示小数点固定的数值,具用浮点数或定点数表示某哪一种数要看用户赋予了这个数的意义是什么。 C++中的浮点数有6种,分别是: float:单精度,32位 unsigned float:单精度无符号,32位 double:双精度,64位 unsigned double:双精度无符号,64位 long double:高双精度,80位 unsigned long double:高双精度无符号,80位(嚯,应该是C++中最长的内置类型了吧!)

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

浮点数的表示和运算 浮点数的表示和基本运算 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 那么这些值是如何求出来的呢?

浮点数加法运算

浮点加减运算 对任意一个二进制数N,总可以表示成:N=2E×M ,式中,E为数N的阶码,M称为数N的尾数,一般为绝对值小于1的规格化数(补码是允许为-1)。 两浮点数X,Y进行加减运算时,必须按以下几步执行: ①对阶,使两数的小数点位置对齐,小的阶码向大的阶码看齐。 ②尾数求和,将对阶后的两尾数按定点加减运算规则求和(差)。 ③规格化,为增加有效数字的位数,提高运算精度,必须将求和(差)后的尾数规格化。 ④舍入,为提高精度,要考虑尾数右移时丢失的数值位。 ⑤判断结果,即判断结果是否溢出。 规格化又分左规和右规两种 (1) 左规。当尾数出现00.0××…×或11.1××…×时,需左规。左规时尾数左移一位,阶码减1,直到符合补码规格化表示式为止(2) 右规。当尾数出现01.××…×或10.××…×时,表示尾数溢出,这在定点加减运算中是不允许的,但在浮点运算中这不算溢出,可 通过右规处理。右规时尾数右移一位,阶码加1. 例,两浮点数x=2+010 ×0.110100,y=2+100 ×(-0.101010),求x+y。 解:阶码取3位,尾数取6位(均不包括符号位),机器表示的形式分别为[x]补= 0010 0110100 [y]补= 0100 1010110 ①对阶:先求阶差(两阶码的补码相减) 00 010 + 11 100 (减00 100 就是加—00100的补码,即11 100) 11 110 其真值为-2,即x的阶码比y的阶码小2 [x] 补的阶码增大成0100,尾数右移两位,即[x] 补 = 0100 0001101 ②尾数相加 00.001101 + 11.010110 11.100011 相加结果为0100 1 100011 ③规格化: 最高有效位与符号位相同,需要左规,所以结果应为: [x+y] 补 = 0011 1 000110 x+y = 2+011 ×(-0.111010) 4.舍入 在对阶和右规的过程中,可能会将尾数的低位丢失,引起误差,影响了精度,为此可用舍入法来提高尾数的精度。常用的舍入方法有三种。 (1)截去法。将多余的位截去,剩下的位不变。其最大误差接近于数据最低位上的1。

单精度浮点数的转换和解析

1 单精度浮点数的转换和解析 工业现场通信经常遇到浮点数解析的问题,如果需要自己模拟数据而又不懂浮点数解析的话会很麻烦!很久以前根据modbus 报文格式分析得到的,供大家参考。 浮点数保存的字节格式如下: 地址 +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

浮点数的表示和计算

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

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

单精度浮点乘法器

EDA/SOPC课程设计报告题目:单精度浮点乘法器 姓名:张恺 学号:120260230 同组人:刘龙 指导教师:王晨旭 成绩:

目录 目录................................................................................................................................................... II 第1章课程设计的要求 . (1) 1.1 课程设计的目的 (1) 1.2 课程设计的条件 (1) 1.3 课程设计的要求 (1) 第2章课程设计的内容 (2) 2.1 设计思路 (2) 2.1.1 符合IEEE-754标准的单精度浮点乘法器规格 (2) 2.1.2 操作数类型 (2) 2.1.3 运算规则 (3) 2.1.4 逻辑门级框图 (3) 2.2 软件流程图 (4) 2.3 HDL代码阐述 (6) 2.4 Modelsim验证 (10) 2.4.1 验证代码 (10) 2.4.2 验证波形 (12) 2.5 硬件调试 (12) 2.5.1 基本说明 (12) 2.5.2 具体操作 (13) 2.6 虚拟机下的DC综合 (17) 2.7 虚拟机下的SDF反标仿真 (19) 第3章课程设计的心得 (20)

第1章课程设计的要求 1.1 课程设计的目的 ●通过课堂所讲授的内容以及私下查阅资料,自主完成课程设计的题目,提高编 程能力,培养用计算机解决实际问题的能力,积累调试程序的经验,更好的消化 老师课堂所讲授的内容,对Verilog这种语言也有了更深的了解; ●掌握较大工程的基本开发技能; ●培养综合运用Modelsim,ISE,Debussy工具进行硬件开发的能力; ●培养数字系统设计的基本能力; ●通过课设积累起的编程以及硬件的能力对于今后的考研抑或是找工作都有非常实 际性的效果; 1.2 课程设计的条件 ●设计条件1:gVim编辑器以及Mentor公司开发的FPGA仿真软件Modelsim; ●设计条件2:Xilinx公司开发的硬件设计工具ISE以及Xilinx公司的开发板; ●设计条件3:虚拟机环境下的Linux系统具有的Design Compiler工具; ●设计条件4:虚拟机环境下的Linux系统具有的SDF工具以及Debussy工具; 1.3 课程设计的要求 ●设计要求1:能够在Modelsim工具下正确的完成程序的编译以及成功的实现波 形的仿真; ●设计要求2:能够在ISE工具下正确的完成程序的综合以及合理的绑定管脚并成 功的将程序下载到开发板里,在开发板中实现程序的功能; ●设计要求3:能够在虚拟机的Linux系统下采用Design Compiler完成逻辑综 合,并且评估其时序面积; ●设计要求4:能够在虚拟机的Linux系统下完成SDF反标仿真;

单双精度浮点数的IEEE标准格式

单双精度浮点数的IEEE标准格式 目前大多数高级语言(包括C)都按照IEEE-754标准来规定浮点数的存储格式,IEEE754规定,单精度浮点数用4字节存储,双精度浮点数用 8字节存储,分为三个部分:符号位、阶和尾数。阶即指数,尾数即有效小数位数。单精度格式阶占8位,尾数占24位,符号位1位,双精度则为11为阶,53 位尾数和1位符号位,如下图所示: 31 30 23 22 0 63 62 52 51 0 细心的人会发现,单双精度各部分所占字节数量比实际存储格式都了一位,的确是这样,事实是,尾数部分包括了一位隐藏位,允许只存储23位就可以表示24位尾数,默认的1位是规格化浮点数的第一位,当规格化一个浮点数时,总是调整它使其值大于等于1而小于2,亦即个位总是为1。例如1100B,对其规格化的结果为1.1乘以2的三次方,但个位1并不存储在23位尾数部分内,这个1是默认位。 阶以移码的形式存储。对于单精度浮点数,偏移量为127(7FH),而双精度的偏移量为1023(3FFH)。存储浮点数的阶码之前,偏移量要先加到阶码上。前面例子中,阶为2的三次方,在单精度浮点数中,移码后的结果为127+3即130(82H),双精度为1026(402H)。 浮点数有两个例外。数0.0存储为全零。无限大数的阶码存储为全1,尾数部分全零。符号位指示正无穷或者负无穷。 下面举几个例子:

所有字节在内存中的排列顺序,intel的cpu按little endian顺序,motorola 的cpu按big endian顺序排列。

IEEE754标准的一个规格化 32位浮点数x的真值可表示为 x=(-1)^S*(1.M)*2^(E-127)e=E-127 31 30 23 0 |S | E |M | [例1]若浮点数x的754标准存储格式为(41360000)16,求其浮点数的十进制数值。 解:将16进制展开后,可得二进制数格式为 0 100,0001,0 011,0110,0000,0000,0000,0000 S E M 指数e=100,0001,0-01111111=00000011=(3)10 包含隐藏位1的尾数1.M=1.011,0110,0000,0000,0000,0000 于是有x=(-1)^0*(1.M)*2^(E-127) =+(1.011011)2*2^3 =(11.375)10 [例2]将数(20.59375)10转化为754标准的32位浮点数的二进制存储格式。解:首先分别将整数部分和小数部分转换成二进制 (20.59375)10=+(10100.10011)2 然后移动小数点使其在1,2位之间 10100.10011=1.010010011*2^4 e=4 于是得到:S=0,E=e+127=131,M=010010011 最后得到32位浮点数的二进制存储格式为 0 100,0001,1 010,0100,1100,0000,0000,0000 =(41A4C000)16 从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以double能存储更高的精度。 任何数据在内存中都是以二进制(0或1)顺序存储的,每一个1或0被称为1位,而在 x86CPU上一个字节是8位。比如一个16位(2字节)的 short int型变量的值是1000,那么它的二进制表达就是:00000011 11101000。由于Intel CPU的架构原因,它是按字节倒序存储的,那么就因该是这样:11101000 00000011,这就是定点数1000在内存中的结构。 目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格: ````````符号位阶码尾数长度 float 1 8 23 32 double 1 11 52 64

浮点数范围

任意精度的浮点数的二进制码的构成如下: 符号位|阶码|尾数 任意精度浮点数的二进制码转换成十进制数的计算公式: ()()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.浮点数表达方式 我们知道任何一个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.浮点数的表示范围 求浮点数的表示范围,实质是求浮点数所能表示的最小负数、最大负数、最小正数和最大正数。

浮点数加减运算课件

如果一个二进制浮点数的尾数的绝对值小于1并且大于等于0.5,(1>|尾数|≥0.5),那么这个二进制浮点数就是一个规格化的浮点数。 用二进制补码表示1个规格化的浮点数,并且规格化的浮点数的尾数只有一个符号位时: 规格化的浮点数的尾数是正数时应该是0 . 1 X X X X X X X X X ……的形式 (0表示符号位,X表示0或1中的任意一个数值) 规格化的浮点数的尾数是负数时应该是1 . 0 X X X X X X X X X ……的形式 (1表示符号位,X表示0或1中的任意一个数值) 用二进制补码表示1个规格化的浮点数,并且规格化的浮点数的尾数只有两个符号位时: 规格化的浮点数的尾数是正数时应该是00 . 1 X X X X X X X X X ……的形式 (00表示符号位,X表示0或1中的任意一个数值) 规格化的浮点数的尾数是负数时应该是11 . 0 X X X X X X X X X ……的形式 (11表示符号位,X表示0或1中的任意一个数值) 两个浮点数加减法的计算结果必须规格化,如果不是规格化的数,则要通过修改阶码并同时左移或者右移尾数,使其变为规格化的数。 [例] x=2010×0.11011011,y=2100×-0.10101100,浮点数均以补码表示,阶码采用双符号位,尾数采用单符号位。求x+y 。 答: (步骤1)转换成题目中要求的浮点数格式: 浮点数x=2010×0.11011011的阶码是+010,尾数是+0.11011011 浮点数均以补码表示,所以阶码以补码表示,并且阶码采用双符号位, [x]浮的阶码=00010(00是两个符号位) 浮点数均以补码表示,所以尾数以补码表示,并且尾数采用单符号位, [x]浮的尾数=0.11011011(0是1个符号位)

浮点数计算方式

2.3.4二进制转10进制及10进制转为二进制 【例2-3-4】 把二进制110.11转换成十进制数,及十进制转为二进制。 解: (110.11)2 =1×22+1×21+1×20+1×2-1+1×2-2 =4+2+0+0.5+0.25=(6.75)10 把十进制转换为二进制 解: 2 6 0 2 3 1 1 1 所以实数部分为110 0.75×(2×2-1)=0.75×2×2-1 =1×2-1+0.5×2-1 =1×2-1+1×2-2 所以结果为:(110.11)2 2.3.5 浮点数在计算机中存储形式 当前主流微机中广泛采用的IEEE754标准浮点格式。 按IEEE754标准,常用的浮点数(32位短实数)的格式如图2-3所示。

IEEE754标准浮点格式 N=2e.M (M为浮点尾数,为纯小数,e为浮点数的指数(阶码))尾数部分决定了浮点数的精度,阶码决定了表示范围32为浮点数(IEEE754标准格式0—22为尾数M,23-30为阶码E,31为符号位S),阶码用移码表示。阶码E=指数真值e+127 规格化真值x=(-1)^S*(1.M)*2^(E-127) 将(82.25)10 转换成短浮点数格式。 1)先将(82.25)10 转换成二进制数 (82.25)10 =(1010010.01)2 2)规格化二进制数(1010010.01)2 1010010.01=1.01001001×2 6 尾数M=01001001 3)计算移码表示的阶码=偏置值+阶码真值: E=127+6=133=10000101 4)以短浮点数格式存储该数 因此:符号位=0 S=0表示该数为正数 阶码=10000101 由3)可得 尾数=01001001000000000000000 由2)可得;尾数为23位, 不足在后面添15位0 所以,短浮点数代码为: 0;10000101;01001001000000000000000 表示为十六进制代码为:42A48000H

IEEE_745浮点数标准

标题: 解读IEEE标准754:浮点数表示 一、背景 在IEEE标准754之前,业界并没有一个统一的浮点数标准,相反,很多计算机制造商都设计自己的浮点数规则,以及运算细节。那时,实现的速度和简易性比数字的精确性更受重视。 直到1985年Intel打算为其的8086微处理器引进一种浮点数协处理器的时候,聪明地意识到,作为设计芯片者的电子工程师和固体物理学家们,也许并不能通过数值分析来选择最合理的浮点数二进制格式。于是Intel在请加州大学伯克利分校的 William Kahan教授──最优秀的数值分析家之一来为8087 FPU设计浮点数格式; 而这个家伙又找来两个专家来协助他,于是就有了KCS组合(Kahn, Coonan, and Stone)。他们共同完成了Intel的浮点数格式设计,而且完成地如此出色,以致于IEEE组织决定采用一个非常接近KCS的方案作为IEEE的标准浮点格式。目前,几乎所有计算机都支持该标准,大大改善了科学应用程序的可移植性。 二、表示形式 从表面上看,浮点数也是一串0和1构成的位序列(bit sequence),并不是三头六臂的怪物,更不会咬人。然而IEEE标准从逻辑上用三元组{S,E,M}表示一个数N,如下图所示: N的实际值n由下列式子表示:

其中: ★ n,s,e,m分别为N,S,E,M对应的实际数值,而N,S,E,M仅仅是一串二进制位。 ★ S(sign)表示N的符号位。对应值s满足:n>0时,s=0; n<0时,s=1。 ★ E(exponent)表示N的指数位,位于S和M之间的若干位。对应值e值也可正可负。 ★ M(mantissa)表示N的尾数位,恰好,它位于N末尾。M也叫有效数字位(sinificand)、系数位(coefficient), 甚至被称作“小数”。 三、浮点数格式 IEEE标准754规定了三种浮点数格式:单精度、双精度、扩展精度。前两者正好对应C语言里头的float、double或者FORTRAN里头的real、double精度类型。限于篇幅,本文仅介绍单精度、双精度浮点格式。 ★ 单精度:N共32位,其中S占1位,E占8位,M占23位。 ★ 双精度:N共64位,其中S占1位,E占11位,M占52位。 值得注意的是,M虽然是23位或者52位,但它们只是表示小数点之后的二进制位数,也就是说,假定 M为“010110011...”, 在二进制数值上其实是“.010110011...”。而事实上,标准规定小数点左边还有一个隐含位,这个隐含位通常,哦不,应该说绝大多数情况下是1,那什么情况下是0呢?答案是N

十进制数和单精度浮点数的相互转换

将十进制数转换成浮点格式(real*4) [例1]: 十进制26.0转换成二进制 11010.0 规格化二进制数 1.10100*2^4 计算指数 4+127=131 符号位指数部分尾数部分 0 10000011 10100000000000000000000 以单精度(real*4)浮点格式存储该数0100 0001 1101 0000 0000 0000 0000 0000 0x41D0 0000 [例2]: 0.75 十进制0.75转换成二进制 0.11 规格化二进制数 1.1*2^-1 计算指数 -1+127=126 符号位指数部分尾数部分 0 01111110 10000000000000000000000 以单精度(real*4)浮点格式存储该数0011 1111 0100 0000 0000 0000 0000 0000 0x3F40 0000 [例3]: -2.5 十进制-2.5转换成二进制 -10.1 规格化二进制数 -1.01*2^1 计算指数 1+127=128 符号位指数部分尾数部分 1 10000000 01000000000000000000000 以单精度(real*4)浮点格式存储该数1100 0000 0010 0000 0000 0000 0000 0000 0xC020 0000

将浮点格式转换成十进制数 [例1]: 0x00280000(real*4) 转换成二进制 00000000001010000000000000000000 符号位指数部分(8位)尾数部分 0 00000000 01010000000000000000000 符号位=0;因指数部分=0,则:尾数部分M为m: 0.01010000000000000000000=0.3125 该浮点数的十进制为: (-1)^0*2^(-126)*0.3125 =3.6734198463196484624023016788195e-39 [例2]: 0xC04E000000000000(real*8) 转换成二进制1100000001001110000000000000000000000000000000000000000000000000 符号位指数部分(11位)尾数部分 1 10000000100 1110000000000000000000000000000000000000000000000000 符号位=1;指数=1028,因指数部分不为全'0'且不为全'1',则:尾数部分M为1+m:1.1110000000000000000000000000000000000000000000000000=1.875 该浮点数的十进制为: (-1)^1*2^(1028-1023)*1.875 =-60

浮点数(单精度浮点数与双精度浮点数)在计算机中的存储

浮点数在计算机中的存储 十进制浮点数格式: 浮点数格式使用科学计数法表示实数。科学计数法把数字表示为系数(coefficient)(也称为尾数(mantissa)),和指数(exponent)两部分。比如3.684*10^2. 在十进制中,指数的基数为10,并且表示小数点移动多少位以生成系数。每次小数点向前移动时,指数就递增;每次小数点向后移动时,指数就递减。例如,25.92 可表示为2.592 * 10^1,其中2.592 是系数,值10^1 是指数。必须把系数和指数相乘,才能得到原始的实数。另外,如0.00172 可表示为1.72*10^-3,数字1.72 必须和10^-3 相乘才能获得原始值。 二进制浮点格式: 计算机系统使用二进制浮点数,这种格式使用二进制科学计数法的格式表示数值。数字按照二进制格式表示,那么系数和指数都是基于二进制的,而不是十进制,例如1.0101*2^2. 在十进制里,像0.159 这样的值,表示的是0 + (1/10) + (5/100) + (9/1000)。相同的原则也适用二进制。比如,1.0101 乘以2^2 后,生成二进制值101.01 ,这个值表示二进制整数5,加上分数(0/2) + (1/4) 。这生成十进制值5.25 。下表列出几个二进制 编写二进制浮点值时,二进制通常被规格化了。这个操作把小数点移动到最左侧的数位,并且修改指针进行补偿。例如1101.011 变成1.101011*2^3 浮点数的存储 ?IEEE 标准754 浮点数标准使用3 个成分把实数定义为二进制浮点值: ?符号 ?有效数字

?指数 符号位表示值是负的还是正的。符号位中的1 表示负值,0 表示正值。 有效数字部分表示浮点数的系数(coefficient)(或者说尾数(mantissa))。系数可以是规格化的(normalized),也可以是非规格化的(denormalized)。所谓规格化,就是任何一个数的科学计数法的表示都可为1.xxx*2^n,既然小数点左边的一位都是1,就可以把这一位省略。单精度浮点数23bit的尾数部分,可表示的精度却为24位,道理就在这里。 指数表示浮点数的指数部分,是一个无符号整数。因为指数值可以是正值,也可以是负值,所以通过一个偏差值对它进行置偏,及指数的真实值=指数部分的整数—偏差值。对于32位浮点数,偏差值=127;对于64位浮点数,偏差值=1023. 浮点数的这3 个部分被包含在固定长度的数据格式之内。IEEE 标准754 定义了浮点数的两种长度:32位单精度和64位双精度 可以用于表示有效数字的位的数量决定精度。下图显示了两种不同精度类型的位布局: 单精度浮点使用23 位有效数字值。但是,浮点格式假设有效数字的整数部分永远为1 ,并且不在有效数字值中使用它。这样实际上有效数字的精度达到了24 位。指数使用8 位值,它的范围从0~255,称为移码指数,意思是必须从指数中减去一个数(称为偏移量或者是偏差值),对单精度浮点数而言,这个值是127 。当指数是0和255时,指数由别的含义,因此实际指数的范围是从-126 到+127 (二进制指数),这样整个浮点数的范围则为:(1.18 * 10^-38~1.0×2……-126 到3.40 * 10^38~1.1……1×2^127)。 ?指数0和255用于特殊用途。如果指数从1变化到254,则由s(符号位)、e(指数)和f(有效数)来表示的数为: ?

相关文档