繁体   English   中英

JavaScript中的浮点数精度或算法错误

[英]Floating point number precision or algorithmic error in JavaScript

我试图使用旋转矩阵在JavaScript中实现围绕点的旋转,但是由于某种原因,我得到了一些意外的结果-我的图形不是沿着一个点移动,而是沿着一条线移动。 在这里,我提供了完全可复制的示例,该示例演示了旋转点和中心之间的旋转距离发生变化之后的情况。 这里是:

var alpha = 0.10146071845187077;
var cos_ = Math.cos(alpha);
var sin_ = Math.sin(alpha);
var center = [4861165.687852355,7606554.432771027];
var pointBefore = [4847712.770874163, 7610682.032298427];
var dist1, dist2, x1, y1, x2, y2, pointAfter = [];
// 1. substract + 2. rotate + 3. get back
// 1.
x1 = pointBefore[0] - center[0];
y1 = pointBefore[1] - center[1];
// 2.
x2 = cos_ * x1 - sin_ * y1;
y2 = sin_ * x1 + cos_ * y1;
// 3.
pointAfter[0] = x2 + center[0];
pointAfter[1] = y2 + center[1];
// Check distances
dist1 = Math.sqrt(Math.pow(x1, 2) + Math.pow(y1, 2));
dist2 = Math.sqrt(Math.pow(pointAfter[0] - center[0], 2) + 
        Math.pow(pointAfter[1] - center[1], 2));
console.log(JSON.stringify({dist1: dist1, dist2: dist2}));
// -> {"dist1":14071.888753138577,"dist2":14071.88875313881}

希望我在数学上犯了一些错误,但看不到它们。

不准确性是由于以下事实造成的: 浮点数的存储方式: 浮点数学运算是否被破坏?

基本上,不可能在64位固定空间中存储无理数和高精度实数,因此舍入误差会在许多操作后变得很明显。 考虑数字2/3,无论精度如何,您都无法准确表示它。

一种可能的解决方案是仅在可能时使用整数进行计算,或者在每次操作后对结果进行取整。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM