javascript - 我应该创建一个标量/数字类来防止浮点错误吗?

标签 javascript performance floating-point game-physics

我正在用 JavaScript 编写一个物理引擎,但是我遇到了很多浮点错误问题。我找到了解决方案,但不知道是否应该使用它。 我的想法是创建一个像这样的标量类:

function Scalar(value){
    this.value = Math.round(value * 1000000)/1000000;
}
Scalar.prototype.add = function(another){
    // Scalar class rounds the values so no floating point errors occur
    return new Scalar(this.value + another.value);
}
// sub, div, mul, ...

每次执行操作时,都会将值舍入为不太精确的值,以防止出现浮点错误。这会加快我的编程速度,但是即使性能也是一个问题,这会是一个好的解决方案吗?

最佳答案

您的 Scalar 类给出的结果比 Javascript 数字的正常实现要低得多。您说“防止浮点舍入误差”,但在大多数情况下它会增加浮点舍入误差,并且会破坏小数字。例如,普朗克常数为 6.62607004 × 10-34 m2 kg/s。当您尝试将其存储在您的类型中时会发生什么?

Javascript 数字的底层表示形式,即 IEEE 754 64 位二进制浮点,给出的结果误差约为 253 分之一,或大约 1015.9 分之一>。您不太可能处理经过如此精确测量的输入。它的震级范围为 10-308 到 10308。这个范围足够宽,能够存储质子的质量(以克为单位)和可观测宇宙的质量(以克为单位)。

它最重要的限制是在具有精确终止小数扩展的分数(例如以美元和美分表示的货币)具有特殊意义的情况下。这些分数在物理学中没有特殊意义。

这确实是一种非常非常适合物理计算的数据类型。

关于javascript - 我应该创建一个标量/数字类来防止浮点错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48247545/

相关文章:

c# - 在 C# for Unity 中非阻塞加载和复制大型 Texture2D

c - 移动所有线程以使用其他 CPU 核心,以便一个线程可以使用其他 CPU 核心?

python - 在Python程序中查看 float 的真实值

javascript - Node.js 如何知道何时退出?

javascript - 如何知道从哪个DOM触发事件

javascript - 我想在不刷新页面的情况下提交我的联系人

javascript - 如何使用angularjs显示文件上传的进度条

c# - .NET:从动态程序集中访问非公共(public)成员

python - 你如何获得浮点序列中的下一个值?

c++ - 为什么没有无符号浮点类型?