设为首页 加入收藏

TOP

13.8 快速平方根和平方计算(2)
2013-10-07 00:54:39 来源: 作者: 【 】 浏览:83
Tags:13.8 快速 平方 计算

之所以如此,是因为指数是奇数时,指数的最后一位左移后进入尾数,相当于在尾数部分添加2k-1。也就是说,此时除了泰勒级数误差之外,还有一个代替误差:

 

相对误差约:

 

最大约5.62%。最终的误差是这个误差与泰勒级数展开误差的混合。

从上述分析可以看出,相对误差只与尾数构成有关,与取值范围无关,因此下面以[0,1]区间做试验,结果见表13-1。

表13-1  [0,1]平方根值

 

最大误差约6%左右,对于一般的3D计算而言,这个精度可以满足要求。

平方运算的原理与平方根运算类似,不再赘述。代码如下:

  1. __declspecnaked ) float fast_x2( float x )  
  2. {  
  3.     __asm  
  4.     {  
  5.         SUB ESP, 4  
  6.         MOV EAX, [ESP+8]  
  7.         SUB EAX, 0x3F800000  
  8.         SAL EAX, 1  
  9.         ADD EAX, 0x3F800000  
  10.         MOV [ESP], EAX  
  11.         FLD DWORD PTR [ESP]  
  12.         ADD ESP, 4  
  13.         RET  
  14.     }      

试验结果见表13-2。最大误差有11%(表中没有出现)。

表13-2  [0,1]平方值

 

另外,平方运算有一个限制,那就是0.0时无法用这种算法,需要剔除。注意,IEEE的0有两种:+0和-0,因此检测代码是:

  1. if( ( *(unsigned int*)&x == 0 ) ||   
  2. ( *(unsigned int*)&x == 0x80000000 ) )  
  3.     return 0.0f;  
  4.  
  5. 不要使用下列代码:  
  6.  
  7. if( x == 0.0f )  
  8.     return 0.0f; 
这会导致编译器使用浮点指令。
【责任编辑:董书 TEL:(010)68476606】

回书目   上一节   

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇10.1 开发背景 下一篇13.8 快速平方根和平方计算(1)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: