所以说我有这些变量:
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
应尽可能接近x
的2。我目前这样做的方法是插入数字并尝试让它们接近匹配。但我想知道以编程方式解决这个问题的通用方法。但是,例如,我可能会尝试插入x = 10
,它等于:
4000 = ((2000000 / 5) / 10) / 10
然后2¹⁰ = 1024
接近4000,但我不知道什么会更接近。尝试x = 11
给出:
3636 = ((2000000 / 5) / 10) / 11
和2¹¹ = 2048
,所以x = 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来查找值,但是必须有更好的方法。
你可以做一个iterative search:
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
对于其他关系,有更好的方法来选择下一个x
,但对于这个特殊问题,线性搜索看起来很好。