Signumfunktion (nur 16 Zeichen)

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
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Beitrag von jear »

... oder 11

Code: Alles auswählen

Macro sig(X) 
  (X>0)-(X<0) 
EndMacro

Debug sig(-12.5)
Debug sig(-1234567890123456789)
Debug sig(-7)
Debug sig(-1)
Debug sig(0)
Debug sig(1)
Debug sig(7)
Debug sig(1234567890123456789)
Debug sig(12.5)
Hat aber schon einen sehr langen Bart...
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

nuja, für manches ist es halt unverzichtbar, und mit "0 Or" bin ich bisher gut gefahren.
ist nur die abkürzung von "#False Or", bzw "#True And".

für procs braucht man das nicht wirklich, da lässt es sich meistens besser über Ifs lösen.
aber für Macros, die einen WERT ergeben sollen, ist es unverzichtbar,
da man dort keine mehreren codezeilen mit bedingungen einbaun kann.

ich könnte mir vorstellen, dass es Fred schwerfällt das zu implementieren,
weil er eventuell irgendwo ganz tief unten in der struktur von PB etwas so angelegt hat,
dass es eben nicht selbstverständlich funktioniert.

....und da nicht viele diese funktionalität wünschen,
man im englischen forum für solch eine anfrage sogar verspottet wird,
wird es bestimmt nicht sehr weit oben in Freds Prioritätenliste stehen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Little John

Beitrag von Little John »

jear hat geschrieben:... oder 11

Code: Alles auswählen

Macro sig(X) 
  (X>0)-(X<0) 
EndMacro
Meine Version hat noch Klammern außenrum:

Code: Alles auswählen

Macro sgn(X) 
  ((X>0)-(X<0))
EndMacro
... sonst kommt z.B. bei

Code: Alles auswählen

3*sgn(-5)
was anderes raus als erwartet. ;)
jear hat geschrieben:Hat aber schon einen sehr langen Bart...
Jup. Ich find's aber trotzdem toll, dass AND51 das (fast) allein herausgefunden hat.

Gruß, Little John
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

yup genau...

aber wie gesagt, nochmal der hinweis:
reine Boole'sche Ausdrücke mit Variablen funktionieren nur in sonderfällen,
und auch der Bool-Typecast ist mit vorsicht zu genießen.

solange es keine offizielle benachrichtigung gibt,
dass Boole'sche Ausdrücke komplett implementiert sind,
sollte man vielleicht nur dort darauf zurückgreifen, wo es unumgänglich ist,
und dann mit einem Typecast, und auch das so oft wie vertretbar gegentesten.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Little John

Beitrag von Little John »

2Kaeru Gaman:
Alles klar, danke.

Gruß, Little John
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Kaeru Gaman hat geschrieben:dass ein einziges ~~ das erledigt, wär mal ne ganz neue feature.

PS:
das Not Not mag diese funktion ausüben, so wie auch das And 1
aber ~ ist nunmal bitwise und nicht boolean.
Mir ist mittlerweile eine passende Antwort darauf eingefallen:

Die bitweisen Operatoren ~~ (entspricht Not Not), drehen bei mir nur einen boole'schen Ausdruck um.
Binärzahlen werden in Purebasic ja so notiert:

Code: Alles auswählen

Define a = $FF ; Hex, 255
Define b = %101 ; Binär, 5
True wäre also %1, False natürlich %0. Egal, ob ich True, was den Wert 'eins' hat, als Hex, Binär oder Integer notiere, es kommt immer nur ein zeichen dabei heraus, nämlich "1". Genau das gleiche mit "0". Das bitweise dreht einfach alles um. Alle nullen werdn zu einsen und umgekehrt, die PB Hilfe beweise es:
Beispiel:
; Zeigt die Benutzung mit Binär-Zahlen, da es so leichter ist, das Ergebnis zu sehen
a.w = ~%1000 ; Ergebnis wird %0111 sein
b.w = ~%1010 ; Ergebnis wird %0101 sein
Wie gesagt, die Boole'schen Ausdrücke, mit denen ich ja weiterrechne sind immer 0 oder 1, werden dann 2 mal ge-Not-ted um dann damit weiterzurechnen.

Somit ist diese Prozedur also völlig sicher und es kann nichts schlimmes passieren. Ich schreibe diesen Post, weil ich Recht haben will :mrgreen: :wink:
und weil du folgendes geschrieben hast, Kaeru Gaman:
Kaeru Gaman hat geschrieben:es kann sein, dass es [nur] zufälliger weise funktioniert
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Hellhound66
Beiträge: 476
Registriert: 23.03.2005 23:19

Beitrag von Hellhound66 »

Das ~~ ist totaler Käse, da

~ und ~ kumulativ sind und sich gegenseitig aufheben, ob die jetzt da sind oder nicht macht gar keinen Unterschied.

Beispiel:

Code: Alles auswählen

a.l = 5
debug ~a   ;-6
debug ~~a ; 5
Und um damit irgendwas zu einem boolschen Ausdruck umzuwandeln, ist auch blödsinn.

Code: Alles auswählen

If a
endif
;ist das gleiche wie:
if a<>0
endif
Optimismus ist ein Mangel an Information.
Little John

Beitrag von Little John »

Der Ausdruck

Code: Alles auswählen

Macro sgn(X)
  ((X>0)-(X<0))
EndMacro
hat mit Bit-Operationen nichts zu tun.

Gruß, Little John
Hellhound66
Beiträge: 476
Registriert: 23.03.2005 23:19

Beitrag von Hellhound66 »

Hat auch keiner behauptet..
Optimismus ist ein Mangel an Information.
Little John

Beitrag von Little John »

Hellhound66 hat geschrieben:Hat auch keiner behauptet..
Dann frage ich mich, warum AND51 in diesem Thread dauernd von Bit-Operationen schreibt, und als "Lösung" seiner selbst gestellten Aufgabe schreibt:

Code: Alles auswählen

Macro sgn(x)
(-(~~x<0)+(x>0))
EndMacro
Gruß, Little John
Antworten