2013-04-05 3 views
1

문제가 자연 로그 눈금이있는 프로그램에서 작업하고 있습니다.분수 자료의 정수 로그

지금까지 unsigned int log2(uint64_t) (C/C++에서), found here의 멋진 구현으로 기본 2를 사용하고 있습니다.

그러나 기본 2가 내 문제에 너무 많은 것으로 나타났습니다. 예를 들어 소수점 이하 기준을 사용해야합니다. 3/2.

누구나 이런 종류의 작업에 대한 구현을 알고 있습니까?

내 현재 해결 방법은 round(log(x)/log(base))입니다. 여기서 round는 정수를 반환하지만 최소한 두 번의 로그 평가를 피하기 위해 호핑되었습니다.

답변

2

log(base)은 상수이기 때문에 한 번 평가하고 그 값을 역수로 사용하십시오 (값 비싼 나누기가 아닌 곱셈으로 바꿈).

const float k = 1.0f/log(base); // init constant once 

y = round(log(x) * k); // each evaluation only requires one log, 
         // one multiply and one round