浮点转定点方法总结.doc

上传人:灯火****19 文档编号:137206786 上传时间:2020-07-06 格式:DOC 页数:19 大小:252KB
返回 下载 相关 举报
浮点转定点方法总结.doc_第1页
第1页 / 共19页
浮点转定点方法总结.doc_第2页
第2页 / 共19页
浮点转定点方法总结.doc_第3页
第3页 / 共19页
浮点转定点方法总结.doc_第4页
第4页 / 共19页
浮点转定点方法总结.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《浮点转定点方法总结.doc》由会员分享,可在线阅读,更多相关《浮点转定点方法总结.doc(19页珍藏版)》请在金锄头文库上搜索。

1、浮点转定点方法总结浮点转定点方法总结 孔德琦 目录目录 定点运定点运算算方法方法.3 1.1 数 的 定 标.3 1.2C语言:从浮点到定点.4 1.2.1 加法.4 1.2.2乘法.6 1.2.3除法.7 1.2.4 三角函数运算.8 1.2.5 开方运算.9 1.3 附录.10 1.3.1 附录1:定点函数库.10 1.3.2附录2:正弦和余弦表.28 定点运算方法定点运算方法 1.1 数数 的的 定定 标标 对某些处理器而言,参与数值运算的数就是 16 位的整型数。但在许多情况下,数学运 算过程中的数不一定都是整数。那么,如何处理小数的呢?应该说,处理器本身无能为力。 那么是不是就不能处

2、理各种小数呢?当然不是。这其中的关键就是由程序员来确定一个数 的小数点处于 16 位中的哪一位。这就是数的定标。 通过设定小数点在 16 位数中的不同位置,就可以表示不同大小和不同精度的小数了。 数的定标用 Q 表示法。表 1.1 列出了一个 16 位数的 16 种 Q 表示能表示的十进制数值范围 和近似的精度。 Q 表示精度(近似)十进制数表示范围 Q150.00002 -1X0.9999695 Q140.00005 -2X1.9999390 Q130.0001 -4X3.9998779 Q120.0002 -8X7.9997559 Q110.0005 -16X15.9995117 Q100

3、.001 -32X31.9990234 Q90.002 -64X63.9980469 Q80.005 -128X127.9960938 Q70.01 -256X255.9921875 Q60.02 -512X511.9804375 Q50.04 -1024X1023.96875 Q40.08 -2048X2047.9375 Q30.1 -4096X4095.875 Q20.25 -8192X8191.75 Q10.5 -16384X16383.5 Q01 -32768X32767 表 1.1 Q 表示、S 表示及数值范围 从表 1.1 可以看出,同样一个 16 位数,若小数点设定的位置不同,它

4、所表示的数也就 不同。例如: 16 进制数 2000H8192,用 Q0 表示 16 进制数 2000H0.25,用 Q15 表示 从表 1.1 还可以看出,不同的 Q 所表示的数不仅范围不同,而且精度也不相同。Q 越 大,数值范围越小,但精度越高;相反,Q 越小,数值范围越大,但精度就越低。例如, Q0 的数值范围是-32768 到+32767,其精度为 1,而 Q15 的数值范围为-1 到 0.9999695,精 度为 1/32768 = 0.00003051。因此,对定点数而言,数值范围与精度是一对矛盾,一个变 量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想提高精度,则数的表

