falsche Vergleiche von Gleitkommazahlen im Script

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

jp112sdl
Beiträge: 12116
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 849 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: falsche Vergleiche von Gleitkommazahlen im Script

Beitrag von jp112sdl » 20.07.2019, 20:22

Black hat geschrieben:
20.07.2019, 17:55
das die kommunikation integer basiert ist ist klar.
das die kommunikation integer basiert ist ist mir/dir klar. :wink:

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

Benutzeravatar
Black
Beiträge: 5483
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 424 Mal
Danksagung erhalten: 1074 Mal
Kontaktdaten:

Re: falsche Vergleiche von Gleitkommazahlen im Script

Beitrag von Black » 20.07.2019, 20:27

Si... geschrieben vom Handy unter Palmen. Und die automatische Worterkennung und ich werden in diesem Leben keine Freunde mehr
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

Matsch
Beiträge: 5452
Registriert: 30.05.2019, 11:37
System: Alternative CCU (auf Basis OCCU)
Wohnort: Chemnitz
Hat sich bedankt: 116 Mal
Danksagung erhalten: 742 Mal

Re: falsche Vergleiche von Gleitkommazahlen im Script

Beitrag von Matsch » 21.07.2019, 10:38

@Black, ich habe mal deinen Testcode von oben original übernommen und ausprobiert. Tatsächlich spielt dabei die Definition des Wertebereichs der Testvariablen keine Rolle, das Ergebnis ist immer falsch. Warum das bei mir zunächst eine Wirkung hatte? Wer weiß.
Auf jeden Fall hast du gezeigt, dass dies nicht wirklich die Lösung war.

Jetzt habe ich es nochmal mit der Rundung probiert:

Code: Alles auswählen

if (diff.Round(14) != Delta.Variable())
{
und nun probiert, ab wie vielen Stellen nach dem Komma es nicht mehr wirkt.
Bei .Round(14) kommt immer noch das erwartete Ergebnis heraus, ab .Round(15) ist es wieder falsch.
Im Moment sehe ich darin den einzigen "einfachen" workaround.

Benutzeravatar
Black
Beiträge: 5483
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 424 Mal
Danksagung erhalten: 1074 Mal
Kontaktdaten:

Re: falsche Vergleiche von Gleitkommazahlen im Script

Beitrag von Black » 21.07.2019, 11:08

Hi, ich bin im Background mit jens deswegen in Kontakt.

Ich bin auch der Meinung dass dieses nach dem epsilon Vergleich so nicht den dürfte.

Black
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

Benutzeravatar
jmaus
Beiträge: 9865
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 464 Mal
Danksagung erhalten: 1883 Mal
Kontaktdaten:

Re: falsche Vergleiche von Gleitkommazahlen im Script

Beitrag von jmaus » 21.07.2019, 12:38

Black hat geschrieben:
21.07.2019, 11:08
Hi, ich bin im Background mit jens deswegen in Kontakt.

Ich bin auch der Meinung dass dieses nach dem epsilon Vergleich so nicht den dürfte.
Sobald ich dazu komme schaue ich es mir an. Aber auch beim Epsilon-basierten Gleitkommazahlenvergleich gibt es natürlich/vmtl. Corner-Cases. Ich schaue es mir aber zeitnah dann mal an und werde berichten.
RaspberryMatic 3.75.7.20240420 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

Matsch
Beiträge: 5452
Registriert: 30.05.2019, 11:37
System: Alternative CCU (auf Basis OCCU)
Wohnort: Chemnitz
Hat sich bedankt: 116 Mal
Danksagung erhalten: 742 Mal

Re: falsche Vergleiche von Gleitkommazahlen im Script

Beitrag von Matsch » 26.07.2019, 13:46

Ich habe noch eine Reihe weitere Versuche gemacht.

Anscheinend ist gar nicht der Vergleich der Übeltäter, sondern die vorausgegangene Subtraktion T_out - T_in !
Wenn ich vor der if-Anweisung das Subtraktionsergebnis runde ( diff = diff.Round(14) ), dann läuft auch der anschließende Vergleich sauber!
Bei der Subtraktion muß also zig Stellen nach dem Komma ein Fehler zustande kommen, der dann zu einer (berechtigten) Differenz führt.
Vielleicht ja nur das letzte Bit?

Benutzeravatar
jmaus
Beiträge: 9865
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 464 Mal
Danksagung erhalten: 1883 Mal
Kontaktdaten:

Re: falsche Vergleiche von Gleitkommazahlen im Script

Beitrag von jmaus » 26.07.2019, 16:36

Matsch hat geschrieben:
26.07.2019, 13:46
Ich habe noch eine Reihe weitere Versuche gemacht.

Anscheinend ist gar nicht der Vergleich der Übeltäter, sondern die vorausgegangene Subtraktion T_out - T_in !
Wenn ich vor der if-Anweisung das Subtraktionsergebnis runde ( diff = diff.Round(14) ), dann läuft auch der anschließende Vergleich sauber!
Bei der Subtraktion muß also zig Stellen nach dem Komma ein Fehler zustande kommen, der dann zu einer (berechtigten) Differenz führt.
Vielleicht ja nur das letzte Bit?

Wie ich schon initial geschrieben hatte gibt es bei Gleitkommaarithmetik eben genau diese Corner-Cases die sich dann mit solchen Symptomen äußern. Auch meine vor längerem eingeführten, epsilon-basierten vergleiche in ReGaHss können das nicht für alle Bereiche abdecken. Deshalb ist es bei solchen Gleitkommaoperationen auch recht üblich statt "delta == threshold" oder "delta != threshold" Vergleichen gewisse Grenzen via "x < a && x > b" abzuprüfen.

Ein paar quellen wo man sich zum Thema Gleitkommazahlendarstellung/verwendung einlesen kann findet man hier:

https://randomascii.wordpress.com/2012/ ... 2-edition/
https://floating-point-gui.de/errors/comparison/
Zuletzt geändert von jmaus am 30.07.2019, 16:19, insgesamt 1-mal geändert.
RaspberryMatic 3.75.7.20240420 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

Matsch
Beiträge: 5452
Registriert: 30.05.2019, 11:37
System: Alternative CCU (auf Basis OCCU)
Wohnort: Chemnitz
Hat sich bedankt: 116 Mal
Danksagung erhalten: 742 Mal

Re: falsche Vergleiche von Gleitkommazahlen im Script

Beitrag von Matsch » 27.07.2019, 13:42

Nun, dann ist das Thema geklärt und du brauchst dich nicht weiter darum kümmern.

Ich hab wieder was gelernt und hatte anscheinend nur Glück, dass dieser Fehler bisher noch nie auftrat.

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“