>  기사  >  백엔드 개발  >  C에서 정수 값에 대한 Log2를 정확하게 계산하는 방법은 무엇입니까?

C에서 정수 값에 대한 Log2를 정확하게 계산하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-15 16:13:02425검색

How to Accurately Compute Log2 for Integer Values in C  ?

C에서 정수 값에 대한 Log2를 계산하는 올바른 방법

C 표준 라이브러리에는 부동 소수점에 대한 로그 방법만 있습니다. 그러나 로그 방법은 Floor(2log(index)) 공식을 사용하여 이진 트리에서 인덱스 수준을 찾는 데 자주 사용됩니다.

일반적인 접근 방식은 int targetlevel = int(log(index)/log(2))를 사용하는 것입니다. 그러나 이 접근 방식은 가장자리 요소(값이 2^n인 요소)에 대한 반올림 오류로 이어질 수 있으며, 결과적으로 예상 n.0이 반환되는 대신 n-1.999999999999가 반환될 수 있습니다.

정확한 Log2 계산을 위한 솔루션

이 문제를 해결하고 정수 값에 대한 정확한 log2 계산을 보장하려면 더 나은 접근 방식은 다음과 같습니다. bsr(비트 스캔 역방향) 명령을 활용합니다. bsr은 x86 및 x86-64 플랫폼에서 사용할 수 있으며 부호 없는 정수로 가장 높은 세트 비트의 위치를 ​​반환합니다. 이는 양의 정수에 대한 log2()와 동일합니다.

다음은 bsr 명령어를 활용하는 최적화된 C 코드 조각입니다.

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

이 코드는 인라인 ASM을 사용하여 bsr 명령어를 효율적으로 호출하고 정수에 대한 정확한 log2 계산을 제공합니다.

위 내용은 C에서 정수 값에 대한 Log2를 정확하게 계산하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.