给出一个2^n的整数,其中n是指数,我想通过对数找到n的索引值。用于查找索引的公式为:log(number) / log(2)。以下是代码片段:
unsigned long int a;
double apower;
apower = log((double)a) / log((double)2);
我发现在某些很大的a值时,'apower'的值是错误的。我不知道具体的数值,因为我的代码提交后失败了。这是为什么?是否存在强制转换问题?
以下是完整的代码片段:
int count = 0;
unsigned long int a,b;
double apower,bpower;
apower = log((double)a) / log((double)2);
bpower = log((double)b) / log((double)2);
count = abs(apower - bpower);
printf("%d\n",count);
a和b的值将始终是2的幂次方。因此,apower和bpower必须在小数位上有00。这就是为什么count的值将是int(%d)。我只想了解对数的行为。
a
上使用unsigned long int
,如果你最终还是将其转换为double
?这毫无意义... - Nidhoeggern
太大超过unsigned long int
的范围时,它就无法工作了,此时结果为-inf
,这是正确的行为。所以请提供更多关于你的作业...抱歉...你的问题的信息。 - Nidhoegger__builtin_ctz()
可以对int
类型计算,对于long
类型则使用__builtin_ctzl()
,long long
类型则使用__builtin_ctzll()
。其他编译器可能也有相应的函数。 - EOF