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

Вниз

Модуль числа без ф-ции 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.016 c
1-8424
Алексей Петухов
2003-10-21 13:40
2003.11.03
DOS Кодировка


1-8463
Ai-Shibo
2003-10-24 12:17
2003.11.03
помогите, пожалуйста


1-8350
GreySerg
2003-10-22 16:40
2003.11.03
Как определить запущено ли уже какое-то приложение или нет ?


4-8729
konstantinov
2003-08-30 23:04
2003.11.03
Помогите с указателями


1-8357
DimChan
2003-10-23 10:05
2003.11.03
TQuery