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

Вниз

вопрос про число   Найти похожие ветки 

 
Василий Петрович ©   (2003-04-13 23:51) [0]

как очень быстренько узнать принадлежит ли число X промежутку например от 0 до 99? то сеть не делая сравнения if x > 0 then...
возможно ли такое?


 
Songoku ©   (2003-04-14 00:00) [1]

Ты что с Delphi ваще обращатся не умеешь???

If (x>0)and(x<100) then TramPamPam(...);


 
default ©   (2003-04-14 00:13) [2]

или
if x in [0..99] then begin ... end


 
Юрий Зотов ©   (2003-04-14 01:15) [3]

Причем второй вариант сработает побыстрее.


 
Songoku ©   (2003-04-14 01:18) [4]

> Юрий Зотов © Почему???
Может вобеше лутше сделать вставку Assembler"a!!!


 
NA ©   (2003-04-14 01:26) [5]


> Юрий Зотов © (14.04.03 01:15)
> Причем второй вариант сработает побыстрее.


Но будет работать, мягко говоря, не со всеми типами данных ;)


> Songoku © (14.04.03 01:18)
> > Юрий Зотов © Почему???
> Может вобеше лутше сделать вставку Assembler"a!!!


В ассемблерной вставке будет решаться ТОЧНО ТА ЖЕ задача: сравнение на бОльшую величину, прыжок, сравнениа на мЕншьую :)))


 
Юрий Зотов ©   (2003-04-14 02:24) [6]

> Songoku © (14.04.03 01:18)

Потому что операция проверки на принадлежность множеству сводится к аналогу AND и одному прыжку. Нужную вставку на Ассемблере компилятор сделает и без нас (хотя сделать ее ручками все равно было бы лучше, это Вы точно сказали).


> NA © (14.04.03 01:26)

> В ассемблерной вставке будет решаться ТОЧНО ТА ЖЕ задача:
> сравнение на бОльшую величину, прыжок, сравнениа на
> мЕншьую :)))

В самом деле? Что ж, посмотрите оба варианта в окне CPU - увидите разный код. А вот что показал тест (в цикле, 100 млн. прогонов на P2-350):
а). вариант со сравнением - около 1800 мс;
б). вариант с множеством - около 1500 мс.
Разница - примерно 20%. Конечно, не в разы, но заметно.


 
snake1977   (2003-04-14 10:16) [7]

а можно даже так поизвращаться :)
if (x mod 100)=x Then tramtramtram(param);

:))
но без If Then никуда не денешся


 
Anatoly Podgoretsky ©   (2003-04-14 10:27) [8]

NA © (14.04.03 01:26)
Существуют варианты для ассеблера, которые обойдутся без всякого сравнения, вообще без сравнения.


 
Sha ©   (2003-04-14 12:23) [9]

2Anatoly Podgoretsky © (14.04.03 10:27)

Вот эквивалент на Delphi тех самых вариантов для ассемблера: (x in [0..99])


 
Sha ©   (2003-04-14 13:26) [10]

Для проверки на принадлежность большому целочисленному диапазону(например, -100<=x<=1000) можно использовать другой трюк:

procedure TForm1.Button1Click(Sender: TObject);
var
x, x1, dx, y, y1: integer;
begin;
//Для x, x1, dx, y, y1: integer;
// аналог (x>=x1) and (x<x1+dx)
// равен cardinal(x-x1)<cardinal(dx),
//а если dx - степень двойки, то проверить
//попадание в квадрат
// (x>=x1) and (x<x1+dx) and (y>=y1) and (y<y1+dx)
// можно так:
// cardinal((y-y1) or (x-x1))<cardinal(dx)
y1:=-1; x1:=-2; dx:=4;
for y:=-5 to 5 do
for x:=-5 to 5 do
if cardinal((y-y1) or (x-x1))<cardinal(dx)
then ShowMessage(Format("%d, %d",[y,x]));
end;


 
Anatoly Podgoretsky ©   (2003-04-14 13:47) [11]

Sha © (14.04.03 12:23)
А при чем тут IN вопрос про больше/меньше, для IN и так нет сранения.
Это примерно так

function GT(Left, Right: Integer): boolean;
asm
xchg eax,edx
sub eax,edx
sbb eax,eax
or eax,1 // если нужен чистый boolean
end;


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


 
Sha ©   (2003-04-14 13:50) [12]

2Anatoly Podgoretsky © (14.04.03 13:47)
а вот причем:

f: boolean;
f:=(x in [0..99]); //всего три инструкции


 
Anatoly Podgoretsky ©   (2003-04-14 13:56) [13]

Еще раз вопрос не про множества, с ними все понятно, и уж совсем не понятно а причем тут присваивание?


 
Sha ©   (2003-04-14 14:05) [14]

>Anatoly Podgoretsky © (14.04.03 13:56)
>вопрос не про множества
если не рассматривать множества, то: cardinal(x-x1)<cardinal(dx)

>и уж совсем не понятно а причем тут присваивание?
чтобы получить "чистый boolean" :)






Страницы: 1 вся ветка

Текущий архив: 2003.04.24;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
6-77046
IVI
2003-03-03 12:05
2003.04.24
Соединение с Internet


1-76879
dimonf
2003-04-14 16:39
2003.04.24
Народ, как создать перечесляемый тип, для своего компанента?


1-76927
Sluggard
2003-04-11 01:35
2003.04.24
Колонтитулы в QReport


1-77027
Vitek
2003-04-14 09:16
2003.04.24
Шестнадцатеричное в Float


14-77107
Николай Быков
2003-04-03 15:53
2003.04.24
моддинг+клава+светодиоды+ком-порты+другие порты