Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Подскажите функцию сравнения чисел   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.12 c
15-1345453443
Дмитрий С
2012-08-20 13:04
2013.03.22
Мастер-класс по микроконтроллерам.


6-1260461403
bob
2009-12-10 19:10
2013.03.22
Сетевая обработка данных


15-1354038522
Дмитрий С
2012-11-27 21:48
2013.03.22
Менеджер паролей.


15-1330604387
upc
2012-03-01 16:19
2013.03.22
Покупка Delphi


2-1340704805
ford
2012-06-26 14:00
2013.03.22
проверить переменную типа Variant