5、示 范围就相应地减小。在实际的定点算法中,为了达到最佳的性能,必须充分考虑到这一点。 浮点数与定点数的转换关系可表示为: 浮点数(x)转换为定点数():xq Q q x2x(int) 定点数()转换为浮点数(x): q x Q q x 2)float(x 例如,浮点数 x=0.5,定标 Q15,则定点数,式中表 q x 16384327685 . 0 示下取整。反之,一个用 Q15 表示的定点数 16384,其浮点数为 163842-15 16384/32768=0.5。 1.2c 语言:从浮点到定点语言:从浮点到定点 下面所描述的几种基本运算是浮点到定点转换中经常遇到的,从中可以体会到一些基

6、 本的技巧和方法。 1.2.1 加法加法 设浮点加法运算的表达式为: float x,y,z; z=x+y; 将浮点加法/减法转化为定点加法/减法时最重要的一点就是必须保证两个操作数的定 标值一样。若两者不一样,则在做加法/减法运算前先进行小数点的调整。为保证运算精度, 需使 Q 值小的数调整为与另一个数的 Q 值一样大。此外,在做加法/减法运算时,必须注 意结果可能会超过 16 位表示,即数的动态范围。如果加法/减法的结果超出 16 位的表示范 围,则必须保留 32 位结果,以保证运算的精度。 1 结果不超过 16 位表示范围 设 x 的 Q 值为 Qx,y 的 Q 值为 Qy,且 QxQy

7、,加法/减法结果 z 的定标值为 Qz,则 zx+y y xz Q q Q q Q q yxz 222 = x yx x Q QQ q Q q yx 222 )( = x yx Q QQ qq yx 22 )( )( )( 22 xz yx QQ QQ qqq yxz 一般情况,我们取 x,y 和 z 的定标值相同,即 Qx = Qy = Qz = Qa 。 所以定点加法可以描述为: short x, y, z ; /Qa z = add (x,y); /Qa 函数 add ( ) 有防饱和机制,如果可以确信 x + y 不会溢出(-215 = z = 215-1) , 可以直接写为 z =

8、x + y . 定点减法: short x, y, z ; /Qa z = sub (x,y); /Qa 函数 sub ( ) 有防饱和机制,如果可以确信 x - y 不会溢出(-215 = z Qy,加法结果 z 的定标值为 Qz,则定点加 法为: int x,y; long temp,z; tempy(Qx-Qz),若 QxQz ztemp(Qz-Qx),若 QxQz 一般情况,我们取 x,y 和 z 的定标值相同,即 Qx = Qy = Qz = Qa 。 所以定点加法可以描述为: int x, y, z ; /Qa z = L_add (x,y); /Qa 函数 L_add ( ) 有

9、防饱和机制,如果可以确信 x + y 不会溢出(-231 = z = 231-1) , 可以直接写为 z = x + y . 定点减法: int x, y, z ; /Qa z = L_sub (x,y); /Qa 函数 L_sub ( ) 有防饱和机制,如果可以确信 x - y 不会溢出(-231 = z (Qx+Qy+1-Qz); 上式中 x 乘 y 的定标本来应该是 Qx + Qy, 但为了处理方便,函数 L_mult( ) 多乘了一 次 2,因此要再加 1。函数 L_mult ( ) 有防饱和机制,如果可以确信 z = x y 不会溢出(- 231 = z (Qx+Qy-Qz)。 2.

10、 结果超过 32 位表示范围 这种情况下位数超出了标准 c 语言的数的表示范围,只能用数组来保存变量。 定点乘法可表示为: #define NN_DIGIT unsigned int NN_DIGIT x digits; NN_DIGIT y digits; NN_DIGIT z 2* digits; NN_Mult (z, x, y, digits); 应注意的是以上 32 位乘法都是无符号数操作,如果需要做有符号数乘法,则需要根据 乘数的符号来判断。 例 1 设 x = 18.4,y = 36.8,则浮点运算值为 z =18.436.8 = 677.12; 设 Qx = 10,Qy = 9

11、,Qz = 5,所以 int x = 18841;/Q10 int y = 18841;/Q9 z = L_mult(18841, 18841)(10+9+1-5) = 354983281L14 = 21666; 因为 z 的定标值为 5,故定点 z = 21666 即为浮点的 z = 21666/32 = 677.08。 例 2 设 x = 18.4,y = 36.8,则浮点运算值为 z =18.436.8 = 677.12; #define NN_DIGIT unsigned int 设 Qx = 20, Qy = 20, Qy = 20, 所以 NN_DIGIT x = 18.4 * (

12、120); /Q20 NN_DIGIT y = 36.8 * (120); /Q20 NN_DIGIT z2; /Q20 NN_Mult(z, /Q40 NN_Rshift(z, z, 20, 1); /Q(40-20) 1.2.3 除法除法 1. 32 位除法 设浮点除法运算的表达式为: float x,y,z; z = x/y; 假设经过统计后被除数 x 的定标值为 Qx,除数 y 的定标值为 Qy,商 z 的定标值为 Qz,则 z = x/y = z Q q z 2 y x Q q Q q y x 2 2 q QQQ q q y x z yxz )( 2 所以定点表示的除法为: int x,y,z; z =

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 总结/报告

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号