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

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

double到int的快速转换相关推荐

  1. Gson int类型被转换成double问题解决(完美解决)

    一.问题复现 1.1.BaseResponse类 class BaseResponse<T>(val code: Int = -1,val message: String? = null ...

  2. 【数论】快速幂:实现pow(double ,int)

    实现函数 double Power(double base, int exponent),求base的exponent次方. 注意: 1.保证base和exponent不同时为0. 2.不得使用库函数 ...

  3. double转换成int java,Java将double转换为int

    本文概述 我们可以使用类型转换在Java中将double转换为int.要将double数据类型转换为int, 我们需要执行类型转换. Java中的类型转换通过类型转换运算符(数据类型)执行. 在这里, ...

  4. 浮点数到整数的快速转换

    之前在看 lua 源码的时候,看到一处浮点数转整数的方法,当时确实吓我一跳,后来在网上搜索了才知道浮点数原来还有这么神奇的地方,我看到一篇喜欢的文章,翻译一下(英文一般还请见谅),大家要闲着没事可以看 ...

  5. double转换为int以及浮点型相加损失精度问题

    最近在做支付相关模块的业务,数据库字段却使用的是double类型,其实也行,只要计算不在sql语句中进行,也是没有问题的. 预先的类属性设置的是Double类型,自己算的时候发现小数相加会出现损失精度 ...

  6. 解决 java double 减 int 型 产生的精度问题

    我们先来看一段代码 public class Test_1 {public static void main(String[] args) {String e = "1.01";/ ...

  7. python转换八进制用取余数方法_python 二、八、十六进制之间的快速转换

    一.进制转换 1.2 十进制转二进制 bin(18)--> '0b10010'     去掉0b就是10010    即为十进制18转二进制是10010 十进制转八进制oct(18) --> ...

  8. Java对于字符串的处理【String和int之间的转换、字符串拼接、字符串获取长度、字符串大小写转换、字符串去空格、字符串分割、字符串替换、字符串提取、字符串比较、字符串查找】

    文章目录 String字符串 和 整型int 的相互转换 String转化为int int 转换为 String 字符串拼接 使用连接运算符 "+" 使用 concat() 方法 ...

  9. double 转 int

    关于double转int类型,先看强转的例子:Double a = 2.3 * 100;int i = new Double(a).intValue();System.out.println(i);输 ...

最新文章

  1. Qt中两种定时器用法
  2. 如何在ubuntu下使用samba创建共享
  3. 留着肯定有用,让你脱胎成技术大神的JAVA开发技巧
  4. 科学家从脑电图中解读大脑的运动意图
  5. 编译高性能linux so库,关于如何在linux环境下生成a库和so库(改,附图)-Go语言中文社区...
  6. 深度学习(三十七)——CenterNet, Anchor-Free, NN Quantization
  7. DevOps时代,企业数字化转型需要强大的工具链
  8. eigen库安装_OpenCV+Eigen上位机程序移植(七十一)
  9. 苹果ipa软件包破解笔记
  10. 联想开机启动项按哪个_win7系统如何修改系统启动项 win7系统修改系统启动项方法【步骤】...
  11. java 使用apollo,Springboot apollo原理及使用方法详解
  12. javascript判断非空
  13. Hibernate中hbm.xml文件的inverse、cascade、fetch、outer-join、lazy
  14. 3.2 语音识别概述
  15. c语言编程 猜字游戏
  16. 9月【笔耕不辍】勋章活动获奖名单公布
  17. 如何在项目中规范git commit格式
  18. BehaviorTree + Groot 在ros中的运用
  19. EasyUI的基本使用布局
  20. springboot医疗管理系统 毕业设计-附源码015221

热门文章

  1. Java学习笔记3.7.1 抽象类、接口与多态 - 抽象类
  2. Neo4J Desktop 安装
  3. Linux应用-阿里云MQTT物联网实践
  4. CF3C--Tic-tac-toe翻译
  5. Linux Mint设置中文输入法
  6. 多尺度可形变注意力机制MultiScaleDeformableAttn
  7. 我能上网,但是右下角wif图标没了,点开显示无法连接internet解决办法
  8. 计算机网络:虚拟机虚拟网络配置
  9. 华为两年,苦乐参半!
  10. Arcengine 保存图层到mxd