IEEE745浮点数标准_第1页
IEEE745浮点数标准_第2页
IEEE745浮点数标准_第3页
IEEE745浮点数标准_第4页
IEEE745浮点数标准_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、IEEE 745浮点数标准解读IEEE标准754:浮点数表示如须转载请注明作者为L ,并请保持文章的完整和提供转载出处。N的实际值n由下列式子表示:n = (1),x m x 2e其中: n,s,e,m分别为N,S,E,M对应的实际数值,而N,S,E,M仅仅是一审二进制 位。 S(sign)表示N的符号位。对应值s满足:n>0时,s=0; n<0时,s=1。 E(exponent)表示N的指数位,位于S和M之间的若干位。对应值e值也 可正可负。 M(mantissa)表示N的尾数位,恰好,它位于 N末尾。M也叫有效数字位 (sinificand )

2、、系数位(coefficient ),甚至被称作“小数”。三、浮点数格式IEEE标准754规定了三种浮点数格式:单精度、双精度、扩展精度。前两 者正好对应C语言里头的float、double或者FORTRAN头的real、double精 度类型。限于篇幅,本文仅介绍单精度、双精度浮点格式。 单精度:N共32位,其中S占1位,E占8位,M占23位。单精度浮点格式31 3023 220SS 双精度:N共64位,其中S占1位,E占11位,M占52位基精度浮点格式63 6Z52 510S£Me = |石| biasbias = 2k-r - 1上图中,|E|表示E的二进制序列表示的整数值,例

3、如E为"10000100",则 |E|=132,e=132-127=5 。 k则表示E的位数,对单精度来说,k=8,则bias=127 , 对双精度来说,k=11,则bias=1023。此时m的计算公式如下图所示:LA/标准规定此时小数点左侧的隐含位为1,那么m=|1.M|。如M="101”,则|1.M|=|1.101|=1.625, 即 m=1.6252、非规格化:当E的二进制位全部为0时,N为非规格化形式。此时e, m 的计算都非常简单。e = 1 biasm = 1cLM注意,此时小数点左侧的隐含位为 00为什么e会等于(1-bias)而不是(-bias),

4、这主要是为规格化数值、非规格化数值之间的平滑过渡设计的。后 文我们还会继续讨论。有了非规格化形式,我们就可以表示 0 了。把符号位S值1,其余所有位均 置0后,我们得到了 -0.0;同理,把所有位均置0,则得到+0.0。非规格化数 还有其他用途,比如表示非常接近 0的小数,而且这些小数均匀地接近 0,称为 “逐渐下溢(gradually underflow) ” 属性。3、特殊数值:当E的二进制位全为1时为特殊数值。此时,若M的二进制 位全为0,则n表示无穷大,若S为1则为负无穷大,若S为0则为正无穷大;若 M的二进制位不全为0时,表示NaN(Not a Number),表示这不是一个合法实数

5、 或无穷,或者该数未经初始化。五、范例仔细研读第四点后,再回忆一下文章开头计算n的公式,你应该写出一个浮 点编码的实际值n 了吧?还不能吗?不急,我先给你示范一下。我们假定 N是 一个8位浮点数,其中,S占1位,E占4位,M占3位。下面这张表罗列了 N可能的正数形式,也包含了 e、m等值,请你对照着这张表,重温一下第四点,你会慢慢明白的。说实在的,这张表花了我不少功夫呢 ,幸好TeX画表格还算省事!描述位志示(N)EQ.Minn00 0000 0000600+0届小非观新化数0 0000 0010631i5120 0000 0100-61I 2 一512 B I- di -1 <I I-

6、 BA * <4*» -f0 0000 1100-6fi36fi512局人北捌格化既0 0000 1110-6f d一7 5"陶小樨格化赞0 0()01 0001-60 A1 + f5120 0001 00116IJ1 + 11 s9 ST2 IV«-144'-1» IV * -4* 事0 001.0 00095 gf_B_2560 0010 0012 J-51工1 + 19 « . . - W F-001L0 1106-1色JF14T7C0110 1116一1二Ti + f15 T?10 0111 000100 Ai + f10

7、 0111 0011I Ai + 49 d-*- . i. i .0 1110 11014r6 d1 + f224观他化像0 1110 11114LA1 + 11 s240C 1111 000一一一一co这张表里头有很多有趣的地方,我提醒一下:看N歹I,从上到下,二进制位表示是均匀递增的,且增量都是一个最小二进制位。这不是偶然,正是巧妙设计的结果。观察最大的非规格数,发现恰好就是M全为1, E全为0的情况。于是我们求出最大的非规格数为: 9 (1 bias)Q(l bias h)*maxdenur 乙乙上面的公式中,h为M的位数(如范例中为3)。注意,公式等号右边的第一 项同时又是最小规格数的

8、值(如范例中为8/512 );第二项则正是最小非规格数 的值(如范例中为1/512)即该浮点数能表示的最小正数。看m歹I,规格化数都是1+ x的形式,这个1正是隐含位1;而非规格 化数隐含位为0,所以没有"1+"。看n歹I,非规格化数从上到下的增量都是1/512,且过渡到规格化数时,增量是平滑的,依旧是1/512。这正是非规格化数中e等于(1-bias)而不是 (-bias)的缘故,也是巧妙设计的结果。再继续往下看,发现增量值逐渐增大。可见,浮点数的取值范围不是均匀的。六、实战我们用一小段汇编来测试一下,浮点数在内存中是如何表示的。测试环境:GentooLinux2006.

9、0/GNU assembler version 2.16.1/GNU gdb 6.4/AMD XP1600+ 如下所示代码:/coding/assemble $ gdb(gdb) list1 .section.data2 f1:3 .float54 f2:5 .float0.16 .section.text7 .global _start8 _start:9 nop10(gdb) x/f &f10x40a000000.1000000010x3dcccccd0x80490a4 <f1>:5(gdb) x/xw &f10x80490a4 <f1>:(gdb)

10、 x/f &f20x80490a8 <f2>:(gdb) x/xw &f20x80490a8 <f2>:(gdb)从上面的gdb命令结果可以看出,浮点数 5 被表示为 0x40a00000,二进制形式为(0100 0000 1010 0000 . 0000 0000)。红色数字为 E,可以看出 |E|=129>0,则 e=129-bias=129-127=2 ; 蓝色 数字为M,且|E|>0 ,说明是规格化数,则 m=|1.M|=|1.01000.000|=1.25 ; 由 n的计算公式可以求得n=(-1)A0 * 1.25 * 2A2= 5

11、,结果被验证了。同样,你也可以验证一下十进制浮点数0.1的二进制形式是否正确,你会发现,0.1不能表示为有限个二进制位, 因此在内存中的表示是舍入(rounding)以后的结果,即0x3dcccccd,十进制为 0.100000001 , 误差 0.000000001 由此产生了。七、未完成关于浮点数,还有很多东西(比如舍入误差、除零异常等等)值得我们深入探讨,但已经无法在此继续。这篇文章 的目的仅在初步解释IEEE标准754对浮点数的规定以及一些奇妙的地方。写这 篇文章花掉了我整天的时间,但也使我彻底记住了以前让我胆怯的东西最重 要的是,希望这篇文章对大家有点用处,也算我为计算机科学基础理论

12、版以及 L 做的一点贡献。:Randall Hyde,The Art ofAssembly Language, Vol.1,4.2.12D: Randal E. Bryant, David R.O Hallaron, Computer Systems A Programmer s Perspective (Beta Draft)Part I , Chapt. H , 2.4Rechard Blum, ProfessionalAssembly Language主题词:单片机数制转换器,单片机浮点数转换器人们研制电子计算机的初衷就是为了用于科学计算。时至今日,尽管现在单片机应

13、用领域宽广、色彩缤纷,但复杂计算仍不可或缺的内容。针的对定点数不能胜任复杂计算的缺点,人们在实践中约定了不同格式、不同精度的浮点数,实现了浮点运算。因为计算机只能识别二进制数,完成二进制数的运算,所以我们所说的浮点数一般都是指二进制浮点数。与定点数相比,浮点数能较好地兼顾表达式数值范围,能简捷地表示出很大或很小的数值。浮点由阶码和尾数两部分组成,阶码为带符号的整数,尾数为小于1 带符号的小数(如尾数的绝对值还满足大于或等于1/2 ,则称该浮点数为规格化浮点数)。计算过程中主要以足够长的尾数来保证数据的精度,以阶杩来调整数模(绝对值)的大小(即改变小数点的位置),并自动进行符号处理。因此浮点数具

