реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> unsigned long поделить на 10 и на 100, ну как нить совсем не стандартно...
=GM=
сообщение Apr 26 2011, 15:37
Сообщение #16


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Чёт не всё понимаю. Вроде бы поначалу борьба шла за малое количество используемых регистров. А сейчас за што бодаетесь?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 26 2011, 15:51
Сообщение #17


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



да, теперь все четко, вот код теста на VC:
Код
int _tmain(int argc, _TCHAR* argv[])
{
  for (unsigned int i = 0; i < 0xFFFFFFFF; i++)
  {
    unsigned int N = i >> 1;
    unsigned int result;
    result = (((N >> 16) + 1) * 0x3333) & 0xFFFF0000;
    N = N - result * 5 + 1;
    N += N >> 16;
    result |= (N * 0x3333) >> 16;
    if (result != (i / 10))
    {
      printf("\nError: i = %X  i / 10 = %X result = %X\n",i , i / 10, result);
      break;
    }
    if ((i & 0xFFFF) == 0) printf("\r i = %X", i);
  }
    return 0;
}



Цитата(=GM= @ Apr 26 2011, 19:37) *
Чёт не всё понимаю. Вроде бы поначалу борьба шла за малое количество используемых регистров. А сейчас за што бодаетесь?

Скорость при разумном количестве используемых регистров.
То есть по регистрам не хуже чем стандартное деление,
а по скорости намного выше.


теперь осталось деление на 100

для 100 разрядности все равно не хватает
то есть понятно что можно поделить на 4 потом на 5 и еще на 5
но это всего в 2,5раза лучше стандартного деления

есть идеи ?
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 26 2011, 16:08
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(singlskv @ Apr 26 2011, 21:51) *
есть идеи ?
Два раза последовательно поделить на 10? laughing.gif
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 26 2011, 16:34
Сообщение #19


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(rezident @ Apr 26 2011, 20:08) *
Два раза последовательно поделить на 10? laughing.gif

ну это я уже озвучил
делим на 4
потом на 5
потом еще на 5

итого 2,5 раза выигрыш
я же хочу получить как минимум раз в 5

вот ukpyr для деления на 10 подсказал гениальную идею сначала поделить на 2,
я так зациклился на просто делении на 10 с помощью умножения на 2^n /10
что этот очевидный факт(поделить сначала на 2) просто упустил из виду
и там в итоге разрядности всех умножений (WORD * DWORD) хватило для реализации

вот для деления на 100 нужна какая-нить похожая фишка,
т.е. каким-нить простым действом душим до 24бит делимого
ну а потом дело техники...


да, еще поясню,
для реализации подобных алгоритмов на AVR у нас есть по максимуму
умножение DWORD на WORD с получением результата в DWORD(младшая DWORD часть результата)
ну и в крайнем случае умножение DWORD * DWORD с получением результата в DWORD(младшая DWORD часть результата)

как-то так...
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 26 2011, 19:31
Сообщение #20


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(hd44780 @ Apr 26 2011, 15:49) *
По-моему ты хочешь невозможного.
Я надеюсь что теперь чуть более понятно,
что я хочу == я это получаю...
ну не сразу, иногда и думать приходицо sm.gif


Go to the top of the page
 
+Quote Post
Tiro
сообщение Apr 26 2011, 23:10
Сообщение #21


Знающий
****

Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768



Теперь чуть-чуть понятно. Вам сюда
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 29 2011, 19:55
Сообщение #22


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



на 100 делить так:
Код
  for (unsigned int i = 0; i < 0xFFFFFFFF; i++)
  {
    unsigned int N = i >> 2;
    unsigned int result;
    unsigned short tmp;

    result = ((((N >> 16) + 1) * 0xA3D7) >> 4) & 0xFFFF0000;
    N -= result * 25U;
    tmp = ((((N >> 8) + 1) * 0xA3D7) >> 12) & 0xFF00;
    N = N - tmp * 25U + 1;
    result |= tmp;
    result |= (N * 0xA3D7) >> 20;

    if (result != (i / 100))
    {
      printf("\nError: i = %X  i / 100 = %X result = %X\n",i , i / 100, result);
      break;
    }
    if ((i & 0xFFFF) == 0) printf("\r i = %X", i);
  }

это тест для VC

для IAR увы sad.gif все плохо...
IAR совсем не умеет "правильно"
двигать на 4 разряда
ну и на 20 разрядов он двигает так же...
учитывая что в AVR есть команда обмена ниблами...
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th June 2025 - 16:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01403 секунд с 7
ELECTRONIX ©2004-2016