9

如果我理解正确,JavaScript 和 ActionScript 3 都适用于弧度。

因此,以下代码的预期输出将是:

Math.PI                 //Expected 3.141592653589793, got 3.141592653589793

Math.sin(0)             //Expected 0, got 0
Math.sin(Math.PI/2)     //Expected 1, got 1
Math.sin(Math.PI)       //Expected 0, got 1.2246063538223773e-16
Math.sin(Math.PI*3/2)   //Expected -1, got -1
Math.sin(Math.PI*2)     //Expected 0, got -2.4492127076447545e-16

Math.cos(0)             //Expected 1, got 1
Math.cos(Math.PI/2)     //Expected 0, got 6.123031769111886e-17
Math.cos(Math.PI)       //Expected -1, got -1
Math.cos(Math.PI*3/2)   //Expected 0, got -1.836909530733566e-16
Math.cos(Math.PI*2)     //Expected 1, got 1

这在 Firefox、Chrome、Safari 和 Flash Professional CS5.5 中的行为相同。我正在使用 Mac OS X 10.7.2。

测试:

http://jsfiddle.net/KA4VM/

4

5 回答 5

19

你看过你得到的价值吗?你期待 0,但你得到了类似的东西

0.00000000000000012246063538223773

这对你来说还不够接近零吗?

基本上,当您的输入不能表示为精确的二进制值时,您不应该期望二进制浮点运算完全正确 - pi/2 不能,因为它是不合理的。(即使输入可以精确地用二进制表示,如果输出不能精确地表达,你也不应该期望结果是准确的......)

于 2011-11-08T12:59:42.553 回答
3

考虑到这些误差都小于1e-15,大约是2**(-50),所以我们可以添加然后减去一个带有大小的数字2**3来对结果进行四舍五入。sin因此,如果我们选择 8 作为数字,我们可以重新定义cos如下:

function sin(x) {
  return Math.sin(x) + 8 - 8;
}

function cos(x) {
  return Math.cos(x) + 8 - 8;
}

这应该会消除错误,并且比toFixed方法更快。

于 2017-04-21T19:09:03.637 回答
2

Math.PI 不是 pi 的 100% 准确表示,仅仅是因为 pi 是无理数并且浮点数只能到此为止。

因此,由于舍入错误,您会得到非常小的数字(您的数字是 #.#####e-16 和 #.#####e-17,它们很小)。

您对此无能为力,只能接受 0.000000000000000006 足够接近 0。

于 2011-11-08T13:01:13.600 回答
2

因为 PI 是一个无理数(Real Number without beeing Rational,所以不可能用精确值来计算。就像 Jon Skeet 所说,Math-object 的三角函数只得到 PI 的近似值并返回一个近似值。如果返回零值对您的代码很重要,您必须将它们四舍五入。在这种情况下,为了方便起见,我通过自己的方法扩展了这些 Javascript 对象:

Math.Sin = function(w){         
    return parseFloat(Math.sin(w).toFixed(10));
};

现在,当你得到

Math.sin(Math.PI)

这个奇怪的结果

> 1.2246467991473532e-16

你得到了你所期望的

Math.Sin(Math.PI)
> 0

对其他三角函数做同样的事情:

Math.Cos = function(w){ 
    return parseFloat(Math.cos(w).toFixed(10));
};

等等。

于 2015-02-01T03:31:57.390 回答
1

所以你有 1.xxxx * 10^-16

这将是 0.0000000000000001xxx(小数点后十五个零)

我敢打赌,它足够接近于零,可以将其视为 0。

由于 pi 值的错误,您会得到那个无穷小的错误(正如您应该知道的,它在小数点后延伸到无限位)

不过,您没有提到您是否在 AS3 或 JavaScript 中获得此功能

于 2011-11-08T13:09:00.360 回答