2008-11-05 127 views
9

將2或10的最接近的功率歸於另一個數字的最有效方法是什麼?例如如何計算2或10的最接近的冪數?

3.5將返回4爲2的冪和1的10

123功率將返回128爲2的冪和100的10

0.24功率將返回0.25的2和0.1功率爲10的力量

我只是尋找算法,不介意的語言。

+1

我倒覺得3.5應該是更接近到2^2比2^1 – EvilTeach 2008-11-05 01:10:02

+1

同樣,10^0 = 1應該接近3.5比10^1 = 10. – 2008-11-05 01:12:08

+0

感謝EvilTeach - 我已經糾正了這一點。 Adam - 我不確定你的評論是否正確,但是無論如何感謝 – 2008-11-05 01:15:23

回答

30
n^round(log_n(x)) 

其中log_n是以n爲底的對數。您可能需要修改round(),具體取決於您如何定義「nearest」。

注意log_n(x)可以被實現爲:

log_n(x) = log(x)/log(n) 

其中log是一個對數到任何方便的位置。

0

我認爲我可能解決這個問題,但使用對數底2和日誌基座10

的日誌10(123)是2.something。 發揮 的地板,然後提高10的權力,這應該讓你接近。

同樣的事情應該有底數的工作2.

的LOG 2(9)3.something 採取 的地板,然後提高對電力

你可能會四捨五入玩的日誌。

2

對於2的冪和> = 1,您可以看到您可以右移多少次。每次這是1的額外力量2你都帶走了。一旦你達到0你有你的號碼。

5

對於整數的2的冪,有一個聰明的技巧,包括將最後一個位複製到右側。然後,你只取決於你如何定義「最接近」不得不增加你的號碼,你有你的2

int NextPowerOf2(int n) 
{ 
    n |= (n >> 16); 
    n |= (n >> 8); 
    n |= (n >> 4); 
    n |= (n >> 2); 
    n |= (n >> 1); 
    ++n; 
    return n; 
} 
0

功率您可能需要修改圓()。

@Greg Hewgill的回答是正確的,除非它給你提供的例子過早。例如,10^round(log_10(3.5))== 10,而不是1.我假設這就是'你如何定義'最接近''的意思。

可能是使用格雷格的公式最簡單的方法,如果它是太高(或者太低X < 1),使用兩個下一個更低的功耗:

closest = n^round(log_n(x)) 

if (closest > x) { 
    other = closest/n 
} else { 
    other = closest * n 
} 

if (abs(other - x) < abs(closest - x)) { 
    return other 
} else { 
    return closest 
} 
相關問題