给定2 ^ n,使用对数找到n

use*_*359 3 c math

给定一个2的幂的整数(2 ^ n),我想找出n,使用对数的索引值.查找索引的公式为:log(number)/ log(2).以下是代码段:

  unsigned long int a;
  double apower;
  apower = log((double)a) / log((double)2);
Run Code Online (Sandbox Code Playgroud)

我发现'apower'的值在a的某个大值上是错误的,我不知道值,因为我的代码在提交之后失败了.为什么会这样?有铸造问题吗?

以下是整个片段:

  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);
Run Code Online (Sandbox Code Playgroud)

a和b的值总是2的幂.所以apower和bpower必须在小数位数为00.这就是为什么count的值将是int(%d).我只是想知道Logarithm的行为.

Wea*_*ane 5

我只回答了你的一半问题,因为没有必要使用日志来解决这个问题.一个简单的方法是使用这个:

unsigned long long a = 0x8000000000000000ULL;
int n = 0;
while (a >>= 1) n++;
printf("%d\n", n);
Run Code Online (Sandbox Code Playgroud)

输出:

63
Run Code Online (Sandbox Code Playgroud)

转换为日志和分区可能会导致重要性丢失,在这种情况下您应该使用round.你使用"提交"这个词,这是一个失败的在线挑战?你究竟打印了什么?(在这种情况下)63.000000?这将从默认格式得到%f.