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
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?
bearücksichtige, dass der AVR-GCC keinen double kennt. Double ist dort nur ein Alias für float, also 4 Bytes.
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);
Mach Fax schrieb: > So hab ichs gemacht: Das ist doch was völlig anderes als in der Anfangsfrage?! Aus 255999999 wird 15.66655540466308593750
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 ;-)
Mach Fax schrieb: > Der int Wert ist dynamisch und könnte zum Bsp. auch > 0.123456 sein. Das wäre ein toller Trick!
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.
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.
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.
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.