![]() |
Re: Function für Vorzeichen?
Zitat:
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; |
Re: Function für Vorzeichen?
Zitat:
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:
|
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 ![]() Gruß Hawkeye |
Re: Function für Vorzeichen?
Zitat:
Zitat:
|
Re: Function für Vorzeichen?
@Flocke: Das weiß ich. Aber ich verwende nur ein if anstatt von zwei, was das ganze wieder beschleuningt.
|
Re: Function für Vorzeichen?
Zitat:
|
Re: Function für Vorzeichen?
Zitat:
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 :| |
Re: Function für Vorzeichen?
Zitat:
(if then else) |
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. |
Re: Function für Vorzeichen?
Zitat:
Zitat:
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. |
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