3 Variablen vergleichen. Wie?

Hallo an alle.

Fange an mich in C einzuarbeiten und bin auf folgendes Problem gestoßen.

Ich möchte prüfen ob 3 Variablen gleich Null sind. Und zwar auf diese weise (nicht mit UND oder Switch):
if (a==b==c==0) printf…

Das funktioniert aber nicht. Es kommt Unwahr raus obwohl alle Variablen Null sind.
Habe die Null weggelassen if (a==b==c)…- funktioniert auch nicht.
Habe „c“ weggelassen- das funktioniert. Also
das Ergebnis von if (a==b)… ist Wahr.

Weiss jemand warum der o.g. Vergleich nicht funktioniert.
Die Variablen sind vom Typ float.

Danke
V.

Hallo Vitali,

Weiss jemand warum der o.g. Vergleich nicht funktioniert.
Die Variablen sind vom Typ float.

weil es einen derartigen Vergleich, wie du ihn willst in C und C++ nicht gibt. Faktisch vergleichst du an der Stelle teilweise boole’sche Werte.

Was spricht denn gegen eine Version mit „UND“ ?

Hier mal eine Version zum spielen und optimieren:

#include 

bool predicate(
 float a, 
 float b, 
 float c)
{
 float Null = 0.0;
 return Null==a && Null==b && Null==c;
}

int main()
{
 float a = 0;
 float b = 0;
 float c = 0;

 for ( a = 0; a %d\n",a,b,c,predicate(a,b,c));
 }
 }
 }

 return 0;
}

Gruss
norsemanna

Hallo,

if (a==b==c==0) printf…
Weiss jemand warum der o.g. Vergleich nicht funktioniert.
Die Variablen sind vom Typ float.

Weil a == b entweder 0 oder 1 zurueckliefert, 1 bei Erfolg.

Wenn a, b, c ints waeren, konntest du mit bitweisen Operationen rangehen>

if (!(a | b | c)) { ... }

Keine Ahnung, ob das mit floats auch geht - vermutlich eher nicht.

Gruesse,
Moritz

Moin,

normalerweise wird davon abgeraten, Floats zu vergleichen, weil sie aufgrund der Rundung und abhängig von der internen Genauigkeit fast gleich sein könnten, aber trotzdem verschieden dargestellt (10.0/2 nicht notwendig gleich 5.). Für floats ist schon der Vergleich zweier Werte sauber nur mit (fabs(a-b)

Hallo,

da hätte ich mal ein Zwischenfrage. Ich nutze zwar C#, aber da ist der Syntax ja ähnlich.
Da ich hier noch Anfänger bin, stelle ich mir die Frage, ob ein Array hier auch geht oder ob das zuviel des Guten wäre?

So in der Art:

int i;

double a = 0.0;
double b = 1.5;
double c = 3.2;

double[] array = {a, b, c};

for (i = 0; i 

Grüße

Hallo V.,

Habe die Null weggelassen if (a==b==c)…- funktioniert
auch nicht.

Also, noch mal zum mitschreiben:

Angenommen „a = b = c = 0;“
„a==b“ ergibt TRUE, also ungleich 0
„TRUE==c“ ergibt dann FALSE.

Die Variablen sind vom Typ float.

Bei Fliesskommazahlen ist ein Vergleich mit 0.0 in den meisten Fällen sowieso sinnlos.

  1. Genau so, wie sich im Dezimalsystem z.B. 1/3 nicht mit endlicher Stellenzahl darstellen lässt, gibt es die selben Probleme bei der Umsetzung in ein binäres Zahlensystem. Typische Rechnung bei billigen Taschenrechnern: (1/3)*3 = 0.999999

  2. Da die Stellenzahl der Mantisse endlich ist, ergeben sich Rundungsfehler bei den Rechenoperationen.

1*10-400 ist für einen Computer ungleich 0.0

Man sollte bei Fliesskommazahlen immer folgendermassen vergleichen:

if ( abs©

Da ich hier noch Anfänger bin, stelle ich mir die Frage, ob
ein Array hier auch geht oder ob das zuviel des Guten wäre?

Hallo,
klar geht das, ist aber einen Tick ineffizienter während der Abarbeitung; deswegen würde ich die Nutzung der Array-Variante davon abhängig machen, ob sich die Anzahl der zu vergleichenden Werte ändern kann. Wenn es sich um z. B. eine Anzahl von Messwerten handelt, die leicht erhöht werden könnte, hat man wahrscheinlich eh’ ein Array, weil man die Werte dort ja auch hinein bekommen muss. Wenn es vom Problem her immer 3 Werte sein müssen, weil z. B. unterschiedliche Messsysteme über je ein Kabel einen Wert abliefern, würde ich bei einzelnen Variablen mit etwas aussagekräftigeren Namen bleiben.

cu

Hallo Peter,

im wesentlichen richtig, nur dass es heissen sollte: Wenn man a==b vergleicht und a und b floats oder doubles (c/c++) sind, so sollte man dieses tunlichst mit

abs(a-b)
double lf = 0.0;
if (lf == 0.0)

liefert immer true.

Gruss
norsemanna

Danke an alle
Danke an alle