Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »
Страницы: 1 2

Сложение с насыщением? [D7, XP]


Sha ©   (21.01.18 21:48[20]

При тестировании функций обнаружены ошибки, исправленные версии:

function SatAdd32Sha(a, b: cardinal): cardinal;
begin;
 Result:=a+b;
 Result:=-((a and b or (a or b) and not Result) shr 31) or Result;
 end;

function SatAdd8Sha(a, b: cardinal): cardinal;
var
 c: cardinal;
begin;
 c:=a+b;
 a:=(a and b or (a or b) and not c) and $80808080;
 b:=a shr 7;
 a:=a+a;
 Result:=(c-a) or (a-b);
 end;

function Add8Sha(a, b: cardinal): cardinal;
var
 c: cardinal;
begin;
 c:=a+b;
 a:=(a and b or (a or b) and not c) and $80808080 ;
 a:=a+a;
 Result:=c-a;
 end;


Время работы SatAdd8Sha практически совпало с временем SatAdd8 (есть по приведенной выше ссылке):

function SatAdd8(a, b: cardinal): cardinal;
const
 sign= $80808080;
var
 dif, same: cardinal;
begin;
 dif:=(a xor b) and sign;
 same:=a and b and sign;
 a:=a and not sign;
 b:=b and not sign;
 a:=a+b;
 same:=same or dif and a;
 same:=same + same - (same shr 7);
 Result:=a xor dif or same;
 end;


Можно немного докрутить и выиграть у нее несколько процентов, но это будут копейки. Так что извиняйте.


Z   (21.01.18 22:36[21]

мм... А как именно тестите и на какой версии компилятора? Опции оптимизатора?
А что с вариантом через просто if?


Sha ©   (21.01.18 23:37[22]

Тест простейший - полный перебор всех вариантов входных параметров для одного разряда (байта).

Компилятор - D7, оптимизация включена.

Можно немного ускорить, подглядывая в ассемблерный код.
Разбиваем составные операторы на более простые и переставляем их как хотим.

Автору темы был интересен вариант без ифа, в данном случае может оказаться быстрее с ифом, не проверял.


Sha ©   (22.01.18 00:12[23]

Вот же, блин, сегодня не мой день.

Ответ на вопрос о тестировании заставил задуматься и погрустнеть)
Из функций [20] верны только SatAdd32Sha и SatAdd8.

SatAdd8Sha и Add8Sha не верны. Они не учитывают, что перенос может распространиться на несколько разрядов. Тестирования одного разряда не достаточно.


Страницы: 1 2 версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо