Forum: Mikrocontroller und Digitale Elektronik Float mit IF vergleichen


von Pascal L. (Gast)


Lesenswert?

Hallo zusammen,

ich komm echt nicht weiter. Kann mir jemanden sagen was mit diesem Code 
nicht stimmt?

float temp;

temp = 0.1;

if (temp > 1.0)
{
  temp = 1.0
}

Wieso springt er mir in das IF und setzt temp auf 1?

Danke für Tipps!!

von N. G. (newgeneration) Benutzerseite


Lesenswert?

Hallo erstmal,
ich denke es ist nur ein Schreibfehler, aber es fehlt ein Semikolon.
hast du es schon eimal mit einem Cast probiert, etwa so
1
if(temp > (float)1.0)

nur so ne theorie

von Pascal L. (Gast)


Lesenswert?

Ja nur ein Schreibfehler... Teste ich mal.

Hmm mit dem AVRSimulator funktioniert es. Wenn ich mit meinem Jtagice3 
auf dem Controller debugge nicht. Komisch.

von Peter II (Gast)


Lesenswert?

N. G. schrieb:
> hast du es schon eimal mit einem Cast probiert, etwa soif(temp > (float)1.0)
> nur so ne theorie

das ist doch Unsinn. Ein Cast ist hier nicht notwendig.

Vermutlich kommt der Debugger mit Optimierten code nicht klar und zeigt 
nur etwas falschen an.

von B. S. (bestucki)


Lesenswert?

Peter II schrieb:
> das ist doch Unsinn. Ein Cast ist hier nicht notwendig.

Bin mir gerade nicht sicher, aber die Konstante 1.0 ist doch vom Typ 
double. float und double sollte man aber nicht miteinander vergleichen 
und daher ist der Cast berechtigt. Ein Versuch ist es allemal Wert.

von Peter II (Gast)


Lesenswert?

be stucki schrieb:
> Bin mir gerade nicht sicher, aber die Konstante 1.0 ist doch vom Typ
> double. float und double sollte man aber nicht miteinander vergleichen
> und daher ist der Cast berechtigt.

und warum nicht? Außerdem ist es ein größer vergleich. Damit spielt eine 
Rundungsfehler beim wandeln auch keine rolle.

von Sauger (Gast)


Lesenswert?

Nabend,

Gleitpunkt lässt sich nicht direkt miteinander vergleichen.
Bevor ich das hier erkläre tipp bei Google mal: "float vergleichen" ein

MfG

von Peter II (Gast)


Lesenswert?

Sauger schrieb:
> Gleitpunkt lässt sich nicht direkt miteinander vergleichen.
> Bevor ich das hier erkläre tipp bei Google mal: "float vergleichen" ein

auf Gleichheit nicht, größer und kleiner ist klein Problem.

von B. S. (bestucki)


Lesenswert?

Peter II schrieb:
> und warum nicht? Außerdem ist es ein größer vergleich. Damit spielt eine
> Rundungsfehler beim wandeln auch keine rolle.

Sorry hab ich übersehen. Daher meinen Einwand bitte ignorieren.


@TO: Dein Programmschnipsel funktioniert bei mir.

von Helmut S. (helmuts)


Lesenswert?

Nur so geht es ohne Fehler und Warnungen mit MS-C(++).
Man beachte das Semikolon. Ohne das Semikolon gibt es eine 
Fehlermeldung.

float temp;

temp = (float) 0.1;

if (temp > 1.0)
{
  temp = 1.0;
}

von Peter II (Gast)


Lesenswert?

Helmut S. schrieb:
> Nur so geht es ohne Fehler und Warnungen mit MS-C(++).
> Man beachte das Semikolon.
> float temp;
> temp = (float) 0.1;
> if (temp > 1.0)
> {
>   temp = 1.0;
> }

man castet doch keine Konstanten, dann schreibt man hin das es ein float 
sein soll!


temp = 0.1f;

von Helmut S. (helmuts)


Lesenswert?

Hatte vergessen zu erwähnen, dass das Ergebnis mit MS-C++ wie erwartet 
0.1 ist.

@Peter,
Danke für das 0.1f.

Ich bin "Hardwerker" und programmiere nur gelegentlich.
Ich war eigentlich überrascht, dass der Compiler bei der Zuweisung
eine Warnung wegen "double" ausgibt.

temp = 0.1;

Das ist vermutlich bei C-Compilern für Mikrocontroller nicht unbedingt 
der Fall, weil die oftmals gar kein echtes double haben. Soll heißen man 
kann double im Programm hinschreiben, aber es wird trotzdem nur float 
gerechnet und gespeichert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.