Forum: Mikrocontroller und Digitale Elektronik Int To Float


von Mach F. (machfax)


Lesenswert?

Hallo

Ich habe einen int Wert. Dieser sieht folgendermassen aus:
255999999
Nach den ersten 3 Dezimalstellen möchte ich ein Komma einfügen und das 
ganze dann in eine float variable speichern.

Es soll anschliessen in der float variable x der Wert 255.999999 stehen.

Wie mache ich das? Der int Wert ist dynamisch und könnte zum Bsp. auch 
0.123456 sein.

Danke

von DirkB (Gast)


Lesenswert?

Du kannst teilen (durch einen Fliesskommawert)

von DirkB (Gast)


Lesenswert?

Bedenke aber, dass du für die Anzahl an Stellen ein double brauchst.

von Dr. Sommer (Gast)


Lesenswert?

Mach Fax schrieb:
> Es soll anschliessen in der float variable x der Wert 255.999999 stehen.
Dieser Wert ist leider nicht in einem float darstellbar. Der nächste 
darstellbare wäre 256.0 . Sicher dass du die Zahl in einem float 
speichern und dabei Präzision verlieren willst, und nicht einfach nur 
bei der Ausgabe an der richtigen Stelle ein Komma einfügen?

von stefan us (Gast)


Lesenswert?

bearücksichtige, dass der AVR-GCC keinen double kennt. Double ist dort 
nur ein Alias für float, also 4 Bytes.

von Mach F. (machfax)


Lesenswert?

So hab ichs gemacht:

SpeedFactorByteMain = (FlowFactor & 0xFF000000) >> 24;
  SpeedFactorByte1   = (FlowFactor & 0x00FF0000) >> 16;
  SpeedFactorByte2   = (FlowFactor & 0x0000FF00) >> 8;
  SpeedFactorByte3   = (FlowFactor & 0x000000FF);

  SyncSpeedFactorFloat = (float)SpeedFactorByteMain + 
((float)SpeedFactorByte1 / 100.0) + ((float)SpeedFactorByte2 / 10000.0) 
+ ((float)SpeedFactorByte3 / 1000000.0);

von Dr. Sommer (Gast)


Lesenswert?

Mach Fax schrieb:
> So hab ichs gemacht:
Das ist doch was völlig anderes als in der Anfangsfrage?!
Aus 255999999 wird 15.66655540466308593750

von Peter (Gast)


Lesenswert?

ich weiß zwar nicht genau was Du willst, aber ich behaupte dass das was 
Du da gemacht hast ist nicht das ist was Du willst ;-)

von Norbert (Gast)


Lesenswert?

Mach Fax schrieb:

> Der int Wert ist dynamisch und könnte zum Bsp. auch
> 0.123456 sein.

Das wäre ein toller Trick!

von Amateur (Gast)


Lesenswert?

Irgendwie stimmt bei Deiner Fragestellung etwas nicht!

Ein Int-Wert von: 255999999 ist möglich, wenn er auch 4 Bytes braucht.
Ein Int-Wert von: 0.123456 ist ganz genau 0. Kanns'e machen nix, muss'e 
gucken zu.

von Mach F. (machfax)


Lesenswert?

Hallo zusammen

Sorry, habe etwas Durcheinander gebracht.
Also ich erhalte über CAN einen Wert mit der Wertigkeit 4.716981.
Dieser wird in einem Protokoll übertragen, das 8 Bytes integer Daten 
übertragen kann. Es gibt ein Byte vor dem Komma, danach 3 Bytes für die 
Nachkommastelle. Der Punkt wird ist nur in der Theorie vorhanden.

Also ich erhalte für 4.716981 folgende Bytes:
51 - 45 - 47 - 04 (HEX)
81 - 69 - 71 - 04 (DEZ)

Jetzt maskiere ich das Byte vor dem virtuellen Komma aus:

