Delphi-PRAXiS
Seite 4 von 6   « Erste     234 56      

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)

himitsu 8. Sep 2006 21:57

Re: Function für Vorzeichen?
 
Zitat:

Zitat von Hawkeye219
Die Unit Math wurde/wird ständig erweitert, die Sign-Funktionen wurden in Delphi 6 hinzugefügt.

OK, dann halt nicht .... mir war nur o, als gab's dat in meinem D4 auch schon :oops:

Dax 8. Sep 2006 22:09

Re: Function für Vorzeichen?
 
Zitat:

Zitat von Cöster
Wie kann man das denn ohne if (und ohne Assembler) schreiben? :gruebel:

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

Hawkeye219 8. Sep 2006 22:24

Re: Function für Vorzeichen?
 
Hallo Cöster!

Zitat:

Natürlich, ich bekomme nicht - oder +, aber -1 oder +1. Das ist auch alles, was ich will.
Manuel wollte dich darauf aufmerksam machen, daß die gängigen Vorzeichen-Funktionen für die Zahl 0 den Wert 0 als "Vorzeichen" liefern. Deine Funktion liefert in diesem Fall den Wert 1, betrachtet die Null also als positive Zahl.

Zitat:

Wie kann man das denn ohne if (und ohne Assembler) schreiben?
Ich hatte im Beitrag #15 eine mögliche Lösung vorgestellt (für Integer- und Double-Werte), weil ich auch von einer zweiwertigen Funktion ausging. Obwohl Vergleichsoperatoren verwendet werden, enthält der erzeugte Assemblercode keine Sprungbefehle.

@Dax: so geht's :thumb:

Gruß Hawkeye

3_of_8 8. Sep 2006 22:25

Re: Function für 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:[/quote]

Du bekommst bei einer 0 eine +1 raus. Eine 0 hat aber kein Vorzeichen, folgerichtig muss also bei einer 0 eine 0 rauskommen.

Das geht natürlich dann nicht ohne if, aber mit einem statt 2.

Christian Seehase 8. Sep 2006 22:50

Re: Function für Vorzeichen?
 
Moin Zusammen,

ist ja schön, dass ihr so viele Vorschläge macht, wie man das bei integer-Werten machen kann, Cöster sucht das aber für Real ;-)

3_of_8 8. Sep 2006 22:53

Re: Function für Vorzeichen?
 
Er kann ihn ja vorher truncaten.

Christian Seehase 8. Sep 2006 22:57

Re: Function für Vorzeichen?
 
Moin Manuel,

das dürfte nicht viel helfen, wenn der Wert zwischen -1 und +1 liegt.

Dax 8. Sep 2006 22:57

Re: Function für Vorzeichen?
 
Zitat:

Zitat von Christian Seehase
Moin Zusammen,

ist ja schön, dass ihr so viele Vorschläge macht, wie man das bei integer-Werten machen kann, Cöster sucht das aber für Real ;-)

Nuuun *grübel* ;)

Delphi-Quellcode:
function Sign(e: Extended): Integer;
begin
  Result := (0 - (e shr 79)) or 1;
end;

Hawkeye219 8. Sep 2006 23:06

Re: Function für Vorzeichen?
 
Dax, diesmal muß ich dich enttäuschen - SHR erwartet einen ganzzahligen Operanden.

Zitat:

Zitat von Christian Seehase
Cöster sucht das aber für Real

Zitat:

Zitat von Hawkeye219
Ich hatte im Beitrag #15 eine mögliche Lösung vorgestellt (für Integer- und Double-Werte)

Gruß Hawkeye

Dax 8. Sep 2006 23:11

Re: Function für Vorzeichen?
 
Zitat:

Zitat von Hawkeye219
Dax, diesmal muß ich dich enttäuschen - SHR erwartet einen ganzzahligen Operanden.

Oops, sowas hab ich mir schon gedacht :( Da hab ich wohl schneller getippt als gedacht. ;)

Gings denn so?

Delphi-Quellcode:
function Sign(e: Extended): Integer;
type
  PExtendedRec = ^TExtendedRec;
  TExtendedRec = record
    case Integer of
      0: (e: Extended);
      1: (a: Array[0..9] of Byte);
  end;
begin
  Result := (0 - (PExtendedRec(@e)^.a[0] shr 7)) or 1;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:09 Uhr.
Seite 4 von 6   « Erste     234 56      

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