Re: Ускорение поиска максимума...

From
Alexandr A. Redchuck ()
To
Sergey Andrianov
Date
2002-12-29T00:40:53Z
Area
RU.ALGORITHMS
From: "Alexandr A. Redchuck" <real@real.kiev.ua>

26-Dec-02 23:13 Sergey Andrianov wrote to Alexander Chelmodeev:

AC>>    max:= (max+ar[n] + Abs(max-ar[n])) div 2 ;
AC>>    min:= (min+ar[n] - Abs(min-ar[n])) div 2 ;
AC>>  end;

SA>     А как ты собираешься реализовать Abs() без сравнений? На поразрядной
SA> логике что ли? :)
Именно на ней.
Для представления целых знаковых чисел с дополнением до 2:
    ; выяснение условия val<0
  <вспомогательный регистр> := <расширение знака рабочего регистра>
    ; "услованая инверсия"
  <рабочий регистр> := <рабочий регистр> XOR <вспомогательный регистр>
    ; "условный инкремент"
  <рабочий регистр> := <рабочий регистр> - <вспомогательный регистр>

Правда, при этом abs(INT_MIN) возвращает все тот же INT_MIN,
но это в точности то же самое, что сделает
  if (val<0) val=-val;

wbr,
Кстати, если уж говорить о "неветвящихся" способах, то
получение максимума можно сделать в виде
 <рег. максимума> := <рег. максимума> - <новое значение>
 <вспом. регистр> := <расширение знака рег. максимума>
 <вспом. регистр> := <инверсия вспом. регистра> ; не нужно при Min
 <рег. максимума> := <рег. максимума> AND <вспом. регистр>
 <рег. максимума> := <рег. максимума> + <новое значение>

Но этот алгоритм  не к паскалю и не к С. Хотя современные могли бы
реализовать такую функцию Max(a,b), ведь Abs()-то они таки делают без
условных переходов, по кр. мере еще BC3.1 генерит
;      return  abs(a);
  mov     ax,word ptr [bp+4]
  cwd
  xor     ax,dx
  sub     ax,dx

--
/* Alexandr Redchuck, Kyiv, Ukraine */
/* real на real тчк kiev тчк ua     */

--- ifmail v.2.15dev5
 * Origin: ReAl at home (2:5020/400)