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

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
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

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

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

oh ja... das berühmt-berüchtigte "boolcast" workaround... :mrgreen:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
PMTheQuick
Beiträge: 630
Registriert: 05.05.2005 19:06

Beitrag 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 ;-)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
PMTheQuick
Beiträge: 630
Registriert: 05.05.2005 19:06

Beitrag 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
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Btw in anderen Programmiersprachen kennt man deine Funktion ("CutVal") unter dem Namen clamp(value, min, max).
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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() ...?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten