Maison > développement back-end > C++ > 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
Libérer: 2024-11-22 10:23:10
original
819 Les gens l'ont consulté

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;
}
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal