5

我有点困惑C++ {fmt} 库中的这个简短函数是如何工作的。

inline std::uint32_t digits10_clz(std::uint32_t n) {
  std::uint32_t t = (32 - __builtin_clz(n | 1)) * 1233 >> 12;
  return t - (n < powers_of_10_u32[t]) + 1;
}

我理解你可以近似log10使用的逻辑,log2(__builtin_clz)你需要调整精确值,但乘法对我来说是个谜。

4

1 回答 1

10

回想一下将对数的底b变为的公式d

日志d x = 日志b x / 日志b d

在我们的例子中,b是 2(二进制)和d10(十进制)。因此,您需要除以 log 2 10,这与乘以 1/log 2 10 相同,即乘以 0.30102999566。

现在回想一下,移位 12 与除以 2 12相同,即 4096。将 1233 除以 4096 得到 0.30102539062,这是基本变化公式中分母的一个很好的近似值。

于 2017-12-13T05:41:00.640 回答