L8FloatingPointI(1)#16CalrollsoverOSUBehindthearmofNateLongshore’s341ydspassing&4TDs,theBearsroll41-13.RecalltheystoppedourwinningstreakLASTyear...Nextwk#11Oregon@home.GoBears!MachineStructuresLecture8FloatingPointIcalbears.cstv.com/sports/m-footbl/recaps/093006aab.htmlL8FloatingPointI(2)Quoteoftheday“95%ofthefolksouttherearecompletelycluelessaboutfloating-point.”JamesGoslingSunFellowJavaInventor1998-02-28L8FloatingPointI(3)数的小结•计算机是用来处理数的•inN位可以表示些什么?•2N个东西,不会更多!他们可以是…•Unsignedintegers:0to2N-1(forN=32,2N–1=4,294,967,295)•SignedIntegers(补码)-2(N-1)to2(N-1)-1(forN=32,2(N-1)=2,147,483,648)L8FloatingPointI(4)Whataboutothernumbers?1.很大的数?(seconds/millennium)31,556,926,00010(3.155692610x1010)2.很小的数?(Bohrradius)0.000000000052917710m(5.2917710x10-11)3.既有整数部分又有小数部分的数?1.5首先考虑3.…其解也可以用来解决1和2.L8FloatingPointI(5)表示小数部分“二进制小数”:和10进制小数点一样,指定整数和小数间的边界xx.yyyy21202-12-22-32-4例:6位表示10.10102=1x21+1x2-1+1x2-3=2.62510假定以上“固定小数点”,6位这样的格式可以表达:0to3.9375(almost4)L8FloatingPointI(6)2的幂次的倒数可以表示的分数01.0110.51/220.251/430.1251/840.06251/1650.031251/3260.01562570.007812580.0039062590.001953125100.0009765625110.00048828125120.000244140625130.0001220703125140.00006103515625150.000030517578125i2-iL8FloatingPointI(7)定点法表示小数.加法和乘法结果对吗?加法的结果:01.1001.51000.1000.51010.0002.010乘法会更复杂一些:01.1001.51000.1000.51000000000000110000000000000000110000HILOW答案是,0.11?(需要记住小数点的位置)L8FloatingPointI(8)表示小数目前为止,表示小数,我们用的是小数点固定的方法,但我们真正需要的是让小数可以“浮动”.Why?浮点数能更有效地使用有限的位数(从而在表示数时精度更高):…000000.001010100000…其它方案将损失精度!例:将0.1640625表为二进制.5位,确定小数点位置.保存这5位,并记下其位置为小数点后2位对于浮点表示,每个数都包含一个字段记录小数点的位置.小数点可在有效位之外,因此可表示很大的数和很小的数.L8FloatingPointI(9)科学记数法(10进制)6.0210x1023radix(base)decimalpointmantissaexponent•规范化形式:无前导0(小数点左边有且仅有一位非零数字)•表示1/1,000,000,000的几种形式•规范化:1.0x10-9•非规范化:0.1x10-8,10.0x10-10L8FloatingPointI(10)科学记数法(二进制)1.0twox2-1radix(base)“binarypoint”exponent•计算机有专门的算术指令支持这种数的运算,称为floatingpoint,因为其所表示的数的小数点是不固定的,这和整数不一样•在C语言中用float来声明该变量类型mantissaL8FloatingPointI(11)浮点表示(0/2)•普通形式:x.xxxxxxxxxxtwo*2yyyytwo031s?Exponent2423sign?Significand8bits24bits031s?Exponent87sign?significand8bits?24bits?L8FloatingPointI(12)浮点表示(1/2)•规范化形式:+1.xxxxxxxxxxtwo*2yyyytwo•字的倍数(32位)031SExponent302322Significand1bit8bits23bits•S代表SignExponent表示y’sSignificand表示x’s•最小可表达2.0x10-38,最大可表达2.0x1038L8FloatingPointI(13)浮点表示(2/2)•如果结果太大,怎么办?(2.0x1038,-2.0x1038)•Overflow上溢!正指数大于8位指数字段可表示范围•如果结果太小,怎么办?(0&2.0x10-38,0&-2.0x10-38)•Underflow!下溢负指数大于8位指数字段可表示范围•如何减少上下溢出的机会?02x10-382x10381-1-2x10-38-2x1038underflowoverflowoverflowL8FloatingPointI(14)双精度浮点表示DoublePrecision•字的二倍长(64位)•对精度(vs.单精度)•C变量,用double声明•可表示的最小数为2.0x10-308,最大数为2.0x10308•但,根本的好处是有效位更多,从而精度更高031SExponent302019Significand1bit11bits20bitsSignificand(cont’d)32bitsL8FloatingPointI(15)四精度浮点数表示QuadPrecision•字的四倍(128bits)•Unbelievablerangeofnumbers•Unbelievableprecision(accuracy)•目前正在制定规范(IEEE754r)•目前的版本是15位指数,112个有效位(113位精度)•八精度Oct-Precision?•Somehavetried,norealtractionsofar•半精度Half-Precision?•Yep,that’sforashort(16bit)en.wikipedia.org/wiki/Quad_precisionen.wikipedia.org/wiki/Half_precisionL8FloatingPointI(16)IEEE754浮点数标准(1/3)单精度(双精度类似):+1.xxxxxxxxxxtwo*2yyyytwo••Signbit:1表示负数0表示正数•有效位Significand:•想多一些有效位,对规范化数,前导1缺省•单精度有1+23位,双精度有1+52位•对于规范化数恒有:0Significand1•有问题吗?•0怎么表示呢?•指数的符号如何表示?补码吗?•符号位为什么不与有效位联在一起,为什么不使用补码?031SExponent302322Significand1bit8bits23bitsL8FloatingPointI(17)IEEE754浮点标准(2/3)•指数部分使用偏移表示BiasedNotation,意即从指数中减去一常量得到真实的数•IEEE754对单精度数使用偏移值为127.•即真实的指数为Exponent字段减去127得到•对双精度其偏移为1023•小结(单精度数):031SExponent302322Significand1bit8bits23bits•(-1)Sx(1+Significand)x2(Exponent-127)•双精度是一样的,只是指数偏移为1023(半精度,四精度类似)L8FloatingPointI(18)IEEE754浮点标准(3/3)•IEEE754使用“偏移指数biasedexponent”表示的原因.•与整数(序)兼容:就同样的位模式来说,大的浮点数对应于大的整数,从而即使没有浮点硬件,也可以使用整数运算,来比较两个浮点数,实现排序•大指数字段表示大数.011000000ssssss和001000000ssssss谁大•如果用补码就会出问题(因为负数看来更大一些)•后面,我们将看到浮点数的演化顺序和整数是完全一样的即.,二进制数从00…00到11…11,而浮点数从0到+MAX到-0到-MAX到0L8FloatingPointI(19)浮点数标准之“父”IEEE754二制制浮点数算术标准.www.cs.berkeley.edu/~wkahan/…/ieee754status/754story.htmlProf.Kahan1989ACMTuringAwardWinner!一流企业做标准,二流企业做品牌,三流企业做产品L8FloatingPointI(20)例:二进制表示的浮点数转换成10进制•Sign:0=positive•Exponent:•01101000two=104ten•偏移调整:104-127=-23•Significand:1+1x2-1+0x2-2+1x2-3+0x2-4+1x2-5+...=1+2-1+2-3+2-5+2-7+2-9+2-14+2-15+2-17+2-22=1.0+0.66611500110100010101010100001101000010•Represents:1.666115ten*2-23~1.986*10-7(about2/10,000,000)L8FloatingPointI(21)例:10进制数转换成浮点数1.去规范化:-23.406252.转换整数部分:23=16+(7=4+(3=2+(1)))=1011123.转换小数部分:.40625=.25+(.15625=.125+(.03125))=.0110124.两部分合在一起,并规范化:10111.01101=1.011101101x245.转换指数部分:127+4=10000011211000001101110110100000000000000-2.340625x101L8FloatingPointI(22)理解有效位Significand(1/2)•方法1(小数法):•10进制数:0.3401034010/1000103410/10010•2进制数:0.11021102/10002=610/810112/1002=310/410•好处:少一些数字,更多一些思想;这种方法可以帮助我们更好地理解有效位L8FloatingPointI(23)理解有效位Significand(2/2)•方法2(位置值):•从科学计数法转换而来的•10进制:1.6732=(1x100)+(6x10-1)+(7x10-2)+(3x10-3)+(2x10-4)•2进制数:1.1001=(1x20)+(1x2-1)+(0x2-2)+(0x2-3)+(1x2-4)•针对数值距离小数点的位置来解释数值•好处:能更快地求得有效位的值;使用该方法转换浮点数L8FloatingPointI(26)“本节课小结…”•浮点数使我们能够:•Representnumberscontainingbothintegerandfractionalpa