Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.01 c
6-8563
Filat
2003-09-04 16:38
2003.11.03
Как сделать send message конкретному юзеру или всей лок. сети?


1-8353
P0tia
2003-10-22 17:04
2003.11.03
Как программно загрузить форму


3-8322
Марат
2003-10-13 09:05
2003.11.03
SQL запросы


1-8514
S!R!X
2003-10-23 15:18
2003.11.03
Выполнение команд в другом приложении с послед. выводом результ.


14-8664
VID
2003-10-13 15:17
2003.11.03
ASDSee 6.0, Norton Utilities 2002 6.0





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