Форум: "Основная";
Текущий архив: 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