Maison  >  Article  >  développement back-end  >  Comment calculer efficacement l'entier Log2 en C sans erreurs à virgule flottante ?

Comment calculer efficacement l'entier Log2 en C sans erreurs à virgule flottante ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-22 10:23:10706parcourir

How to Efficiently Calculate Integer Log2 in C   Without Floating-Point Errors?

Calcul Log2 entier en C

Développement de la question donnée, qui cherche une méthode pour effectuer une opération log2 entière en C sans rencontrer de flottant -problèmes d'approximation de points, nous explorons une solution. Les bibliothèques standard C ne fournissent pas d'implémentation entière de log, ce qui complique le calcul du niveau d'un index dans un arbre binaire à l'aide de log(index) / log(2).

Pour résoudre ce problème, la fonction ASM en ligne fournie utilise l'instruction bsr sur les plates-formes x86 ou x86-64. Cette instruction fournit la position du bit le plus élevé dans un entier non signé, ce qui équivaut à log2(). L'implémentation utilise la fonctionnalité ASM en ligne.

#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;
}

En tirant parti de cette méthode, vous pouvez déterminer avec précision le niveau de l'index dans l'arborescence binaire, même pour les éléments de bord où valeur = 2^n.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn