[GELÖST] Mathematik

Einrichtung, Nutzung und Hilfe zu RaspberryMatic (OCCU auf Raspberry Pi)

Moderatoren: jmaus, Co-Administratoren

Matthias1912
Beiträge: 7
Registriert: 24.03.2020, 13:05

[GELÖST] Mathematik

Beitrag von Matthias1912 » 26.03.2020, 23:27

Hi Leute,

mal ne kurze Frage, kann die CCU nicht rechnen? Da macht das Skripten ja keinen Sinn, wenn ich jede Ausgabe erst mal in Frage stellen muss!

Code: Alles auswählen

integer value = 23 * 100 + 17;
WriteLine("Ergebnis = " + value.ToString()); 
Ausgabe:

Code: Alles auswählen

Ergebnis = 2691
Erst wenn ich Klammern setze kommt das richtige Ergebnis raus.
Ist das normal?

Baxxy
Beiträge: 1090
Registriert: 18.12.2018, 15:45
System: Alternative CCU (RaspberryMatic etc.)
Hat sich bedankt: 98 Mal
Danksagung erhalten: 163 Mal

Re: Mathematik

Beitrag von Baxxy » 27.03.2020, 00:02

Matthias1912 hat geschrieben:
26.03.2020, 23:27
Ist das normal?
Ja, ist es. :wink:
CCU-Rechnen.JPG
Grüße
Baxxy
Grüße
Baxxy

Matthias1912
Beiträge: 7
Registriert: 24.03.2020, 13:05

Re: Mathematik

Beitrag von Matthias1912 » 27.03.2020, 00:38

:shock: klasse, Rangfolge hab ich klassisch "überlesen" :roll:
Ich komm aus der C Sprache, hätte mir nie einfallen lassen, das es hier ne eq-3 Mathe Variante gibt.

Danke für den Hinweis

Benutzeravatar
Psi
Beiträge: 376
Registriert: 09.08.2018, 19:58
Wohnort: Nürnberg
Hat sich bedankt: 23 Mal
Danksagung erhalten: 52 Mal

Re: Mathematik

Beitrag von Psi » 27.03.2020, 00:43

OMG, zum Glück nutz ich NodeRED :wink:

dtp
Beiträge: 8589
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 76 Mal
Danksagung erhalten: 213 Mal

Re: [GELÖST] Mathematik

Beitrag von dtp » 27.07.2020, 10:16

Ja, Mathe mit der ReGaHSS macht echt Spaß.

Ein Beispiel:

Code: Alles auswählen

real a = 3.0;
real b = 6.0;

WriteLine((a + b)/2);
Ergebnis: 4.500000, wie erwartet

Code: Alles auswählen

real a = 3;
real b = 6.0;

WriteLine((a + b)/2);
Ergebnis: 4, weil nun nur noch mit Integer gerechnet wird, obwohl a als real definiert war.

Wenn man nun aber "/2" ersetzt durch "0.5 *", dann geht's wieder.

Code: Alles auswählen

real a = 3;
real b = 6.0;

WriteLine(0.5 * (a + b));
Ergebnis: 4.500000

Aber Vorsicht, richtig lustig wird's, wenn man die Multiplikation mit 0.5 nach hinten stellt.

Code: Alles auswählen

real a = 3;
real b = 6.0;

WriteLine((a + b) * 0.5);
Na, was kommt da wohl raus?
Ergebnis: 0
Da muss man erst mal drauf kommen. ;)

Hat mich am Wochenende locker zwei Stunden beschäftigt, bis mir das aufgefallen war. ;)
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

Benutzeravatar
jmaus
Beiträge: 5993
Registriert: 17.02.2015, 14:45
System: Alternative CCU (RaspberryMatic etc.)
Wohnort: Dresden
Hat sich bedankt: 16 Mal
Danksagung erhalten: 336 Mal
Kontaktdaten:

Re: [GELÖST] Mathematik

Beitrag von jmaus » 27.07.2020, 10:45

Alles vollkommen normal, dokumentiert und schon länger bekannt :) Ersetze einfach deine „real“ Datentyp definitionen gegen „var“ und dir sollten solche Fehler nicht mehr So einfach passieren weil du dann mehr darauf achtest ob du einen integer oder float/real einer variable zuweist und damit die variable dann zu einem anderen typ zwingst wie das bei der ReGa Skriptsprache eben so ist.
RaspberryMatic 3.51.6.20200621 @ ESXi mit ~180 HomeMatic Geräten + ioBroker – GitHubGitHub Sponsors / PayPalTwitter

alchy
Beiträge: 9714
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 18 Mal
Danksagung erhalten: 255 Mal

Re: [GELÖST] Mathematik

Beitrag von alchy » 28.07.2020, 22:51

dtp hat geschrieben:
27.07.2020, 10:16
Ja, Mathe mit der ReGaHSS macht echt Spaß.
...
Hat mich am Wochenende locker zwei Stunden beschäftigt, bis mir das aufgefallen war. ;)
upps. :oops:
Geht bedeutend schneller mit Spielzeug - inklussive Erklärung der Schritte & Typumwandlungen
HM-Skript-Rechner.jpg
jmaus hat geschrieben:
27.07.2020, 10:45
Ersetze einfach deine „real“ Datentyp definitionen gegen „var“
Hilfe zur Selbsthilfe in dem man nicht deklariert? Auch ein Ansatz.
Da hätte man sich doch die Typen doch gleich ganz sparen können und alles var nennen. :lol:
Aber wie du schon geschrieben hast, die automatische Typumwandlung und von rechts nach links ist schon ewig bekannt und normal.


