IF Abfrage funktioniert nicht

Homematic-, TCL- und Shell-Script, Toolchain, C, etc.

Moderator: Co-Administratoren

Antworten
lundm2406
Beiträge: 9
Registriert: 20.10.2014, 07:03

IF Abfrage funktioniert nicht

Beitrag von lundm2406 » 03.03.2016, 12:32

Hallo zusammen,

habe mich ein wenig in Script versucht. Einiges funktioniert schon aber hier komme ich nicht weiter:

real a_temp = dom.GetObject("BidCos-RF.LEQ0993473:1.TEMPERATURE");
real temp = a_temp.Value();
real a_soll = dom.GetObject("BidCos-RF.LEQ0993473:2.SET_TEMPERATURE");
real soll = a_soll.Value();
real diff = dom.GetObject("DiffSollIstTemp");
WriteLine(diff.Value());
WriteLine(soll-temp);
if (diff.Value() == soll-temp)
{
WriteLine(" gleich");
}
else
{
WriteLine("nicht gleich");
}


Ergebnis der Ausgabe ist
0.200000
0.200000
nicht gleich


Der IF Vergleich läuft immer in den NEIN Zweig obwohl die Werte gleich sind.Was mach ich falsch?

Vielen Dank schon mal für euere Hilfe
Klaus

BadenPower

Re: IF Abfrage funktioniert nicht

Beitrag von BadenPower » 03.03.2016, 12:51

Real-Werte kann man nicht direkt vergleichen, wenn man vorher mit ihnen gerechnet hat, da es betriebssytem-ahängige Differenzen im nichtsichtbaren Nachkommastellenbereich gibt.

Mach aus

Code: Alles auswählen

if (diff.Value() == soll-temp) 
einfach

Code: Alles auswählen

if ( (diff.Value()).ToString(6) ==  (soll-temp).ToString(6) ) 

.

lundm2406
Beiträge: 9
Registriert: 20.10.2014, 07:03

Re: IF Abfrage funktioniert nicht

Beitrag von lundm2406 » 03.03.2016, 13:02

Vielen Dank, hat funktioniert.
Aber schon merkwürdig, dieses Verhalten. Hab extra REAL genommen um nicht unterschiedliche Typen zu vergleichen, da es dann erfahrungsgemäß zu Problemen kommt. VAR funktioniert ja auch nicht.
Ich muss schon sagen, sehr eigenartig die Entwicklung mit script.

vg Klaus

BadenPower hat geschrieben:Real-Werte kann man nicht direkt vergleichen, wenn man vorher mit ihnen gerechnet hat, da es betriebssytem-ahängige Differenzen im nichtsichtbaren Nachkommastellenbereich gibt.

Mach aus

Code: Alles auswählen

if (diff.Value() == soll-temp) 
einfach

Code: Alles auswählen

if ( (diff.Value()).ToString(6) ==  (soll-temp).ToString(6) ) 

.

konrad
Beiträge: 21
Registriert: 10.02.2015, 09:17

Re: IF Abfrage funktioniert nicht

Beitrag von konrad » 10.05.2016, 18:47

lundm2406 hat geschrieben:Vielen Dank, hat funktioniert.
Aber schon merkwürdig, dieses Verhalten.
Nein, gar nicht. Das ist das normale, übliche Verhalten von Fliesskommadarstellungen am Rechner. Vergleiche auf Gleichheit sind mehr oder weniger sinnlos. Was geht sind Vergleiche auf größer/kleiner. Wenn Du sowas wie Gleichheit brauchst, dann solltest Du die Differenz bilden und feststellen ob sich deren Absolutbetrag unterhalb eines von Dir definierten Deltas befindet. Also in Pseudo-Code:

Code: Alles auswählen

float w1;
float w2;
float delta = 0.001;

if( fabs(w1-w2) < delta )
{
 println("gleich")
}

Antworten

Zurück zu „Softwareentwicklung für die HomeMatic CCU“