4

我试图避免pow在 C中使用。

pow(2,16)可以写成1<<16,但是我怎么表示pow(2,-16)呢?如果我这样做1/(1<<16),我得到 0。

有人可以帮忙吗?

4

4 回答 4

6

您可以将该ldexp函数用于两个的浮点幂,例如ldexp(1, -16).

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

于 2013-01-08T15:34:14.553 回答
2

负幂表示将一个数乘以幂,然后取反。

您遇到的问题相当简单:如果您从整数开始,这一切都将通过整数数学来完成,在这种情况下,当您反转时只有两种可能的结果:1/1 显然会给出 1. 1/(任何 > 1) 都会给出 0。

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

或者,您可以只pow从标准库中使用。

于 2013-01-08T15:34:03.850 回答
1

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

#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
于 2013-01-08T15:35:37.690 回答
0

1/(1<<16)一切都是如此int,它类型转换为整数结果,因此得到 as 0。你为什么不输入 cast tofloat并查看结果。

(float)1.0/(1<<16)
于 2013-01-08T15:35:19.460 回答