14、有精度高、数的表达范围宽等特点,特别适用于计算过程复杂、精度要求高的场合。目前单片机常用的浮点数格式,不外乎有四种格式:三字节格式、IEEE-754 标准格式、IEEE-754 标准变形 1 和 IEEE-754 标准变形2,共 4 种格式。作为单片机程序员来说,在编写程序时经常要检验程序中的浮点数运算结果是否正确,但手中又没有合适的检验工具,非常麻烦。对此我就深有体会。为此我收集整理有关浮资料,并编写了一款非常实用的转换工具,它能辅助你编写有关浮点数运算方便的程序,尤其是有关浮点数表格的制作,更是事半功倍。你只需将要转换的十进制定点数编制成一个文本文件,利用FON浮点数转换器“载入”,如图(

15、2),点击一下转换按钮,顷刻间便可完成一个文件数据的转换。也可将浮点数转换为十进制定点数,即逆转换。FON孚点数转换器,我也在工作中使用了两年多,效果非常好,为节省了不少时间。下面是浮点数转换器的部分截屏:©我心咪一 一 I 8:3H0事后 3褥架 一 I* gI?Qp. C1 I馅薛一叫南A-aaai L - 日翻革> 一一 个!料揖 (18罂 I mJLnTW目C(11M 耀 Ilmr-IH 昌【L 1节鹫>一济|?-山留【L (II格隹)洛一岳昌C1格理济昌0胃(£(“出"】用体lllIS L1杂兽护叶111记L摇$<-蜘惭揖aHH至匕町案

16、各 H9H里国寻 H区理胫ZI? KYEcnsm寻 xucvslcslTir 交将口名出 5YCU清爆 百08月目 H记mg 省目§ 求量§ 用5m军工3 §WU8? H93IXI9R3T 寸 HtoacclCJ寸61寸IIImi 口 bbdiEOlEgommcn LOdoiEicxo口 EEzmnsm *曷标方罂将察寺常序后高名望巴p<uw钻F0晒点裁转顿看单个转换卷个转换帮助 十进制定点数:|1£及为131135139|43相52刖160|54晓光17&,10 ,3454 ,72S3 ,00 ,1L ,1926 3033 ,33 ,33

17、三进制浮点操作数:MIHj 及 Q3?K Of&H ;小 041儿口硼。晓凡g6H :' llUDS OCCH.OCBH : IIH.UFXH, OB8K052H .口4兆 OOEK 侬凡 口 FEH ; 042K01EH aElHD43H . 口4况。冽 口8sH 01FH . D42K 040H 000H DOOM : 42K 050K 070K 0A4H : 04巩口&叫口冲 廊K: CH?M, 0T1K OOAJt 03DH042%口随可口氧及MAH .口倒口砌口螭4OF&H : 042此口的耳口解H, DF6H ; 04ZK 网九 口蜘H. OF&am

18、p;H : v转城选项:厂51三字节(格式一)广文三字节I格式二Jr IEEE-T54 (格式一)ff inM54(wSx)JHEEE-754_1(格式一)C工EEE-754f格式二J广工EEE75L2t格式一)工EEE-7£4_2f 格式二)转换©-<Tt换多组数据转换(格式 2)(图3)主要用于制作浮点数表格讨F0暗点费转换益单个转城裔个转换帮助 十进制逊数:|ie.5a)Q0Q7T&37722 799999237060527400000381469731,340000152SS7935,5400001557339.720001220703143,8900

19、0106811524652,110000510351656,18990862670960,25999S3Z15332B4.300003&51757066,330001831054772,3300013310547 re.3300013310547转摭©->1二进制浮点煤作数:MIHj 口94耳 03?K Of&H ; m 041 a 0B8X。吃凡066H :' 口41 比 口同,OCCH, OCBH ; 41H.UFAH, OB8K052H .4现 OOEK 0S6K 口 FEM ; 042K01EH 0E1HD43H : 口 4况江n 085K D1

20、FH . D42K 040H 000H DODH : 042M, 050K 070K 0A4H : 04巩口&叫 M2及卿H : D4?K OTlJi, OOAJt 03DK ;一 M2凡口随H, 口氧H, MAH . 口例口朝口战比OF&H : 042凡口如耳口品H, 0F6H ;口4弭口8肌口嫡40F6H ; v转飘选项:厂5L三字节(格式一)九三字节格式二】r IEEE-T54 (格式一)V IEEE-754 (格式二)广工EEE-754(格式一)C工EEE-754(格式二】广工EEE=T5L£t格式一)工EEE-754_2E 格式二 3装载U |保存为国)|E

