DSP浮点运算

DSP浮点运算
DSP浮点运算

浮点数结构详解

附录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

浮点数的表示和基本运算

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

浮点数表示方法与运算

在计算机系统的发展过程中,曾经提出过多种方法表达实数,典型的比如定点数。在定点数表达方式中,小数点位置固定,而计算机字长有限,所以定点数无法表达很大和很小的实数。最终,计算机科学发展出了表达范围更大的表达方式——浮点数,浮点数也是对实数的一种近似表达。 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.浮点数的表示范围 求浮点数的表示范围,实质是求浮点数所能表示的最小负数、最大负数、最小正数和最大正数。

浮点数的加减乘除运算步骤

设两个浮点数X=Mx※2Ex Y=My※2Ey 实现X±Y要用如下5步完成: ①对阶操作:小阶向大阶看齐 ②进行尾数加减运算 ③规格化处理:尾数进行运算的结果必须变成规格化的浮点数,对于双符号位的补码尾数来说,就必须是001×××…×× 或110×××…××的形式, 若不符合上述形式要进行左规或右规处理。 ④舍入操作:在执行对阶或右规操作时常用“0”舍“1”入法将右移出去的尾数数值进行舍入,以确保精度。 ⑤判结果的正确性:即阶码是否溢出 若阶码下溢(移码表示是00…0),要置结果为机器0; 若阶码上溢(超过了阶码表示的最大值)置溢出标志。 例题:假定X=0 .0110011*211,Y=0.1101101*2-10(此处的数均为二进制)?? 计算X+Y;解:[X]浮:0 1010 1100110 [Y]浮:0 0110 1101101 符号位阶码尾数 第一步:求阶差:│ΔE│=|1010-0110|=0100 第二步:对阶:Y的阶码小,Y的尾数右移4位 [Y]浮变为0 1010 0000110 1101暂时保存 第三步:尾数相加,采用双符号位的补码运算 00 1100110 +00 0000110 00 1101100 第四步:规格化:满足规格化要求 第五步:舍入处理,采用0舍1入法处理 故最终运算结果的浮点数格式为:0 1010 1101101, 即X+Y=+0. 1101101*210

①阶码运算:阶码求和(乘法)或阶码求差(除法) 即[Ex+Ey]移= [Ex]移+ [Ey]补 [Ex-Ey]移= [Ex]移+ [-Ey]补 ②浮点数的尾数处理:浮点数中尾数乘除法运算结果要进行舍入处理 例题:X=0 .0110011*211,Y=0.1101101*2-10 求X※Y 解:[X]浮:0 1 010 ******* [Y]浮:0 0 110 1101101 第一步:阶码相加 [Ex+Ey]移=[Ex]移+[Ey]补=1 010+1 110=1 000 1 000为移码表示的0 第二步:原码尾数相乘的结果为: 0 10101101101110 第三步:规格化处理:已满足规格化要求,不需左规,尾数不变,阶码不变。第四步:舍入处理:按舍入规则,加1进行修正 所以X※Y= 0.1010111※2+000

浮点数计算方式

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

浮点数在计算机中的存储方式

C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE 的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。 无论是单精度还是双精度在存储中都分为三个部分: 1.符号位(Sign) : 0代表正,1代表为负 2.指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移 位存储 3.尾数部分(Mantissa):尾数部分 其中float的存储方式如下图所示: 而双精度的存储方式为: R32.24和R64.53的存储方式都是用科学计数法来存储数据的,比如8.25 用十进制的科学计数法表示就为:8.25*,而120.5可以表示 为:1.205*,这些小学的知识就不用多说了吧。而我们傻蛋计算机根本不认 识十进制的数据,他只认识0,1,所以在计算机存储中,首先要将上面的数更改为二进制的科学计数法表示,8.25用二进制表示可表示为1000.01,我靠,不会连这都不会转换吧?那我估计要没辙了。120.5用二进制表示为:1110110.1用二进制的科学计数法表示1000.01可以表示为

1.0001*,1110110.1可以表示为1.1101101*,任何一个数都的科学计 数法表示都为1.xxx*,尾数部分就可以表示为xxxx,第一位都是1嘛,干嘛还要表示呀?可以将小数点前面的1省略,所以23bit的尾数部分,可以表示的精度却变成了24bit,道理就是在这里,那24bit能精确到小数点后几位呢,我们知道9的二进制表示为1001,所以4bit能精确十进制中的1位小数点,24bit就能使float能精确到小数点后6位,而对于指数部分,因为指数可正可负,8位的指数位能表示的指数范围就应该为:-127-128了,所以指数部分的存储采用移位存储,存储的数据为元数据+127,下面就看看8.25和120.5在内存中真正的存储方式。 首先看下8.25,用二进制的科学计数法表示为:1.00001* 按照上面的存储方式,符号位为:0,表示为正,指数位为:3+127=130 ,位数部分为,故8.25的存储方式如下图所示: 而单精度浮点数120.5的存储方式如下图所示:

浮点运算

STM32-F4属于Cortex-M4构架,与M0、M3的最大不同就是有硬件浮点运算FPU,数学计算速度相比普通cpu运算快上几十倍。想要使用FPU首先包含#include “arm_math.h”,还有在keil的target选项中勾选use single precision。 1.1 简单的FPU运算性能测试 测试条件是开启一个100ms定时器,定时串口打印计算次数,优化级别是0,main函数中运行的代码如下: float a=1.1,b=1.2,c=1.3,d=1.4; 1、FPU运算474566次,CPU运算64688次,除法速度快了7.3倍多。 c = b / d; 2、FPU运算722169次,CPU运算244271次,乘法运算快了3倍。FPU的乘法运算比除法运算快1.5倍。 c = b * d; 3、FPU运算19398次,CPU运算19628次,FPU的双精度除法运算没有优势,比单精度运算慢了24.5倍 c = b / 1.4; 4、FPU运算503321次,CPU运算65450次,单精度常数和变量的运算差不多,单精度常数的除法快6%左右,这根编译器的关系比较大。 c = b / 1.4f; 5、FPU运算519073次,跟下面比较说明整形常数和单精度常数的除法运算速度几乎一样。

c = b / 3; 6、FPU运算519057次 c = b / 3.0f; 7、FPU运算263643次 c = arm_cos_f32(1.3f); 8、FPU运算3949次,说明IT给的DSP库运算速度还是很给力的,速度快了67倍 c = cos(1.3f); 1.2 代码设置 旧版本的keil设置如下,但是发现我使用的keil5包含的新固件库已经不需要这一步了。 如果没有启动FPU而使用数学函数运算时,CPU执行时认为遇到非法指令而跳转到HardFault_Handler()中断函数中死循环。因此,需要在系统初始化时开启FPU。在system_stm32f4xx.c中的SystemInit()函数中添加如下代码: /* FPU settings ------------------------------------------------------------*/ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ #endif 当__FPU_PRESENT=1且__FPU_USED=1时,编译时就加入了启动FPU的代码,CPU也就能正确高效的使用FPU进行简单的加减乘除。需要使用固件库自带的arm_math.h而非编译器自带的math.h,这个文件根据编译控制项(__FPU_USED ==1)来决定是使用哪一种函数方法:如果没有使用FPU,那就调用keil的标准math.h头文件中定义的函数;如果使用了FPU,那就是用固件库自带的优化函数来解决问题。

浮点数的加减法运算

计算机组成与结构 之 浮点数的加减法运算 学生组所在学院:燕山大学信息学院 学生组所在班级:2014级计算机1 班 学生组姓名:陈朝俊张海傅晓欣曲佳彤

地址:中国河北省秦皇岛市河北大街438号邮编:066004 电话: 传真: 网址:

浮点数加减法运算简介 大型计算机和高档微型机中,浮点加减法运算是由硬件完成的。低档的微型机浮点加减法运算是由软件完成的,但不论用硬件实现还是软件实现,基本原理是一致的。 浮点加减法运算要经过对阶、尾数加减运算、结果规格化、舍入处理、溢出判断五步操作。其中尾数运算与定点加减法运算相同,而对阶、规格化、舍入和溢出判断,则是浮点加减法运算和定点加减法运算不同的操作之处。 在补码浮点运算中,阶码与尾数可以都用补码表示。在硬件实现的运算中,阶码和数符常采用双符号位。 浮点数的表示形式 浮点数的表示形式(假设以2为底): N=M·2E 其中,M为浮点数的尾数,一般为绝对值小于1的规格化二进制小数,用原码或补码形式表示;E为浮点数的阶码,一般是用移码或补码表示的整数。 阶码的底除了2以外,还有用8或16表示的,这里暂且只以2为底进行讨论。

浮点数加减法运算的步骤 设两浮点数X、Y进行加减运算,其中:X=M X·2EX,Y=M Y·2EY 一般由以下五个步骤完成:

