ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
8 мая
1267732
Dingo (13.12.2022 11:51, просмотров: 4360)
Деление 64 бит для пропорции. Хочу перевести тиков таймера за секунду в дробную 32-битную часть секунды. Пусть будет 12 Мгц (не совсем круглое) . Пропорция x/2^32 = y/12M, x = 2^32*y/12M. Тут для умножения и деления надо преобразовать операнды в 64 бит. gcc цепляет __aeabi_uldivmod которая использует __udivmoddi4 с большим количеством инструкций. Как сравнить этот способ с описанным дальше? 

Старший разряд дробной системы счисления идёт как m/b, для двоичной m=[0|1], b=2, для троичной (чтобы отвязаться от "привычных) m=[0|1|2], b=3; Минимальное ненулевое значение текущего разряда 1/b, что соответствует 12M/b в примере. y ∈ [0;12M) Собсна пересчёт:

1. Инициализируем frac=12M/b, n=0

2. Если y < frac в разряде 0, пункт ...

3. пока y > frac: n++, y -= frac

4 разряд равен n

5. переход к следующему разряду: n=0, frac = frac/b, далее №2

Повторять пока не достигнем заданной точности/количества разрядов.


как оценить быстродействие?

PS: Вспоминается Forth ранние версии с арифметическим оператором */ где результат умножения был удвоенной разрядности слова.