首页 > 解决方案 > 以线程安全的方式快速将 double 转换为 uint64_t

问题描述

我有以下在并行循环中调用的函数。我已经union在下面的函数内部声明了线程安全。问题是这样做会很慢。我的问题是是否有一种方法可以将其double变成uin64_t(与此方法相同union)但以更快的方式?谢谢你。

uint64_t flip(double d) {
  union {double d; uint64_t u64;} u;
  u.d = d;
  return u.u64 ^ (-(u.u64 >> 63) | 0x8000000000000000ULL);
}

我正在使用 gcc 来编译代码。

标签: cparallel-processingbit-manipulation

解决方案


您可以尝试将其作为宏重新执行,以消除函数的call开销return

#define DOUBLE_TO_UINT64(d) ((*(uint64_t *)(&(d))) ^ (-( (*(uint64_t *)(&(d))) >> 63) | 0x8000000000000000ULL))

推荐阅读