Seite 1 von 1

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

Verfasst: 05.01.2007 10:57
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

Verfasst: 05.01.2007 12:26
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.

Verfasst: 05.01.2007 13:08
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.

Verfasst: 05.01.2007 13:41
von Kaeru Gaman
yo, und von mir aus tus auch inne Pfanne und schlag en Ei drüber...

Verfasst: 05.01.2007 13:49
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.

Verfasst: 05.01.2007 14:00
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...

Verfasst: 05.01.2007 18:01
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.