我有点困惑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 logarithm到d
是
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/