21、:FONptlOO. txt 甲 FOH'ptl 8*多组数据逆转换(图4),此时的定点数会出现此尾数差异,并不影响精度班F0唁点软转换森O叵区I单个转摭!/个转换超出二m单杳机浮点数格式说明N凯51三字节格式:三浮点数格式如下:地址B/0BT1内容 SEIE ETEE mUMM NMMM MMHM MMNM用三个字节表示,第一个字节的最高位为数将*,正数为。,负数为心其余七位 为阶码(二进制补码那式)第二字节为尾数的高字节'第三字节为尾数的低宇 节,尾数用双字节R CD吗纯小数C原吗)来表示。帆S-51三字节浮点数视格化:为了提高运篁精度,正数的尾数最高位规定为1,负数的尾数

22、的最高位规定为0 , 这种形式的浮点数为规格化数I又祢浮点操作数)D运苴之前所有的浮点数都应转 成规格化数0以下为1EEETS4林推中的32-bi t单精度厚点数及其变异型格式.L> TP Iff 17_77匚 ri产ifrt空单片机浮点数格式说明 MCS51三字节格式:浮点数格式如下:地址ebBY0BY1内容 SEEE EEEE MMMM MMMM MMMM MMMM用三个字节表示,第一个字节的最高位为数符 S,正数为0,负数为1,其余七位为阶码(二进制补码形式) 第二字节为尾数的高字节;第三字节为尾数的低字节,尾数用双字节BCD码纯小数(原码)来表示。例:已知 a=-123.4 ;

23、b=0.7577 ; c=56.34 ; d=1.276 ;用BCD码浮点数表示时,分别为a=831234H; b=007577H; c=025634H; d=011276H。 MCS51三字节浮点数规格化:为了提高运算精度,正数的尾数最高位规定为 1,负数的尾数的最高位规定为 0,这种形式的浮点数为规格 化数(又称浮点操作数)。运算之前所有的浮点数都应转成规格化数。* IEEE -754标准的格式:一个浮点数用两个部分表示,尾数和2 的幂,尾数代表浮点上的实际二进制数,2 的幂代表指数,指数的保存形式是一个0 到 255 的 8 位值,指数的实际值是保存值(0 到 255) 减去127,一个

24、范围在-127 到 +128之间的值,尾数是一个 24位值(代表大约7个十进制数),最高位 MSB®常是1,因此省略不保存,一个符号位表示浮点数是正或负。地址ebBY0BY1BY2内容SEEEEEEE E.MMMMMMM MMMMMMMM MMMMMMMMS (第 31 位)代表符号(数符)位1 是负, 0 是正;E 偏移 127 的幂,二进制阶码=(EEEEEEEE)-127;. 小数点;M 24 位的尾数保存在23 位中,只存储23 位,隐含最高位1 。此方法用最较少的位数实现了较高的有效位数,提高了精度。零是一个特定值,幂是0 尾数也是0。阶码的计算方法:阶码采用指数的移码,阶

25、码= 指数 P+7FH阶码(移码)eb=指数P+7FH其中:指数P=int (Z),Z=ln (A)/ln ( 2)由1 位符号位、8 位指数、23 位有效数组成。能表示的数据范围为:± 1.2X10% -38)3.4 ><10人38,超出范围为溢出。精度为 2-24 即 5.9 X 10 -8 o如果 eb=P+7EH 那么指数 P=int (Z) +1 ,(广洲天龙AVR单片机浮点数格式定义的移码为7EH,而IEEE-754标准定义的是7FH,故我们取移码为7FH)* 在由二进制浮点数转为十进制定点数时,注意在尾数的左边有一个省略的小数点和1,这个1 在浮点数的保存中

