Möchte Werte im Bereich von 0-15 auf einen Bereich von 0-11 umrechnen. Für die größeren Zahlen klappt es einigermaßen, von links gesehen die erste Null zu behalten und die restlichen Stellen nach rechts zu schieben. Kennt jemand die "saubere" Lösung, mit der sich auch kleinere Werte ordentlich runden lassen?
Zum Verständnis: Möchtest du quasi mit dem Bruch 11/15 multiplizieren? Gruß Thomas
Z.B. 15 * 188 / 256 = 11 in 8051 assembler: mov a, #15 ;A = input (15) mov b, #188 mul ab mov a, b ;A = output (11) Peter
na ja, sind es denn 12/16, (da die 0 ja auch mit darstellbar ist)? also dann auch 3/4 /4 ist mit shift realisierbar, und *3 durch 3fache Addition Du must also zuerst 3 mal addieren (also passende Registergröße vorhalten, müssten ja dann 10 bit sein) und das ergebniss dann schieben
AUtsch, wo ich den Zahlenwert in 8 Bit breitkloppen möchte weiß ich auch grad nicht. "zur Not" tuns auch 4 Bit (respp. 6 Bit) also 15d * 3d = 45d (binär = 101101 das dann durch 4 = 2 * shift rechts = 1011 = 11d
Wie wär's mit einem einfachen Tabelle? Ist garantiert kürzer als jede Rechnerei.
0 0,00 0 1 0,75 1 2 1,50 2 3 2,25 2 4 3,00 3 5 3,75 4 6 4,50 5 7 5,25 5 8 6,00 6 9 6,75 7 10 7,50 8 11 8,25 8 12 9,00 9 13 9,75 10 14 10,50 11 15 11,25 11 Ein bishcen ungenau wird es also immer
Na ja und die Tabelle kann man ja mit int-Werten belegen. Wenn gerechnet werden soll: Tabellenwert * 10; + 5 und wieder durch 10 teilen. Dann sind die C-Rundungsfehler eliminiert. MW
Eben bin ich mit der Bahn nach Hause gefahren und dachte nur: Autsch, was für ne bekloppte Frage. Wert kopieren, zweimal schieben, Ergebnis vom Ursprungswert subtrahieren und fertig. Danke für die vielen schnellen Antworten. Peter, Du hättest bestimmt noch irgendwo nen Zyklus gespart doch für mich ist die Performance vorerst ausreichend und ich kenne mich mit dem 8051ger nicht aus... (die neue Schule, erst mit´m AVR angefangen ;) THX (und nächstes mal versuche ich erstmal nachzudenken bevor ich dumme Fragen stelle ;) Basti aka "Alisa 1387"
Salve, @Martin: es bleibt trotzdem bei 11/15 - daß die 0 mit im Wertebereich liegt, spielt doch keine Rolle. 0 bleibt 0, und 15 wird 11. Also 11/15. Mark
Das ist ja alles viel zu umständlich. So ganz habe ich nicht verstanden, wozu ich 10 Bit brauche, um einen 4bit Wert nach 3 1/2 umzurechnen. Die "garantiert kürzere" Tabelle ist mir zu lang. Und das Runden ist egal, da gar keine Nachkommastellen benötigt werden (waren die 10 Bit für Nachkommastellen gedacht?)
Also in 3 1/2 Bit können ja so viele Nachkommastellen nicht enthalten sein?
Ich habe nicht alles gelesen, aber wie kann es halbe Bits geben?
"Peter, Du hättest bestimmt noch irgendwo nen Zyklus gespart doch für mich ist die Performance vorerst ausreichend und ich kenne mich mit dem 8051ger nicht aus..." Die ATMegas können doch auch multiplizieren: ldi r16, 15 ;r16 = 15 ldi r17, 188 mul r16, r17 mov r16, r1 ;r16 = 11 Peter
@Freak5: Indem es Wertebereiche gibt, welche keine Potenz von 2 sind?!? @Peter: Danke, das war verständlich...
Achso. Das ist aber doch kein 2.5Bit-Wert, da man keine halben Bits nutzen kann g Aber jetzt weiß ich, wass ihr meint.
> da man keine halben Bits nutzen kann *g*
Doch, es gibt nutzbare halbe bits (auch außerhalb von Gaststätten um
Bitburg)
Beid er seriellen Übertragung kann man dei Anzahl der Stop-bits auf 1,5
oder ,5 stellen. Dies hat durchaus sinnvolle Gründe.
aber trotzdem versteh ich nicht, wieso eine integer-Multiplikation effizienter sein soll als 2 Additionen plus ein Doppel-Shift (siehe meine obige Formel)
@Martin, "wieso eine integer-Multiplikation effizienter sein soll" LDI + MUL = 2 Words / 3 Zyklen 2 * ADD + 2 * LSR = 4 Words / 4 Zyklen Die Effizienz ist aber nicht ausschlaggebend, sondern daß die Multiplikation auch für beliebig andere Umrechnungen geeignet ist. Z.B. um ADC-Werte in reale Spannungen umzurechnen und umgekehrt. Wichtig ist dabei nur, daß man den Koeffizienten so wählt, daß eine Division durch 256 oder 65536 oder andere Zweierpotenzen herauskommt. Peter
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.