![]() |
Re: Function für Vorzeichen?
Zitat:
Delphi-Quellcode:
Gruß Jürgen
function Vorzeichen( const dValue: double ): integer;
begin if dValue >= 0 then begin if dValue = 0 then Result := 0 else Result := 1; end else Result := -1; end; |
Re: Function für Vorzeichen?
Dann kann ich's eigentlich auch mit Abs(Value)/Value machen. Ich dachte, da gäb's vielleicht ne fertige Funktion für, aber die selber zu schreiben (sign kennt mein delphi nicht) führt ja nur zu zusätzlichen Codezeilen. Oder hat meine Variante irgendwelche nachteile? (wenn Value 0 ist, wird der Code sowieso nicht aufgerufen, es würde also nicht durch 0 geteilt)
|
Re: Function für Vorzeichen?
Zitat:
Zitat:
|
Re: Function für Vorzeichen?
Also gut, jetzt noch einmal. Sign steht in der Unit Math. Die einbinden. Das dürfte auch bei Delphi 4 oder was du hast drinsein.
Und außerdem habe ich dir schon einen Code geschrieben, der mit EINER If-Abfrage auskommt. abs(value)/value ist ineffizient, wenn dann schon abs(value) div value, was bei einer 0 versagt, weil man nunmal nicht durch 0 teilen kann. Außerdem ist so ein div im Vergleich zu meinem Code wirklich langsam. Zitat:
|
Re: Function für Vorzeichen?
Hallo,
hier ist noch eine Assembler-Version:
Delphi-Quellcode:
Die folgenden PASCAL-Versionen haben den Vorteil, daß man sie im BDS mit der INLINE-Direktive versehen kann. In zeitkritischen Routinen kann man damit einen zusätzlichen Geschwindigkeitsvorteil erzielen:
function Sign2 (aValue: Integer): Integer;
asm sar eax,31 or eax,1 end;
Delphi-Quellcode:
Gruß Hawkeye
function SignInt (aValue: Integer): Integer; {nur für BDS: inline;}
const cSign: array [Boolean] of Integer = (-1, +1); begin Result := cSign[aValue >= 0]; end; function SignFloat (aValue: Double): Integer; {nur für BDS: inline;} const cSign: array [Boolean] of Integer = (-1, +1); begin Result := cSign[aValue >= 0]; end; |
Re: Function für Vorzeichen?
Das funktioniert so nicht ganz.
Denn bei 0 hast du eine 0 im Sign-Bit und dann kriegst du bei einer 0 als Result 1. Und wenn du das willst, geht das auch genausogut so: |
Re: Function für Vorzeichen?
Hallo Manuel,
Zitat:
PS: In deiner Assembler-Routine solltest du das "JA" durch ein "JG" ersetzen. :wink: Gruß Hawkeye |
Re: Function für Vorzeichen?
Zitat:
Zitat:
Zitat:
Zitat:
Ich hab mir nach euren Tipps jetzt doch ne Function gebastelt:
Delphi-Quellcode:
function Sign(Value: Real): Integer;
begin If Value < 0 then result := -1 else result := 1; end; |
Re: Function für Vorzeichen?
Aber eigentlich sollte D5 Sign kennen (siehe Unit Math)
PS: @Threadersteller rate mal, was deine Variante mit der Divition sagt, wenn man der eine 0 gibt :warn: |
Re: Function für Vorzeichen?
Er sagte, es kommt nie dazu.
Und @Cöster: Nimm nie ein if, wenn du stattdessen eine arithmethische Operation kriegst. Ifs bremsen den Prozessor ab. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:54 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