Fixed-Point Kehrwert in VHDL

OP Persönliche Seite #4896972
Lesenswert?

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
Gast #4897450
Lesenswert?

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).
OP Persönliche Seite #4898348
Lesenswert?

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% :)
#4898573
Lesenswert?

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...
OP Persönliche Seite #4898618
Lesenswert?

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 :)
Gast #4898721
Lesenswert?

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.
#4898742
Lesenswert?

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.
#4898772
Lesenswert?

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?

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