Forum: Mikrocontroller und Digitale Elektronik Fest Komma Rechnung


von Vicky (Gast)


Lesenswert?

Hallo zusammen,
Kann mir jemand weiterhelfen?
Ich muss ein unterprogramm schreiben, dass eine 8.8 Festkommazahl in AX 
mit PI multipliziert und das Ergebnis an AX zurück gibt
Vielen Dank vorab!

von Stefan F. (Gast)


Lesenswert?

AX = AX * 3.14159265358979323846;

von superrechner (Gast)


Lesenswert?

Na das war einfach.

von c-hater (Gast)


Lesenswert?

Vicky schrieb:

> Ich muss ein unterprogramm schreiben, dass eine 8.8 Festkommazahl in AX
> mit PI multipliziert und das Ergebnis an AX zurück gibt

Schöne Aufgabe. Löse sie. Alleine. Dann hast du gelernt, was die Aufgabe 
dir beibringen will/soll.

Das Ziel wäre völlig verfehlt, wenn du einfach nur irgendwelchen, von 
Vollidioten zugelieferten Code kopieren würdest. Dann hättest du nämlich 
garnix begriffen.

Das ist der Sinn solcher Aufgaben. Man muß sie selber lösen, um selber 
etwas zu verstehen.

von Vicky (Gast)


Lesenswert?

Vielen Dank erstmal für die Rückmeldungen.
Das Problem ist, dass ich beim Programmieren die Zahl 3.14… man so nicht 
in Assembler darstellen kann
Das Problem kann ich ehrlicherweise nicht so einfach lösen und frage 
deshalb hier um Hilfe. Habe es schon anderswo versucht. Es konnte mir 
keiner helfen

von Teo (Gast)


Lesenswert?

Behalte das Komma ganz fest im Gedächtnis und sonst nirgends.

von Sebastian S. (amateur)


Lesenswert?

Löse die Aufgabe doch einfach mal auf dem Papier - falls Du das noch 
kannst.
Diesen Weg kann man dann fast 1:1 übernehmen.
Wie hast Du eigentlich eine 8.8-Zahl in AX bekommen? Ist das nicht ein 
wenig eng da drin?

von Stefan F. (Gast)


Lesenswert?

Eben, die allererste zu klärende Frage ist: Wie wird die Zahl im 
Speicher des Computers (bzw. in AX) repräsentiert. Damit fängt alles an.

von Jobst M. (jobstens-de)


Lesenswert?

Multipliziere Pi mit 256, multipliziere mit AX und Teile das Ergebnis 
durch 256.

... nur so als Anregung - Wie Du es dann tatsächlich durchführst musst 
Du Dir selber überlegen. Es wird am Ende aber ganz einfach werden.


Gruß
Jobst

von Thomas B. (thomas2)


Lesenswert?

Vicky schrieb:
> Das Problem ist, dass ich beim Programmieren die Zahl 3.14… man so nicht
> in Assembler darstellen kann

Vielleicht solltest du erst mal die Aufgabenstellung klar formulieren. 
Es geht also um Assembler, davon stand in der ursprünglichen Frage 
nichts. Wenn man jetzt noch wüsste, welchen Mikrocontroller, welchen 
Assembler und ggf. welche Bibliotheken du benutzt ... wobei sich 
AX-Register eher nach 80x86 anhört, als nach Mikrocontroller?

In Ganzzahlarithmetik kannst du mit 3.14 multiplizieren, indem du zuerst 
mit 314 multipliziert und dann durch 100 teilst, oder entsprechend 
angepasst je nach erforderlicher Genauigkeit.

Bei der Multiplikation mit 314 muss darauf geachtet werden, ob ein 
Überlauf stattfinden kann bzw. wieviele Bits man für das Ergebnis 
maximal braucht. Dabei hängt es vom eingesetzten µC ab, ob und mit wie 
vielen Bit eine Multiplikation hardwaremäßig möglich ist, oder ob man 
das softwaremäßig machen muss.

von Wolfgang (Gast)


Lesenswert?

Vicky schrieb:
> Das Problem ist, dass ich beim Programmieren die Zahl 3.14… man so nicht
> in Assembler darstellen kann

Rechner rechnen meistens nicht im Dezimalsystem

von malsehen (Gast)


Lesenswert?

Thomas B. schrieb:
> In Ganzzahlarithmetik kannst du mit 3.14 multiplizieren, indem du zuerst
> mit 314 multipliziert und dann durch 100 teilst, oder entsprechend
> angepasst je nach erforderlicher Genauigkeit.

Naja...

von Rudi D. (rulixa)


Lesenswert?

Vicky schrieb:
> Kann mir jemand weiterhelfen?
> Ich muss ein unterprogramm schreiben, dass eine 8.8 Festkommazahl in AX
> mit PI multipliziert und das Ergebnis an AX zurück gibt

