Heim > Backend-Entwicklung > C++ > Wie berechnet man Log2 für ganzzahlige Werte in C genau?

Wie berechnet man Log2 für ganzzahlige Werte in C genau?

Mary-Kate Olsen
Freigeben: 2024-11-15 16:13:02
Original
501 Leute haben es durchsucht

How to Accurately Compute Log2 for Integer Values in C  ?

Korrekte Methode zur Berechnung von Log2 in C für Ganzzahlwerte

In C-Standardbibliotheken gibt es nur die Log-Methode für Gleitkommazahlen. Die Protokollmethode wird jedoch häufig verwendet, um die Ebene eines Index in einem Binärbaum mithilfe der Formel floor(2log(index)) zu ermitteln.

Ein gängiger Ansatz ist die Verwendung von int targetlevel = int(log(index)/log(2)). Dieser Ansatz kann jedoch zu Rundungsfehlern für Kantenelemente (Elemente mit dem Wert 2^n) führen, was dazu führt, dass n-1,999999999999 anstelle des erwarteten n,0 zurückgegeben wird.

Lösung für eine genaue Log2-Berechnung

Um dieses Problem zu beheben und eine genaue Log2-Berechnung für ganzzahlige Werte sicherzustellen, ist die Verwendung des BSR-Befehls (Bit Scan Reverse) ein besserer Ansatz. bsr ist auf x86- und x86-64-Plattformen verfügbar und gibt die Position des höchsten gesetzten Bits in einer vorzeichenlosen Ganzzahl zurück. Dies entspricht log2() für positive ganze Zahlen.

Hier ist ein optimierter C-Codeausschnitt, der die BSR-Anweisung nutzt:

#include <stdint.h>

static inline uint32_t log2(const uint32_t x) {
  uint32_t y;
  asm ( "\tbsr %1, %0\n"
      : "=r"(y)
      : "r" (x)
  );
  return y;
}
Nach dem Login kopieren

Dieser Code verwendet Inline-ASM, um die BSR-Anweisung effizient und effizient aufzurufen Bietet präzise log2-Berechnungen für ganze Zahlen.

Das obige ist der detaillierte Inhalt vonWie berechnet man Log2 für ganzzahlige Werte in C genau?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage