C中2的负幂

时间:2013-01-08 15:30:46

标签: c

我试图避免在C中使用pow

pow(2,16)可以写成1<<16,但我如何代表pow(2,-16)?如果我1/(1<<16),我会得到0。

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:5)

您可以将ldexp函数用于浮点幂2,例如ldexp(1, -16)

您可以预期这将是有效的,并利用您的平台存储浮点指针数作为尾数加二进制指数(如果适用)的事实,因此,如果您愿意,这是积分表达式1 << 16的道德类比。

答案 1 :(得分:2)

负功率表示将数字提升为幂,然后反转。

你遇到的问题很简单:如果你从整数开始,这将完成整数数学运算,在这种情况下你反转时只有两个可能的结果:1/1显然会给1。 1 /(任何&gt; 1)将给出0。

要获得有意义的结果,您通常需要转换为浮点数,以便可以表示小数结果:1/(double)(1<<16)1.0/(1<<16)

或者,您可以使用标准库中的pow

答案 2 :(得分:0)

因为1/(1<<16)都是int所以,它会转换为整数结果,因此得到0。 为什么不键入将其转换为float并查看结果。

(float)1.0/(1<<16)

答案 3 :(得分:0)

确保使用浮点数而不是整数:

#include <stdio.h>
#include <math.h>


int main(int argc, char **argv) {
  printf("%f %f\n", pow(2,3), pow(2,-3));

  printf("%d %f\n", (1<<3), 1.0/(1<<3));

  return 0;
}

结果:

bf@bf-laptop:~/playground$ ./test
8.000000 0.125000
8 0.125000