c - 给定 2^n,使用对数求 n

标签 c math

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

  unsigned long int a;
  double apower;
  apower = log((double)a) / log((double)2);

我发现'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);

a 和 b 的值始终是 2 的幂。因此 apower 和 bpower 的小数位必须为 00。这就是为什么 count 的值将是 int (%d) 的原因。 我只想知道对数的行为。

最佳答案

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

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

输出:

63

转换为日志和分割可能会导致失去意义,在这种情况下你应该使用round。你用了“提交”这个词,所以这是一个失败的在线挑战?你到底打印了什么? (在这种情况下)63.000000?这将从 %f 的默认格式中获取。

关于c - 给定 2^n,使用对数求 n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32426561/

相关文章:

c++ - 传递给函数的数组参数不是常量指针吗?

algorithm - 什么函数伪随机地重新排序 N 个项目?

algorithm - 在具有一组连续 1 的二维数组中查找所有可能的位排列

javascript - 使用atan2的 Angular 动画

math - 如何在 Go 中执行除法

algorithm - 在有障碍物的二维平原上寻找路径

c - 我的程序运行正常,但收到警告

c - 读取文件时无限循环

c - 根据标准,什么样的类型转换是显式冗余的?

c++ - 你怎么能在llvm中打印指令