1

可能的重复:
JavaScript 的数学被破坏了吗?

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

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

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

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

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

我明白了45.00000000000001

我知道这是一个非常非常小的差异,但这会阻止我检查两个向量之间的角度是否为 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,但是由于我对如何在较低级别上实现数学函数完全不了解,我真的很好奇哪些因素可能导致两个计算应该给出完全相同的值来导致结果略有不同的东西。

4

0 回答 0