我正在尝试将数字四舍五入到另一个数字的下一个最小幂。我并不确定在哪个方向上取整,但是如果可能的话,我更喜欢向下取整。
x我要舍入的数字将满足:x > 0,并且通常在range内0 < x <= 1。很少会高于1。
x
x > 0
0 < x <= 1
更笼统地说,我的问题是: 给定一个数字x,如何将其四舍五入到某个基数的最接近的整数次幂b?
b
我希望能够四舍五入为任意基数,但目前我最关注的基数是2和2的小数次幂,例如2 ^(1/2),2 ^(1/4)和等等。这是我当前基于2的算法。
double roundBaseTwo(double x) { return 1.0 / (1 << (int)((log(x) * invlog2)) }
任何帮助,将不胜感激!
您有正确的想法;对于任何基数x,x ^ floor( log_x(n) )就是您想要的。(其中log_x表示’log to the base x ‘) 在C#中:
x ^ floor( log_x(n) )
log_x
static double roundBaseX(double num, double x) { return Math.Pow(x, Math.Floor(Math.Log(num, x))); }
如果您不能将对数取到任意基数,请使用以下公式: log_x(n) = log(n) / log(x)
log_x(n) = log(n) / log(x)