Division einer 8 Bit Konstante / eine 8 Bit Variable

Gast
Hallo,

der Kehrwert von 255 ist 0.0039... das dürfe auch nicht gehen. Kommas 
sind so glaube ich auch ein Problem das nicht ohne mehr aufwand gelöst 
werden kann.
Gast
@ René (Gast)

>der Kehrwert von 255 ist 0.0039... das dürfe auch nicht gehen. Kommas
>sind so glaube ich auch ein Problem das nicht ohne mehr aufwand gelöst
>werden kann.

Festkommaarithmetik

Aber das löst das Problem nciht, denn die VARIABLE steht im Nenner. Da 
kommt man um einen Division nicht herum. Warum wird da so ein Theather 
draus gemacht? Wie schnell muss denn gerechnet werden? Und wozu das 
Ganze?

MfG
Falk
Gast
Danke Falk für den Hinweis

ich wollte nur Register sparen da schon fast alle belegt sind. Und die 
Teilweise in Interups benutzt werden kann es zu "überschneidungen" 
kommen. Aber da werde ich nicht drum herumkommen. Die Zeit ist nicht so 
das Problem.
Es geht um RGB nach HSV und zurück umrechnung in .asm Für C gibt es ja 
schon Beispiele aber in asm ist nichts zu finden. Da mein ganzes Projekt 
aber in ASM gehalten ist habe ich ein Problem
Gast
@ René (Gast)

>ich wollte nur Register sparen da schon fast alle belegt sind. Und die

Hast du keinen SRAM? Welchen Controller verwendest du?

>Teilweise in Interups benutzt werden kann es zu "überschneidungen"

Auch das Problem kann SRAM lösen. Push & Pop.

MfG
Falk
Gast
damit ist eine approximation gemeint. Die Quintessenz von dem Link, der 
oben gepostet worden ist ist folgende:

man findet kurze und einfache Routinen, um Division für bestimmte Zahlen 
wie z.B. 10 zu umgehen - die funktionieren allerdings nur bis zu einem 
bestimmten Eingangswert.

Ein nahezu bestechend einfacher ist:  Eingangswert * 26 und das low-byte 
vergessen. Diese Lösung stimmt bis zu einem Eingangswert von 67. Also 
für 6 Bit genau. Das kann man nehmen, wenn man eine Anzahl Sekunden, 
Minuten, Stunden, etc. z.B. auf einem Display darstellen will [mögliche 
Eingangswerte: 0-59]. Die "Division" benötigt gerade einmal 4 Zyklen.

mov TEMP1,10
mul INPUT,TEMP1
mov OUTPUT,r1

Genauer wirds mit: (Eingangswert * 205)/8. Diese Lösung stimmt sogar bis 
1027 - also 10 Bit. Man kann soz.B. einen Messwert von 0-999 fix in die 
Einzelstellen zerlegen.

mov TEMP1,205
mul INPUT,TEMP1
shr r1
shr r1
shr r1
mov OUTPUT,r1


Für andere Divisoren als 10 müsstest du natürlich selbst solche Tricks 
aufstellen aber der Link sollte als Anregung für Methoden dazu reichen.
Gast
die Approximation würde ich noch für am Besten halten. In 2er Potenzen 
multiplizieren und sehen, ob das Ergebnis größer oder kleiner dem 
Vorgabewert ist. So ähnlich. Wie man das dann programmiert, müßte 
überlegt werden.

mfg

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.