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!
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.
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
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?
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.
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
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.
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
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...
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.
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.
Andi schrieb: > Na eben Fixkomma 8.8, steht doch alles schon im ersten Beitrag. Du meinst als ASCII? Das sollte man vorher klären.
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.
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.
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
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".
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.
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
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.
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.
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.
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
Vielen Dank für eure Antworten und die Hilfestellungen Don’t be so hard on me - jeder steht doch mal auf dem Schlauch
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
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.
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
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
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. ;-)
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
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.
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
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.