规 格 化 浮 点 数 加 减 运 算 流 程 一、对阶 1.对阶是指将两个进行运算的浮点数的阶码对齐的操作。对阶的目

的是为了使两个浮点数的尾数能够进行加减运算。因为,当进行MX·2EX 与MY·2EY加减运算时,只有使两浮点数的指数值部分相同,才能将相同的指数值作为公因数提出来,然后进行尾数的加减运算。 2.对阶的具体方法是:首先求出两浮点数阶码的差,即ΔE=Ex-Ey,将小阶码加上ΔE,使之与大阶码相等,同时将小阶码对应的浮点数的尾数右移ΔE位,以保证该浮点数的值不变。 3.几点注意: (1)对阶的原则是小阶对大阶,因为若大阶对小阶,则尾数的数值部分的高位需移出,而小阶对大阶移出的是尾数的数值部分的低位,这样损失的精度更小。 (2)若ΔE=0,说明两浮点数的阶码已相同,无需再做对阶操作。(3)尾数右移时,对原码表示的尾数,符号位不参加移位,尾数数值部分的高位补0;对补码表示的尾数,符号位参加右移,并保持原符号位不变。 (4)由于尾数右移时是将最低位移出,会损失一定的精度,为减少误差,可先保留若干移出的位,供以后舍入处理用。 二、尾数的加减运算

浮点运算

简介 当我们用不同的电脑计算圆周率时,会发现一台电脑的计算较另一台来讲结果更加精确。或者我们在进行枪战游戏的时候,当一粒子弹击中墙壁时,墙上剥落下一块墙皮,同样的场面在一台电脑上的表现可能会非常的呆板、做作;而在另外一台电脑上就会非常生动形象,甚至与我们在现实中看到的所差无几。这都是浮点运算能力的差异导致的。 定点与浮点 大学计算机基础中已经了解过计算机的实数表示方法可分为两种即定点与浮点 1、定点数: 定点数指小数点在数中的位置是固定不变的,通常有定点整数和定点小数。在对小数点位置作出选择之后,运算中的所有数均应统一为定点整数或定点小数,在运算中不再考虑小数问题。 (1)定义:数据中小数点位置固定不变的数 (2)种类:定点整数 (3)小数点在符号位与有效位之间。 注:定点数受字长的限制,超出范围会有溢出。 2、浮点数: 浮点数的表示形式有点像科学计数法(*.*****×10^***),它的表示形式是0.*****×10^***,在计算机中的形式为 .***** e ±***),其中前面的星号代表定点小数,也就是整数部分为0的纯小数,后面的指数部分是定点整数。利用这样的形式就能表示出任意一个整数和小数,例如1024就能表示成0.1024×10^4,也就是 .1024e+004,3.1415926就能表示成0.31415926×10^1,也就是 .31415926e+001,这就是浮点数。浮点数进行的运算就是浮点运算。 注:其浮点数的精度由尾数决定,数的表示范围由阶码决定。 浮点数,这个复杂点,有三种格式 单精度:_31_30________23_22___________0 符号指数有效数 双精度:_63_62__________52_51__________________0 符号指数有效数 扩展精度数: _79_78____________64_63___________________0 符号指数有效数 3、定点数与浮点数区别 定点表示法运算直观,但数的表示范围较小,不同的数运算时要考虑比例因子的选取,以防止溢出。浮点表示法运算时可以不考虑溢出,但浮点运算,编程较难。要掌握定、浮点数的

实数计算的常见类型及方法(1)

实数计算的常见类型及方法 【精练】计算 3-2÷3+(-)0-3-1+(-3)2-32 解:原式=3-+1-+9-9=3 在算3-2÷3时易算成1÷3=,另外(-3)2与-32是有区别的. 【知识规律串讲】 一、实数的运算 (1)加法 同号两数相加,取原来的符号,并把绝对值相加; 异号两数相加。取绝对值较大的数的符号,并用较大的绝对值减去较小的绝对值; 任何数与零相加等于原数。 (2)减法 a-b=a+(-b) (3)乘法 两数相乘,同号得正,异号得负,并把绝对值相乘;零乘以任何数都得零.即 (4)除法 (5)乘方 (6)开方如果x2=a且x≥0,那么=x;如果x3=a,那么 在同一个式于里,先乘方、开方,然后乘、除,最后加、减.有括号时,先算括号里面.3.实数的运算律 (1)加法交换律 a+b=b+a (2)加法结合律 (a+b)+c=a+(b+c) (3)乘法交换律 ab=ba. (4)乘法结合律 (ab)c=a(bc) (5)分配律 a(b+c)=ab+ac 其中a、b、c表示任意实数.运用运算律有时可使运算简便. 一、加法运算中的方法与技巧 例1 计算: (1)5-[2+(-4.8)-(-4)]

(2)|(-)-(-)+(-)| 分析:(1)题的关键是确定运算顺序,有括号的还应先计算括号内的; (2)题的关键是求出绝对值符号中式子的值,进而求出整个式子的值.进行有理数的混合计算时,小学学过的确定运算顺序的方法仍然适用 解(1)5-[2+(-4.8)-(-4)] =5-[2-4.8+4] =5-[7-4.8] =5-2.2=3 (2) |(-)-(-)+(-)| =|-+-| =|--+| =|-|= 【小结】巧用加法的交换律与结合律,以达到简化的目的,同时注意交换加数位置时,一定要连同前面的符号一起移动. 实数加法运算中通常有以下规律:互为相反数的两个数先相加—“相反数结合法”;符号相同的数先相加—“同号结合法”;分母相同的数先相加—“同分母结合法”;几个数相加得到整数先相加—“凑整法”;整数与整数,小数与小数相加—“同形结合法”. 二、乘、除运算中的方法与技巧 例2:计算: (1)4--÷;(2)--3××(-1)÷(-1).

浮点数运算

浮点数的表示和基本运算 [收藏此页] [打印] 【IT168知识库】 1 浮点数的表示 通常,我们可以用下面的格式来表示浮点数 S P M 其中S是符号位,P是阶码,M是尾数 对于IBM-PC而言,单精度浮点数是32位(即4字节)的,双精度浮点数是64位(即8字节)的。两者的S,P,M所占的位数以及表示方法由下表可知 S P M 表示公式偏移量 1 8 23 (-1)S*2(P-127)*1.M 127 1 11 5 2 (-1)S*2(P-1023)*1.M 1023 以单精度浮点数为例,可以得到其二进制的表示格式如下 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长度来反映无限的实数集合,因此大多数情况下都是一个近似值。同时,对于浮点数的运算还同时伴有误差扩散现象。特定精度下看似相等的两个浮点数可能并不相等,因为它们的最小有效位数不同。 由于浮点数可能无法精确近似于十进制数,如果使用十进制数,则使用浮点数的数学或比较运算可能不会产生相同的结果。 如果涉及浮点数,值可能不往返。值的往返是指,某个运算将原始浮点数转换为另一种格式,而反向运算又将转换后的格式转换回浮点数,且最终浮点数与原始浮点数相等。由于一个或多个最低有效位可能在转换中丢失或更改,往返可能会失败。 4 将浮点数表示为二进制

关于浮点数的详细讲解

