我试图避免pow
在 C中使用。
pow(2,16)
可以写成1<<16
,但是我怎么表示pow(2,-16)
呢?如果我这样做1/(1<<16)
,我得到 0。
有人可以帮忙吗?
您可以将该ldexp
函数用于两个的浮点幂,例如ldexp(1, -16)
.
您可以期望这将是有效的,并利用您的平台将浮点数存储为尾数加二进制指数(如果适用)的事实1 << 16
,因此如果您愿意,这就是积分表达式的道德模拟。
负幂表示将一个数乘以幂,然后取反。
您遇到的问题相当简单:如果您从整数开始,这一切都将通过整数数学来完成,在这种情况下,当您反转时只有两种可能的结果:1/1 显然会给出 1. 1/(任何 > 1) 都会给出 0。
要获得有意义的结果,您通常需要转换为浮点数,以便可以表示小数结果:1/(double)(1<<16)
或1.0/(1<<16)
.
或者,您可以只pow
从标准库中使用。
确保使用浮点数,而不是整数:
#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
1/(1<<16)
一切都是如此int
,它类型转换为整数结果,因此得到 as 0
。你为什么不输入 cast tofloat
并查看结果。
(float)1.0/(1<<16)