double到int的快速转换

double到int的快速转换

  (2014-01-19 13:39:56)
标签: 

double

 

long

 

数值类型转换

 

快速

 
图形表示用double,显示用int,很常规的提高效率的小方子。可是,你知道吗?最普通的类型转换其实是相当慢的: int a = (int)dbl; 今天搜索定点数运算时,无意中看到一篇文章,说的就是double转int的快速方法。

先把代码贴上来,其实是lua的源代码,:-)
=============================================================
#if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) && !defined(__SSE2__) && \
     (defined(__i386) || defined (_M_IX86) || defined(__i386__))
union  luai_Cast {  double  l_d;  long  l_l; };
#define lua_number2int(i,d) \
   {  volatile  union  luai_Cast u; u.l_d = (d) + 6755399441055744.0; (i) = u.l_l; }
#define lua_number2integer(i,n)     lua_number2int(i, n)
#else
#define lua_number2int(i,d) ((i)=(int)(d))
#define lua_number2integer(i,d) ((i)=(lua_Integer)(d))
#endif
===========================================================

帖子原文在这里
  http://rangercyh.blog.51cto.com/1444712/1313162
作者也分析了原因。
我就不罗嗦了,记得有这个方法就好。

最后,我做了小实验,比较一下这个方法和直接类型转换的速度差别。

#define LOOPS 200000000
union luai_Cast { double l_d; long l_l; };
#if 1
#define dbl2int(d, i)\
  { volatile union luai_Cast u; u.l_d = (d) + 6755399441055744.0;  (i) = u.l_l; }
#else
#define dbl2int(d, i) (d)+=6755399441055744.0;  (i)=*(int*)&d;
#endif

int main(int argc, char* argv[])
{
       printf("Hello World!\n");

       long val;
       double dbl=7.56;

       long t1 = GetTickCount();
       for (int i=0; i
       {
              dbl2int(dbl, val);
              dbl=i;
              val+=1;
       }
       long t2 = GetTickCount();
       printf("start: %d\n   end: %d\ntime=%d\n", t1, t2, t2-t1);

       dbl=7.86;
       long t3 = GetTickCount();
       for (int j=0; j
       {
              val=(int)dbl;
              dbl=j;
              val+=1;
       }
       long t4 = GetTickCount();
       printf("start: %d\n   end: %d\ntime=%d\n\n %f\n\n", t3, t4, t4-t3, 1.0*(t4-t3)/(t2-t1));

       printf("val=%d\n", val);

       return 0;
}

运行结果如下:
Hello World!
start: 11795010
   end: 11795761
time=751
start: 11795761
   end: 11799546
time=3785

  5.039947

val=199999999
Press any key to continue
速度相差5倍。

同时还比较了联合与指针运算的速度差别,用指针取值也是需要时间的,不如联合快,意料之中的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值