目录 1. 什么是浮点数 2. IEEE 浮点数 3. 实数和浮点数之间的变换 4. 特殊值 4.1. NaN 4.2. 无穷 4.3. 有符号的零 4.4. 非规范化数 5. 参考资料 1. 什么是浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式,比如 99.00 或者 00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值。由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。SQL 中的 NUMBER 数据类型就是利用定点数来定义的。还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。 定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。这种表达方式利用科学计数法来表达实数,即用一个尾数(M antissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如 123.45 用十进制科学计数法可以表达为 1.2345 × 102,其中 1.2345 为尾数,10 为基数,2 为指数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。 提示: 尾数有时也称为有效数字(Significand)。尾数实际上是有效数字的非正式说法。 同样的数值可以有多种浮点数表达方式,比如上面例子中的 123.45 可以表达为 12.345 × 101,0.12345 × 103或者 1.2345 × 102。因为这种多样性,有必要对其加以规范化以达到统一表达的目标。规范的(Normalized)浮点数表达方式具有如下形式: ±d.dd...d × βe, (0 ≤d i< β) 其中 d.dd...d即尾数,β为基数,e为指数。尾数中数字的个数称为精度,在本文中用p 来表示。每个数字d介于 0 和基数之间,包括0。小数点左侧的数字不为0。 基于规范表达的浮点数对应的具体值可由下面的表达式计算而得: ±(d0 + d1β-1 + ... + d p-1β-(p-1))βe, (0 ≤d i< β) 对于十进制的浮点数,即基数β等于 10 的浮点数而言,上面的表达式非常容易理解,也很直白。计算机内部的数值表达是基于二进制的。从上面的表达式,我们可以知道,二进制

定点与浮点运算的比较

定点与浮点运算DSP的比较 定点运算DSP在应用中已取得了极大的成功,而且仍然是DSP应用的主体。然而,随着对DSP处理速度与精度、存储器容量、编程的灵活性和方便性要求的不断提高、自80年代中后期以来,各DSP生产厂家陆续推出了各自的32bit 浮点运算DSP。 和定点运算DSP相比,浮点运算DSP具有许多优越性: 浮点运算DSP比定点运算DSP的动态范围要大很多。定点DSP的字长每增加1bit,动态范围扩大6dB。16bit字长的动态范围为96dB。程序员必须时刻关注溢出的发生。例如,在作图像处理时,图像作旋转、移动等,就很容易产生溢出。这时,要么不断地移位定标,要么作截尾。前者要耗费大量的程序空间和执行时间,后者则很快带来图像质量的劣化。总之,是使整个系统的性能下降。在处理低信噪比信号的场合,例如进行语音识别、雷达和声纳信号处理时,也会发生类似的问题。而32bit浮点运算DSP的动态范围可以作到1536dB,这不仅大大扩大了动态范围,提高了运算精度,还大大节省了运算时间和存储空间,因为大大减少了定标,移位和溢出检查。 由于浮点DSP的浮点运算用硬件来实现,可以在单周期内完成,因而其处理速度大大高于定点DSP。这一优点在实现高精度复杂算法时尤为突出,为复杂算法的实时处理提供了保证。 32bit浮点DSP的总线宽度较定点DSP宽得多,因而寻址空间也要大得多。这一方面为大型复杂算法提供了可能、因为省的DSP目标子程序已使用到几十MB存储器或更多;另一方面也为高级语言编译器、DSP操作系统等高级工具软件的应用提供了条件。 DSP的进一步发展,必然是多处理器的应用。新型的浮点DSP已开始在通信口的设置和强化、资源共享等方面有所响应。

浮点数的加减运算一般由以下五个步骤完成

浮点数的加减运算一般由以下五个步骤完成: 对阶 ↓ 尾数运算 ↓ 结果规格化 ↓ 舍入处理 ↓ 溢出判断 设两浮点数X、Y进行加减运算,其中 X=M x·2Ex,Y=M y·2Ey 1. 对阶 所谓对阶是指将两个进行运算的浮点数的阶码对齐的操作。对阶的目的是为使两个浮点数的尾数能够进行加减运算。因为,当进行M x·2Ex与M y·2Ey加减运算时,只有使两浮点数的指数值部分相同,才能将相同的指数值作为公因数提出来,然后进行尾数的加减运算。 对阶的具体方法是:首先求出两浮点数阶码的差,即⊿E=E x-E y,将小阶码加上⊿E,使之与大阶码相等,同时将小阶码对应的浮点数的尾数右移相应位数,以保证该浮点数的值不变。几点注意: (1)对阶的原则是小阶对大阶,之所以这样做是因为若大阶对小阶,则尾数的数值部分的高位需移出,而小阶对大阶移出的是尾数的数值部分的低位,这样损失的精度更小。 (2)若⊿E=0,说明两浮点数的阶码已经相同,无需再做对阶操作了。 (3)采用补码表示的尾数右移时,符号位保持不变。 (4)由于尾数右移时是将最低位移出,会损失一定的精度,为减少误差,可先保留若干移出的位,供以后舍入处理用。 2. 尾数运算 尾数运算就是进行完成对阶后的尾数相加减。这里采用的就是我们前面讲过的纯小数的定点数加减运算。 3. 结果规格化 在机器中,为保证浮点数表示的唯一性,浮点数在机器中都是以规格化形式存储的。对于IEEE754标准的浮点数来说,就是尾数必须是1.M的形式。由于在进行上述两个定点小数的尾数相加减运算后,尾数有可能是非规格化形式,为此必须进行规格化操作。 规格化操作包括左规和右规两种情况。 左规操作:将尾数左移,同时阶码减值,直至尾数成为1.M的形式。例如,浮点数0.0011·25是非规格化的形式,需进行左规操作,将其尾数左移3位,同时阶码减3,就变成1.1100·22规格化形式了。 右规操作:将尾数右移1位,同时阶码增1,便成为规格化的形式了。要注意的是,右规操作只需将尾数右移一位即可,这种情况出现在尾数的最高位(小数点前一位)运算时出现了进位,使尾数成为10.xxxx或11.xxxx的形式。例如,10.0011·25右规一位后便成为1.00011·26的规格化形式了。 4. 舍入处理

相关文档
最新文档