Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.04.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
Василий Петрович   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.007 c
3-76761
PrettyFly
2003-04-08 14:25
2003.04.24
TQuery.Refresh


1-76991
Giemgo
2003-04-13 00:25
2003.04.24
Не пойму где разместить initialization и finalization


1-76976
Alexander1966
2003-04-11 16:12
2003.04.24
Delphi-йский аналог объявленных констант C++Builder


3-76799
Angel
2003-04-04 00:41
2003.04.24
Query??? почему при выполнении запроса


1-77022
Nikos
2003-04-14 14:10
2003.04.24
Как узнать сущетвует ли каталог или нет





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский