有什么办法可以写log(base 2)函数?
C语言有2个内置函数->>
1。log
以e为底。
2。log10
10为基数;
但是我需要以2为底的对数函数。该如何计算。
有什么办法可以写log(base 2)函数?
C语言有2个内置函数->>
1。log
以e为底。
2。log10
10为基数;
但是我需要以2为底的对数函数。该如何计算。
Answers:
C99拥有log2
(以及log2f
和log2l
浮法和长双)。
如果要查找积分结果,则只需确定值中设置的最高位并返回其位置即可。
Integer.highestOneBit(int)
方法):i |= (i >> 1); i |= (i >> 2); i |= (i >> 4); i |= (i >> 8); i |= (i >> 16); return i - (i >>> 1);
while (i >>= 1) { ++l; }
i>>32
。但是由于Java只有32位整数,所以很好。对于C / C ++,需要考虑这一点。
如http://en.wikipedia.org/wiki/Logarithm所述:
logb(x) = logk(x) / logk(b)
意思就是:
log2(x) = log10(x) / log10(2)
log()
因此不会这样做。我的错。
log10()
C标准中定义了一个函数,因此编译器可以自由地“特殊地”对待它,包括预计算结果,我相信这是@Johannes的建议?
log10(2)
为一个常量。
如果要使其快速,可以使用“ Bit Twiddling Hacks”中的查找表(仅适用于整数log2)。
uint32_t v; // find the log base 2 of 32-bit v
int r; // result goes here
static const int MultiplyDeBruijnBitPosition[32] =
{
0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31
};
v |= v >> 1; // first round down to one less than a power of 2
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
r = MultiplyDeBruijnBitPosition[(uint32_t)(v * 0x07C4ACDDU) >> 27];
此外,你应该看看你的编译器内置的方法,如_BitScanReverse
这可能会更快,因为它可以在硬件完全计算。
还看一下可能的重复项如何在C ++中执行整数log2()?
uint16_t log2(uint32_t n) {//but truncated
if (n==0) throw ...
uint16_t logValue = -1;
while (n) {//
logValue++;
n >>= 1;
}
return logValue;
}
基本上与tomlogic的相同。
我需要具有更高的精度,即最高有效位的位置,而我使用的微控制器没有数学库。我发现仅对正整数值参数使用2 ^ n个值之间的线性近似效果很好。这是代码:
uint16_t approx_log_base_2_N_times_256(uint16_t n)
{
uint16_t msb_only = 0x8000;
uint16_t exp = 15;
if (n == 0)
return (-1);
while ((n & msb_only) == 0) {
msb_only >>= 1;
exp--;
}
return (((uint16_t)((((uint32_t) (n ^ msb_only)) << 8) / msb_only)) | (exp << 8));
}
在我的主程序中,我需要计算N * log2(N)/ 2和一个整数结果:
temp =((((uint32_t)N)* rox_log_base_2_N_times_256)/ 512;
并且所有16位值的偏差都不会超过2%