SpeedFactorByteMain = (FlowFactor & 0xFF000000) >> 24;

Danach setzte ich aus den restlichen 3 Bytes die Nachkommastellen 
zusammen:

  SpeedFactorByte1   = (FlowFactor & 0x00FF0000) >> 16;
  SpeedFactorByte2   = (FlowFactor & 0x0000FF00) >> 8;
  SpeedFactorByte3   = (FlowFactor & 0x000000FF);

Alles zusammen ergibt dann wieder 4.716981

  SyncSpeedFactorFloat = (float)SpeedFactorByteMain +
((float)SpeedFactorByte1 / 100.0) + ((float)SpeedFactorByte2 / 10000.0)
+ ((float)SpeedFactorByte3 / 1000000.0);

Hoffe dass es jetzt klar ist was ich machen wollte, danke.

von Mike (Gast)


Lesenswert?

Mach Fax schrieb:
> Dieser wird in einem Protokoll übertragen, das 8 Bytes integer Daten
> übertragen kann. Es gibt ein Byte vor dem Komma, danach 3 Bytes für die
> Nachkommastelle. Der Punkt wird ist nur in der Theorie vorhanden.

Dann möchtest du uns vielleicht mitteilen, dass deine Zahl BCH (Binär 
Coded Hundred) ist, als immer zwei Stellen in einem Byte als Binärzahl 
übertragen werden? Jedes Byte hat also 1/100 des Gewichtes des 
vorhergehenden, wobei das höchste Byte die Gewichtung 1 besitzt und 
insgesamt bei dem Format vier Bit verschenkt werden.

von Werner (Gast)


Lesenswert?

Mach Fax schrieb:
> Also ich erhalte für 4.716981 folgende Bytes:
> 51 - 45 - 47 - 04 (HEX)
> 81 - 69 - 71 - 04 (DEZ)

So wie du das beschreibst, müßte der Int Wert zu 255.999999 dann aber
4284703587 bzw. 0xFF636363 sein.

von Amateur (Gast)


Lesenswert?

Irgendwie sieht das für mich nach: "Wollte und konnte nicht" aus.


Zwischenwert = Format [ 3 ] * 1000000 + Format [ 2 ] * 10000 +
               Format [ 1 ] *     100 + Format [ 0 ];

Zwischenwert = 4000000 + 710000 + 6900 + 4
Zwischenwert = 4.716.904

Zwischenwert = 255000000 + 990000 + 9900 + 99
Zwischenwert = 255.999.999

von Mach F. (machfax)


Lesenswert?

Werner schrieb:
> So wie du das beschreibst, müßte der Int Wert zu 255.999999 dann aber
> 4284703587 bzw. 0xFF636363 sein.

genau, aber da ja alle nur darauf rumhacken ziehe ich mich aus diesen 
Thread zurück und wünsche allen Profis gute Nacht

: Bearbeitet durch User
von .... (Gast)


Lesenswert?

Hahaha, naja was soll man hier auch machen...
Du hast einen Eröffnungsthread mit völlig zusammenhangslosen 
informationen und öffensichtlichen widersprüchen ohne die Ausgangslage 
zu erklären.

Du hattest nie einen int der 255999999 lautete, sondern nur die 
0xFF636363 vom Protokoll.
Dein nächster Post, beschreibt bereits, wie du das Problem gelöst hast. 
Erst dort kann man erkennen, was das eigentliche Problem war.

Und jetzt erwartest du Samthandschuhe für das Eröffnen eines Threads der 
von vornherein völlig sinnlos und unütz war.
Das hat nix mit Arroganz der Profis zu tun, das ist das, was man für 
dafür bekommt, wenn man bedenkt das andere Zeit investieren, um deinen 
Firlefanz zu lösen - wozu wir nie eine Chance hatten.. Wie respektvoll 
schätzt du dich denn selbst ein?
Jo, kettensatz, aber nötig!

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.