浮点数和定点数的区别
- 格式:doc
- 大小:54.00 KB
- 文档页数:6
定点数与浮点数
定点数
定点数是小数点固定的数。
在计算机中没有专门表示小数点的位,小数点的位置是约定默认的。
一般固定在机器数的最低位之后,或是固定在符号位之后。
前者称为定点纯整数,后者称为定点纯小数。
例题:用8位原码表示定点整数(100)10
(100)10 = (1100100)2
定点整数表示为
例题:用8位原码表示定点纯小数(-0.6875)10
(-0.6875)10 = (-0.1011)2
定点纯小数表示为
定点数表示法简单直观,但是数值表示的范围太小,运算时容易产生溢出。
浮点数
浮点数是小数点的位置可以变动的数。
为增大数值表示范围,防止溢出,采用浮点数表示法。
浮点表示法类似于十进制中的科学计数法。
在计算机中通常把浮点数分成阶码和尾数两部分来表示,其中阶码一般用补码定点整数表示,尾数一般用补码或原码定点小数表示。
为保证不损失有效数字,对尾数进行规格化处理,也就是平时所说的科学记数法,即保证尾数的最高位为1,实际数值通过阶码进行调整。
一般浮点数在机器中的格式为:
阶符表示指数的符号位、阶码表示幂次、数符表示尾数的符号位、尾数表示规格化后的小数值。
N = 尾数×基数阶码(指数)
例题:二进制数-110101101.01101可以写成: -0.11010110101101×21001
这个数在机器中的格式为(阶码用8为表示,尾数用24位表示)
[关闭窗口]。
定点数和浮点数1、定点数(Fixed-Point Number)计算机处理的数据不仅有符号,而且大量的数据带有小数,小数点不占有二进制一位而是隐含在机器数里某个固定位置上。
通常采取两种简单的约定:一种是约定所有机器数的小数的小数点位置隐含在机器数的最低位之后,叫定点纯整机器数,简称定点整数。
另一种约定所有机器数的小数点隐含在符号位之后、有效部分最高位之前,叫定点纯小数机器数,简称定点小数。
无论是定点整数,还是定点小数,都可以有原码、反码和补码三种形式。
2、浮点数(Floating-Point Number)计算机多数情况下采作浮点数表示数值,它与科学计数法相似,把一个二进制数通过移动小数点位置表示成阶码和尾数两部分:其中:E——N的阶码(Expoent),是有符号的整数S——N的尾数(Mantissa),是数值的有效数字部分,一般规定取二进制定点纯小数形式。
例:1011101B=2+7*0.1011101,101.1101B=2+3*0.1011101,0.01011101B=2-1*0.1011101浮点数的格式如下:阶符阶尾符尾数浮点数由阶码和尾数两部分组成,底数2不出现,是隐含的。
阶码的正负符号E0,在最前位,阶反映了数N小数点的位置,常用补码表示。
二进制数N小数点每左移一位,阶增加1。
尾数是这点小数,常取补码或原码,码制不一定与阶码相同,数N的小数点右移一位,在浮点数中表现为尾数左移一位。
尾数的长度决定了数N的精度。
尾数符号叫尾符,是数N的符号,也占一位。
例:写出二进制数-101.1101B的浮点数形式,设阶码取4位补码,尾数是8位原码。
-101.1101=-0.1011101*2+3浮点形式为:阶码0011 尾数11011101补充解释:阶码0011中的最高位“0”表示指数的符号是正号,后面的“011”表示指数是“3”;尾数11011101的最高位“1”表明整个小数是负数,余下的1011101是真正的尾数。
定点数与浮点数计算机处理的数值数据多数带有小数,小数点在计算机中通常有两种表示方法,一种是约定所有数值数据的小数点隐含在某一个固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。
1. 定点数表示法(fixed-point)所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。
在计算机中通常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。
一般常称前者为定点小数,后者为定点整数。
定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。
若数据x 的形式为x = x0.x1x2…x n( 其中x0为符号位,x1~x n是数值的有效部分,也称为尾数,x1为最高有效位),则在计算机中的表示形式为:一般说来,如果最末位x n = 1,前面各位都为0 ,则数的绝对值最小,即|x|mi n = 2-n。
如果各位均为1,则数的绝对值最大,即|x|ma x =1-2-n 。
所以定点小数的表示范围是:2- n ≤ | x| ≤ 1 - 2- n定点整数是纯整数,约定的小数点位置在有效数值部分最低位之后。
若数据x 的形式为x = x0x1x2…x n ( 其中x0为符号位,x1~x n是尾数,x n为最低有效位),则在计算机中的表示形式为:定点整数的表示范围是:1≤ | x| ≤ 2n - 1当数据小于定点数能表示的最小值时,计算机将它们作0处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出。
计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据比例因子,还原成实际数值。
若比例因子选择不当,往往会使运算结果产生溢出或降低数据的有效精度。
用定点数进行运算处理的计算机被称为定点机。
2. 浮点数表示法(floating-point number)4与科学计数法相似,任意一个J进制数N,总可以写成N = J E × M式中M称为数N 的尾数(mantissa),是一个纯小数;E为数N 的阶码(e x ponent),是一个整数,J称为比例因子J E 的底数。
1、请简述操作系统的基本功能。
答:用户接口:主要有命令行接口和图形用户接口进程及处理机管理:在操作系统的系统状态下,输入操作系统命令或运行用户应用程序都要占用计算机CPU资源,为程序分配CPU资源是由操作系统来完成的。
存储管理:主要是之对计算机主存储器即内存的管理文件管理:文件系统负责管理在外存储器的信息并把对信息的存取、共享和保护等手段提供给操作系统用户。
设备管理:操作系统的设备管理系统是用于对外围设备输入输出进行控制和管理2、请简述数的定点表示与浮点表示的异同点。
答:定点数:定点数指小数点在数中的位置是固定不变的,通常有定点整数和定点小数。
在对小数点位置作出选择之后,运算中的所有数均应统一为定点整数或定点小数,在运算中不再考虑小数问题。
(1)定义:数据中小数点位置固定不变的数(2)种类:定点整数(3)小数点在符号位与有效位之间。
注:定点数受字长的限制,超出范围会有溢出。
浮点数:浮点数中小数点的位置是不固定的,用阶码和尾数来表示。
通常尾数为纯小数,阶码为整数,尾数和阶码均为带符号数。
尾数的符号表示数的正负;阶码的符号则表明小数点的实际位置。
(1)形式:N=M×2E (2)M:尾数(3)E:阶码(4)在计算机中M和E表示形式为阶码尾数符号尾数将其与数学中的科学记数法进行比较。
注:其浮点数的精度由尾数决定,数的表示范围由阶码决定。
定点数与浮点数区别定点表示法运算直观,但数的表示范围较小,不同的数运算时要考虑比例因子的选取,以防止溢出。
浮点表示法运算时可以不考虑溢出,但浮点运算,编程较难。
要掌握定、浮点数的转换方法及浮点数规格化方法。
/3、在Excel工作表中有哪几种常用的数据类型?如何输入分数和字符类型的数字数据?答:常用数据类型有: 数字型,文本型,错误型,逻辑型输入分数的方法是: 例如输入1/2, 请输入0 1/2, 0和1/2之间是空格,大于1的分数的输入方法同理2 1/2, 3 1/4等输入字符型数字可以在前面加单引号例如'012344、请简述计算机病毒的基本特征。
计算机处理的数值数据多数带有小数,小数点在计算机中通常有两种表示方法,一种是约定所有数值数据的小数点隐含在某一个固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。
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处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出。
计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据比例因子,还原成实际数值。
若比例因子选择不当,往往会使运算结果产生溢出或降低数据的有效精度。
用定点数进行运算处理的计算机被称为定点机。
2. 浮点数表示法(floating-point number)与科学计数法相似,任意一个J进制数N,总可以写成N = J E×M式中M称为数N的尾数(mantissa),是一个纯小数;E为数N的阶码(exponent),是一个整数,J称为比例因子J E的底数。
简介当我们用不同的电脑计算圆周率时,会发现一台电脑的计算较另一台来讲结果更加精确。
或者我们在进行枪战游戏的时候,当一粒子弹击中墙壁时,墙上剥落下一块墙皮,同样的场面在一台电脑上的表现可能会非常的呆板、做作;而在另外一台电脑上就会非常生动形象,甚至与我们在现实中看到的所差无几。
这都是浮点运算能力的差异导致的。
定点与浮点大学计算机基础中已经了解过计算机的实数表示方法可分为两种即定点与浮点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、定点数与浮点数区别定点表示法运算直观,但数的表示范围较小,不同的数运算时要考虑比例因子的选取,以防止溢出。
定点与浮点运算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已开始在通信口的设置和强化、资源共享等方面有所响应。
一:浮点与定点概述--------------------------------------------------------声明:此文为原创,欢迎转载,转载请保留如下信息作者:afreez 北京-中关村联系方式:afreez.gan@(欢迎与作者交流)初次发布时间:2006-12-09初次发布在: /ganxingming/不经本人同意,不得用语商业或赢利性质目的,否则,作者有权追究相关责任!---------------------------------------------------------1.1相关定义说明定点数:通俗的说,小数点固定的数。
浮点数转定点数原理一、浮点数和定点数的概念与区别在计算机中,浮点数和定点数都是表示实数的一种方式。
浮点数英文名称为floating-point number,它的位数是由固定的底数和指数组成的。
通常情况下,浮点数的位数包括符号位、指数位和尾数位。
浮点数的实际大小取决于底数和指数,而且具有一定的精度限制。
区别:定点数是使用固定的小数点表示实数,因此它的精度可以是固定的。
而浮点数使用底数和指数来表示实数,因此它的精度受到底数和指数的限制,并且可以表示的实数范围更广。
浮点数转定点数是将浮点数转化为定点数的操作。
在实际编程中,由于浮点数的计算复杂度较高,因此常常需要将浮点数转化为定点数,以提高计算效率。
浮点数转定点数的原理可以通过以下步骤来实现:Step 1. 确定定点数整数部分和小数部分的位数在浮点数转定点数的过程中,需要确定定点数的整数部分和小数部分的位数。
通常情况下,整数部分的位数取决于浮点数的最大整数位数,小数部分的位数取决于浮点数的分数位数和需要的精度。
Step 2. 将浮点数转换为寄存器中的二进制数将浮点数转换为二进制数是将浮点数转为定点数的第二个步骤。
在这一步中,需要将浮点数的符号位、指数位和尾数位分别转变为二进制数。
Step 3. 将二进制数左移或右移将浮点数转换成定点数之后,需要将其左移或右移,使之符合定点数的要求。
在这一步中,需要将二进制数左移或右移多少位,可以根据前面步骤的结果来进行调整。
另外,在嵌入式系统中,由于资源限制,只能使用较小的处理器和较少的存储器。
因此,在这种情况下,需要使用定点数来代替浮点数,以使系统功能更有效地实现。
四、总结浮点数转定点数是将浮点数转化为定点数的一种操作。
在实际编程中,由于浮点数计算复杂度高,因此常常需要将浮点数转化为定点数。
浮点数转定点数的原理是将浮点数转化为二进制数,并将其左移或右移,然后将左移或右移后的二进制数转变为定点数。
浮点数转定点数在计算机系统中有广泛的应用,特别是在图像、音频、视频等领域的信号处理中。
定点数概述在计算机科学和数字电子技术中,定点数是一种用于表示实数和整数的数值表示方法。
与浮点数不同,定点数使用固定的小数位数和整数位数来表示数字,而不是使用指数和尾数。
定点数通常用于对精度要求较高的应用程序,如金融和科学计算。
定点数的表示定点数可以表示为一个整数和一个比例因子的乘积,其中比例因子决定了小数点的位置。
在定点数中,小数点位于固定的位置,通常在最低位的右边。
比例因子可以是2的幂次或其他整数。
例如,考虑一个定点数表示方法,使用8位整数和8位小数。
该定点数的范围为-128到127.996。
假设我们要表示数值-32.75,可以将整数部分-32表示为-32,小数部分0.75表示为0xC0(二进制为11000000)。
因此,-32.75可以用一个字节的形式表示为0xE0。
在某些定点数表示方法中,比例因子可以是负数。
这意味着小数点左边的位相对于小数点右边的位具有不同的权重。
这对于表示较大或较小的数字范围非常有用。
定点数的运算定点数的运算可以通过类似于整数的方式进行,只需要小心处理小数部分的进位和借位。
加法和减法的定点数运算与整数运算相似,只需将小数部分视为普通的整数部分并进行运算。
乘法和除法则需要更复杂的算法,其中需要将小数部分进行调整以保持正确的小数位数。
特定的定点数表示方法可能会提供优化的算法来处理这些运算。
优点和缺点定点数的优点是表示和处理速度快,计算开销低。
它们可以在使用整数运算器的计算机系统上实现,并能够更好地满足对精度要求较高的应用程序。
此外,定点数的数量表示范围较小,易于理解和分析。
然而,定点数也存在一些缺点。
首先,由于定点数使用固定的小数位数和整数位数,所以对于非常大或非常小的数字范围,定点数可能无法提供足够的精度。
其次,定点数的表示方法可能因应用程序的特定需求而有所不同,可能需要额外的编码和处理开销。
应用领域定点数广泛应用于各种应用领域,特别是对于需要高精度计算的领域。
以下是几个常见的应用领域:1. 金融领域:金融应用程序需要对货币交易进行精确计算,并保持精确的小数位数。
浮点数运算转换为定点数运算的c语言浮点数运算转换为定点数运算的C语言一、定点数的概念1、什么是定点数所谓定点数,就是一种固定的格式的数,它通常用特定的位数表示一个数字,其中小数点的位置是固定的,它跟浮点数不同,浮点数的精度随着数值的变化而变化,而定点数的精度是固定的。
2、定点数的运算定点数的运算是指定点数的加减乘除、四舍五入、整数转换等运算。
二、C语言定点数运算1、C语言定点数的完成(1)使用 long long、int 类型变量,配合 shift 运算,实现定点数的加减运算、乘除运算等。
(2)使用其他类型变量,配合位操作运算,实现定点数的四舍五入、整数转换等。
2、C语言定点数运算的实现(1)定点数加:long long add_fix(long long a,long long b){return (a + b);}(2)定点数减:long long sub_fix(long long a,long long b) {return (a - b);}(3)定点数乘:long long mul_fix(long long a,long long b) {return ((a * b) >> 16);}(4)定点数除:long long div_fix(long long a,long long b) {return ((a << 16) / b);}(5)定点数四舍五入:int round_up(long long a,long long b){int result;result = a/b;if(a % b >= b/2)result++;return result;}(6)定点数转换为整数:int to_int(long long a){return (int)(a >> 16);}三、总结从上述分析可以看到,C语言提供的变量类型和位运算符号,可以用来实现定点数的加减乘除、四舍五入、整数转换等运算,这使得定点数的运算变得更加方便、高效。
计算机中小数位的转化
计算机中存储的数字都是以二进制形式表示的,因此涉及到小数时也需要进行转化。
一般来说,常用的小数转化方式有两种:浮点数和定点数。
浮点数是将小数转化为科学计数法表示,并用一定的位数存储尾数和指数。
定点数则是将小数的整数部分和小数部分分别存储,可以选择固定小数点位置或者浮动小数点位置。
在进行小数转化时,需要考虑精度和舍入误差。
计算机的存储空间是有限的,因此在存储小数时必须设置一定的精度,以便将小数转化为有限的二进制数。
同时,由于浮点数和定点数都存在舍入误差,因此在进行小数计算时需要注意误差的累积问题。
综上所述,计算机中小数位的转化涉及到多种技术和问题,需要根据具体的应用场景来选择合适的转化方式和精度设置。
- 1 -。
cloudseawang定点数与浮点数区别最近做HDR时,经常要用NV提供的16位纹理,它的说明书16位能达到24位的精度,就很奇怪?一直搞不懂浮点数的精度怎么算的?今天认真看了一下IEEE float point的标准,终于明白是什么了1. 什么是浮点数在计算机系统的发展过程中,曾经提出过多种方法表达实数。
典型的比如相对于浮点数的定点数(Fixed Point Number)。
在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。
货币的表达就可以使用这种方式,比如99.00 或者00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值。
由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。
SQL 中的NUMBER 数据类型就是利用定点数来定义的。
还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。
定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。
最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。
这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ),一个基数(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。
基于规范表达的浮点数对应的具体值可由下面的表达式计算而得:±(d 0 + d 1β-1 + ... + d p-1β-(p-1))β e , (0 ≤ d i < β)对于十进制的浮点数,即基数β 等于10 的浮点数而言,上面的表达式非常容易理解,也很直白。
计算机内部的数值表达是基于二进制的。
从上面的表达式,我们可以知道,二进制数同样可以有小数点,也同样具有类似于十进制的表达方式。
只是此时β 等于2,而每个数字d 只能在0 和 1 之间取值。
比如二进制数1001.101 相当于1 × 2 3 + 0 × 22 + 0 ×21 + 1 ×20 + 1 ×2-1 + 0 ×2-2 + 1 ×2-3,对应于十进制的9.625。
其规范浮点数表达为1.001101 × 23。
2. IEEE 浮点数计算机中是用有限的连续字节保存浮点数的。
保存这些浮点数当然必须有特定的格式,Java 平台上的浮点数类型float 和double 采纳了IEEE 754 标准中所定义的单精度32 位浮点数和双精度64 位浮点数的格式。
注意: Java 平台还支持该标准定义的两种扩展格式,即float-extended-exponent 和double-extended-exponent 扩展格式。
这里将不作介绍,有兴趣的读者可以参考相应的参考资料。
在IEEE 标准中,浮点数是将特定长度的连续字节的所有二进制位分割为特定宽度的符号域,指数域和尾数域三个域,其中保存的值分别用于表示给定二进制浮点数中的符号,指数和尾数。
这样,通过尾数和可以调节的指数(所以称为"浮点")就可以表达给定的数值了。
具体的格式参见下面的图例:在上面的图例中,第一个域为符号域。
其中0 表示数值为正数,而1 则表示负数。
第二个域为指数域,对应于我们之前介绍的二进制科学计数法中的指数部分。
其中单精度数为8 位,双精度数为11 位。
以单精度数为例,8 位的指数为可以表达0 到255 之间的255 个指数值。
但是,指数可以为正数,也可以为负数。
为了处理负指数的情况,实际的指数值按要求需要加上一个偏差(Bias)值作为保存在指数域中的值,单精度数的偏差值为127,而双精度数的偏差值为1023。
比如,单精度的实际指数值0 在指数域中将保存为127;而保存在指数域中的64 则表示实际的指数值-63。
偏差的引入使得对于单精度数,实际可以表达的指数值的范围就变成-127 到128 之间(包含两端)。
我们不久还将看到,实际的指数值-127(保存为全0)以及+128(保存为全1)保留用作特殊值的处理。
这样,实际可以表达的有效指数范围就在-127 和127 之间。
在本文中,最小指数和最大指数分别用emin 和emax 来表达。
图例中的第三个域为尾数域,其中单精度数为23 位长,双精度数为52 位长。
除了我们将要讲到的某些特殊值外,IEEE 标准要求浮点数必须是规范的。
这意味着尾数的小数点左侧必须为1,因此我们在保存尾数的时候,可以省略小数点前面这个1,从而腾出一个二进制位来保存更多的尾数。
这样我们实际上用23 位长的尾数域表达了24 位的尾数。
比如对于单精度数而言,二进制的1001.101(对应于十进制的9.625)可以表达为 1.001101 ×23,所以实际保存在尾数域中的值为00110100000000000000000,即去掉小数点左侧的1,并用0 在右侧补齐。
值得注意的是,对于单精度数,由于我们只有24 位的指数(其中一位隐藏),所以可以表达的最大指数为224 - 1 = 16,777,215。
特别的,16,777,216 是偶数,所以我们可以通过将它除以2 并相应地调整指数来保存这个数,这样16,777,216 同样可以被精确的保存。
相反,数值16,777,217 则无法被精确的保存。
由此,我们可以看到单精度的浮点数可以表达的十进制数值中,真正有效的数字不高于8 位。
事实上,对相对误差的数值分析结果显示有效的精度大约为7.22 位。
参考下面的示例:true value stored value--------------------------------------16,777,215 1.6777215E716,777,216 1.6777216E716,777,217 1.6777216E716,777,218 1.6777218E716,777,219 1.677722E716,777,220 1.677722E716,777,221 1.677722E716,777,222 1.6777222E716,777,223 1.6777224E716,777,224 1.6777224E716,777,225 1.6777224E7--------------------------------------根据标准要求,无法精确保存的值必须向最接近的可保存的值进行舍入。
这有点像我们熟悉的十进制的四舍五入,即不足一半则舍,一半以上(包括一半)则进。
不过对于二进制浮点数而言,还多一条规矩,就是当需要舍入的值刚好是一半时,不是简单地进,而是在前后两个等距接近的可保存的值中,取其中最后一位有效数字为零者。
从上面的示例中可以看出,奇数都被舍入为偶数,且有舍有进。
我们可以将这种舍入误差理解为"半位"的误差。
所以,为了避免7.22 对很多人造成的困惑,有些文章经常以7.5 位来说明单精度浮点数的精度问题。
提示: 这里采用的浮点数舍入规则有时被称为舍入到偶数(Round to Even)。
相比简单地逢一半则进的舍入规则,舍入到偶数有助于从某些角度减小计算中产生的舍入误差累积问题。
因此为IEEE 标准所采用。
3. 实数和浮点数之间的变换现在我们已经明白了浮点数的IEEE 表达方式。
我们来做些实数和浮点数之间的变换练习以加深理解。
在这些练习中,你还会发现一些围绕浮点数运算的令人吃惊的事实。
首先我们来看看事情简单的一面,从浮点数变换到实数。
理解了浮点数的格式,做这个练习并不难。
假定我们有一个32 位的数据,用十六进制表示为0xC0B40000,并且我们知道它实际上是一个单精度的浮点数。
为了得到该浮点数实际表达的实数,我们首先将它变换为二进制形式:C 0 B 4 0 0 0 01100 0000 1011 0100 0000 0000 0000 0000接着按照浮点数的格式切分为相应的域:1 10000001 01101000000000000000000符号域1 意味着负数;指数域为129 意味着实际的指数为2 (减去偏差值127);尾数域为01101 意味着实际的二进制尾数为1.01101 (加上隐含的小数点前面的1)。
所以,实际的实数为:-1.01101 × 22-(20 + 2-2 + 2-3 2-5) × 22-5.625从实数向浮点数变换稍微麻烦一点。
假定我们需要将实数-9.625 表达为单精度的浮点数格式。
方法是首先将它用二进制浮点数表达,然后变换为相应的浮点数格式。
首先,将小数点左侧的整数部分变换为其二进制形式,9 的二进制性形式为1001。
处理小数部分的算法是将我们的小数部分乘以基数2,记录乘积结果的整数部分,接着将结果的小数部分继续乘以2,并不断继续该过程:0.625 × 2 = 1.25 10.25 × 2 = 0.5 00.5 × 2 = 1 10当最后的结果为零时,结束这个过程。
这时右侧的一列数字就是我们所需的二进制小数部分,即0.101。
这样,我们就得到了完整的二进制形式1001.101。
用规范浮点数表达为1.001101 × 23。
因为是负数,所以符号域为1。
指数为3,所以指数域为 3 + 127 = 130,即二进制的10000010。
尾数省略掉小数点左侧的1 之后为001101,右侧用零补齐。
最终结果为:1 10000010 00110100000000000000000最后可以将浮点数形式表示为十六进制的数据如下:1100 0001 0001 1010 0000 0000 0000 0000C 1 1 A 0 0 0 0最终结果为0xC11A0000。