pow
Cでの使用を避けようとしています。
pow(2,16)
と書けるが1<<16
、どう表現すればよいのpow(2,-16)
だろうか?もしそうなら1/(1<<16)
、私は0を得る。
誰でも助けてもらえますか?
pow
Cでの使用を避けようとしています。
pow(2,16)
と書けるが1<<16
、どう表現すればよいのpow(2,-16)
だろうか?もしそうなら1/(1<<16)
、私は0を得る。
誰でも助けてもらえますか?
ldexp
この関数は、浮動小数点の 2 の累乗に使用できますldexp(1, -16)
。
これは効率的であり、プラットフォームが浮動小数点数を仮数とバイナリ指数 (該当する場合) として格納するという事実を利用することが期待でき1 << 16
ます。
負のべき乗は、数値をべき乗してから反転することを意味します。
あなたが遭遇する問題はかなり単純です: 整数から始めると、これはすべて整数演算で行われます。この場合、反転すると 2 つの可能な結果しかありません: 1/1 は明らかに 1 を返します。 1/(何か > 1) は 0 になります。
意味のある結果を得るには、通常、小数の結果を表現できるように浮動小数点に変換する必要があります:1/(double)(1<<16)
または1.0/(1<<16)
.
pow
または、標準ライブラリから使用することもできます。
int ではなく float を使用してください。
#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
に、それは整数の結果に型キャストされ、したがって として取得され0
ます。タイプキャストしてfloat
結果を見てみませんか。
(float)1.0/(1<<16)