Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизПодскажите функцию сравнения чисел Найти похожие ветки
← →
Baks (2012-09-14 17:15) [0]Вроде встречал в справке функцию сравнения двух целых чисел. Если первое число больше второго, то возвращается одна константа, если второе больше первого, то другая константа, если равны, то третья константа. Забыл как называется и не могу найти. D5, D7.
← →
RWolf © (2012-09-14 17:18) [1]sign?
← →
Ega23 © (2012-09-14 17:24) [2]
function CompareInt(Value1, Value2: Integer): Integer; inline;
begin
if Value1 < Value2 then
Result := -1
else
if Value2 > Value1 then
Result := 1
else
Result := 0;
end;
Ну или Розыч щас на асме выдаст :)
← →
Baks (2012-09-14 17:24) [3]Нет, нужно сравнить два числа.
← →
Jeer © (2012-09-14 17:26) [4]ifthen
← →
Baks (2012-09-14 17:26) [5]
> Ega23 ©
Сам написал? Я именно тут хотел найти. Может я путаю, может такой нет.
← →
RWolf © (2012-09-14 17:27) [6][3]
сравнить два числа или задать критерий сортировки элементов списочного контрола?
← →
Ega23 © (2012-09-14 17:28) [7]
> Сам написал?
Ну да. А чё там писать-то?
> Может я путаю, может такой нет.
Со строками - StrComp есть, да. С числами - не встречал. Да и зачем?
← →
Sha © (2012-09-14 17:29) [8]http://guildalfa.ru/alsha/node/20
← →
alexdn © (2012-09-14 17:29) [9]> Baks (14.09.12 17:15)
это новая функция, секретная, не везде ставится, если хочешь продам
недорого.
← →
Ega23 © (2012-09-14 17:32) [10]
> http://guildalfa.ru/alsha/node/20
С GetTickCount - очень изящно.
Спасибо.
← →
Baks (2012-09-14 17:34) [11]
> сравнить два числа или задать критерий сортировки
Сравнить два числа. Как в Ega23 © [2]. Но там константы были не числа, а текст что-то типа LeftValueGreate. Может эта функция в каком-то компоненте была. Ну ладно, спасибо, я наверно что-то напутал. А самому конечно просто её написать.
← →
RWolf © (2012-09-14 17:34) [12]Ega23 © (14.09.12 17:32) [10]
костыль же; привести к 64-битному виду, и нет проблемы.
← →
RWolf © (2012-09-14 17:35) [13]> Может эта функция в каком-то компоненте была.
в [1] написал же уже, что за функция.
← →
Roman_man (2012-09-14 17:46) [14]
> Baks (14.09.12 17:15)
Это подойдет:?
E:= IfThen(X > Y, 13, IfThen(Y < Z, 777, 3));
← →
Ega23 © (2012-09-14 17:47) [15]
> в [1] написал же уже, что за функция.
Sign - это, ЕМНИП, знак числа. Отрицательное, положительное равное нулю, положительное неравное нулю.
> Сравнить два числа. Как в Ega23 © [2]. Но там константы
> были не числа, а текст что-то типа LeftValueGreate. Может
> эта функция в каком-то компоненте была. Ну ладно, спасибо,
> я наверно что-то напутал.
Делов-то:const
cLeftValueGrater = -1;
cRightValueGrater = 1;
cValuesEqual = 0;
function CompareInt(Value1, Value2: Integer): Integer; inline;
begin
if Value1 < Value2 then
Result := cLeftValueGrater
else
if Value2 > Value1 then
Result := cRightValueGrater
else
Result := cValuesEqual;
end;
← →
Jeer © (2012-09-14 17:50) [16]
> Это подойдет:?
Просто все упорно забывают про ifthen :)
← →
RWolf © (2012-09-14 18:03) [17]Ega23 © (14.09.12 17:47) [15]
>Sign - это, ЕМНИП, знак числа.
Всё верно, я просто применил её к разности чисел, о чём забыл упомянуть.
← →
KSergey © (2012-09-14 20:15) [18]> Sha © (14.09.12 17:29) [8]
> http://guildalfa.ru/alsha/node/20
1) if (a<=x) and (x<b) then …
vs
2) if cardinal(x-a)<cardinal(b-a) then …
Мне интересно: неужели 2 гарантированных вычитания в 2) быстрее, чем полтора (предположим, что в среднем это так) сравнения? (я подразумеваю включенную опцию неполного вычисления булевых выражений)
← →
Sha © (2012-09-14 20:40) [19]Да, второй вариант обычно лучше. И вот почему:
1. Выражение cardinal(b-a) часто константа,
так что во втором случае мы имеем одно сравнение и одно вычитание.
Даже если правая часть выражения и не является константой,
процессор ее вычислит параллельно с вычислением левой части.
2. Каждое сравнение на Паскале представляет собой 2 процессорных команды:
а) собственно сравнение, которое выполняется также быстро,
как сложение и вычитание (обычно 0.5 такта CPU) и
б) условный переход, который может выполняться несколько тактов.
3. Наконец, второй вариант может дать более короткий машинный код,
что также может отразиться на его скорости.
← →
DevilDevil © (2012-09-14 22:58) [20]> Baks (14.09.12 17:15)
> Ega23 © (14.09.12 17:24) [2]
В самых быстрых сях используют обычное вычитание
И сравнивают не -1/1/0, а <0/>0/0
в плане архитектуры процессора, сравнивать целое число с нулём лучше, чем с любой другой константой
← →
DevilDevil © (2012-09-14 23:03) [21]в конце концов команда сравнения CMP есть что иное как команда вычитания SUB, только без изменения первого операнда
короче не делайте мозги
← →
Sha © (2012-09-14 23:41) [22]
> DevilDevil © (14.09.12 22:58) [20]
> сравнивать целое число с нулём лучше, чем с любой другой константой
- чем лучше?
- чем с другой константой!
← →
Sha © (2012-09-14 23:41) [23]
> DevilDevil © (14.09.12 22:58) [20]
> сравнивать целое число с нулём лучше, чем с любой другой константой
- чем лучше?
- чем с другой константой!
← →
DevilDevil © (2012-09-14 23:48) [24]>Sha © (14.09.12 23:41) [23]
1)
cmp reg, const
vs
test reg, reg // сравнение с нулём
2)
sub reg1, reg2
cmp reg, const
j ...
vs
sub reg1, reg2
j ... // прыжок сразу же после вычитания
← →
Sha © (2012-09-15 00:16) [25]1) экономится только память
if i=1 then немного длиннее, чем if i>0 then
по скорости почти всегда одно и то же,
с тем же успехом можно использовать выражение if i-1=0 then
2) это не число, а выражение
обычно, мало кто напишет в коде, где требуется скорость
if i-5=6 then когда можно if i-11=0 then
но некоторые выражения часто пишут неоптимально,
яркий пример: if i and 1=1 then,
тут гораздо лучше if i and 1<>0 then
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.156 c