我有以下C程序:
#include <stdio.h>
#include <math.h>
#define LOG2(x) ((int)( log((double)(x)) / log(2) ))
int main() {
int num = 64;
int val1 = LOG2(num);
int val2 = LOG2(64);
printf("val1: %d, val2 %d\n", val1, val2);
return 0;
}
哪个输出:
val1: 5, val2: 6
当我将其与变量一起使用时,为什么该宏会产生不同的(错误的)答案,但是当我直接键入64时,它可以正确地工作吗?
不管这实际上是否是获取日志库2的好方法,是什么导致此行为?有什么办法可以使这个宏与变量一起正常工作?(我所有的输入将是2的精确乘方)
从数学上讲,这是计算以2为底的对数的一种好方法,但是由于log(val)和log(2)都将是冗长且混乱的分数,因此除法的结果最终不会是5.999 ,它将被截断为5。我建议四舍五入,特别是如果您知道输入将始终为2的幂。
(但是为什么对常量和变量会得到不同的答案?这是一个好问题,我不确定答案。通常的答案是,当涉及常量时,编译器能够执行部分/全部编译时进行计算,但通常编译器最终会使用与运行时环境相比微妙或明显不同的浮点算法。但是我不会想到编译器会像log()
在进行编译时常量折叠时那样解释函数。)
另外,某些C库具有log2()
应为您提供完美答案的功能,但我不知道该功能的标准程度。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句