Die Aufgabenstellung ist unvollständig. Darf man Fixkommaroutinen 
verwenden, oder sollen diese auch selbst entwickelt werden. Wenn ja, 
dauerts lang!

Also erst einmal PI() in hex wandeln, dann rechnen und Ergebnis wieder 
retour in dez

Ich hab die Routinen für Atmel 8 bit bis 32 Bit Zahlen, die im Internet 
zu finden sind als Tip.

von Andi (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Eben, die allererste zu klärende Frage ist: Wie wird die Zahl im
> Speicher des Computers (bzw. in AX) repräsentiert. Damit fängt alles an.

Na eben Fixkomma 8.8, steht doch alles schon im ersten Beitrag.

malsehen schrieb:
> Thomas B. schrieb:
>> In Ganzzahlarithmetik kannst du mit 3.14 multiplizieren, indem du zuerst
>> mit 314 multipliziert und dann durch 100 teilst, oder entsprechend
>> angepasst je nach erforderlicher Genauigkeit.
>
> Naja...

Wenn man Faktor 100 durch 256 ersetzt ist's doch eigentlich ganz 
richtig.

Die Frage ist halt, darf das Zwischenresultat der Multiplikation über 
die 16 Bits hinausgehen. Hat der Prozessor überhaupt eine Multiplizier 
Instruktion.
Wenn nicht kann man das auch ganz ohne MUL lösen:

  AX = AX*2 + AX + AX/8 + AX/64   ; 2+1+0.125+0.15 = 3.14

*2, /8, /16 lassen sich alle durch bitschieben erzeugen.

von Wolfgang (Gast)


Lesenswert?

Andi schrieb:
> Na eben Fixkomma 8.8, steht doch alles schon im ersten Beitrag.

Du meinst als ASCII? Das sollte man vorher klären.

von Andi (Gast)


Lesenswert?

Nein, Festkomma 8.8 bedeutet 8 Bits vor dem Komma und 8 Bits nach dem 
Komma, zusammen also 16 Bits. Das ist eine reine Binärdarstellung.
Da 8 bits hinter dem Komma eben ein Faktor 256 sind, kann man sich das 
Ganze auch so vorstellen, dass man mit 256 multipliziert um Zahlen 
kleiner 1.0 abbilden zu können.

von jemand (Gast)


Lesenswert?

Vicky schrieb:
> Hallo zusammen,
> Kann mir jemand weiterhelfen?
> Ich muss ein unterprogramm schreiben, dass eine 8.8 Festkommazahl in AX
> mit PI multipliziert und das Ergebnis an AX zurück gibt
> Vielen Dank vorab!

Runde Pi auf 3. Stand ja nichts zu der geforderten Genauigkeit.

Du wandelst Pi nach Fixkomma (zB Q2.14) multiplizierst den Salat als 
vorzeichenlose Ganzzahl und überlegst die, welches Fixpunkt-Format da 
rauskommt (theoretisch 32bit insgesamt) und wandelst das ggf durch 
Shifts.

von A. S. (Gast)


Lesenswert?

jemand schrieb:
> Du wandelst Pi nach Fixkomma (zB Q2.14) m

sollten 804 in Dezimal bei 8.8 sein.

von Achim M. (minifloat)


Lesenswert?

Andi schrieb:
> Wenn nicht kann man das auch ganz ohne MUL lösen:
> AX = AX*2 + AX + AX/8 + AX/64   ; 2+1+0.125+0.15 = 3.14
> *2, /8, /16 lassen sich alle durch bitschieben erzeugen.

Schau' dir mal an, welche Bits bei π im 8.8-Format gesetzt sind. Das 
8.8-Format ermöglicht außerdem effiziente Bitshifts um ganze Bytes vor 
Division bzw. nach Multiplikation. Da denke ich ist Multiplikation in 
32bit-Register schneller gerechnet als 3x schieben und addieren. Zumal 
"Schieben um Konstante" auch im Mikrocode eine Multiplikation benutzen 
kann ;)

mfg mf

: Bearbeitet durch User
von PittyJ (Gast)


Lesenswert?

Was ist eigentlich AX?

von Stefan F. (Gast)


Lesenswert?

PittyJ schrieb:
> Was ist eigentlich AX?

Vermutlich ein CPU Register.

Weniger im Klaren bin ich mir über das Festkomma Format 8.8. Wenn man 
mir Anforderungsdokumente oder Schnittstellenbeschreibungen mit so einer 
Angabe vorlegt, dann ist damit immer gemeint:

8 Ziffern vor dem Komma und 8 Ziffern nach dem Komma, das Vorzeichen "-" 
nicht mitgezählt.

