[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?


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: 512
Registriert: 09.08.2018, 19:58
Wohnort: Nürnberg
Hat sich bedankt: 27 Mal
Danksagung erhalten: 90 Mal

Re: Mathematik

Beitrag von Psi » 27.03.2020, 00:43

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

dtp
Beiträge: 10658
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 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: 9840
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 462 Mal
Danksagung erhalten: 1863 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.75.6.20240316 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 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

Blacklist................... almost 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: 9639
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 697 Mal
Danksagung erhalten: 1614 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?
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

dtp
Beiträge: 10658
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 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: 5469
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1070 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.
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Antworten

Zurück zu „RaspberryMatic“