Alchy

.................... full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

MichaelN
Beiträge: 689
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 50 Mal
Danksagung erhalten: 61 Mal

Re: [GELÖST] Mathematik

Beitrag von MichaelN » 28.07.2020, 23:39

Da hätte man sich doch die Typen doch gleich ganz sparen können und alles var nennen
Das habe ich mir auch gedacht. Gibt es noch irgendeine andere Programmiersprache auf der Welt, die in diesem Maße die Typ Deklarationen ignoriert? Und ist das nun Bug oder Feature?

dtp
Beiträge: 8589
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 76 Mal
Danksagung erhalten: 213 Mal

Re: [GELÖST] Mathematik

Beitrag von dtp » 29.07.2020, 07:30

Mir war zwar bewusst, dass die ReGaHSS von rechts nach links rechnet, aber ich war bisher der irrigen Annahme, dass auch die Variable bzw. Konstante, die ganz rechts steht, die also zuerst kommt, den Typ des Ergebnisses definiert. Aber es ist im Gegenteil die Variable bzw. Konstante, die zuletzt herangezogen wird, die also ganz links steht.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

Benutzeravatar
Black
Beiträge: 3084
Registriert: 12.09.2015, 22:31
System: Alternative CCU (RaspberryMatic etc.)
Wohnort: Wegberg
Hat sich bedankt: 48 Mal
Danksagung erhalten: 228 Mal
Kontaktdaten:

Re: [GELÖST] Mathematik

Beitrag von Black » 29.07.2020, 10:29

dtp hat geschrieben:
29.07.2020, 07:30
Mir war zwar bewusst, dass die ReGaHSS von rechts nach links rechnet, aber ich war bisher der irrigen Annahme, dass auch die Variable bzw. Konstante, die ganz rechts steht, die also zuerst kommt, den Typ des Ergebnisses definiert. Aber es ist im Gegenteil die Variable bzw. Konstante, die zuletzt herangezogen wird, die also ganz links steht.
das ist fieserweise nicht so ganz richtig....

Der Ergebnis (oder besser zwischenergebnistyp) ist immer der Linksstehende der Operation, so wird ein schuh draus.

Beispiel:

Code: Alles auswählen

var a= 2.0+5*6.5;  
Nach deiner Theorie kommt eine Gleitpunktzahl raus, und das musste 34.00 sein... isses aber nicht, das ergebnis ist nachher 32.00
Die rega arbeitet nach dem Stackpointer Verfahren, LIFO, last IN, First out.

die aufgabe landet durch den Parser auf dem Stackpoiunter

Code: Alles auswählen

2.0 --> 2.0  --> 2.0  --> 2.0  -- > 2.0
         +        +       +         +
                  5       5         5
                          *         *
                                    6.5  
Nun kommt der Interpreter als schleife (Wenn Stack enthält mehr als 1 Wert) und arbeitet das ab
erster Wert 6.5
Operaton *
zweiter Wert 5
Zweiter wert ist Interger, also wird eine Intergermultiplikatoin gemacht 5 * 6.5 = 30, der wert kommt wieder auf den Stack

nach edm ersten Abarbeiten sieht der Stack so aus

Code: Alles auswählen

2.0 --> 2.0  --> 2.0  --> 2.0  -- > 2.0  --> 2.0
         +        +       +         +        +
                  5       5         5        30
                          *         *
                                    6.5  
jetzt wirder das ganze
erster Wert 30
Operaton +
zweiter Wert 2.0
Zweiter wert ist float, also wird eine Gleitpunktaddition gemacht 2.0 + 30 = 32.00, der wert kommt wieder auf den Stack

Danach sieht der Stack so aus

Code: Alles auswählen

2.0 --> 2.0  --> 2.0  --> 2.0  -- > 2.0  --> 2.0  --> 32.00
         +        +       +         +        +
                  5       5         5        30
                          *         *
                                    6.5  
Es ist nur noch ein Ergebnis auf dem Stack, heisst, abgearbeiet, Ergebnis liegt vor.

So kommen diese im ersten moment merkwürdigen Werte zustande

Black
Zuletzt geändert von Black am 29.07.2020, 17:36, insgesamt 1-mal geändert.
Die Wahrheit ist ein Chor aus Wind
Meine Seite, ok noch bisschen im Aufbau

RaspberryMatic 3.51.6.20200420 mit Groundplane Antennenmod
jede Menge Sensoren und Aktoren, Logamatic 2107 Gateway zum Buderus Kessel
ioBroker unter ProxMox auf NUC als Hauptsteuersystem und Visualisierung
Script Time Scheduler V1.3
Howto - AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 4.01.08B Scripteditor und Objektinspektor

technical contribution against annoying advertising

Antworten

Zurück zu „RaspberryMatic“