代码之家  ›  专栏  ›  技术社区  ›  Sean_Codes

在一个数接近零之前,我能把它乘以小数/分数多少次

  •  1
  • Sean_Codes  · 技术社区  · 6 年前

    我在试着根据物体的速度来判断前方有多远的地方可以找到一个壁架。这样物体就可以停止加速,让摩擦停止。

    enter image description here

    问题

    每一步的摩擦力为0.9*HorizontalSpeed。

    当水平速度小于0.001时,我们将水平速度设置为0

    达到0.001需要多长时间是水平速度=1

    即时消息当前如何解决

    var horizontalSpeed = 1    
    var friction = 0.9
    var closeEnoughToZero = 0.001
    var distance = 0
    
    while(horizontalSpeed > closeEnoughToZero) {
        horizontalSpeed *= friction
        distance += horizontalSpeed
    }
    
    console.log(distance) // 8.99

    可能已经解决了我只是觉得这是一个有点野蛮的力量,可能是某种类型的数学函数,这是方便的!

    1 回复  |  直到 6 年前
        1
  •  2
  •   Jaromanda X    6 年前

    这里有一个“纯数学”解

    var horizontalSpeed = 1    
    var friction = 0.9
    var closeEnoughToZero = 0.001
    var distance = (horizontalSpeed * friction)/(1-friction)
    
    console.log(distance)

    或者,如果给定一个“接近于零”,也可以不用循环来完成

    var horizontalSpeed = 1    
    var friction = 0.9
    var closeEnoughToZero = 0.001
    var distance = 0
    
    // this is the power you need to raise "friction" to, to get closeEnoughToZero
    let n = Math.ceil(Math.log(closeEnoughToZero)/Math.log(friction)); 
    // now use the formula for Sum of the first n terms of a geometric series
    let totalDistance = horizontalSpeed * friction * (1 - Math.pow(friction, n))/(1-friction);
    console.log(totalDistance);

    我用 Math.ceil 属于 Math.log(closeEnoughToZero)/Math.log(friction) -在你的情况下是66。如果在代码中添加了循环计数器,则会看到循环执行66次

    而且,正如您所看到的,第二个代码产生的输出与循环完全相同。