资源预览内容
第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
第9页 / 共11页
第10页 / 共11页
亲,该文档总共11页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
常用的浮点数存储格式:32-bit IEEE-754 floating-point format 常用的浮点数存储格式:32-bit IEEE-754 floating-point format 对于大小为 32-bit 的浮点数( 32-bit 为单精度, 64-bit 浮点数为双精度,80-bit 为扩展精度浮点数),1、其第 31 bit 为符号位,为 0 则表示正数,反之为负数,其读数值用 s 表示;2、第 3023 bit 为幂数,其读数值用e 表示;3、第 220 bit 共 23 bit 作为系数,视为二进制纯小数,假定该小数的十进制值为 x;十进制转浮点数的计算方法: 则按照规定, 十进制的值用浮点数表示为:如果十进制为正,则s = 0,否则 s = 1;将十进制数表示成二进制,然后将小数点向左移动,直到这个数变为1.x 的形式即尾数,移动的个数即位指数。为了保证指数为正,将移动的个数都加上127,由于尾数的整数位始终为1,故舍去不做记忆。对 3.141592654 来说,1、正数, s = 0;2、3.141592654 的二进制形式为正数部分计算方法是除以二取整,即得 11,小数部分的计算方法是乘以二取其整数,得0.0010 0100 0011 1111 0110 1010 1000,那么它的二进制数表示为11.0010 0100 0011 1111 0110 1010 1;3、 将小数点向左移一位,那么它就变为 1.1001 0010 0001 1111 1011 0101 01 ,所以指数为 1+127=128 ,e = 128 = 1000 0000 ;4、舍掉尾数的整数部分1,尾数写成 0.1001 0010 0001 1111 1011 0101 01 ,x = 921FB6 5、最后它的浮点是表示为0 1000 0000 1001 0010 0001 1111 1011 0101 = 40490FDA 浮点数转十进制的计算方法:则按照规定,浮点数的值用十进制表示为: (-1)s * (1 + x) * 2(e - 127) 对于 49E48E68 来说,1、其第 31 bit 为 0,即 s = 0 2、 第 3023 bit 依次为 100 1001 1 , 读成十进制就是 147, 即 e = 147。3、第 220 bit 依次为 110 0100 1000 1110 0110 1000,也就是二进制的纯小数 0.110 0100 1000 1110 0110 1000,其十进制形式为(0.110 0100 1000 1110 0110 1000 * 223) / (223) = (0x49E48E68 Round(1.5) = 2; Round(2.5) = 2 ; 四舍五入模式:Round(0.5) = 1 ; Round(1.5) = 2; Round(2.5) = 3 ; 主要理由: 由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。在两个可以精确表示的相邻浮点数之间,必定存在无穷多实数是IEEE 浮点数所无法精确表示的。如何用浮点数表示这些数,IEEE 754的方法是用距离该实数最近的浮点数来近似表示。但是,对于.5 ,它到 0 和 1 的距离是一样近,偏向谁都不合适,四舍五入模式取1 ,虽然银行在计算利息时,愿意多给 0.5 分钱,但是,它并不合理。例如:如果在求和计算中使用四舍五入,一直算下去,误差有可能越来越大。机会均等才公平,也就是向上和向下各占一半才合理,在大量计算中,从统计角度来看,高一位分别是偶数和奇数的概率正好是50% : 50% 。至于为什么取偶数而不是奇数,大师Knuth有一个例子说明偶数更好,于是一锤定音。最近舍入模式在C/C+中没有相应的函数,当然,IEEE754以及 x86 FPU 的默认舍入模式是最近舍入,也就是每次浮点计算结果都采用最近舍入模式,除非用程序显式设置为其它三种舍入模式。另外三种舍入模式,简要说明。向 0(截断)舍入:C/C+的类型转换。(int) 1.324 = 1,(int) -1.324 = -1; 向负无穷大(向下)舍入:C/C+函数 floor()。例如: floor(1.324) = 1,floor(-1.324) = -2 。向正无穷大(向上)舍入:C/C+函数 ceil()。ceil(1.324) = 2。Ceil(-1.324) = -1; 后两种舍入方法据说是为了数值计算中的区间算法,但很少听说哪个商业软件使用区间算法。3 、 十进制小数与二进制小数的相互转换先看看十进制数与二进制数如何互相转换。用下标表示数的基(base ),即 d10表示十进制数,b2二进制数。则一个具有n+1位整数 m 位小数的十进制数d10表示为:例 3:同理,一个具有n+ 1 位整数 m 位小数的二进制数b2表示为:例 4:二进制数转换成十进制数,比较容易,如例4 。十进制数转换成二进制数,是把整数部分和小数部分分别转换,整数部分用2 除,取余数,小数部分用2 乘,取整数位。例 5:把 (13.125)10转换成二进制数整数部分:,小数部分:因此,说明 :C/C+语言的 scanf()函数一般不采用这种方法。一个十进制数能否用二进制浮点数精确表示,关键在于小数部分。我们来看一个最简单的小数能否精确表示。按照乘以2 取整数位的方法,有:得到一个无限循环的二进制小数,用有限位无法表示无限循环小数,因此,无法用 IEEE 754 浮点数精确表示。从中也可以看到:由于,这四个数也无法精确表示。同理:也无法用IEEE 754浮点数精确表示。结论 1 :的 9 个小数中,只有0.5 可以精确表示:。可以把这个结论推广到一般情况:结论 2 :任何下面的十进制数都无法用IEEE 754 浮点数精确表示,必定存在误差。如果的整数部分能精确表示且该数在浮点数的精度范围之内,则该数可以精确表示。4 、 二进制小数能精确表示的十进制小数的基本规律上述结论是由十进制数向二进制数转换而得到的,下面从二进制数向十进制数转换的角度来推演:可以一直算下去,得到一个基本规律结论 3 :一个十进制小数要能用浮点数精确表示,最后一位必须是5,因为 1 除以 2 永远是 0.5,当然这是必要条件,并非充分条件。一个 m 位二进制小数能够精确表示的十进制小数有多少个呢?当然是个。推演如下:一位二进制小数能够精确表示的小数只有个:。两位二进制小数能够精确表示的小数有个:。三位二进制小数能够精确表示的小数有个: m 位二进制小数能够精确表示的十进制小数就是个。而 m 位十进制小数有个,因此,能精确表示的十进制小数的比例是,m 越大,比例越小。以常用的单精度和双精度浮点数为例,m 分别是 24 和 53 ,则比例为:和,小到可以忽略不计。5 、 FAQ :C/C+库函数函数printf() 是如何忽悠我们的?Q: 既然绝大部分浮点小数都不能精确表示十进制小数,为什么 printf()经常能打印出准确的值?A:因为 IEEE 754对二进制到十进制的转换有明确规定,见前面2.d )。而且函数printf()默认情况下只打印7 位有效数字,在误差不大的情况下是没有问题的,但是,我们经常见到这样的结果 “.xxxx999999 ” 。用 printf(“%.17lf ”, ) ;可以让浮点数显出原形。6 、 与 IEEE 754相关的标准本文的结论基于IEEE 754标准,另外一个标准是IEEE 854 ,这个标准是关于十进制浮点数的,但没有规定具体格式,所以很少被采用。另外,从2000年开始, IEEE 754开始修订,被称为 IEEE 754R (http:/754r.ucbtest.org/),目的是融合IEEE 754和 IEEE 854标准,已经在工作组内进行表决,还没有被IEEE 表决通过,估计也快了。该标准在浮点格式方面的修订如下:a) 加入了 16 位和 128 位的二进制浮点数格式。b) 加入了十进制浮点数格式,采用了IBM 公司( http:/www2.hursley.ibm.com/decimal/ )提出的格式,Intel公司也提出了自己的格式,但未被采纳,只留了口子。(标准从来都是企业利益博弈的产物)。7 、 是否该使用十进制浮点数?Kahan教授的看法:一定要使用十进制浮点数,以避免人为错误。也就是这种错误:double d = 0.1 ;实际上, d 0.1 。IBM 公司的看法:在经济、金融和与人相关的程序中,使用十进制浮点数。但是,由于没有硬件支持,用软件实现的十进制浮点计算比硬件实现的二进制浮点计算要慢100-1000倍。由于被 IEEE 754R所采纳, IBM 公司将在下一代Power芯片中实现十进制FPU。( http:/www2.hursley.ibm.com/decimal/)8 、 进一步阅读建议本文讨论的是二进制浮点数的表示精度问题,对于计算精度,可以阅读David Goldberg的经典文章 What Every Computer Scientist Should Know About Floating-Point Arithmetic ,别以为 “ Scientist”是什么高级玩意儿,在这里是“ 初学者 ” ,数值计算指南把该文作为附录。总结精确是偶然的,误差是必然的。如果做数值算法,惟一能做的就是误差不积累,其它的就不要奢望了。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号