![]() |
Doku zu DECMath?
hi
ich bin auf der suche nach einer doku zur DECMath... ich habe hier die D7-Version gefunden. in einem thread schreibt negaH man könne mit IInteger "wie mit einem normalen Integer" arbeiten. leider kennt er aber kein div, nichtmal vergeleiche à la if IInteger > 0 sind möglich. hat einer diesen typ bereits benutzt? |
Re: Doku zu DECMath?
Zitat:
|
Re: Doku zu DECMath?
ok, das meisste wurde geklärt...
nur noch ne idee: wie prüf ich ob das dingen 0 is? |
Re: Doku zu DECMath?
Spät, aber besser als nieee ;)
Zitat:
Delphi-Quellcode:
Gruß Hagenvar A: IInteger; begin if NCmp(A, 0) = 0 then ; // NCmp() -> Compare if NSize(A) = 0 then ; // NSize() -> Anzahl der Bits, Bytes, Words oder Cardinals if NSgn(A) = 0 then ; // NSgn() -> Signum -> Vorzeichen von A // -1 wenn A < -2^31, // -A when A < 0 und A > -2^31 // 0 wenn A = 0 // +A when A > 0 und A < +2^31 // +1 when A > 2^31 end; |
Re: Doku zu DECMath?
Zitat:
ist es dann <-2^31 oder =-1 ??? |
Re: Doku zu DECMath?
Zitat:
Normalerweise fragt man zb. so ab
Delphi-Quellcode:
Man benutzt also NSgn() normalerweise nur mit Vergleichen zu 0.begin if NSgn(A) < 0 then ... else if NSgn(A) > 0 then .... else .... end; In einigen Fällen aber möchte man zb. auf -2 oder +2 abfragen und dann kann man auch NSgn() dafür benutzen. Allerdings ist dies eher ein "verstecktes" Feature. Das nun -1,+1 doppeltdeutig ist würde ich heute als "Design-schwäche" bezeichnen, damals aber fand ich's toll und habe auch dieses Feature an verschiedenen Stellen benutzt. Es ist halt vom Code her schneller NSgn(A) = -2 abzufragen als mit NCmp(A, -2) = 0 zu arbeiten. Dies liegt einfach daran das bei NSgn() der Rückgabewert in EAX überprüft wird, während bei NCmp(A, -2) mit zusätzlichen Paramtern gearbeitet werden muß. Aus meiner heutigen Sicht ist es aber ein Designfehler, man wird halt älter und strenger ;) Auf alle Fälle verhindert diese Schwäche solche Source wie nachfolgende
Delphi-Quellcode:
Ich würds auf Grund dessen heute anders programmieren ;) Das dir das aber auch auffallen musste.case NSgn(A) of -1: ; 0: ; +1: ; end; // oder const sSgn: array[-1..+1] of String = ('negativ', 'null', 'positiv'); Result := sSgn[NSgn(A)]; Gruß Hagen |
Re: Doku zu DECMath?
Mist, ich erzähle da mal wieder Schwachsinn über meine eigenen Source.
Also NSgn() ist so deklariert
Delphi-Quellcode:
Die eine Funktion fragt das Vorzeichen ab die andere setzt es.function NSgn(const A: IInteger; Extended: Boolean = False): Integer; overload; // Sign of A // returns if Extended = False // 0 if A = 0 // 1 if A > 0 // -1 if A < 0 // retruns if Extended = True // 0 if A = 0 // A if 0 < A < $80000000 // -A if -$80000000 < A < 0 // MaxInt if A >= $80000000 // -MaxInt if A <= -$80000000 procedure NSgn(var A: IInteger; Sign: Integer); overload; // set sign of A // Signum(A) = Signum(Sign) Bei der Abfrage mit NSgn(A, False); oder eben NSgn(A) liefert die Funktion immer -1,0,+1 als mögliche Werte zurück. Bei der Abfrage NSgn(A, True); liefert die Funktion -A wenn A > -2^31-1, -MaxInt wenn A < -MaxInt und umgekerht zurück. Liefert NSgn(A, True) = -1 so ist A == -1 etc.pp. Ich hatte noch im Hinterkopf meine TBigNum Klasse, der Vorgänger von IInteger, bei dem war es wie oben beschrieben. Bei IInteger habe ich also diese Designschwäche schon beseitigt gehabt. Also alles bestens. Oh mann ich werde wohl alt ;) Gruß Hagen |
Re: Doku zu DECMath?
Zitat:
aber wenn es "jetzt", d.h. bei IInteger richtig ist, is ja gut :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:31 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-2025 by Thomas Breitkreuz