发布时间:2012-03-16 阅读量:1459 来源: 我爱方案网 作者:
什么是浮点数
浮点数是表示小数的一种方法。所谓浮点就是小数点的位置不固定,与此相反有定点数,即小数点的位置固定。整数可以看做是一种特殊的定点数,即小数点在末尾。8086/8088中没有浮点数处理指令,不过从486起,CPU内置了浮点数处理器,可以执行浮点运算。一般的浮点数有点象科学计数法,包括符号位、指数部分和尾数部分。
浮点数的表示方法
浮点数是指小数点位置可以浮动的数据,通常以下式表示:
这里的M(Mantissa)被称为浮点数的尾数,R(Radix)被称为阶码的基数,E(Exponent)被称为阶的阶码。计算机中一般规定R为2、8或16、是一个确定的常数,不需要在浮点数中明确表示出来。因此,要表示浮点数,一是要给出尾数M的值,通常用定点小数形式表示,它决定了浮点数的表示精度,即可以给出的有效数字的位数。二是要给出阶码,通常用整数形式表示,它指出的是小数点在数据中的位置,决定了浮点数的表示范围。浮点数也要有符号位。在计算机中,浮点数通常被表示成如下格式:
Ms是尾数的符号位,即浮点数的符号位,安排在最高一位;
E 是阶码,紧跟在符号位之后,占用m位,含阶码的一位符号;
M 是尾数,在低位部分,占用n位。
合理地选择m和n的值是十分重要的,以便在总长度为1+m+n个二进制表示的浮点数中,既保证有足够大的数值范围,又保证有所要求的数值精度。例如,在PDP-11/70计算机中,用32位表示的一个浮点数,符号位占一位,阶码用8位,尾数用23位,数的表示范围约为:
精度约为10进制的7位有效数字。
若不对浮点数的表示格式作出明确规定,同一个浮点数的表示就不是唯一的。例如0.5也可以表示为0.05×101 , 50×10-2 等。为了提高数据的表示精度,也为了便于浮点数之间的运算与比较,规定计算机内浮点数的尾数部分用纯小数形式给出,而且当尾数的值不为0时,其绝对值应大于或等于0.5,这被称为浮点数的规格化表示。对不符合这一规定的浮点数,要通过修改阶码并同时左右移尾数的办法使其变成满足这一要求的表示形式,这种操作被称为的规格化处理,对浮点数的运算结果就经常需要进行规格化处理。
当一个浮点数的尾数为0,不论其阶码为何值,该浮点数的值都为0。当阶码的值为它能表示的最小一个值或更小的值时,不管其尾数为何值,计算机都把该浮点数看成零值,通常称其为机器零,此时该浮点数的所有各位(包括阶码位和尾数位)都清为0值。
按国际电子电气工程师协会的IEEE标准,规定常用的浮点数的格式为:
符号位 阶码 尾数 总位数
短浮点数 1 8 23 32
长浮点数 1 11 52 64
临时浮点数 1 15 64 80
对短浮点数和长浮点数,当其尾数不为0值时,其最高一位必定为1,在将这样的浮点数写入内存或磁盘时,不必给出该位,可左移一位去掉它,这种处理技术称为隐藏位技术,目的是用同样多位的尾数能多保存一位二进制位。在将浮点数取回运算器执行运算时,再恢复该隐藏位的值。对临时浮点数,不使用隐藏位技术。
从上述讨论可以看到,浮点数比定点小数和整数使用起来更方便。例如,可以用浮点数直接表示电子的质量9×10-28 克,太阳的质量2×1033 克,圆周率3.1416等。上述值都无法直接用定点小数或整数表示,要受数值范围和表示格式各方面的限制。
浮点数比较
在数学运算当中经常会涉及到判断两个数是否相等的情况,对于整数很好处理 A==B这样的一个语句就可以解决全部的问题,但是对于浮点数是不同的。
首先,浮点数在计算机当中的二进制表达方式就决定了大多数浮点数都是无法精确的表达的,现在的计算机大部分都是数字计算机,不是模拟机,数字机的离散化的数据表示方法自然无法精确表达大部分的数据量的。
其次计算机浮点数的精度在单精度float类型下,只有7位,在进行浮点运算的时候,这个精度往往会导致运算的结果和实际期望的结果之间有误差
因为前两个原因,我们很难用 A==B来判定两个浮点数是否相同。很自然,我们可以想到 fabs(A-B) < epsilon 这样的一种判别方法。但是这种判别方法稳妥吗?它也不稳妥。
首先, epsilon是一个绝对的数据,也就是误差分析当中说说的绝对误差,使用一个固定的数值,对于float类型可以表达的整个数域来说是不可以的
比如epsilon取值为0.0001,而a和b的数值大小也是0.0001附近的,那么显然不合适。另外对于a和b大小是10000这样的数据的时候,它也不合适,因为10000和10001也可以认为是相等的呢?适合它的情况只是a或者b在1或者0附近的时候。既然绝对误差不可以,那么自然的我们就会想到了相对误差。
bool IsEqual(float a, float b, float relError ) {
return ( fabs ( (a-b)/a ) < relError ) ? true : false;
}
这样写还不完善,因为是拿固定的第一个参数做比较的,那么在调用IsEqual(a, b, relError ) 和 IsEqual(b, a, relError ) 的时候,可能得到不同的结果。同时如果第一个参数是0的话,就有可能是除0溢出。这个可以改造,把除数选取为a和b当中绝对数值较大的即可。
bool IsEqual(float a, float b, relError )
{
if (fabs(a)
return (fabs( (a-b)/b) > relError ) ? true : false;
};
使用相对误差就很完善吗? 也不是, 在某些特殊情况下, 相对误差也不能代表全部。比如在判断空间三点是否共线的时候,使用判断点到另外两个点形成的线段的距离的方法的时候。只用相对误差是不够的,应为线段距离可能很段,也可能很长,点到线段的距离,以及线段的长度做综合比较的时候,需要相对误差和绝对误差结合的方式才可以。相对完整的比较算法应该如下:
bool IsEqual(float a, float b, float absError, float relError )
{
if (a==b) return true;
if (fabs(a-b)
return (fabs((a-b)/b>relError ) ? true : false;
}
这样才相对完整这浮点数之间最初级的比较方法。
在现代汽车行业中,HUD平视显示系统正日益成为驾驶员的得力助手,为驾驶员提供实时导航、车辆信息和警示等功能,使驾驶更加安全和便捷。在HUD平视显示系统中,高精度的晶振是确保系统稳定运行的关键要素。YSX321SL是一款优质的3225无源晶振,拥有多项卓越特性,使其成为HUD平视显示系统的首选。
随着医疗技术的进步,心电监护设备在日常生活和医疗领域中起到了至关重要的作用。而无源晶振 YSX211SL 作为一种先进的心电贴产品,以其独特的优势在市场上备受瞩目。
对于可编程晶振选型的话,需要根据企业的需求选择。在选择可编程晶振的时候注重晶振外观、晶振的频率、晶振的输出模式、晶振的型号等等,这些都是要注意的,尤其是晶振的频率和晶振输出模式以及晶振的型号都是需要注意的。
在现代科技发展中,服务器扮演着越来越重要的角色,为各种应用提供强大的计算和数据存储能力。而高品质的服务器组件是确保服务器稳定运行的关键。YSO110TR宽电压有源晶振,作为服务器的重要组成部分,具备多项优势,成为业界必备的可靠之选。
其实对于差分晶振怎么测量方式有很多种,主要还是要看自己选择什么样的方式了,因为选择不同的测量方式步骤和操作方式是不同的。关于差分晶振怎么测量的方式,小扬给大家详细的分享一些吧!