c/c++ 로 로그 베이스(2)를 쓰는 방법
log(base 2) 함수를 쓸 수 있는 방법이 있습니까?
C 언어에는 2개의 기능이 내장되어 있습니다. -- > >
1.log
기본 e입니다.
2.log10
베이스 10;
하지만 2번 베이스의 로그 기능이 필요합니다.계산법
간단한 계산:
log2 (x) = logy (x) / logy (2)
여기서 y는 무엇이든 될 수 있으며, 표준 로그 함수의 경우 10 또는 e 중 하나입니다.
C99에는 (또한log2f
그리고.log2l
플로트 및 롱 더블).
log2(int n) = 31 - __builtin_clz(n)
적분 결과를 찾고 있는 경우 값에서 설정된 가장 높은 비트를 확인하고 해당 위치를 반환하기만 하면 됩니다.
#define M_LOG2E 1.44269504088896340736 // log2(e)
inline long double log2(const long double x){
return log(x) * M_LOG2E;
}
(배수는 나눗셈보다 빠를 수 있습니다)
uint16_t log2(uint32_t n) {//but truncated
if (n==0) throw ...
uint16_t logValue = -1;
while (n) {//
logValue++;
n >>= 1;
}
return logValue;
}
기본적으로 Tomlogic과 동일합니다.
위의 답변은 모두 정답입니다.아래 답변은 누군가가 필요로 할 때 도움이 될 수 있습니다.저는 C를 사용하여 해결하고 있는 많은 질문에서 이 요구사항을 보았습니다.
log2 (x) = logy (x) / logy (2)
다만, C 언어를 사용하고 있는 경우에, 결과를 정수로 하는 경우는, 다음을 사용할 수 있습니다.
int result = (int)(ceil(log(x) / log(2)));
이게 도움이 됐으면 좋겠다.
고속화하려면 비트트위들링핵과 같은 룩업테이블을 사용할 수 있습니다(정수 log2 한정).
uint32_t v; // find the log base 2 of 32-bit v
int r; // result goes here
static const int MultiplyDeBruijnBitPosition[32] =
{
0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31
};
v |= v >> 1; // first round down to one less than a power of 2
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
r = MultiplyDeBruijnBitPosition[(uint32_t)(v * 0x07C4ACDDU) >> 27];
또, 다음과 같은 컴파일러 내장 메서드에 대해서도 설명합니다._BitScanReverse
하드웨어로 완전히 계산될 수 있기 때문에 더 빠를 수 있습니다.
또한 중복될 수 있는 C++의 정수 log2()를 살펴봅니다.
log2(x) = log10(x) / log10(2)
가장 중요한 비트의 위치에만 수학 라이브러리가 없는 마이크로 컨트롤러가 필요했습니다.나는 양의 정수 값 인수에 대해 2^n 값 사이의 선형 근사치를 사용하는 것 만으로도 잘 작동한다는 것을 알았다.코드는 다음과 같습니다.
uint16_t approx_log_base_2_N_times_256(uint16_t n)
{
uint16_t msb_only = 0x8000;
uint16_t exp = 15;
if (n == 0)
return (-1);
while ((n & msb_only) == 0) {
msb_only >>= 1;
exp--;
}
return (((uint16_t)((((uint32_t) (n ^ msb_only)) << 8) / msb_only)) | (exp << 8));
}
메인 프로그램에서는 N * log2(N) / 2의 정수 결과를 계산해야 했습니다.
온도 = ((uint32_t) N) * 약_log_base_2_N_times_256) / 512;
16비트 값 모두 2% 이상 꺼지지 않았습니다.
http://en.wikipedia.org/wiki/Logarithm에 기재된 바와 같이:
logb(x) = logk(x) / logk(b)
즉, 다음과 같습니다.
log2(x) = log10(x) / log10(2)
math.h(C) 또는 cmath(C++)를 포함해야 합니다.물론 우리가 알고 있는 수학을 따라야 합니다.숫자만>0 입니다.
예:
#include <iostream>
#include <cmath>
using namespace std;
int main(){
cout<<log2(number);
}
기초 수학 코스를 참고하세요.log n / log 2
당신이 선택하든 말든 상관없습니다.log
또는log10
이 경우로 나누면log
새로운 기지가 통할 거야
Ustaman Sangat의 개량형
static inline uint64_t
log2(uint64_t n)
{
uint64_t val;
for (val = 0; n > 1; val++, n >>= 1);
return val;
}
언급URL : https://stackoverflow.com/questions/3064926/how-to-write-log-base2-in-c-c
'programing' 카테고리의 다른 글
jar 내에서 리소스 파일 읽기 (0) | 2022.07.11 |
---|---|
구성 요소의 vuex 작업에서 상태 데이터를 반환하는 방법 (0) | 2022.07.11 |
Vue.js의 vuex 스토어에서 참조되는 이미지에 링크하는 중 (0) | 2022.07.11 |
Best practices to sync the client side vuex state to the server side state? (0) | 2022.07.11 |
선택한 Vue 옵션 선택 (0) | 2022.07.11 |