Forum: FPGA, VHDL & Co. Quelle für Quadratwurzelalgorithmus


von Kiigass (Gast)


Lesenswert?

Hi, ich habe hier im Forum diesen Algorithmus gefunden:

Beitrag "Wurzel ziehen - VHDL"
1
public static int sqrt(int num) {
2
        int op = num;
3
        int res = 0;
4
        int one = 1 << 14; // The second-to-top bit is set: 1L<<30 for long
5
 
6
        // "one" starts at the highest power of four <= the argument.
7
        while (one > op)
8
            one >>= 2;
9
       
10
        while (one != 0) {
11
            if (op >= res + one) {
12
                op -= res + one;
13
                res += 2 * one;
14
            }
15
            res >>= 1;
16
            one >>= 2;
17
        }
18
        return res;
19
    }
Da ich den in einer wissenschaftlichen Arbeit verwenden möchte, brauche 
ich eine Quelle. Weiß jemand wer sich das ausgedacht hat? Also auf 
welchen Mathematiker das Verfahren zurück geht?

danke für eure Hilfe

von Jonny (Gast)


Lesenswert?

Hi,

Hier ist die Quelle.

Square root by abacus algorithm, Martin Guy @ UKC, June 1985.
From a book on programming abaci by Mr C. Woo.

Gruß,

von Kiigass (Gast)


Lesenswert?

Vielen Dank! Das ging schnell! Ich hab gestern in der Uni den halben Tag 
in der Bibliothek verbracht und 5 Profs gefragt, alles ohne Ergebnis^^

von Uwe Bonnes (Gast)


Lesenswert?

Muesste auch mit CORDIC gehen.

von BB (Gast)


Lesenswert?

Geht auch mit schriftlichem Dividieren ohne sequenzielles Vorgehen voll 
parallel.

von Harko (Gast)


Lesenswert?

Kann man den Cordic eigentlich so aufziehen, dass er einen 
Flash-Kombinatorik abgibt?

CORDIC ist ja ein iterativer Algo der nach einer gewissen Schrittzahl 
zum Ergebnis kommt. Wenn man die Iterationen als loop formuliert, müsste 
man ein Schaltwerk erhalten, das in einem Schritt arbeiten kann. Bei 
entsprechend geringer Frequenz natürlich.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Harko schrieb:
> Kann man den Cordic eigentlich so aufziehen, dass er einen
> Flash-Kombinatorik abgibt?

Was meinst du damit?



> CORDIC ist ja ein iterativer Algo der nach einer gewissen Schrittzahl
> zum Ergebnis kommt. Wenn man die Iterationen als loop formuliert, müsste
> man ein Schaltwerk erhalten, das in einem Schritt arbeiten kann. Bei
> entsprechend geringer Frequenz natürlich.

Geht sicher theoretisch, doch das macht man nicht. Die Stufen werden 
getaktet. Man kann bereits nach einem Takt den Eingang mit dem nächsten 
Wert füttern. So kann mit jedem Takt ein Wert ausgerechnet werden. Die 
Latenzzeit ist so lang, wie die Anzahl der Stufen.

von BB (Gast)


Lesenswert?

Damit müsste aber die gesamte Latzen steigen. Wenn man soviele Daten gar 
nicht hat, um einen hohen Druchsatz zu bekommen, liessen sich viele 
Register und etwas Zeit sparen, wenn man ihn ungetaktet laufen lässt und 
ein multi cycle constraint verwendet, um die Daten verarbeiten zu 
können.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

BB schrieb:
> liessen sich viele Register und etwas Zeit sparen,
Keine Sorge: es lohnt sich nicht, in einem FPGA Register sparen zu 
wollen und deshalb mehr Logik verdrahtet. Denn die Register hinter einer 
LUT in einem Funktionsblock/Slice sind sowieso nicht mehr verwendbar, 
wenn diese LUT "nur" für Kombinatorik verwendet wird.

von Hannes (Gast)


Lesenswert?

Es gibt aber noch einen Punkt: Reine Kombinatorik, die nicht über 
mehrere Takte verteil ist, kann zusammengefasst werden - sonst nicht.

von Jaromir (Gast)


Lesenswert?

Der OP ist mal wieder - wie so oft - verduftet.

von Uwe Bonnes (Gast)


Lesenswert?

Ask once, read never...

Aber vielleicht arbeitet der OP in einem der Teile Deutschlands, wo bis 
zum 6. fast nirgends gearbeitet wird und liest daher z.Z. nicht mit.

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
Noch kein Account? Hier anmelden.