如何舍入到另一个数的最近分数?

时间:2014-04-30 06:01:54

标签: c++ math numbers

我想添加一个特殊的缩放模式,它会捕捉到最接近的倍数。现在,扩大规模很好,它是线性的,如下所示:

 // f(x := 35, n := 32) = 32
 // f(x := 66, n := 32) = 64
 x = floor(x / n) * n

但是为了缩小规模,我想要某种逆指数:

 // f(x := 18, n := 32) = 16
 // f(x := 12, n := 32) = 8
 // f(x := 7, n := 32) = 4

不使用任何语言的循环的实现建议就足够了。我目前的实施如下(100%有效):

float ScaleMultiple(float value, float multiple) {
    if (value > multiple) {
        return(floor(value / multiple) * multiple);
    } else if (value < multiple) {
        do {
            multiple /= 2.0f;
        } while (value >= multiple);
        return(multiple);
    } else {
        return(value);
    }
}

multiple是一个正浮点数,不一定是2的倍数,至少等于1。 value是一个正浮点数,至少等于1.

2 个答案:

答案 0 :(得分:0)

32 / 18~ = 1.8~ = 2,你想要的结果是32/2,对吗?对于12和32的情况,这将产生3但不是4。为了到达那里,取该数字的log-2,将其四舍五入为偶数,然后转换回来。但是,当n不是2的幂时,这就存在无法正常工作的问题。

答案 1 :(得分:0)

您可以按如下方式获得Java中给出的值的正确结果:

int f = (int)Math.pow(2,(int)(Math.log(x)/Math.log(2)));

提供的信息不足以回答任意 n。

的问题