Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Вот, по мотивам Кнута. Очень быстрая функция:

Отправлено Igor_Koval (95.135.191.232) 15 января 2010, г. 20:11
В ответ на: В столбик ? отправлено Igor_Koval 15 января 2010, г. 20:08


//Sets a = b / c, where a and c are digits.
//Lengths: b[2].
//Assumes b[1] < c and HIGH_HALF (c) > 0. For efficiency, c should be normalized.
void NN_DigitDiv (NN_DIGIT *a, NN_DIGIT b[2], NN_DIGIT c)
{
NN_DIGIT t_h, t_l, u, v, aHigh, aLow;

t_l = b[0];
t_h = b[1];

//Underestimate high half of quotient and subtract.
if ((c >> 16) == 0x0000ffff) aHigh = (t_h >> 16);
else aHigh = ((t_h / ((c >> 16) + 1)) & 0x0000ffff);
u = aHigh * (c & 0x0000ffff);
v = aHigh * (c >> 16);
if ((u << 16) > t_l) t_h--;
t_l -= (u << 16);
t_h -= (u >> 16);
t_h -= v;

//Correct estimate.
while ((t_h > (c >> 16)) || ((t_h == (c >> 16)) && (t_l >= (c << 16)))){
if ((c << 16) > t_l) t_h--;
t_l -= (c << 16);
t_h -= (c >> 16);
aHigh = ((aHigh + 1) & 0x0000ffff);
}
//Underestimate low half of quotient and subtract.
if ((c >> 16) == 0x0000ffff) aLow = (t_h & 0x0000ffff);
else aLow = ((((t_h << 16) + (t_l >> 16)) / ((c >> 16) + 1)) & 0x0000ffff);
u = aLow * (c & 0x0000ffff);
v = aLow * (c >> 16);
if (u > t_l) t_h--;
t_l -= u;
if ((v << 16) > t_l) t_h--;
t_l -= (v << 16);
t_h -= (v >> 16);

//Correct estimate.
while ((t_h > 0) || ((t_h == 0) && t_l >= c)) {if (c > t_l) t_h--;
t_l -= c;
aLow = ((aLow + 1) & 0x0000ffff);
}
*a = ((aHigh << 16) + aLow);
}


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
поделите 4 пополам:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru