double到int的快速转换

来源:互联网 发布:上海手机数据恢复 编辑:程序博客网 时间:2024/05/17 22:55

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倍。

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