Abs() nun auch für Integer und Quad (bisher nur für Floats)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Abs() nun auch für Integer und Quad (bisher nur für Floats)

Beitrag von AND51 »

Hallo Kaeru Gaman!

Ich habe mir die Freiheit genommen :wink:
und deine AbsEx()-Funktion optimiert. Ich dachte mir, ein kleiner Wettkampf wie beim byterechner() könnte nicht schaden :)
Ich habe beide Codes mit den Zahlen -6, 0 und 90 bei 100.000.000 Durchläufen getestet (ohne Debugger, versteht sich).
  • Kaeru Gaman (532 ms)

    Code: Alles auswählen

    Macro AbsEx(Expression) 
      ( ( ((Expression) >= 0 Or 0) *2 - 1  ) * (Expression) ) 
    EndMacro 
    
    Debug AbsEx(90)
    Debug AbsEx(0)
    Debug AbsEx(-6)
  • AND51 (297 ms):

    Code: Alles auswählen

    Macro myAbs(Number)
    	(((Number > 0)-(Number < 0))*Number)
    EndMacro
    
    Debug myAbs(90)
    Debug myAbs(0)
    Debug myAbs(-6)
Ich finde deine Vorgehensweise übrigens sehr interessant! :)
Zu meinem Code: Ich griff auf die Signumfunktion zurück und multipliziere dieses Ergebnis mit 'Number'.


An alle anderen: Ihr dürft natürlich auch eure Meinungen hier niederschreiben oder Codes posten. :D
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

meine intension war, dass komplexe ausdrücke drin stehen können....

teste das ganze doch mal nach performance, wenn du so ausdrücke wie

Code: Alles auswählen

37 * x + 42 * y + 43 + sin(t)
drin hast...

ok, der sinus isn function-call

aber halt komplexe ausdrücke...

du hättest ihn 3x zu berechnen, ich nur 2x.. ;)

PS:

Code: Alles auswählen

((Number > 0)-(Number < 0))
das geht so nich in PB...
mindestens

Code: Alles auswählen

((0 Or (Number > 0))-(0 Or (Number < 0)))
boole'sche Ausdrücke werden nicht nativ unterstützt, und müssen mit
einem logischen ausdruck gecasted werden, um richtig zu funktionieren.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Kaeru Gaman hat geschrieben:PS:

Code: Alles auswählen

((Number > 0)-(Number < 0))
das geht so nich in PB...
mindestens

Code: Alles auswählen

((0 Or (Number > 0))-(0 Or (Number < 0)))
boole'sche Ausdrücke werden nicht nativ unterstützt, und müssen mit
einem logischen ausdruck gecasted werden, um richtig zu funktionieren.
Wenn ich schreibe A=B, wird das nicht unterstützt, aber in dem Signum-Thread hast du selber gemerkt, dass < und > anscheinend doch funktioneiren:
Kaeru Gaman hat geschrieben:...yo sakra... gibts das doch inzwischen?

muss ich mal ausgiebig testen, vielleicht ist dieses konstrukt ein sonderfall.
aber

Code: Alles auswählen

Macro sig(X) 
(-(X<0)+(X>0)) 
EndMacro 
scheint zu funktionieren *kopfkratz*
Mit "Or 0" oder "And 1" wird mein Macro übrigens genauso "schnell" bzw. "Langsam", wie deines. Du siehst also, ich habe schon daran gedacht.

> du hättest ihn 3x zu berechnen, ich nur 2x..
Und was, wenn ich aus dem Macro eine Procedure mache? :wink: Dann hätte ich "es" nur 1x zu berechnen. Aber: Wenn ich schon eine Procedure draus mache, kann ich mir das Suchen nach einem Einzeiler sparen, denn diese Art von macros müsen ja Einzeiler sein.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

yo, und von mir aus tus auch inne Pfanne und schlag en Ei drüber...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Es ging mir lediglich darum, deine tolle Idee zu publizieren, damit alle was davon haben, denn ich fänds schade, wenn dein Macro in dem thread, genauer: in einem Nebensatz erwähnt, in Vergessenheit geraten würde.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

yo danke, is ja lieb von dir...

ich hab nur inzwischen irre koppschmerzen von der ganzen scheiße letzte nacht...
bin im moment nich gut drauf.. sollte ma off gehen...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

so da bin ich wieder....

also, es geht OHNE boolcast nicht zuverlässig

Code: Alles auswählen

a = 4
b1 = (a>5)
c1 = (a>5) Or 0
b1 = (a<5)
c1 = (a<5) Or 0
Debug b1
Debug c1
Debug b2
Debug c2
siehe erster wert: die rückgabe müsste 1 sein, um damit rechnen zu können.
ok, jeder wert ungleich null ist #TRUE, aber damit man es als faktor verwenden kann, muss es 1 sein.

Code: Alles auswählen

Macro AbsEx(Expression) 
  ( ( ((Expression) > 0 Or 0) *2 - 1  ) * (Expression) ) 
EndMacro 
bei mir jetzt im code:
((Expression) > 0 Or 0)
hier wird bewertet ob der ausdruck größer als null is oder nicht.
bei größer null ergibt das eins, andernfalls null.
*2
damit wird es zu 2 oder 0
-1
damit wird es zu 1 oder -1
...bis dahin ist es also eine komplette Signum, in der der ausdruck nur einmal vorkommt.
damit man nun den absoluten wert des ausdrucks zurückbekommt,
muss man mit dem ausdruck selber multiplizieren.
dadurch, dass ich den wert des ausdrucks mit seinem vorzeichen multipliziere,
erhalte ich den absoluten wert des ausdrucks.

wenn ich jetzt keine einfachen variablen drin habe,
sondern komplexe ausdrücke mit mehreren variablen,
dann wird man sehr wohl den unterschied merken,
dass in deiner variante der ausdruck 3x berechnet werden muss,
und bei meiner nur 2x...

ganz abgesehen davon, dass ich bezweifle, ob ein boolescher ausdruck ohne boolcast in PB immer funktioniert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten