0

所以说我有这些变量:

  • m是以位为单位的可用内存量
  • k是一个分割因子
  • j是另一个划分因子,作为单独的变量保存,而不是与k
  • x是我们要计算的值。
  • z是我们想要最接近的值2^x

然后我们有

let z = (((m / k) / j) / x)

例如,假设我们有这个:

  • m = 2000000
  • k = 5
  • j = 10
  • x = ?
  • z = ?

然后我们有

let z = ((2000000 / 5) / 10) / x

我想弄清楚x给出的内容z应该尽可能接近 2 的幂x。我目前这样做的方式是插入数字并尝试使它们接近匹配。但我想知道一种以编程方式解决这个问题的通用方法。但例如,我可能会尝试插入x = 10,这等于:

4000 = ((2000000 / 5) / 10) / 10

然后2¹⁰ = 1024是接近 4000,但我不知道会更接近。尝试x = 11给出:

3636 = ((2000000 / 5) / 10) / 11

并且2¹¹ = 2048x = 11还有一个更好的解决方案。

想知道如何以编程方式解决这个问题。我试图将方程式分解出来,但是自从我这样做以来已经有一段时间了,所以我不知道。

z = (((m / k) / j) / x)
x * z = (m / k) / j
j * (x * z) = m / k
k * (j * (x * z)) = m
...

现在有点迷茫,不知道如何做到这一点:

f(k, j) = ... => [ x, z ]

一般来说,我试图弄清楚如何以编程方式求解方程。仅仅看到一个实现就可以让我理解而不会使其过于宽泛。

我目前所做的基本上是进入调试器并输入一些 JavaScript 来查找值,但必须有更好的方法。

在此处输入图像描述

4

1 回答 1

1

您可以进行迭代搜索

x = 1
best_error = infinity
best_x = 0
while True:
   z = (((m / k) / j) / x)
   error = abs(z - pow(2,x))
   if error > best_error
      return best_x
   best_error = error
   best_x = x
   x = x+1

对于其他关系,有更好的选择 next 的方法x,但对于这个特定问题,线性搜索似乎很好。

于 2019-02-12T20:52:44.047 回答