3 Stimmen

LUT gegen Newton-Raphson-Division für IEEE-754 32-Bit-Gleitkomma

Ich frage mich, welche Kompromisse bei der Implementierung der 32-Bit-IEEE-754 Gleitkomma-Division bestehen: Verwendung von LUTs gegenüber der Newton-Raphson-Methode?

Wenn ich von Kompromissen spreche, meine ich in Bezug auf Speichergröße, Anweisungszähler usw.

Ich habe einen kleinen Speicher (130 Wörter (jeweils 16 Bit)). Ich speichere die oberen 12 Bits der Mantisse (einschließlich des versteckten Bits) an einem Speicherort und die unteren 12 Bits der Mantisse an einem anderen Speicherort.

Derzeit verwende ich die Newton-Raphson-Division, überlege jedoch, welche Kompromisse es gäbe, wenn ich meine Methode ändern würde. Hier ist ein Link zu meinem Algorithmus: Newtons Methode zur Ermittlung des Kehrwerts einer Gleitkommazahl für die Division

Vielen Dank und bitte erläutern Sie Ihre Argumente.

4voto

Jerry Coffin Punkte 452852

Der Kompromiss ist ziemlich einfach. Ein LUT verwendet zusätzlichen Speicher in der Hoffnung, die Anweisungszahl genug zu reduzieren, um etwas Zeit zu sparen. Ob es wirksam ist, hängt viel von den Details des Prozessors ab - insbesondere vom Zwischenspeichern.

Bei Newton-Raphson ändern Sie X/Y zu X*(1/Y) und verwenden Ihre Iteration, um 1/Y zu finden. Zumindest nach meiner Erfahrung, wenn Sie volle Präzision benötigen, ist es selten nützlich - seine primäre Stärke liegt darin, Ihnen zu helfen, etwas mit (sagen wir) 16-Bit Präzision schneller zu finden.

Die übliche Methode für die Division ist eine Bit-für-Bit-Methode. Obwohl diese spezielle Antwort sich mit ganzen Zahlen befasst, machen Sie für Gleitkommazahl im Wesentlichen dasselbe, nur dass Sie zusätzlich die Exponenten subtrahieren. Eine Gleitkommazahl ist im Grunde A*2N, wobei A die Signifikante und N der Exponent des Zahlenanteils ist. Also, Sie nehmen zwei Zahlen A*2N / B * 2M und führen die Division als A/B * 2N-M aus, wobei A und B in diesem Fall (im Wesentlichen) als ganze Zahlen behandelt werden. Der einzige wirkliche Unterschied besteht darin, dass Sie bei Gleitkomma normalerweise das Ergebnis runden möchten, anstatt es abzuschneiden. Das bedeutet im Grunde genommen, die Division mit (mindestens) einem zusätzlichen Bit Präzision durchzuführen und dann aufzurunden, wenn dieses zusätzliche Bit eine Eins ist.

Die häufigste Methode unter Verwendung von Lookup-Tabellen ist die SRT-Division. Diese wird meistens in Hardware durchgeführt, daher würde ich wahrscheinlich nach etwas wie "Verilog SRT" oder "VHDL SRT" googeln. Es sollte jedoch nicht allzu schwierig sein, es in C++ zu implementieren. Während die Methode, die ich in der verlinkten Antwort umrissen habe, ein Bit pro Iteration produziert, kann diese so geschrieben werden, dass sie 2, 4 usw. Bits pro Iteration produziert. Soweit ich mich erinnere, wächst die Größe der Tabelle jedoch quadratisch mit der Anzahl der pro Iteration produzierten Bits, so dass man in der Praxis selten viel mehr als 4 sieht.

3voto

mcdowella Punkte 18996

Jeder Newton-Raphson-Schritt verdoppelt grob die Anzahl der Dezimalstellen, sodass Sie, wenn Sie die Anzahl der Bits der Genauigkeit von einem LUT einer bestimmten Größe bestimmen können, in der Lage sein sollten, die Anzahl der NR-Schritte zu ermitteln, die erforderlich sind, um Ihre gewünschte Genauigkeit zu erreichen. Der Cray-1 verwendete NR als letzten Schritt seiner Kehrwertberechnung. Auf der Suche danach fand ich einen ziemlich ausführlichen Artikel zu dieser Art von Thema: Eine genaue, schnelle Implementierung von Division durch Kehrwertannäherung vom 9. IEEE-Symposium über Computerarithmetik (6.-8. September 1989).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X