[Delphi] wratość bezwględna w delphi3

[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 ???

Vogel
  • Rejestracja:prawie 23 lata
  • Ostatnio:prawie 7 lat
0

Abs+F1=solution


Life is just a dream, you know...
[Cowboy Bebop]
TH
  • Rejestracja:około 23 lata
  • Ostatnio:około 13 lat
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 :)

Dryobates
  • Rejestracja:prawie 23 lata
  • Ostatnio:około 6 lat
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ę)


Jest jeszcze jeden błąd :)
Unix is user friendly. It's just very particular about who it's friends are.
TH
  • Rejestracja:około 23 lata
  • Ostatnio:około 13 lat
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 :)

SP
  • Rejestracja:około 23 lata
  • Ostatnio:ponad 2 lata
  • Postów:1164
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]

Dryobates
  • Rejestracja:prawie 23 lata
  • Ostatnio:około 6 lat
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.


Jest jeszcze jeden błąd :)
Unix is user friendly. It's just very particular about who it's friends are.
MrSquell
  • Rejestracja:ponad 22 lata
  • Ostatnio:11 miesięcy
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]


Powodzenia! No comments, yet!
Marooned
Administrator
  • Rejestracja:prawie 23 lata
  • Ostatnio:około 3 godziny
  • Lokalizacja:Poznań
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)


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.