Delphi-PRAXiS
Seite 3 von 6     123 45     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Function für Vorzeichen? (https://www.delphipraxis.net/76719-function-fuer-vorzeichen.html)

Flocke 8. Sep 2006 20:02

Re: Function für Vorzeichen?
 
Zitat:

Zitat von 3_of_8
Nimm nie ein if, wenn du stattdessen eine arithmethische Operation kriegst. Ifs bremsen den Prozessor ab.

:roll: Was denkst du denn, was ein ja bzw. jg in Assembler ist?

Die Version von Hawkeye219 ist laufzeittechnisch schon optimal - schade dass man Assembler-Funktionen nicht inline machen kann...

// Nachtrag: ich Dummkopf...

Delphi-Quellcode:
function Sign(Value: Integer): Integer; inline;
begin
  Result := (Value shr 31) or 1;
end;

Cöster 8. Sep 2006 20:08

Re: Function für Vorzeichen?
 
Zitat:

Zitat von himitsu
Aber eigentlich sollte D5 Sign kennen (siehe Unit Math)

In der Uses-Klausel steht Math und trotzdem schreibt er mir undefinierter Bezeichner, sobald ich was von Sign schreibe.

Kann es vielleicht sein, dass die Unit Math für spätere Delphi-Versionen überarbeitet wurde?
Übrigens: TryIntToStr kennt Delphi 5 Standard auch nicht.

Zitat:

Zitat von 3_of_8
Nimm nie ein if, wenn du stattdessen eine arithmethische Operation kriegst.

Was meinst du damit?

Hawkeye219 8. Sep 2006 20:19

Re: Function für Vorzeichen?
 
@Flocke

SHR ist in Delphi ein vorzeichenloser Shift nach rechts - unabhängig von der Art des Operanden. Das Gegenstück (ASR) haben die Borländer leider nicht implementiert.

@Cöster:

Die Unit Math wurde/wird ständig erweitert, die Sign-Funktionen wurden in Delphi 6 hinzugefügt. Eine Erklärung zu Manuels Aussage findest du in der Wikipedia.

Gruß Hawkeye

Flocke 8. Sep 2006 20:41

Re: Function für Vorzeichen?
 
Zitat:

Zitat von Hawkeye219
SHR ist in Delphi ein vorzeichenloser Shift nach rechts - unabhängig von der Art des Operanden.

Ich habe gerade extra Delphi noch einmal angeschmissen, um mich zu vergewissern. Leider hast du Recht - anders als z.B. in C/C++ ist shr immer vorzeichenlos.

Zitat:

Zitat von Hawkeye219
Das Gegenstück (ASR) haben die Borländer leider nicht implementiert.

Du meinst bestimmt SAR, oder? :mrgreen: :zwinker:

3_of_8 8. Sep 2006 20:45

Re: Function für Vorzeichen?
 
@Flocke: Das weiß ich. Aber ich verwende nur ein if anstatt von zwei, was das ganze wieder beschleuningt.

Cöster 8. Sep 2006 20:47

Re: Function für Vorzeichen?
 
Zitat:

Zitat von Hawkeye219
Eine Erklärung zu Manuels Aussage findest du in der Wikipedia.

Jetzt weiß ich trotzdem noch nicht, was eine arithmetische Operation ist. Statt wessen krieg ich die?

Dax 8. Sep 2006 20:48

Re: Function für Vorzeichen?
 
Zitat:

Zitat von Flocke
Delphi-Quellcode:
function Sign(Value: Integer): Integer; inline;
begin
  Result := (Value shr 31) or 1;
end;

Nenn mich blöd, aber warum noch das or?

edit: :wall: Ja, ich hab mir das shr als sar vorgestellt beim lesen, aber warum das or muss, ist mir erst später aufgefallen... Nennt mich nicht blöd, bindet mir ein Schild um :|

Cöster 8. Sep 2006 20:49

Re: Function für Vorzeichen?
 
Zitat:

Zitat von 3_of_8
@Flocke: Das weiß ich. Aber ich verwende nur ein if anstatt von zwei, was das ganze wieder beschleuningt.

Benutze ich nicht auch nur eins?
(if then else)

3_of_8 8. Sep 2006 20:54

Re: Function für Vorzeichen?
 
Ganz einfach: Wenn er eine 0 oder eine 1 reinkriegt, hat er eine 0 als Ergebnis. Das muss aber eine 1 sein, darum or 1.

@Cöster: Eigentlich hätte ich schreiben sollen eine logisch-arithmetische Operation. Dazu gehören +-*/, div und mod und außerdem not, and, or, xor, shl, shr, sar und vllt hab ich noch welche Vergessen.

Auf Assemblerebene gibts noch ein paar zusätzliche wie z.B. cdq, was allerdings eher ein Cast zu einem Int64 ist.

Diese Operationen bremsen im Gegenteil zu einem if den Prozessor nicht ab. (Pipelining)

Das ist auch der Grund, warum z.B. die Funktion abs nicht mithilfe von Ifs implementiert ist, sondern mit einem cdq und einem xor.

Noch ein Beispiel:
Du willst eine Variable zwischen 0 und 1 umschalten, also wenn a=0 dann a:=1 ansonsten a:=0;
Das könnte man jetzt so machen:
if a=0 then a:=1 else a:=0;

Man könnte es aber auch so machen:
a:=1-a;

Zweiteres geht deutlich schneller.

Zu deinem einen If: 1. lässt sich das auch noch vermeiden und 2. bekommst du mit deiner Funktion NICHT das Vorzeichen.

Cöster 8. Sep 2006 21:46

Re: Function für Vorzeichen?
 
Zitat:

Zitat von Cöster
Delphi-Quellcode:
function Sign(Value: Real): Integer;
begin
  if Value < 0 then
    result := -1
  else
    result := 1;
end;

Zitat:

Zitat von 3_of_8
Zu deinem einen If: 1. lässt sich das auch noch vermeiden und 2. bekommst du mit deiner Funktion NICHT das Vorzeichen.

Sondern? Natürlich, ich bekomme nicht - oder +, aber -1 oder +1. Das ist auch alles, was ich will. Ich brauch den Befehl "hänge an a das Vorzeichen von b dran" und dafür schreib ich dann
a := sign(b)*a;

Wie lässt sich das if denn in der Funktion verhindern (ohne Assembler-Code)? Mehr als
result := value/abs(value)
fällt mir nicht ein. Aber das soll ja noch langsamer sein, als ein if.
Wie kann man das denn ohne if (und ohne Assembler) schreiben? :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:18 Uhr.
Seite 3 von 6     123 45     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz