设为首页 加入收藏

TOP

13.2.5 直接设置符号
2013-10-07 00:53:08 来源: 作者: 【 】 浏览:73
Tags:13.2.5 直接 设置 符号

13.2.5  直接设置符号

既然_copysign()可以直接操作浮点数,我们也可以这么做:

  1. double myabs(double data)  
  2. {  
  3.     DWORD* p = (DWORD*)&data;  
  4.     p[1] &= 0x7FFFFFFF;   
  5.     return data;  

对应的汇编代码如下:

  1. __declspec(nakeddouble myabs(double data )  
  2. {  
  3.     __asm AND dword ptr [esp+8], 0x7FFFFFFF  
  4.     __asm fld qword ptr [esp+4]  
  5.     __asm ret  

这段代码的效率与使用_copysign()差不多,但由于没有使用任何浮点常数(例如1.0)提供符号,减少了参数传递和内存操作,因此效率要高一些。

至此,在使用函数框架的前提下,代码已经相当简化,很难再作进一步改进了。不过,如果将函数声明为内联函数,那么在某些情况下还会免去参数传递操作,效率会更高一些:

  1. inline double myabs( double data ); 
【责任编辑:董书 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇13.2.2 使用FABS指令 下一篇13.2.1 进行浮点比较

评论

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