我可以得到一个数字与另一个数字相乘的次数,直到达到一定限度:
var velocity = -5.706875;
var friction = 0.9925;
var limit = 0
var times = 0;
while (Math.floor(Math.abs(velocity)*10) > limit) {
velocity *= friction;
times += 1;
}
// times = 538
有没有办法让时间没有循环?
尝试Math.log(5.706875, 0.9925)
,但它给出了另一个结果。
答案 0 :(得分:2)
当然,你有:
times = Math.ceil(Math.log(-0.1/velocity)/Math.log(friction));
编辑:
实际上,考虑到limit
var,它将是:
times = Math.ceil(Math.log(-(0.1+limit/10)/velocity)/Math.log(friction));
答案 1 :(得分:0)
@lpg提供了正确的答案。澄清一下:
首先,Math.floor(Math.abs(velocity)*10) > 0
是说Math.abs(velocity) > 0.1
的迂回方式,因为您希望在v * 10
小于1时(或换句话说{{ {1}}小于0.1)。
所以我们可以从那开始。您的迭代过程不断将速度确定为v
,其中v = vi * f ^ n
是迭代次数,因此我们有:
n
我们希望求解abs(v * f ^ n) > abs(0.1)
的值,使双方都相等,使其成为阈值点。
在这种情况下,我们知道n
是肯定的,因为f ^ n
是肯定的,我们知道f
是否定的,所以v
等于{{1} }}
一步一步,我们可以做到:
abs(v * f ^ n)
此时,它只是一个简单的计算,根据需要进行四舍五入以计算最后一次迭代:
-v * f ^ n