[Delphi] wratość bezwględna w delphi3

0

Da sie w delphi3 uzyskać wartość bezwgledna bez stosowania if ???
tzn jesli mam:

begin
j:=-3;
jj:=-4;
label1.caption:=inttostr(j+jj);
end;

....to jak zrobić żeby wynik ddawania był zawsze dodatni ???

0

Abs+F1=solution

0

O ile się nie mylę, to można jeszcze:

wart_bezwzgl:=liczba*sign(liczba); :)

sign() to funkcja signum, zwraca -1 jeśli liczba jest ujemna, 0 jeśli liczba to 0, oraz 1 jeżeli liczba jest dodatnia :)

0

O ile się nie mylę, to można jeszcze:

wart_bezwzgl:=liczba*sign(liczba); :)

sign() to funkcja signum, zwraca -1 jeśli liczba jest ujemna, 0 jeśli liczba to 0, oraz 1 jeżeli liczba jest dodatnia :)

Hehe. To już jest najlepsze rozwiązanie Thenkles :)
Wykonuje się znacznie dłużej. Należy wywołać oddzielną funkcję (Abs działa jak operator).
Sprawdzałem ile cykli zegara potrzeba na obliczenie wartości bezwzględej (wg tego co generuje Delphi). Okazało się, że najmniej cykli potrzebuje instrukcja
if w < 0 then w := -w;
I co wy na to? (nie testowałem w rzeczywistych warunkach. Może się okazać, że Abs mogłoby być szybsze, w co jedak wątpię)

0

Jeżeli chodzi o tego if'a, t w pytanie było napisane, jak obliczyć wartość bezwzględną właśnie bez if'a :)

0

Jeżeli chodzi o tego if'a, t w pytanie było napisane, jak obliczyć wartość bezwzględną właśnie bez if'a :)

zawsze można zrobic funkcje:

[code]function wb(liczba: integer) :integer;
begin
if liczba &lt 0 then Result:=-liczba
else result:=liczba;
end;

a potem w kodzie wb(-4) i gra muzyka :-D[/code]

0

Jeżeli chodzi o tego if'a, t w pytanie było napisane, jak obliczyć wartość bezwzględną właśnie bez if'a :)

zawsze można zrobic funkcje:

[code]function wb(liczba: integer) :integer;
begin
if liczba < 0 then Result:=-liczba
else result:=liczba;
end;

a potem w kodzie wb(-4) i gra muzyka :-D[/code]

Właśnie cała słabość rozwiązania Thenklesa polega na wywoływaniu innej funkcji. Wywołania funkcji to jedne z dłużej działających instrukcji.

0

Jeżeli chodzi o tego if'a, t w pytanie było napisane, jak obliczyć wartość bezwzględną właśnie bez if'a :)

zawsze można zrobic funkcje:

[code]function wb(liczba: integer) :integer;
begin
if liczba < 0 then Result:=-liczba
else result:=liczba;
end;

a potem w kodzie wb(-4) i gra muzyka :-D[/code]

[code]spin a spróbuj Twoją funkcją wowołać wb(-4.5)[/code]

:-D [cya]

0

A ja proponuję inne podejście (dla liczb całkowitych):
Napisanie własnej funkcji albo makra w Assemblerze:

iZmienna : integer;
optymalizacja pod kątem objętości:

label:
neg iZmienna
js short label

optymalizacja pod kątem szybkości:
mov eax,iZmienna
mov edx,eax
sar edx,31
xor eax,edx
sub eax,edx
mov iZmienna,eax

(źródło: http://alexfru.narod.ru/miscdocs/optimize/allgems.zip)

1 użytkowników online, w tym zalogowanych: 0, gości: 1