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

.
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...

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

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...

^^. 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

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...
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() ...?