www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik int float zuweisung


Autor: dan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

will int Variable einer floatvariable zuweisen.

float f;
unsigned int i;



f = i;


oder:

f = i/27906;


kann mir jemand helfen?
mit diesem cast operator habe ich es versucht - geht nicht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dan schrieb:

> mit diesem cast operator habe ich es versucht - geht nicht.

Was bedeutet "geht nicht"


> f = i/27906;
lass mich raten, in f steht trotzdem immer noch eine ganze Zahl. Wenn i 
zb den Wert 500 hätte, steht in f eine 0.

Das kommt daher, dass i ein int ist, 27906 ein int ist (eigentlich ein 
long, aber das ist jetzt nicht wichtig) und daher die Division als 
Ganzzahldivision ausgeführt wird. Erst dieses Ergebnis wird dann auf 
einen float umgewandelt und zugewiesen.

Merke: Wenn der Compiler entscheiden muss, wie eine Operation konkret 
duchrzuführen ist, entscheiden immer nur die Datentypen der beteiligten 
Operanden. Der Datentyp der Variablen, die das Ergebnis aufnehmen wird, 
ist dafür unerheblich.

Autor: dan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok,
danke schonmal.
Ich verstehe nur noch nicht ganz wie ich jetzt an mein komma - ergebnis
herankomme.


f = FFFF/27906 wären 2,3484....

brauch diese kommazahl

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dan schrieb:
> ok,
> danke schonmal.
> Ich verstehe nur noch nicht ganz wie ich jetzt an mein komma - ergebnis
> herankomme.
>
>
> f = FFFF/27906 wären 2,3484....
>
> brauch diese kommazahl
Dann sag ihm, dass er mit Komma rechnen soll:
f = (float) FFFF/27906

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dan schrieb:

> Ich verstehe nur noch nicht ganz wie ich jetzt an mein komma - ergebnis
> herankomme.

Dann solltest du noch einmal darüber nachdenken, was die Aussage:
"Ausschliesslich die beteiligten Operanden bestimmen, wie eine Operation 
implementiert wird"
konkret für dich impliziert.

   5 / 8

wird als Integer-Division durchgeführt, weil sowohl 5 als auch 8 ein 
Integer sind.

   5.0 / 8

hingegen wird als Gleitkommaoperation durchgeführt, weil mindestens 
einer der beiden Operanden eine Floating Point Zahl ist (und die andere 
bei Bedarf dann ebenfalls auf Floating Point angehoben wird)

> f = FFFF/27906 wären 2,3484....

Nein
    FFFF   ist keine Zahl :-)
Aber auch bei
   0xFFFF / 27906
wäre das Ergebnis nicht 2.3484 sondern 2.
Warum? Weil sowohl 0xFFFF als auch 27906 ein Integer sind.

Wenn du also dafür sorgen willst, dass die Berechnung als 
Gleitkommadivision gemacht wird, musst du dafür sorgen, dass mindestens 
einer der beiden Operanden ein Gleitkommawert ist.
Bei einem konstanten Wert geht das ganz einfach

    5    ist ein Integer
    5.   ist eine Gleitkommazahl
    5.0  ist eine Gleitkommazahl

Das Vorhandensein eines Dezimalpunkes genügt bereits um eine Zahl als 
Gleitkomazahl zu kennzeichnen.

Hat man eine Variable, dann muss man sie entsprechend umcasten.

Autor: gastlich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
beim gcc funktioniert

f = (float)i/27906;

wunderbar ...
damit sagst du dem Compiler, dass er die division als floatingpoint 
division durchführen soll, da i zuvor in einen float gecastet wird.

gruss Claudio

Autor: dan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank.

Hat mit (float)0xFFFF gelkappt.

Danke euch!

Autor: Route_66 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... müsste nicht auch

f = i/27906.0;

klappen?

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.