Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [C] sgn-Funktion verhält sich komisch (falsche Rückgabe) (https://www.delphipraxis.net/127952-%5Bc%5D-sgn-funktion-verhaelt-sich-komisch-falsche-rueckgabe.html)

Dax 21. Jan 2009 23:50

Re: [C] sgn-Funktion verhält sich komisch (falsche Rückgabe)
 
Zitat:

Zitat von 3_of_8
Im übrigen, die übersichtliche Version wäre ja die folgende:
Code:
int sgn(float x) {
  return (x<0)?-1:((x>0)?1:0));
}

Was macht das mit nicht finiten Werten? ;)

Der Jan 21. Jan 2009 23:54

Re: [C] sgn-Funktion verhält sich komisch (falsche Rückgabe)
 
float wird nicht infinit :)

ok, mormalerweise nicht. bei diesem definierten infinit-Value müßte man es testen.

3_of_8 22. Jan 2009 15:31

Re: [C] sgn-Funktion verhält sich komisch (falsche Rückgabe)
 
Naja, das kann schon passieren. 1/0 liefert infinty, -1/0 liefert -infinity (die 0 ist hier eine +0)

Wie sich das jetzt verhält, hängt davon ab, wie sich die FPU bei Vergleichen von Infinity-Werten verhält, das müsste ich jetzt ausprobieren...

himitsu 22. Jan 2009 15:39

Re: [C] sgn-Funktion verhält sich komisch (falsche Rückgabe)
 
Zitat:

Zitat von Der Jan
Ich bezweifle, dasss das ein Pascaler für übersichtlich halten wird, aber ich liebe diesen Operator :) *sich duckt und wegschleicht*

nja, für die Programmieranfänger dann halt irgendwie so :angel2:
Code:
int sgn(float p)
{
   if (p < 0) {
     return -1;
   }
   else
   if (p > 0) {
     return +1;
   }
   else
     return 0;
}
ich hoff das sieht nicht all zu schlimm aus (kommt ja nur von 'nem Pascaler)

fkerber 22. Jan 2009 15:45

Re: [C] sgn-Funktion verhält sich komisch (falsche Rückgabe)
 
Das nenne ich dann, das Problem elegant "umschifft"... ;)


Ciao, Frederic

Apollonius 22. Jan 2009 15:57

Re: [C] sgn-Funktion verhält sich komisch (falsche Rückgabe)
 
Unendlich große Werte sind kein Problem, aber NaNs, denn mit diesen schlagen alle Vergleiche fehl.

Edit: Oder auch nicht. Vermutlich ist das Ergebnis vom C-Standard nicht definiert.

Der Jan 22. Jan 2009 17:24

Re: [C] sgn-Funktion verhält sich komisch (falsche Rückgabe)
 
Was mir grad noch einfällt, es gibt auch in Delphi eine Funktion für den trinären Operator: "ifthen", die ist (glaube ich) in der Unit Math.

Apollonius 22. Jan 2009 17:29

Re: [C] sgn-Funktion verhält sich komisch (falsche Rückgabe)
 
Dort werden allerdings beide Argumente in jedem Fall ausgewertet, was die Nützlichkeit drastisch reduziert. Hier geht es natürlich, weil es sich um Konstanten handelt.

Der Jan 22. Jan 2009 17:59

Re: [C] sgn-Funktion verhält sich komisch (falsche Rückgabe)
 
Damit hast du natürlich recht. Außerdem ist IfThen AFAIR nur für Zahlen definiert, man kann sich allerdings seilbst ein paar zusätzliche Funktionen definieren, um andere Typen wie String oder Variant abzudecken, so etwa:

Delphi-Quellcode:
unit MyIfThen;
//-----------------------------------------------------------------------------
interface

function IfThen(i_bl: boolean; i_sTrue: string; i_sFalse: string = '0'): string;
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
implementation

function IfThen(i_bl: boolean; i_sTrue: string; i_sFalse: string = '0'): string;
begin
  if(i_bl) then
    Result := i_sTrue
  else
    Result := i_sFalse;
end;
//-----------------------------------------------------------------------------
end.
Aber langsam wirds OT :)

Dax 22. Jan 2009 18:03

Re: [C] sgn-Funktion verhält sich komisch (falsche Rückgabe)
 
Müsste ein trinärer Operator unter neuen Delphis nicht mit einer generischen Funktion (bool, TFunc<T>, TFunc<T>): T und anonymen Funktionen recht eklig zu machen sein? ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:22 Uhr.
Seite 2 von 3     12 3      

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