dedecms蓝色企业网站模板,购物网站的建立,凡科网页版登陆入口,网页qq官网整数的表示和运算我们已经讲完了#xff0c;在实际应用中#xff0c;整数能够解决我们大部分问题。但是某些需要精确表示的数#xff0c;比如某件商品的价格#xff0c;某两地之间的距离等等#xff0c;我们如果用整数表示将会有很大的出入#xff0c;这时候浮点数就产生…整数的表示和运算我们已经讲完了在实际应用中整数能够解决我们大部分问题。但是某些需要精确表示的数比如某件商品的价格某两地之间的距离等等我们如果用整数表示将会有很大的出入这时候浮点数就产生了。在 20世纪80年代以前每个计算机厂商都设计了自己表示浮点数的规则以及对浮点数执行运算的细节这对于应用程序在不同机器上的移植造成了巨大的困难。而在这之后也就是 1985年左右IEEE 标准产生了这是一个仔细制定的表示浮点数及其运算的标准现在的计算机浮点数也都是采用这个标准。浮点数不仅仅是为了让数值的表示更加精确也是为了表示一些整数无法达到的数字比如一些接近于0的数字或者一些非常大的数值。因此浮点数对于计算机的意义是非常大的。1、二进制小数前面这篇博客 进制间的转换 我们已经讲过了各个进制数的表示。现在我们复习一下进位计数制的要素①、数码用来表示进制数的元素。比如二进制数的数码为0,1。十进制数的数码为0,1,2,3,4,5,6,7,8,9。十六进制数的数码为0,1,2,3,4,5,6,7,8,9A,B,C,D,E,F②、基数数码的个数。比如二进制数的基数为2。十进制数的基数为10。十六进制数的基数为 16.③、位权数制中每一固定位置对应的单位值称为位权。例如十进制第2位的位权为101即10第3位的位权为102即100而二进制第1位的位权为20即1第3位的位权为4对于 N进制数整数部分第 i位的位权为N(i-1)而小数部分第j位的位权为N-j。那么我们可以说每个数码所表示的数值该数码值 * 所处位置的位权。比如十进制数(123.45)101×1022×1013×1004×10-15×10-2二进制数(1010)2 l× 230 × 22l× 210 × 20(10)10十六进制数(BAD)16 11× 16210×16113×160(2989)10二进制小数(10010.1110)2 1 * 24 0 * 23 0 * 22 1 * 21 0 * 20 1 * 2-1 1 * 2-2 1 * 2-3 0 * 2-4 16 2 1/2 1/4 1/8总结来说十进制表示公式对于一个形式为bm....b0.b-1....b-n的二进制小数b来说二进制表示公式从上面的二进制公式我们可以看出小数点向左移动一位则相当于 (∑ 2i * bi)/2。因为每一位的位权都*2-1反过来小数点向右移动一位则相当于该数乘以2。注意二进制小数不像整数一样只要位数足够它就可以表示所有整数。假设我们仅考虑有限长度的编码那么二进制小数无法精确的表示任意小数比如十进制小数0.2我们并不能将其准确的表示为一个二进制数只能增加二进制长度提高表示的精度。2、IEEE 浮点表示IEEE电气和电子工程师协会( 全称是Institute of Electrical and Electronics Engineers)是一个国际性的电子技术与信息科学工程师的协会是目前全球最大的非营利性专业技术学会IEEE 754 标准是IEEE二进位浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)的标准编号。IEEE 浮点标准表示 V (-1)s * M * 2E。①、s 是符号位为0时表示正为1时表示负。②、M为尾数是一个二进制小数它的范围是0至1-ε或者1至2-ε(ε的值一般是2-k次方其中设k 0)③、E为阶码可正可负作用是给尾数加权。我们将浮点数的位划分为三个阶段分别对这些值进行编码。一、一个单独的符号位 s 直接编码符号 s二、k 位的阶码字段 exp ek-1ek-2...e1e0 编码阶码E三、n 位小数字段 frac fn-1fn-2...f1f0 编码尾数 M但是编码出来的值也依赖于阶码字段的值是否等于0.一般来说现在的编译器都支持两种浮点格式一种是单精度一种是双精度。单双精度分别对应于编程语言当中的float和double类型。其中float是单精度的采用32位二进制表示其中1位符号位8位阶码以及23位尾数。double是双精度的采用64位二进制表示其中1位符号位11位阶码以及52位尾数。如下图表示如果给定了位 s 的表示根据 exp 的值被编码的值可以分为三种不同的情况(最后一种情况有两个变种)。下图是单精度的情况下面我们分别讲解这三种情况(规格化、非规格化、特殊值)3、规格化阶码E 的位模式exp既不全为0(数值0)也不全为1(单精度8位1数值为255双精度11位数值为2047)。这种情况下阶码字段被解释为以偏置形式表示的有符号整数。”偏置”的含义就是在原有的值的基础上加上一个偏移量对于阶码位数为k的情况来说偏移量Bias 2k-1-1。假设e是阶码的无符号数值那么真实的阶码E e - Bias。单精度阶码位数为8则Bias 127。由于8位阶码下的规格化的浮点数的阶码范围是1至254因此真实阶码的范围则为-126至127。对于小数字段 frac fn-1fn-2...f1f0 它的值 0 f 1。那么我们可以表示为0. fn-1fn-2...f1f0也就是二进制小数点在最高有效位的左边。当计算浮点数数值的时候会在尾数值的基础上加1也就是真实的尾数M 1 f。因此我们可以把 M 看成一个二进制表达式为 1.fn-1fn-2...f1f0的数字。相当于我们省掉了1位二进制形成了浮点数表示的约定默认尾数的值还有一个最高位的1。4、非规格化的值当阶码域为全 0 的时候所表示的数就是非规格化形式。按照上面规格化的阶码求值方式来说非规格化的阶码值应该固定在-Bias这个值上面。不过这里有一个小技巧我们设定阶码的值E 1 - Bias。这样做是为了能够平滑的从非规格化的浮点数过渡到规格化的浮点数有关这一点后面我们再详细看。对于尾数的解释非规格化的方式与规格化不同它不会对尾数进行加1的处理也就是说真实的尾数M f。这是为了能够表示0这个数值否则的话尾数总是大于1那么无论如何都将得不到0这个数值。非规格化的浮点数除了可以表示0以外它还有一个作用就是可以表示接近于0的数值。另外在浮点数当中0的表示有两种一种是位表示全部为0则为0.0。还有一种则是符号位为1其余全为0此时为-0.0。5、特殊值特殊值是指阶码全为 1 的时候出现的。在阶码全为1时如果尾数位全为0则表示无穷大。符号位为0则表示正无穷大相反则表示负无穷大。倘若尾数位不全为0时此时则表示NaN表示不是一个数字。一些运算的结果不能是实数或者无穷就会返回NaN值比如正无穷减正无穷-1的根号值。在某些应用中表示未初始化的值也很有用处。这一点在Javascript当中有一个函数isNaN()与这个NaN的含义有点类似它的作用是用来判断一个参数或者表达式是否是一个数字。6、数值范围注意由于浮点数在正负的区间内是一一对应的因此我们将忽略符号位对取值范围的影响我们只讨论符号位为0的情况。非规格化①、最小的正非规格化值的位表示是由最低有效位为 1 而其他所有位为 0 构成。它具有小数(尾数)值 Mf2-n 和阶码值 E -2k-1 2。因此它的数字值是 V 2-n * 22 - 2k-1 2-n2 - 2k-1。②、最大的非规格化值全为0的阶码字段和全为1的小数字段组成。此时的小数(尾数)值 Mf1-2-n阶码 E -2k-1 2因此此时的值为 (1 - 2-n) * 22 - 2k-1。规格化①、最小的正规格化值阶码字段的最低有效位为1其它位为0,。它的尾数值 M 1。阶码值 E -2k-1 2。因此数值 V 22 - 2k-1②、最大的规格化值符号位为0阶码最低有效位等于0其它位等于 1尾数为n个1。它的小数值 f1-2-n,尾数 M 2 - 2-n此时的值为(2 - 2-n) * 2-1 2k-1也可以化简一下为(1 - 2-n-1) * 22k-1。下面我们看一下非负浮点数单双精度取值范围7、总结本篇博客介绍的 IEEE 浮点标准算是难度系数很高的一节了需要花很多时间去理解。下篇博客浮点数据类型的舍入以及运算。