我有点困惑C++ short function中的这个{fmt} library是如何工作的。

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)并需要调整为精确值的逻辑,但是乘法对我来说是个谜。

最佳答案

b调用the formula for changing the base of logarithmd

logdx = logbx/logbd

在我们的情况下,b是2(二进制),而d是10(十进制)。因此,您需要除以log210,这与乘以1/log210相同,即乘以0.30102999566。

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

关于c++ - * 1233 >> 12后面的数学运算是十进制数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47786128/

10-10 18:34