Bei Geldbeträgen benutzen wir z.B. meistens das Format "8.2".

von Rudi D. (rulixa)


Lesenswert?

jemand schrieb:
> Vicky schrieb:
>> Hallo zusammen,
>> Kann mir jemand weiterhelfen?
>> Ich muss ein unterprogramm schreiben, dass eine 8.8 Festkommazahl in AX
>> mit PI multipliziert und das Ergebnis an AX zurück gibt
>> Vielen Dank vorab!
>
> Runde Pi auf 3. Stand ja nichts zu der geforderten Genauigkeit.
>
> Du wandelst Pi nach Fixkomma (zB Q2.14) multiplizierst den Salat als
> vorzeichenlose Ganzzahl und überlegst die, welches Fixpunkt-Format da
> rauskommt (theoretisch 32bit insgesamt) und wandelst das ggf durch
> Shifts.

Ich glaube inzwischen Vicky machst sich einen Spass. Auf unsere 2 
Vorgangsweisen kommt keine Antwort.

von jemand (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Weniger im Klaren bin ich mir über das Festkomma Format 8.8. Wenn man
> mir Anforderungsdokumente oder Schnittstellenbeschreibungen mit so einer
> Angabe vorlegt, dann ist damit immer gemeint:

Das ist ein übliches Format und eine gängige Art das anzugeben in der 
digitalen Signalverarbeitung.
https://de.wikipedia.org/wiki/Festkommazahl#Nomenklatur_des_Zahlenformats

von jemand (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> 8 Ziffern vor dem Komma und 8 Ziffern nach dem Komma, das Vorzeichen "-"
> nicht mitgezählt

Und effektiv ist es genau das, nur binär.

von Klaus W. (mfgkw)


Lesenswert?

Stefan ⛄ F. schrieb:
> Bei Geldbeträgen benutzen wir z.B. meistens das Format "8.2".

ja, aber 8 und 2 in dezimal.

Nur spekulieren kann man, daß es hier um Binärstellen geht.
Typische Dullifrage, die schräg losgeht und nix rauskommt.
Etliche Leute rätseln rum, und den OT juckt es nicht mehr.

von Georg A. (georga)


Lesenswert?

Klaus W. schrieb:
> Etliche Leute rätseln rum, und den OT juckt es nicht mehr.

Weil der Abgabetermin der Lösung vermutlich schon vorbei ist.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Vicky schrieb:
> Das Problem ist, dass ich beim Programmieren die Zahl 3.14… man so nicht
> in Assembler darstellen kann
Ist eigentlich ganz einfach...

Pi sieht in der Dezimaldarstellung so aus:  3,1415926

Also binär so: 11,001001000011

Und wenn ich jetzt das Komma in die Mitte schiebe, dann komme ich auf 
das gewünschte 8.8-Format mit 8 binären Vorkommastellen und 8 binären 
Nachkommastellen: 00000011,00100100

Und wenn ich das jetzt in 2 Bytes aufteile, dann ergibt es 03hex und 
24hex

> Es konnte mir keiner helfen
Tragisch genug. Blöderweise gilt der Satz auch jetzt noch, nachdem ich 
die Aufgabe gelöst habe. Denn "geholfen" ist dir damit gar nicht.


> Das Problem kann ich ehrlicherweise nicht so einfach lösen und frage
> deshalb hier um Hilfe.
> Habe es schon anderswo versucht. Es konnte mir keiner helfen
Dein Lehrer meint vermutlich, dass du es nicht anderswo versuchen 
solltest, sondern selber. Der dabei eintretende Effekt nennt sich 
"Lernen".
Aber wie sage ich immer: es muss auch schlechte Arbeiter, Techniker und 
Ingenieure geben, damit man den Wert der Guten erkennt.

: Bearbeitet durch Moderator
von Vicky (Gast)


Lesenswert?

Vielen Dank für eure Antworten und die Hilfestellungen
Don’t be so hard on me - jeder steht doch mal auf dem Schlauch

von Alex -. (alex796)


Lesenswert?

Vicky schrieb:
> jeder steht doch mal auf dem Schlauch

Nicht auf Mikrocontroller.net ;)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Vicky schrieb:
> jeder steht doch mal auf dem Schlauch
Falls einer damit Schwierigkeiten hat, dann am ehesten mit der rechten 
Seite. Denn links vom Komma ist die Gewichtung der Bits ja klar:
1
128   64   32   16   8   4   2   1
Dann kommt das Komma und es geht logischerweise rechts davon so weiter:
1
1/2   1/4   1/8   1/16   1/32   1/64   1/128   1/256
und somit in dezimaler Kommaschreibweise:
1
0,5   0,25   0,125   0,0625   0,03125   0,015625 ...
Und dann kann man mal die Bits zuordnen:
1
128   64   32   16   8   4   2   1   1/2   1/4    1/8     1/16     1/32      1/64     ...
2
128   64   32   16   8   4   2   1   0,5   0,25   0,125   0,0625   0,03125   0,015625 ...
3
 0    0    0    0    0   0   1   1 ,  0     0      1        0        0          1     0   0
Somit ergibt sich die obige Zahl zu 2 + 1 + 0,125 + 0.012625 = 3,140625.
Genauer geht es mit 8 Nachkommabits eben nicht.

: Bearbeitet durch Moderator
von fop (Gast)


Lesenswert?

Wie wäre es mit ((AX * 355) + 56) / 113

Wobei das + 56 aus dem üblichen Abrunden nahezu ein kaufmännisches 
Runden macht.

Wieviel Bits die Zwischenergebnisse benötigen muss man sicherlich 
beachten. Von Vorzeichen war auch noch nicht die Rede, aber bei 8.8 sind 
ja wohl alle Bits von AX verplant, so dass es keine negativen Zahlen 
geben kann.

von Franko P. (sgssn)


Lesenswert?

Problem ist auch die Zahl der Stellen fürs Ergebnis. Wenn man mal wieder 
AX als ein 8086-Register sieht, hat das ja 16 Bit. Wenn ich 16*16 Multi 
mache, ist das Ergebnis 32 Bit. Also kann ich (8.8)AX als 16 Bit gar 
nicht machen, selbst wenn der Multiplikator als ganze Zahl nur 1 Stelle 
hat, das Ergbnis kann eine Stelle mehr haben. Vielleicht war ja nicht 
8.8 sondern 8*8 Bit gemeint?

Gerhard

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Franko P. schrieb:
> Wenn ich 16*16 Multi mache, ist das Ergebnis 32 Bit.
> Also kann ich (8.8)AX als 16 Bit gar nicht machen
Da steht nichts, dass die Zahl nicht zwischendurch das gesamte EAX 
Register belegen dürfte. Es ist nur beschrieben, wie die Parameter 
übergeben werden müssen.

Ich lese das so:

>>>> dass eine 8.8 Festkommazahl in AX mit PI multipliziert

... wird, damit das gesamte EAX belegt ...

>>>> und das Ergebnis an AX zurück gibt

Also einfach 16x16 (8.8*8.8) multiplizieren, dann um 8 Bit nach rechts 
schieben und fertig.

: Bearbeitet durch Moderator
von Wolfgang (Gast)


Lesenswert?

Jobst M. schrieb:
> Multipliziere Pi mit 256, multipliziere mit AX und Teile das Ergebnis
> durch 256.

In der Frage steht nur, dass der Operand in AX im Format 8.8 vorliegen 
soll. Weder für das Format von Pi, noch für das Ergebnis wird eine 
Vorgabe gemacht. ;-)

