Int To Float

OP #3806987
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
Gast #3807007
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?
OP #3807174
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);
Gast #3807189
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.
OP #3807323
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.
Gast #3807341
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.
Gast #3807528
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
Gast #3807655
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren