我应该创建一个 Scalar/Number class 来防止浮点错误吗?
Should I create a Scalar/Number class for preventing floating point errors?
我正在 JavaScript 中编写一个物理引擎,但我遇到了很多浮点错误问题。我找到了解决方案,但不知道是否应该使用它。
我的想法是像这样制作一个标量 class:
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, ...
每次执行运算时,它都会将值四舍五入为不太准确的值,以防止出现浮点错误。这会加快我的编程速度,但这是否是一个好的解决方案,即使性能也是一个问题?
您的标量 class 将给出比 Javascript 数字的正常实现更不精确的结果。你说 "preventing floating point rounding error" 但在大多数情况下它会增加浮点舍入误差,并且会破坏小数字。例如普朗克常数为6.62607004×10-34m2kg/s。当您尝试将其存储在您的类型中时会发生什么?
Javascript 数字的基础表示,IEEE 754 64 位二进制浮点数,给出的结果在 253 中的一部分或大约一部分的误差在 1015.9。您不太可能处理已被测量到类似精度的输入。它在大约 10-308 到 10308 的幅度范围内这样做。这是一个足够宽的范围,能够存储以克为单位的质子质量和以克为单位的可观测宇宙质量。
它最重要的限制是在某些情况下,分数具有精确的终止小数扩展,例如美元和美分的钱,具有特殊意义。这些分数在物理上没有特殊意义。
真的是非常非常好的物理计算数据类型
我正在 JavaScript 中编写一个物理引擎,但我遇到了很多浮点错误问题。我找到了解决方案,但不知道是否应该使用它。 我的想法是像这样制作一个标量 class:
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, ...
每次执行运算时,它都会将值四舍五入为不太准确的值,以防止出现浮点错误。这会加快我的编程速度,但这是否是一个好的解决方案,即使性能也是一个问题?
您的标量 class 将给出比 Javascript 数字的正常实现更不精确的结果。你说 "preventing floating point rounding error" 但在大多数情况下它会增加浮点舍入误差,并且会破坏小数字。例如普朗克常数为6.62607004×10-34m2kg/s。当您尝试将其存储在您的类型中时会发生什么?
Javascript 数字的基础表示,IEEE 754 64 位二进制浮点数,给出的结果在 253 中的一部分或大约一部分的误差在 1015.9。您不太可能处理已被测量到类似精度的输入。它在大约 10-308 到 10308 的幅度范围内这样做。这是一个足够宽的范围,能够存储以克为单位的质子质量和以克为单位的可观测宇宙质量。
它最重要的限制是在某些情况下,分数具有精确的终止小数扩展,例如美元和美分的钱,具有特殊意义。这些分数在物理上没有特殊意义。
真的是非常非常好的物理计算数据类型