- Beiträge
- 6.575
- Reaktionspunkte
- 1.640
-> Hier kostenlos registrieren
Das war auch meine Motivation, mir zunächst keine Gedanken über eine Begrenzung zu machen. Die ZweierKomplementDarstellung ist ja so was von Standard, dass das Problem eigentlich hinreichend bekannt sein sollte und dort, wo es wirklich problematisch in Erscheinung tritt, schon angemessene WorkArounds existieren sollten.Die Begrenzung habe ich auskommentiert für Fälle, wenn man vorher schon einen begrenzten Wertebereich hat (z.B. von -1000 .. +1000 oder -27648 .. +27648). Dann braucht man nicht auf -32768 prüfen und spart die Hälfte des Codes.
Auf das Problem habe ich aber hingewiesen und den nötigen Code im Kommentar angegeben.
Nicht viele machen sich solch intensive Gedanken um deartige "RandErscheinungen" wie Du. Viel zu oft werden sie gar nicht erst erkannt oder falls doch, dann werden sie viel zu schnell beiseite geschoben (weil "unangenehm"?).Für das Problem gibt es leider keine "korrekte" Lösung, weil es +32768 im Wertebereich von INT nicht gibt. Da hilft auch kein ausweichen auf DINT, wenn die +32768 irgendwann einer INT-Variable zugewiesen werden muß, was ja nicht geht bzw. zu -32768 führt. Höchstens wenn nochmal negiert wird oder etwas hinzuaddiert wird, dann kann das temporäre Ausweichen auf DINT für die Aufnahme der +32768 korrekt sein.
Ja, "aufgemalt" ähnlich dieser Form ...Ich vermute mal, Du hast die 4 Kombinationen aufgemalt und da diese simple Logik "gesehen"?
Code:
X1 = 0 OR X2 = 0 : "kein" Vorzeichen : 0 --> X3
X1 > 0 AND X2 > 0 : Vorzeichen gleich : X2 --> X3
X1 < 0 AND X2 < 0 : Vorzeichen gleich : -X2 Negation erforderlich --> X3
X1 < 0 AND X2 > 0 : Vorzeichen ungleich : X2 Negation erforderlich --> -X3
X1 > 0 AND X2 < 0 : Vorzeichen ungleich : -X2 Negation liegt bereits vor --> -X3
Und erst NACH der Realisierung in AWL gesehen, wie überraschend gross das EinsparPotenzial ist bzw. sein kann!
Du sagst es selbst:
Ja, verdächtig kurz, ich war doch auch sehr überrascht. Aber ich wusste ja, welche Überlegung dahintersteckte und zu diesem auch für mich überraschenden Ergebnis geführt hatte.In den AWL-Varianten ist die Umsetzumg des ELSIF-Zweigs allerdings verdächtig kurz...
Joa. Ich wollte ja kein Rätsel formulieren, sondern eine klare Aufgabenstellung möglichst nah an der Vorgabe durch diesen Thread.Für die SCL-Variante hast Du die Logik für 2 Fälle ausführlich mit AND und OR ausformuliert.
Du wirst es nicht glauben, Harald. Angefangen hatte ich auch mit Bits (BOOLeVariablen) für X1_neg, X1_pos, X2_neg, X2_pos und selbstverständlich auch mit der XOR-Verküpfung zur Ermittlung, ob die beiden Vorzeichen unterschiedlich bzw. gleich sind.Ich habe mich mehr an der allgemeinen Aufgaben-Formulierung festgehalten "negieren, wenn die beiden Vorzeichen unterschiedlich sind" - für mich klar XOR. Und ich habe gedacht, ABS kann man ruhig machen, egal ob nötig oder nicht. Es kostet mehr Code, das unnötige ABS zu verhindern.
Ich hatte aber auch die (in diversen ProgrammierSprachen verfügbare) SIGN-Funktion im Hinterkopf, die als Ergebnis üblicherweise einen der drei IntegerWerte -1, 0 oder 1 zurückgibt, aber - wohlgemerkt - drei verschiedene Zustände. In zwei BOOLeVariablen lässt sich das nur abbilden, wenn man grosszügig 1 der 4 KombinationsMöglichkeiten "verschwendet". Habe diesen Weg also schnell wieder verdrängt, zumal ich entsprechende TempVariablen gar nicht erst aufkommen lassen wollte.
Ja, das ist schon extrem "ausgeknautscht", was Du da mithilfe der StatusBits anstrebst.Eigentlich wollte ich da ursprünglich eine Anweisung, die möglichst einfach die Statusbits A1 und A0 so setzt wie nach einer Rechenoperation oder nach einem Vergleich auf >=0 (oder <0), um direkt feststellen zu können, ob #in positiv (>=0) oder negativ (<0) ist.L 0
+>=I
sind zwei Anweisungen. Ich habe da nichts besseres gefunden alsNEGI
.NEGI
ist nur eine Anweisung und stört den Akku1-Inhalt nicht (und auch nicht das VKE), im Gegenteil, es löst vielleicht schon die Aufgabe (ABS).
Das habe ich früher nur in gaaanz seltenen AusnahmeFällen getan, dass ich mal SprungBefehle verwendet habe, die "normalerweise niemand kennt". Habe mich immer bemüht, mich auf eine möglichst kleine Auswahl von S5- bzw. S7-Befehlen zu beschränken (Stichwort: "Reduced InstructionSet Code"). So konnten z.B. die Inbetriebnehmer relativ leicht "mitgenommen" werden, wenn es darum ging, allen Widerständen zum Trotz unverzichtbare "Neuigkeiten" in den Programmen einzuführen.
Viele Wege führen nach Rom und leider erinnern viele dieser Wege eher an Labyrinthe als an gut lesbare StrassenKarten.
Ja, ich geb's zu, manchmal habe ich's selbst trotzdem mit den LabyrinthLösungsWegen. Sie können so verführerisch sein, insbesondere, wenn sie in bewährten, gut funktionierenden BlackBoxes verschwinden bzw. unsichtbar werden.