关于Math.sqrt在javascript中的精确度的奇怪行为

时间:2012-10-18 05:09:08

标签: javascript math vector precision

  

可能重复:
  Is JavaScript’s Math broken?

所以我正在研究一个js库来处理三维向量,我偶然发现了一个非常小的精度问题。首先,请参阅下面的代码:

var a = new vec3(1, 0, 0);
var b = new vec3(1, 1, 0).normalize();

我正在创建两个彼此正好成45°角的向量(我省略了vec3构造函数,因为我只是在那里做标准数学的东西)

现在你们知道2个3D矢量的点积产生它们的大小,角度的余弦相乘。但是当我这样做时:

alert(180 / Math.PI * Math.acos(a.dot(b)));

我得到45.00000000000001

我知道这是一个非常非常小的差异,但这会阻止我能够检查2个向量之间的角度是否为45°,以防我事先不知道,因为Math.acos(a.dot(b)) == Math.cos(Math.PI / 180 * 45)会结果为false

但是,如果我改变我的向量,这是一个有趣的事情:

var y = new vec3(Math.sqrt(2), Math.sqrt(2), 0).normalize();
var x = new vec3(Math.sqrt(2), 0, 0).normalize();

然后进行与上面相同的计算,它恰好给了我45个。

现在我知道我可以围绕那个45.00000000000001,但由于我完全不知道数学函数如何在较低级别实现,我真的很好奇哪些因素可能导致两个计算应该给出完全相同的值会导致稍微不同的东西。

0 个答案:

没有答案