2010-04-24 55 views
4

我試圖將一個數字舍入到另一個數字的下一個最小功率。我並不特別指出它朝哪個方向發展,但如果可能的話,我更喜歡向下。四捨五入到給定基地的最接近的整數功率

我四捨五入的數字x將滿足:x > 0,並且通常在0 < x <= 1範圍內。只有很少會超過1.

更一般地說,我的問題是:給定一個數x,我怎麼能四捨五入到最接近的一些基地的整數功率b

我希望能夠繞過任意的基礎,但我最關心的是基數2和2的分數冪,如2 ^(1/2),2 ^(1/4)等等。這是我目前的基數爲2的算法。

double roundBaseTwo(double x) 
{ 
    return 1.0/(1 << (int)((log(x) * invlog2)) 
} 

任何幫助,將不勝感激!

回答

6

你有正確的想法;對於任何基地x,x^floor(log_x(n))是你想要的。 (凡log_x代表 '登錄到基地X')
在C#:

static double roundBaseX(double num, double x) 
{ 
    return Math.Pow(x, Math.Floor(Math.Log(num, x))); 
} 

如果你不能把對數爲任意的基礎上,只需使用公式:log_x(n) = log(n)/log(x)

+0

謝謝!這正是我正在尋找的。你會碰巧知道是否有更快的方式做,或者我堅持這樣做?我正在考慮爲普通值做一個查找表,因爲這是在我的主循環中非常頻繁地計算的。 – 2010-04-25 06:38:12

+1

不客氣。 :)關於加快速度,我認爲查找表可以做的很好。如果你可以將你的基數的所有能力存儲在一個數組中(即足夠覆蓋你需要的整個範圍),那麼只需要一個簡單的二進制搜索來做四捨五入。當然,你需要使用一個這樣的陣列用於你使用的每個基地。 – tzaman 2010-04-25 11:48:14