von Rainer V. (a_zip)


Lesenswert?

Wenn man so etwas auf einem Controller programmiert, dann bietet sich 
zuerst mal an, PI durch einen Bruch (beliebiger Genauigkeit) zu 
ersetzten. Alle möglichen Zahlen können durch Brüche mehr oder weniger 
genau dargestellt werden! Dann gilt für mich (als Assembler-typ), das 
Divisionen möglichst immer vor Multiplikationen durchgeführt 
werden...und schon ist man fertig :-)
Gruß Rainer

von c-hater (Gast)


Lesenswert?

Rainer V. schrieb:

> Dann gilt für mich (als Assembler-typ), das
> Divisionen möglichst immer vor Multiplikationen durchgeführt
> werden...

Huch? Bits ohne Not wegwerfen? Das ist sicher nicht das richtige 
Konzept. Genau das Umgekehrte ist richtig.

von Rainer V. (a_zip)


Lesenswert?

c-hater schrieb:
> Genau das Umgekehrte ist richtig.

Blödsinn, wenn du in diesem Bereich mit Genauigkeit hantierst, dann 
machst du wahrscheinlich sowieso keine Ganzzahlarithmetik...also what?

Rainer

von c-hater (Gast)


Lesenswert?

Rainer V. schrieb:

> Blödsinn, wenn du in diesem Bereich mit Genauigkeit hantierst, dann
> machst du wahrscheinlich sowieso keine Ganzzahlarithmetik...also what?

Häh?

Schau dir einfach mal als Beispiel folgendes an:

Beitrag "Re: Westminster Soundgenerator mit ATtiny85"

Du kannst die Sache ja mal mit deinem Konzept umsetzen. Spätestens dann 
erkennst du es...

von A. S. (Gast)


Lesenswert?

Fest, Koma, Rechnung.

Koma schreibt man mit 1 m.

Und ja, die Rechnung geht an den, der die Musik bestellt hat.

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.