C で符号なし固定小数点除算を行うアルゴリズムが必要です。最大 32 ビット ワードを使用できます。
[0..15] の範囲の数値を使用できるようにしながら、整数部分を表すために必要なビット数を最小限に抑えたいと考えています。どうやら最小ビット数は4です。問題は、私が思いついたアルゴリズムが5ビットでしか動作しないことです。剰余を除数と比較し、除数よりも大きくなるまで剰余をシフトするため、除数の最上位ビットが 1 の場合、アルゴリズムは剰余をシフトするだけです (大きくなることはありません)。コードは次のとおりです。
int divu(int a, int b){
int pt_int, r, pt_frac=0;
int i;
pt_int = ((unsigned) a/b) << BITS_FRAC;
r = (unsigned) a%b;
for (i=BITS_FRAC; i>=0; i--){
if ((unsigned) r < b)
r <<= 1;
else{
r -= b;
pt_frac += 01 << i;
r <<= 1;
}
}
return pt_int + pt_frac;
}
解決策はあるがコードを理解したくない場合は、投稿してください。:)
例:
1.5 を 2 で割ると、0.75 になります。整数部に 4 ビット、小数部に 28 ビットを使用しているとします。したがって、数字は16進数です。
1.5: 0x18000000
2: 0x20000000
result: 0x0c000000