(gelöst) [C++] Schnelle Quadratwurzel aus binärer Zweierpote

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8251
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

(gelöst) [C++] Schnelle Quadratwurzel aus binärer Zweierpote

Beitrag von Krishty »

Hi,

Algorithmen für Quadratwurzeln gibt es wie Sand am Meer. Im Binärsystem auch. Aber gibt es eine schnelle Variante, die nur mit Zweierpotenzen funktioniert?

Das Vorgehen ist sehr einfach: man halbiert einfach die Anzahl der Nullen hinter der Eins: 100 0000 0000 (1024) -> 10 0000 (32); 10000 (16) -> 100 (4).

Wie kriegt man das möglichst schnell (sprungfrei?) hin?

Ich habe beim Verfolgen des log2-Weges den bsr-x86-Befehl gefunden. Ich müsste nur sein Ergebnis halbieren und als Links-Shift auf 1 anwenden, aber, wie bekommt man einen C++-Compiler dazu, von diesem Befehl Gebrauch zu machen? Assembler ist keine Option, Intrinsics vielleicht.

Gruß, Ky

Edit: thx@Jörg
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten