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

Как сравнить быстродействие с библиотечным вариантом? 10К значений прогнать на целевой платформе и засечь время? Это если нет таймера со скоростью ядра.

uint32_t frac_convert( uint32_t val, uint32_t fullrange)

{

uint32_t ret = 0;

uint32_t dig_1 = (1 << (32-1)); // most significant bit

while( dig_1 != 0) {

val = val << 1;

if ( val >= fullrange ) {

ret |= dig_1;

val -= fullrange;

}

dig_1 = dig_1 >> 1;

}

return ret;

}