它一直以來我寫純C很長一段時間,所以這裏是在C++(我想唯一的區別是輸出功能,所以你應該能夠遵循它):
#include <iostream>
using namespace std;
const static double CUTOFF = 1e-10;
double log2_aux(double x, double power, double twoToTheMinusN, unsigned int accumulator) {
if (twoToTheMinusN < CUTOFF)
return accumulator * twoToTheMinusN * 2;
else {
int thisBit;
if (x > power) {
thisBit = 1;
x /= power;
}
else
thisBit = 0;
accumulator = (accumulator << 1) + thisBit;
return log2_aux(x, sqrt(power), twoToTheMinusN/2.0, accumulator);
}
}
double mylog2(double x) {
if (x < 1)
return -mylog2(1.0/x);
else if (x == 1)
return 0;
else if (x > 2.0)
return mylog2(x/2.0) + 1;
else
return log2_aux(x, 2.0, 1.0, 0);
}
int main() {
cout << "5 " << mylog2(5) << "\n";
cout << "1.25 " << mylog2(1.25) << "\n";
return 0;
}
函數「mylog2」做一些簡單的日誌掛羊頭賣狗肉,以獲得相關的數字爲1和2之間,然後調用log2_aux與該號碼。
log2_aux或多或少遵循Scorpi0鏈接到上面的算法。在每一步,你會得到1比特的結果。當你有足夠的位時,停止。
如果你能得到一份副本,費曼物理23號講座首先對日誌做一個很好的解釋,然後或多或少的去做這個轉換。非常優於維基百科的文章。
該問題的+1。我只用100作爲輸入,然後返回30.方法不完整。 – 2011-04-18 09:53:49
維基百科上有一個算法http://en.wikipedia.org/wiki/Binary_logarithm – 2011-04-19 06:44:57