Re[9]: Занятная задачка на возведение в квадрат
От: TarasB  
Дата: 09.07.14 09:10
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Если размер кода или глубина стека разбухает кратно увеличению разрядности, то указатель инструкции или стека, соответственно, — это скрытая переменная.


Не понял. Эти указатели и так есть, при любой реализации.

К>Не понял, как считать по твоей формуле. Вот так получилось 5 переменных.

К>
К>// n*n = n*2^k + n*(n-2^k)
К>int square(int n)
К>{
К>  int s = 0;
К>  int m = n; // правый множитель
К>  while(m > 0)
К>  {
К>    int p  = 1; // 2^k, k=0, 1, ...
К>    int pn = n; // p*n
К>    while(p+p <= m)
К>    {
К>      p  += p;
К>      pn += pn;
К>    }
К>    s += pn;
К>    m -= p;
К>  }
К>  return s;
К>}
К>

Да, я это понял. Но если развернуть портянку ифов, перебрав все случаи двоичного порядка для m, то будет 4. А по схеме от n-2*k к n можно свести и до 3.

ПС еле нашёл тему, фиг тут поймёшь что куда переносится
Re[10]: Занятная задачка на возведение в квадрат
От: Аноним  
Дата: 09.07.14 09:30
Оценка:
TB>ПС еле нашёл тему, фиг тут поймёшь что куда переносится

Ага, я подумал, что рекрутеры пожаловались, и тему удалили
Re[10]: Занятная задачка на возведение в квадрат
От: Кодт Россия  
Дата: 09.07.14 11:39
Оценка:
Здравствуйте, TarasB, Вы писали:

К>>Если размер кода или глубина стека разбухает кратно увеличению разрядности, то указатель инструкции или стека, соответственно, — это скрытая переменная.

TB>Не понял. Эти указатели и так есть, при любой реализации.

вот смотри
int square(int n) {
  int m = n; // множитель
  int s = 0; // сумматор

  assert(n < 32);

  if(m >= 16) {
    int t = n; t+=t; t+=t; t+=t;
    s += t;
    m -= 16;
  }
  if(m >= 8) {
    int t = n; t+=t; t+=t;
    s += t;
    m -= 8;
  }
  if(m >= 4) {
    int t = n; t+=t; t+=t;
    s += t;
    m -= 4;
  }
  if(m >= 2) {
    int t = n; t+=t;
    s += t;
    m -= 2;
  }
  if(m >= 1) {
    int t = n;
    s += t;
    m -= 1;
  }
}

С каждым новым битом у нас добавляется новый шаблонный кусок кода. То есть, мы сделали за компилятора такую работу
RUN <16> ();
RUN <8> ();
RUN <4> ();
RUN <2> ();
RUN <1> ();

и вот этот параметр — 1..16 — спрятали, синхронизировав с указателем инструкции.

А вот если бы у нас был цикл, то такая синхронизация отсутствовала бы. И стало бы очевидно, нужна ли ещё одна переменная, или можно обойтись, построив цикл над уже существующими.



TB>ПС еле нашёл тему, фиг тут поймёшь что куда переносится


http://rsdn.ru/Users/Private/MyRsdn.aspx?go=answers (в дереве: Мой RSDN — ответы мне)
Перекуём баги на фичи!
Re[11]: Занятная задачка на возведение в квадрат
От: TarasB  
Дата: 09.07.14 12:12
Оценка:
Здравствуйте, Кодт, Вы писали:

К>С каждым новым битом у нас добавляется новый шаблонный кусок кода. То есть, мы сделали за компилятора такую работу

К>и вот этот параметр — 1..16 — спрятали, синхронизировав с указателем инструкции.

Ну спрятали, да. Ну и? Это параметр времени компиляции, а не выполнения.
Может ещё посчитать переменные, которые были у меня в голове, когда я придумывал этот код?

Я просто смысла уже не понимаю, сформулируй ясно, что именно мы считаем.

К>http://rsdn.ru/Users/Private/MyRsdn.aspx?go=answers (в дереве: Мой RSDN — ответы мне)


А, понял, а из гуя как выйти на эту ссылку?
Re[12]: Занятная задачка на возведение в квадрат
От: Кодт Россия  
Дата: 09.07.14 13:52
Оценка:
Здравствуйте, TarasB, Вы писали:

TB>Ну спрятали, да. Ну и? Это параметр времени компиляции, а не выполнения.

TB>Может ещё посчитать переменные, которые были у меня в голове, когда я придумывал этот код?

TB>Я просто смысла уже не понимаю, сформулируй ясно, что именно мы считаем.


Смысл такой: если масштабирование задачи ведёт к перекомпиляции, — то значит, параметры времени компиляции тоже надо учитывать.
Иначе, в пределе, можно вообще одной переменной обойтись
unsigned int square(unsigned short n)
{
  if(i < 0x8000)
    if(i < 0x4000)
      if(i < 0x2000)
        ...
          if(i < 0x0002)
            if(i < 0x0001)
              return 0;
            else // [0x0001..0x0002)
              return 1;
          else
            if(i < 0x0003)
              return 4;
            else // [0x0003..0x0004)
              return 9;
        ...
    else // [0x4000..0x8000)
      if(i < 0x6000)
        ...
      else // [0x6000..0x8000)
        ...
  else // [0x8000..0xFFFF)
    ...
}

Тоже за логарифмическое время. По-твоему, это честно?

К>>http://rsdn.ru/Users/Private/MyRsdn.aspx?go=answers (в дереве: Мой RSDN — ответы мне)

TB>А, понял, а из гуя как выйти на эту ссылку?

Так я и говорю: www.rsdn.ru, дерево слева, в самом низу "Мой RSDN", ветка "ответы мне" или "мои сообщения"
Перекуём баги на фичи!
Re[13]: Занятная задачка на возведение в квадрат
От: TarasB  
Дата: 10.07.14 06:45
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Смысл такой: если масштабирование задачи ведёт к перекомпиляции, — то значит, параметры времени компиляции тоже надо учитывать.


Заточка кода под новую разрядность всегда ведёт к перекомпиляции.

К>Иначе, в пределе, можно вообще одной переменной обойтись

К>Тоже за логарифмическое время. По-твоему, это честно?

Да, можно. Насчёт честности — условия надо уточнять. Что мы минимизируем? Число занятых регистров? Объём исполняемого кода? Скорость исполнения? Или всё вместе с какими-то весами? А скорость на чём мерять, что это за экзотический процессор, не умеющий умножать?

К>Так я и говорю: www.rsdn.ru, дерево слева, в самом низу "Мой RSDN", ветка "ответы мне" или "мои сообщения"


Спасибо.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.