Hallo, ich habe folgendes Problem. Ich habe als Ergebnis einer Berechnung einen 46bit Vektor, wobei 26bit auf den Integer-Wert und 20bit auf die Nachkommastellen entfallen. Nun möchte/muss ich diesen Wert durch 4096 teilen. Dabei reicht mir aber die einfache Shiftoperation nicht aus, denn bei der wird ja prinzipiell abgerundet. Ich interessiere mich für die "Nachkommastellen", die nach der Division entstehen, denn das ist mein Ergebnis zum Weiterrechnen. Einen Dividierer zu entwerfen ist an sich nicht schwer bzw. gibt es ihn schon fertig z.B. von Lothar Miller. Aber gibt es eine Möglichkeit, dass mit jedem Takt ein Ergebnis bereit steht? Ich füttere also den Dividierer mit jedem Takt und nach einer Latenz X (wird sicher die Bitbreite in Takten sein) steht das Ergebnis am Ausgang bereit, das aber jeden Takt, so dass keine Pausen entstehen, sondern nur eine Art Delay. Bei 46 Takten wären das 46 Takte Delay... kann man diese Latenz noch verkürzen, indem man z.B. mit Variablen rechnet und dadurch mehrere Rechenschritte pro Takt ausführen kann? Ist so etwas möglich, oder wurde so etwas schon umgesetzt? Danke im Vorraus! Mfg Frank
Das Problem gibt es eigentlich überall und kann nicht von der Sprache abhängen. Ich kenne es aus der Finanzmathematik und mache das mit SAS immer so, dass zuerst der Wert, um den dividiert werden soll, hälftig oder statistisch addiert wird. Danach kann man runden. Möchte man z.B. einen Wert auf 3 Nachkommastelen genau haben, muss statisch mit 0,0005 addiert werden. Statistisch mit 0,00025 +/- 0,00025. Dies stimmt bei negativen und postiven Zahlen, soforn die Integerrundung und nicht die mathematische Rundung (Gaussklammer) eingesetzt wird. Bezogen auf 1/4096 sind es dann 1/8192, die zu addieren wären. Im Binärsystem ist das immer das nächstgelegene niederwertigere Bit. Mit welcher Technik dann dividert wird, ist unerheblich.
Frank M. schrieb: > Bei 46 Takten wären das 46 Takte Delay... ... > Ist so etwas möglich, oder wurde so etwas schon umgesetzt? Ja, wie Du schon schreibst, nennt sich das Ganze Pipeline-Prinzip. > kann man diese Latenz noch > verkürzen, indem man z.B. mit Variablen rechnet und dadurch mehrere > Rechenschritte pro Takt ausführen kann? Jein. Du gehst immer einen Kompromiss ein: Je weniger Register drin sind, umso länger wird der kombinatorische Pfad und umso langsamer die Taktfrequenz ( z.B. Plasma 25 MHz vs. Microblaze 100 MHz). Frank M. schrieb: > Nun möchte/muss ich diesen Wert durch 4096 teilen. > Dabei reicht mir aber die einfache Shiftoperation nicht aus, denn bei > der wird ja prinzipiell abgerundet. Ich interessiere mich für die > "Nachkommastellen", die nach der Division entstehen, denn das ist mein > Ergebnis zum Weiterrechnen. Das ist mir ein bissel konfus. Was willst Du denn nun: 1. richtig runden oder 2. modulo 4096 rechnen? Duke P.S.: Und brauchst Du wirklich in jedem Takt eine Division?
Frank M. schrieb: > Nun möchte/muss ich diesen Wert durch 4096 teilen. > Dabei reicht mir aber die einfache Shiftoperation nicht aus, denn bei > der wird ja prinzipiell abgerundet. Das erscheint mir als Motiv für einen vollständigen und sogar gepipelineten Dividierer etwas schwach. Rundung/Vorzeichenspielerei sollte nicht wirklich soo arg schwierig sein.
Darf man mal fragen, welches Ergebnis hier erwartet wird, dass anders aussieht, als das, was bei 1/4096 rauskommt? Das Ergebnis kann ja nicht genauer sein, als die 12 Bits einerseits und dem Eingangsvektor andererseits. Wenn der Eigangsvektor grösse ist, fügt man einfach die fehlenden Stellen hinzu und multipliziert. 1/4096 * 2hoch38 = 1.UUUUU mit einer Auflösung von 26 Bit. q.e.d.
Frank M. schrieb: > Nun möchte/muss ich diesen Wert durch 4096 teilen. > Dabei reicht mir aber die einfache Shiftoperation nicht aus, denn bei > der wird ja prinzipiell abgerundet. Ich interessiere mich für die > "Nachkommastellen", die nach der Division entstehen, denn das ist mein > Ergebnis zum Weiterrechnen. Ich versteh das Problem auch nicht ganz. Die ersten 12 + 20 Bits sind deine Nachkommastellen wenn du durch 4096 dividieren willst.
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.