Fest Komma Rechnung

Gast #6868089
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.
Gast #6868142
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
#6868196
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.
#6868240
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.
Gast #6868247
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.
Gast #6868269
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.
Gast #6868273
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.
#6868358
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
Gast #6868389
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".
#6868473
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.
Gast #6868480
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
Moderator (Firma: Titel) Persönliche Seite #6868537
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.
Moderator (Firma: Titel) Persönliche Seite #6868694
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.
Gast #6868862
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.
#6868872
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
Moderator (Firma: Titel) Persönliche Seite #6868926
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.
#6869111
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

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