Grias eich :)
Ich müsste eine Kehrwertbildung in VHDL umsetzen und hatte mir folgendes
dazu gedacht:
Die Zahl x kann kann ich ähnlich wie bei der Logarithmisierung in
Mantisse und Exponent zerlegen:
1/x = 1/M * 1/2^E
1/2^E ist nur simples Bit-schieben. Für den Kehrwert der Mantisse kann
ich eine LUT mit z.B. 8Bit verwenden. Ich benötige insgesamt keine
Multiplikation und nur einen Tabellenzugriff.
Ist recht simpel und schnell umgesetzt.
Mene Frage lautet: Weshalb findet man größtenteils iterative
Approximationsverfahren nach Newton-Raphson?
Ist dieses Verfahren soviel genauer? Oder möchte man sich die LUT
sparen? Darür benötigt man Multiplikationen, die teurer als Blockram
sind ...
Weiß da jemand etwas?
Viele Grüße,
Mampf
Mampf F. schrieb:> 1/2^E ist nur simples Bit-schieben. Für den Kehrwert der Mantisse kann> ich eine LUT mit z.B. 8Bit verwenden. Ich benötige insgesamt keine> Multiplikation und nur einen Tabellenzugriff.>> Ist recht simpel und schnell umgesetzt.
Hängt von der Genauigkeit/Anz.Stellen ab, LUTs sind
aber schon ab ein paar Bits zu "klein", besser sind
hier die internen RAMs.
Mampf F. schrieb:> Mene Frage lautet: Weshalb findet man größtenteils iterative> Approximationsverfahren nach Newton-Raphson?
.. ob das wirklich die häufigste Methode ist? Schau mal
nach Div-Radix2, Div-Radix-4 oder CORDIC, die werden
auch verwendet (statt A/B einfach 1/B).
Sigi schrieb:> .. ob das wirklich die häufigste Methode ist? Schau mal> nach Div-Radix2, Div-Radix-4 oder CORDIC, die werden> auch verwendet (statt A/B einfach 1/B).
Danke! Ich hatte wohl falsch gesucht und deshalb nichts sinnvolles
gefunden :)
Lothar M. schrieb:> Und hat wegen der 8 Bit Tabelle gerade mal zweieinhalb signifikante> Stellen...
Nicht unbedingt: der Ausgangswert kann ja wenige Stellen
haben aber das Resultat mit wesentlich höherer Genauigkeit
in der Tabelle abgespeichert werden.
Lothar M. schrieb:> Das nennt sich umgangssprachlich "schönsaufen". Das holt einen am> nächsten Morgen mit einem bösen Kater wieder ein...
Ich hab nur Werte von 0 bis 1 ... Mit der LUT-Version hatte ich in etwa
eine Abweichung von <0,01 vom errechneten Wert her. Prozentual habe ich
es nicht ausgerechnet ... Bei 1/0,001 bekam ich 991,irgendwas ... wären
auch nur 0,9% :)
Mampf F. schrieb:> Lothar M. schrieb:>> Das nennt sich umgangssprachlich "schönsaufen". Das holt einen am>> nächsten Morgen mit einem bösen Kater wieder ein...
8 Bit rein, 8 Bit raus.
> ... Mit der LUT-Version hatte ich in etwa> eine Abweichung von <0,01 vom errechneten Wert her. Prozentual habe ich> es nicht ausgerechnet ... Bei 1/0,001 bekam ich 991,irgendwas ... wären> auch nur 0,9% :)
Wie kommst Du mit einer 8Bit-LUT auf "991,irgendwas"? Das geben doch die
8Bit überhaupt nicht her! Vor allem ",irgendwas"!
Angenommen, die 1,0 bearbeitest Du als Sonderfall.
Angenommen, die 0 bearbeitest Du als Sonderfall.
Angenommen, Du kannst hinreichend oft shiften.
Somit gehst Du für die 8Bit-LUT immer aus von: (0,1)xxxxxxxx
Adressleitungen 8-Bit LUT: 76543210
Somit ist 0,001d: (0,1)00000110b *2**(-9)
Somit liegt das Ergebnis zwischen 1b/0,100000000b=10,0b und
1b/0,111111111b=1.00392d
Angenommen, "1b/0,100000000b=10,0b" bearbeitest Du als Sonderfall.
Somit steht im Ergebnis immer eine 1 vor dem Komma.
Somit steht in der LUT (1,)xxxxxxxx.
Somit steht für (0,1)00000110b in der LUT (1,)11110100
(1,)11110100b * 2**9 =1111101000b=1000d
Mhh...
Lars R. schrieb:> Wie kommst Du mit einer 8Bit-LUT auf "991,irgendwas"? Das geben doch die> 8Bit überhaupt nicht her! Vor allem ",irgendwas"!
Oh sorry, das war missverständlich ... Die LUT ist für eine 8Bit
Mantisse, d.h. die Tabelle hat 255 Werte, aber die Werte in der Tabelle
haben 24Bit.
Lars R. schrieb:> Somit steht für (0,1)00000110b in der LUT (1,)11110100
siehe:
Mampf F. schrieb:> 1/x = 1/M * 1/2^E>> 1/2^E ist nur simples Bit-schieben. Für den Kehrwert der Mantisse kann> ich eine LUT mit z.B. 8Bit verwenden. Ich benötige insgesamt keine> Multiplikation und nur einen Tabellenzugriff.
Genau, ich suche die Mantisse vorher, dann ist die Genauigkeit höher.
Beim Logarithmisieren macht man es genauso :)
Lars R. schrieb:> Mampf F. schrieb:>> Lothar M. schrieb:>>> Das nennt sich umgangssprachlich "schönsaufen". Das holt einen am>>> nächsten Morgen mit einem bösen Kater wieder ein...>> 8 Bit rein, 8 Bit raus.
Der Kehrwert wird z.B. oft verwendet, um anschliessend
mit ihm mehrfach zu multiplizieren. Hier bedeutet ein
Mehr an Stellen eine "besseres" Rundungsergebnis.
(schmeisst man hier Stellen weg, dann muss man sich
das Ergebnis halt Schönsaufen).
Mampf F. schrieb:> Oh sorry, das war missverständlich ... Die LUT ist für eine 8Bit> Mantisse, d.h. die Tabelle hat 255 Werte, aber die Werte in der Tabelle> haben 24Bit.
Hört sich irgendwie nach FP12, FP16 (z.B. von GPUs verwendet) an.
Schau mal im Netz nach, da gibt's zahlreiche Ansätze für schnelles
Multipizieren und Dividieren.
Mampf F. schrieb:> Lars R. schrieb:>> Wie kommst Du mit einer 8Bit-LUT auf "991,irgendwas"? Das geben doch die>> 8Bit überhaupt nicht her! Vor allem ",irgendwas"!>> Die LUT ist für eine 8Bit> Mantisse, d.h. die Tabelle hat 255 Werte, aber die Werte in der Tabelle> haben 24Bit.
Auf 991,x für 0,001d komme ich dennoch nicht.
> Oh sorry, das war missverständlich ...
Ich hatte für den Inhalt der LUT eben etwas angenommen.
Sigi schrieb:> Lars R. schrieb:>> Mampf F. schrieb:>>> Lothar M. schrieb:>>>> Das nennt sich umgangssprachlich "schönsaufen". Das holt einen am>>>> nächsten Morgen mit einem bösen Kater wieder ein...>>>> 8 Bit rein, 8 Bit raus.>> Der Kehrwert wird z.B. oft verwendet, um anschliessend> mit ihm mehrfach zu multiplizieren. Hier bedeutet ein> Mehr an Stellen eine "besseres" Rundungsergebnis.> (schmeisst man hier Stellen weg, dann muss man sich> das Ergebnis halt Schönsaufen).
Was ist besser?
8 Bit rein, 16 (bzw 17) Bit raus, oder
9 Bit rein, 8 (bzw 9) Bit raus?
und 8x24 vs 9x12?
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang