我试图避免在C中使用pow
。
pow(2,16)
可以写成1<<16
,但我如何代表pow(2,-16)
?如果我1/(1<<16)
,我会得到0。
有人可以帮忙吗?
答案 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