在阅读Lua的源代码时,我注意到Lua使用a将a macro
舍入double
到32位int
.我解压缩了macro
,它看起来像这样:
union i_cast {double d; int i[2]};
#define double2int(i, d, t) \
{volatile union i_cast u; u.d = (d) + 6755399441055744.0; \
(i) = (t)u.i[ENDIANLOC];}
Run Code Online (Sandbox Code Playgroud)
这里ENDIANLOC
定义为endianness,0
对于little endian,1
对于big endian.Lua小心翼翼地处理字节序.t
代表整数类型,如int
或unsigned int
.
我做了一些研究,并且有一个更简单的格式macro
使用相同的想法:
#define double2int(i, d) \
{double t = ((d) + 6755399441055744.0); i = *((int *)(&t));}
Run Code Online (Sandbox Code Playgroud)
或者以C++风格:
inline int double2int(double d)
{
d += 6755399441055744.0;
return …
Run Code Online (Sandbox Code Playgroud) 在x86 CPU上将浮点数转换为int的最快方法是什么.优选在C或组件中(可以在C中内嵌)以获得以下任何组合:
我正在寻找一些比让编译器更快的技术.
我经常看到代码将int转换为双精度转换为双精度并再次转换(有时候出于好的理由,有时候没有),而且我刚刚想到这似乎是我程序中的"隐藏"成本.我们假设转换方法是截断.
那么,它有多贵?我确定它会因硬件而异,所以让我们假设一个新的英特尔处理器(Haswell,如果你愿意,虽然我会采取任何措施).我会感兴趣的一些指标(虽然一个好的答案不需要全部):
我还假设我们最敏锐地体验慢转换的影响的方式是关于功率使用而不是执行速度,因为我们每秒可以执行多少次计算相对于实际到达的数据量的差异在每秒CPU.