26、经常省略, 但在还原时应加上去。* IEEE -754_1 标准的格式:地址ebBY0BY1BY2内容PtEEEEEEE S.MMMMMMM MMMMMMMM MMMMMMMMPt 代表阶符,阶符视阶的正负而定;S 代表符号(数符)位,1 是负, 0 是正;. 小数点在数符的右边;E 代表幂偏移,即指数偏差;M 24 位的尾数保存在23 位中,只存储23 位,隐含最高位1 。阶码的计算方法:( 1 )十进制整数(可带小数):阶码eb数P+7EH其中:指数P=int ( Z) +1, Z=ln ( A) /ln ( 2)( 2)纯小数:阶码eb=指数+7EH其中:指数P=int ( Z),Z=l

27、n ( A) /ln ( 2)注:IEEE-754_1主要用于PIC系列单片机浮点数格式* IEEE -754_2 标准的格式:地址ebBY0BY1BY2内容PtEEEEEEE S.MMMMMMM MMMMMMMM MMMMMMMMPt 代表阶符,阶符视阶的正负而定;S 代表符号(数符)位1 是负, 0 是正;. 小数点在数符的右边;E 代表幂偏移,即指数偏差;M 24 位的尾数保存在23 位中,只存储23 位,隐含最高位1 。阶码采用1字节移码,以 80H0FFH表示0127,以01H7FH表示-127-1 。阶码的计算方法:( 1 )十进制整数(可带小数):阶码eb=指数P+80H其中:指

28、数P=int ( Z) +1, Z=ln ( A) /ln ( 2)( 2)纯小数:阶码eb=指数+80H其中:指数P=int ( Z),Z=ln ( A) /ln ( 2)能表示的数据范围为:5.8X10A( -39)1.7 ><10人38,超出范围为溢出。注: Pt 表示阶符,Pt=0 表示阶码为正数;Pt=1 表示阶码为负数(如 0.1 的阶为 -3,则 阶码=( -3) + 80H=7DH )IEEE-754_1 与 IEEE-754_2 只是阶码字节的内容不同,而尾数的内容是相同的。例:十进制数50.265 化为 32 位规格化浮点数。解 A=50.265 ,则 Z=ln

29、50.265/ln2 , P=int(Z)+1 ,故P=6;X=A/2P=50.265/26=0.785390625 ,将定点小数:0.785390625 转为二进制数为:1100 1001 0000 1111 0101 1100B , 取其 24 位,检查24 位是否为1 ,否则,将二进制数左移,直至二进制数的最高位为1 ;隐含尾数整数的1,将二进制数的最高位改为数的数符位(正数为0,负数为1 )。则: 0100 1001 0000 1111 0101 1100B = 49H,0FH,5CH;而阶码 eb=P+80H=6+80H=86H二进制浮点数为:86H, 49H,0FH,5CH*浮点B

30、CD码的格式: 浮点BCD码,是以纯小数(原码)来表示。小数点的位置由阶来确定。 阶符 . 阶码 ,数符 . 尾数( 4 字节),即带符号的阶码与带符号的尾数。阶符:正数为“+”,可隐含;负数为“- ”;数符:正数为“+”,可隐含;负数为“- ”;阶码:根据小数点的位置来确定。0.1-> 阶符为“+” , 数符为“+”,阶为000.01-> 阶符为“ -” , 数符为“+”,阶为0122.00-> 阶符为“+”,数符为“+”,阶为02-0.1-> 阶符为“+” , 数符为“-”,阶为 00-0.01-> 阶符为“-” ,数符为“ -”,阶为 01-22.00-> 阶符为“+”,数符为“- ”,阶为02阶 -> 这里所说的阶是十进制浮点数的阶, 即为小数点的位置。“+”阶小数点的位置向右移;“- ”阶小数点的位置向左移。如: 阶符 . 阶码 ,数符 . 尾数-0.012345678 ,浮点 BCM为:-01 , -12345780H0.012345678 ,浮点 BCM为:-01 , 12345780H0.12345678,浮点 BCM为:00 , 12345780H 12345678,浮点 BCM为:08 , 12345780H-12345678 ,浮点 BC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论