У вас есть номер с фиксированной точкой 4,28, и вы хотите разделить на число 4,28. Вы находите точность после деления, вычитая точность числителя из знаменателя, поэтому прямое деление даст 4,28 - 4,28 = 0 - без значащих битов. Очевидно, это не сработает.
1.5 [4.28] 0x18000000
/ 2.0 [4.28] 0x20000000
= 0? [0.00] 0x00000000
Идеальный способ сделать это - повысить числитель до 8,56 (умножив на 2 ^ 28), а затем выполнить 64-разрядное деление:
. . . .
1.5 [8.56] 0x180000000000000
/ 2.0 [4.28] 0x20000000
= 0.75 [4.28] 0x0c000000
Если вы действительно не можете использовать 64-битные числа, тогда ваш единственный вариант - уменьшить знаменатель.
Например, вы можете использовать половину точности, разделив на 2 ^ 14
1.5 [4.28] 0x18000000
/ 2.0 [2.14] 0x8000
= 0.75 [2.14] 0x3000
Затем вы можете умножить результат на тот же коэффициент, чтобы вернуться к числу 4,28: 0x3000 *(1<<14) = 0x0c000000
Вы теряете некоторую точность таким образом, но это неизбежно без использования больших числителей. Например
5.0/3.0 = 1.66667 = 0x1AAAAAA [4.28]
, но
((5.0<<28)/(3<<14))<<14 = 0x1AAA8000 [4.28] = 1.66662