Форум: "Потрепаться";
Текущий архив: 2003.11.03;
Скачать: [xml.tar.bz2];
ВнизМодуль числа без ф-ции abs Найти похожие ветки
← →
Partizan_ (2003-10-12 19:48) [0]Кто может на паскале написать ф-цию, которая считает модуль чиса от -1000000000 до 1000000000, не используя ф-цию abs?
← →
Иван Шихалев (2003-10-12 19:52) [1]
a = b*sgn(b);
Осталось только написать функцию sgn().
← →
otido (2003-10-12 19:54) [2]sgn это типа sign ... malo li, neponjatno)
← →
Partizan_ (2003-10-12 19:55) [3]Ну и как же её написать неиспользуя abs?
(забыл сказать:естественно ветвление использовать нельзя)
← →
Иван Шихалев (2003-10-12 19:56) [4]
> sgn это типа sign ... malo li, neponjatno)
Сигнум - он и в Африке сигнум!
← →
Иван Шихалев (2003-10-12 19:57) [5]
> (забыл сказать:естественно ветвление использовать нельзя)
Хм... Батенька - извращенец? Т.е. будем ветвление противоестественно пользовать?
← →
Partizan_ (2003-10-12 19:59) [6]Короче правильный ответ:
function sgn(x:longint):longint;
begin
sgn:=
x div 2+(x+1) div 2+ (x+1000000001)div 2+(x+1000000002)div 2-1;
end;
← →
Ihor Osov'yak (2003-10-12 20:08) [7]
function MyAbs(aInt: integer): integer; assembler;
asm
cdq
xor eax, edx
sub eax, edx
end;
← →
Ihor Osov'yak (2003-10-12 20:10) [8]зы - это и на паскале также пишется..
← →
Иван Шихалев (2003-10-12 22:39) [9]
>cdq
Что за зверь?
← →
Mihey (2003-10-12 22:42) [10]Для ленивых.
Num - наше число. Тады:
s := IntToStr(Num);
Delete(s, Pos("-", s), 1);
Num := StrToInt(s);
← →
default (2003-10-13 00:05) [11]Ihor Osov"yak © (12.10.03 20:08) [7]
так по-моему дельфёвый компилятор поступает...
← →
default (2003-10-13 00:38) [12]to Ihor Osov"yak
function Abs1(const N: Integer): Integer;
asm
CDQ
XOR EAX, EDX
SUB EAX, EDX
end;
function Abs2(const N: Integer): Integer;
asm
MOV EDX, EAX
NEG EAX
CMOVS EAX, EDX
end;
Abs1 это твой вариант, который как я подозреваю ты взял из окошка дебагера,
Abs2 это мой, по скорости практически одно и тоже, второй даже чуть быстрей
<code/>
← →
Asteroid (2003-10-13 00:52) [13]> Иван Шихалев © (12.10.03 22:39) [9]
CDQ — Convert Doubleword to Quadword
Doubles the size of the operand in register EAX by means of sign extension and stores the result in registers EDX:EAX.
← →
default (2003-10-13 00:54) [14]Asteroid © (13.10.03 00:52) [13]
а попроще - заполняет регистр EDX значением старшего бита регистра EAX
← →
Ihor Osov'yak (2003-10-13 00:58) [15]2 [9] Иван Шихалев © (12.10.03 22:39)
рассширение 32 битного в 64 с учетом знака.. То есть, если в eax отрицательное, то в edx будет 0xFFFFFFFF, если положительное - то 0.
2 [12] default © (13.10.03 00:38)
Естественно..
Есть случаи, когда нужно думать. А есть случаи, когда можно посмотреть готовый ответ и проанализировать, есть ли он приемлимым. Этот вопрос не из разрада, когда напрягать извилину есть необходимость ( у меня во всяком случае есть более уважительные для этого поводы).. И подсмотренный ответ я посчитал приемлемым.
← →
default (2003-10-13 01:04) [16]Ihor Osov"yak © (13.10.03 00:58) [15]
полностью согласен, разве что копирайт борландовский надо было поставить...
← →
Ihor Osov'yak (2003-10-13 01:16) [17]2 [16] default © (13.10.03 01:04)
Э, хидера я сам присобачил.. Борланд инлайн делает.. :-)
← →
default (2003-10-13 01:50) [18]Ihor Osov"yak © (13.10.03 01:16) [17]
я знаю, но идея-то борланда, тривиальной я бы её не назвал
← →
vidiv (2003-10-13 03:55) [19]
function abs(a:integer):integer;
begin
abs := round(sqrt(sqr(a)));
end;
← →
MBo (2003-10-13 06:34) [20]AbsInt:=IntVar and MaxInt;
← →
MBo (2003-10-13 06:37) [21];) соврал я ;)
← →
MBo (2003-10-13 07:28) [22]В качестве извращения:
i:=(i - i shr 31) xor not (i shr 31 - 1);
;)
← →
Verg (2003-10-13 10:43) [23]function Abs_int(W : integer):integer; assembler;
asm
@@1: neg eax
js @@1
end;
← →
default (2003-10-13 16:54) [24]Verg © (13.10.03 10:43)
по моим замерам твой всё равно медленней двух предыдущих
хотя все три они почти одинаковы по скорости
1 - 10057
2 - 10054
3 - 10067
← →
Ihor Osov'yak (2003-10-13 20:39) [25]2 [18] default © (13.10.03 01:50)
Нащет авторства борланд - немного сомневаюсь, думаю эта реализация (ну, немного иное было вместо CDQ) еще с тех славных времен, когда почти все на азме писалось и каждый байт считали..
← →
default (2003-10-13 23:20) [26]Partizan_ (12.10.03 19:48)
вообще Abs - это не ф-ия, а макрос такой
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.11.03;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.009 c