avatar
Рейтинг
0.00
Сила
0.00

Александр

Избранное

avatar
На счет умножения и деления чисел с фиксированной точкой. 64-х разрядное умножение и особенно деление может быть очень медленным. Особенно на 8-ми и 16-ти битниках. А умножение и деление можно реализовать и без использования типов с большей разрядностью. Например умножение q16:
uint32_t mult_q16(uint32_t a, uint32_t b)
{
    uint32_t inta = a >> 16;
    uint32_t intb = b >> 16;
    uint32_t fracta = a & 0x0000ffff;
    uint32_t fractb = b & 0x0000ffff;
    uint32_t result = (inta * intb << 16) + (inta * fractb + fracta * intb) + (fracta * fractb >> 16);
    return result;
}

Нужно 4 умножения 16х16=>32 бита.
Деление q16:
uint32_t div_q16(uint32_t a, uint32_t b)
{
    uint32_t r = a >> 16, q = a << 16;
    uint_fast8_t carry = 0;
    for (uint_fast8_t i = 0; i < 32; i++)
    {
        if(r & 0x80000000)
            carry = 1;
        else
            carry = 0;
        r <<= 1;
        if (q & 0x80000000)
            r |= 1;
        q <<= 1;
        if (r >= b || carry)
        {
            q = q | 1;
            r -= b;
        }
    }
    return q;
}

Хоть оно и побитовое, но работает в разы бsстрее, чем х64 деление на Cortex-m3. Может быть можно сделать еще быстрее используя аппаратное деление 32/32=>32 и алгоритм Кнута.