当前位置:  开发笔记 > 编程语言 > 正文

如何加快浮点数到整数转换?

如何解决《如何加快浮点数到整数转换?》经验,为你挑选了3个好方法。

我们在项目中进行了大量的浮点到整数转换.基本上,这样的事情

for(int i = 0; i < HUGE_NUMBER; i++)
     int_array[i] = float_array[i];

执行转换的默认C函数非常耗时.

是否有任何工作(可能是手动调整功能)可以加快一点点的过程?我们不太关心精度.



1> Larry Gritz..:

这里的大多数其他答案只是试图消除循环开销.

只有deft_code的答案才能解决真正问题的核心 - 在x86处理器上将浮点转换为整数是非常昂贵的.deft_code的解决方案是正确的,但他没有给出任何引用或解释.

以下是技巧的来源,有一些解释以及特定于是否要向上,向下或向零的版本:了解您的FPU

很抱歉提供一个链接,但真的写在这里的任何东西,除了再现那篇优秀的文章,都不会让事情变得清晰.



2> deft_code..:
inline int float2int( double d )
{
   union Cast
   {
      double d;
      long l;
    };
   volatile Cast c;
   c.d = d + 6755399441055744.0;
   return c.l;
}

// this is the same thing but it's
// not always optimizer safe
inline int float2int( double d )
{
   d += 6755399441055744.0;
   return reinterpret_cast(d);
}

for(int i = 0; i < HUGE_NUMBER; i++)
     int_array[i] = float2int(float_array[i]);

双参数不是错误的!有办法直接用浮子做这个技巧,但是试图覆盖所有角落的情况变得丑陋.在当前形式中,如果要截断,则此函数将使浮点数舍入最接近的整数,而不是使用6755399441055743.5(少0.5).



3> Crashworks..:

我对不同的float-to-int转换方法进行了一些测试.简短的回答是假设您的客户具有支持SSE2的CPU并设置/ arch:SSE2编译器标志.这将允许编译器使用SSE 标量指令,其速度是魔术数字技术的两倍.

否则,如果你有很长的浮动字符串来研磨,请使用SSE2压缩操作.

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有