AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Function für Vorzeichen?

Ein Thema von Cöster · begonnen am 8. Sep 2006 · letzter Beitrag vom 10. Sep 2006
Antwort Antwort
Seite 3 von 6     123 45     Letzte »    
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#21

Re: Function für Vorzeichen?

  Alt 8. Sep 2006, 19:02
Zitat von 3_of_8:
Nimm nie ein if, wenn du stattdessen eine arithmethische Operation kriegst. Ifs bremsen den Prozessor ab.
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;
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#22

Re: Function für Vorzeichen?

  Alt 8. Sep 2006, 19:08
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 von 3_of_8:
Nimm nie ein if, wenn du stattdessen eine arithmethische Operation kriegst.
Was meinst du damit?
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#23

Re: Function für Vorzeichen?

  Alt 8. Sep 2006, 19:19
@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
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#24

Re: Function für Vorzeichen?

  Alt 8. Sep 2006, 19:41
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 von Hawkeye219:
Das Gegenstück (ASR) haben die Borländer leider nicht implementiert.
Du meinst bestimmt SAR, oder?
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#25

Re: Function für Vorzeichen?

  Alt 8. Sep 2006, 19:45
@Flocke: Das weiß ich. Aber ich verwende nur ein if anstatt von zwei, was das ganze wieder beschleuningt.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#26

Re: Function für Vorzeichen?

  Alt 8. Sep 2006, 19:47
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?
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#27

Re: Function für Vorzeichen?

  Alt 8. Sep 2006, 19:48
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: 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
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#28

Re: Function für Vorzeichen?

  Alt 8. Sep 2006, 19:49
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)
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#29

Re: Function für Vorzeichen?

  Alt 8. Sep 2006, 19:54
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#30

Re: Function für Vorzeichen?

  Alt 8. Sep 2006, 20:46
Zitat von Cöster:
Delphi-Quellcode:
function Sign(Value: Real): Integer;
begin
  if Value < 0 then
    result := -1
  else
    result := 1;
end;
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 6     123 45     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz