Мне нужен алгоритм для беззнакового деления с фиксированной точкой в 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 бит для дроби. Итак, наши числа в шестнадцатеричном формате:
1.5: 0x18000000
2: 0x20000000
result: 0x0c000000