Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.51 MB
Время: 0.058 c
15-1346322658
Артём
2012-08-30 14:30
2013.03.22
Как программно нажать на кнопку на сайте?


15-1345118559
Es
2012-08-16 16:02
2013.03.22
ADO + Ora = пропихнуть в хранимку blob более 32 кбайт


15-1342466570
MsGuns
2012-07-16 23:22
2013.03.22
Умер Джон Лорд


15-1344107027
Прогер
2012-08-04 23:03
2013.03.22
Делегаты и функторы.


15-1332455404
Юрий
2012-03-23 02:30
2013.03.22
С днем рождения ! 22 марта 2012 четверг





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский