万有引力定律 - 操作顺序

Universal law of gravitation - order of operations

我正在 JavaScript 中进行一些 N 体模拟。正如我所料,它是 运行,但我注意到了一些奇怪的事情。模拟使用 verlet 积分器,累积力的函数具有以下行:

force.length = (this.gravity * pa.mass * pb.mass) / dist * dist;

正如我所说,模拟按预期工作,但代码实际上不应该是这样的:

force.length = (this.gravity * pa.mass * pb.mass) / (dist * dist);

距离平方的运算顺序在哪里是正确的?当我以这种方式进行模拟时,模拟就会崩溃。有点奇怪,错误的方法可以正常工作,或者似乎可以。任何人都知道问题是什么?完整代码和 运行 示例在这里:

https://gist.github.com/arctwelve/ca5868f80d0b0cd5791e http://bl.ocks.org/arctwelve/ca5868f80d0b0cd5791e

TIA

解读

force.length = (this.gravity * pa.mass * pb.mass) / dist * dist;

force.length = ((this.gravity * pa.mass * pb.mass) / dist) * dist;

除法运算符和乘法运算符具有相同的运算符优先级,它们分组left-to-right。因此你的表达是有效的

force.length = this.gravity * pa.mass * pb.mass;

我想您可能对模拟的工作方式抱有期望。

在你的代码中,var dist = vect.x * vect.x + vect.y * vect.y; 实际上是将 dist 设置为 距离的平方 ,所以 force.length = (this.gravity * pa.mass * pb.mass) / dist; 应该给你正确的结果。