Fast nächste Potenz von 2 in JavaScript?

8

Gibt es eine schnellere Alternative zu folgendem Ausdruck:

%Vor%

Das heißt, die nächste (kleinere) ganzzahlige Potenz von 2 eines Double zu nehmen? Ich habe einen solchen Ausdruck in einer inneren Schleife. Ich vermute, es könnte viel schneller sein, wenn man bedenkt, dass man einfach die Mantisse von der IEEE-754-Darstellung des Doppelten nehmen könnte.

    
MaiaVictor 17.11.2014, 03:43
quelle

3 Antworten

7

Nutzen Sie ESAs Math.clz32 (n) um zählen führende Nullen einer 32-Bit-Ganzzahl:

%Vor%
    
le_m 15.03.2017, 00:32
quelle
2

Leider würden Sie ein Äquivalent der C-Funktion frexp benötigen. Das Beste, was ich finden konnte, ist in JSFiddle , und der Code verwendet Math.pow .

Es gibt ein paar Alternativen, die Sie mit realen Daten vergleichen könnten, zusammen mit Ihrem aktuellen Versuch:

  1. Beginnen Sie bei 1.0, multiplizieren Sie wiederholt mit 2.0, bis es größer oder gleich der Eingabe ist, und multiplizieren Sie mit 0.5, bis es kleiner oder gleich der Eingabe ist. Für Werte an den Enden des Doppelbereichs benötigen Sie eine spezielle Handhabung.
  2. Speichern Sie ein aufsteigendes Werte-Array mit allen exakten Potenzen von zwei im Doppelbereich und führen Sie eine binäre Suche durch.

Der erste ist wahrscheinlich am schnellsten, wenn Ihre Daten in der Nähe von 1,0 liegen. Der zweite benötigt bis zu 11 bedingte Zweige.

    
Patricia Shanahan 17.11.2014 14:24
quelle
1

Hier ist eine andere Alternative mit Benchmarks. Während beide vergleichbar zu sein scheinen, mag ich es, zu Fuß oder zur Decke zu gehen.

%Vor% %Vor%
    
bob 31.01.2016 06:23
quelle