C 四舍五入到给定值的最近倍数

C 四舍五入到给定值的最近倍数,c,math,C,Math,如果我们有一个任意的double值f,另一个v和一个乘法因子p,我如何将值f捕捉到最接近的vp的幂 例如: f=3150.0 v=100.0 p=2 乘法将是这样的 100(v) 200(乘以p) 四百 八百 1600 3200 f最接近3200.0,因此函数应返回3200.0 实际上,它有一个名字,我似乎已经忘记了,也许这就是为什么我找不到这样一个函数。让k=floor(log\u p(f/v))其中log\u p(x)=log(x)/log(p)是以p函数为底的对数。根据floor

如果我们有一个任意的
double
f
,另一个
v
和一个乘法因子
p
,我如何将值
f
捕捉到最接近的
v
p的幂

例如:

  • f=3150.0
  • v=100.0
  • p=2
乘法将是这样的

  • 100(
    v
  • 200(乘以
    p
  • 四百
  • 八百
  • 1600
  • 3200

f
最接近
3200.0
,因此函数应返回
3200.0


实际上,它有一个名字,我似乎已经忘记了,也许这就是为什么我找不到这样一个函数。

k=floor(log\u p(f/v))
其中
log\u p(x)=log(x)/log(p)
是以
p
函数为底的对数。根据
floor
log
的属性,可以得出
p^k v“最近的”是指绝对差值还是比率
log\u p(f/v)
应该让您知道在哪里查找。@dxiv该值应该被捕捉到最近的乘法。在本例中,该值为所列值之一(如果值舍入
log_p(f/v))
到最接近的整数
k
,那么您要查找的数字是
p^kv
。如果这不是您想要的,那么请提问并澄清。@dxiv什么是
log\u p
?如果这是一个函数名,在C中没有。或者它是在pThe上方的log。您可以将
log\u p(f/v)
计算为
log(f/v)/log(p)
。你的数学很好。我也需要学习所有这些。另外,你认为如何使用适当的术语编辑我的问题,以便更容易从他人那里找到和理解?如果你认为这很有用,以便其他人可以找到我的问题和你的答案。@Edenia这个问题写得很好,除了你打错了用“二的幂”代替“p的幂”。计算出的例子也有帮助,剩下的歧义是关于“最近的”是如何定义的,这是我无法猜测的。例如,
4
在线性意义上比
8
更接近
2
(因为
4-2<8-4
),但在乘法意义上与
2
8
相同(因为
4/2=8/4
)。因此我应该添加最近的(线性意义上)。或“最近的(最小距离意义上)”,这可能更容易理解。但是,在这种情况下,解决方案不是由
round
给出的,而是由
floor
ceil
中的一个给出的,它必须通过比较
f-p^k v
p^(k+1)v-f
的两个距离来选择。正确的解决方案似乎只有
round