Seite 1 von 1

CutVal(Min, Max, Val) (Makrospielerei ^^)

Verfasst: 06.05.2009 18:20
von cxAlex
Ganz netter, einfacher Code, einfach ne Zahl zwischen einen minimal und einen Maximalwert begrenzen:

PS:

Hier gings mir eigentlich nur darum das ohne If zu probieren, praktischer Nutzen ist eher wenig vorhanden :mrgreen: .

Code: Alles auswählen

Macro CutVal(Min, Max, Val)
  ((Val>Max) Or 0)*Max + ((Val<Min) Or 0)*Min + (((Val> = Min) And (Val< = Max)) Or 0)*Val
EndMacro

Procedure CutVal2(Min, Max, Val)
  Protected RtVar
  If Val>Max
    RtVar = Max
  ElseIf Val<Min
    RtVar = Min
  Else
    RtVar = Val
  EndIf
  ProcedureReturn RtVar
EndProcedure

Verfasst: 06.05.2009 18:49
von Kaeru Gaman
oh ja... das berühmt-berüchtigte "boolcast" workaround... :mrgreen:

Verfasst: 06.05.2009 18:55
von PMTheQuick
Hier ne Minifunktion fürs berechnen der Differenz von 2 Zahlen. Die Macrovariante ist dabei schneller :-)

Code: Alles auswählen

Macro DifVar(Z1, Z2)
  ((Z1>Z2)*Z1)+((Z2>Z1)*Z2)-(((Z2>Z1)*Z1)+((Z1>Z2)*Z2))
EndMacro

Procedure DifVarProc(Z1, Z2)
  If Z1>Z2
    ProcedureReturn Z1-Z2
  Else
    ProcedureReturn Z2-Z1
  EndIf
EndProcedure

ST = GetTickCount_()
For i = 1 To 100000
  s = DifVar(20, 10)
  s = DifVar(5, 15)
Next i
Debug "Zeit: "+Str(GetTickCount_()-ST)+"ms"
Debug "Resultate: "
Debug DifVar(20, 10)
Debug DifVar(5, 15)

Debug ""

ST = GetTickCount_()
For i = 1 To 100000
  s = DifVarProc(20, 10)
  s = DifVarProc(5, 15)
Next i
Debug "Zeit: "+Str(GetTickCount_()-ST)+"ms"
Debug "Resultate: "
Debug DifVarProc(20, 10)
Debug DifVarProc(5, 15)
PB Debugger sagt: hat geschrieben:Zeit: 16ms
Resultate:
10
10

Zeit: 62ms
Resultate:
10
10
Gruss PMTheQuick ;-)

Verfasst: 06.05.2009 19:03
von Kaeru Gaman
:lol: ach PM...

1. Performance-Tests mit Debugger bringen nix.

2. aussagekräftig wird das erst bei dementsprechender Länge, d.h. einem Vielfachen einer Timeslice also bei mehreren Sekunden...


3. warum nicht einfach:

Code: Alles auswählen

z1.l = Random($FFFFFF)
z2.l = Random($FFFFFF)

z3.l = Abs( z1 - z2 )

Debug z1
Debug z2
Debug z3
Hintergrund:
Abs() ist zwar nur für Floats geeignet, aber da ein Ausdruck übergeben wird, wird der auf Float gecastet.
man muss hier nur drauf achten, dass die Differenz auch in eine Float reinpasst.

Verfasst: 06.05.2009 21:10
von cxAlex
Kaeru Gaman hat geschrieben:oh ja... das berühmt-berüchtigte "boolcast" workaround... :mrgreen:
^^. Solange das mit Or 0 geht brauch ich keine native Boolsche Logik.

Verfasst: 06.05.2009 21:13
von PMTheQuick
Kaeru Gaman hat geschrieben:

Code: Alles auswählen

z1.l = Random($FFFFFF)
z2.l = Random($FFFFFF)

z3.l = Abs( z1 - z2 )

Debug z1
Debug z2
Debug z3
[/code]
Diese Lösung wäre ja viiieeeel zu einfach :mrgreen: Zudem ist das hier viel schöner anzusehen im Code: (besser lesbar)

Code: Alles auswählen

Macro DifVar(Z1, Z2)
  ((Z1>Z2)*Z1)+((Z2>Z1)*Z2)-(((Z2>Z1)*Z1)+((Z1>Z2)*Z2))
EndMacro 
*gg* ne Scherz... War gedacht, mal als erstes mal etwas mit so ner öhm naja halt mit dieser Weise ne Prozedur zu bauen... :-D

Gruss
PMTheQuick

Verfasst: 07.05.2009 08:44
von DarkDragon
Btw in anderen Programmiersprachen kennt man deine Funktion ("CutVal") unter dem Namen clamp(value, min, max).

Verfasst: 07.05.2009 11:19
von Kaeru Gaman
DarkDragon hat geschrieben:Btw in anderen Programmiersprachen kennt man deine Funktion ("CutVal") unter dem Namen clamp(value, min, max).
... und was macht dann die Funktion Ratchet() ...?