一尘不染

四舍五入到给定基数的最接近整数次幂

algorithm

我正在尝试将数字四舍五入到另一个数字的下一个最小幂。我并不确定在哪个方向上取整,但是如果可能的话,我更喜欢向下取整​​。

x我要舍入的数字将满足:x > 0,并且通常在range内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))
}

任何帮助,将不胜感激!


阅读 237

收藏
2020-07-28

共1个答案

一尘不染

您有正确的想法;对于任何基数x,x ^ floor( log_x(n) )就是您想要的。(其中log_x表示’log to the base 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)

2020-07-28