度数的cos与等效弧度的cos不匹配

时间:2010-09-19 12:57:32

标签: javascript math radians

JavaScript中的所有数学函数都使用弧度代替度。 然而,他们要么不平等,要么我偏离基础。

从度数到弧度的转换是:

var rad = angle * Math.PI / 180

90度角equals 1.57079633弧度

90度角的余弦equals 0 余弦为1.57079633弧度equals -3.20510345×10-9。

请注意,在Javascript中,所有操作都是一步完成的,以避免舍入错误:

var cos = Math.cos(angle * Math.PI / 180);

我显然在这里遗漏了一些明显的东西,但男孩却搞砸了代码。

6 个答案:

答案 0 :(得分:11)

  

一切都在一步完成,以避免舍入错误

如何避免舍入错误?它只是意味着舍入错误在单独的变量中不可用,这就是全部。

pi的 true 值无法准确表示为浮点数,因此pi / 2的真值也不能。所以你不能给Math.cos得到0所需的确切值。但是嘿--10 -9 非常非常小的数字。这意味着如果你画了一条长10,000公里的线,你最终会偏离相关轴1厘米。

这正是处理浮点数时应该期待的事情。不要与平等进行比较 - 在​​一定的容忍度内进行比较。

答案 1 :(得分:1)

总会出现舍入错误。并且浮点数在数学上并不准确,它只能精确到一定数量的有效数字。

更改代码,以便在错误达到1/1000000000时不会“搞砸”。

答案 2 :(得分:1)

对于我们大多数人在计算机上执行严重的总计0 IS 等于-3.20510345×10 ^ -9到您在使用浮点时有权期望的任何合理程度的准确度数字。这是SO上定期讨论的主题。

答案 3 :(得分:1)

是的,你只是丢失了类型转换的数据。

以弧度为单位的90度并不等于1.57079633。如果有更多小数位,那将按预期直接转换回来。

你总是要小心这样的事情。如上所述,10 ^ -9足够接近于零。

也取自MSDN

  

此外,由于Double类型的精度损失,使用Double值的算术和赋值操作的结果可能会因平台而略有不同。例如,在32位和64位版本的.NET Framework中,分配文字Double值的结果可能不同。下面的示例说明了将文字值-4.42330604244772E-305和值为-4.42330604244772E-305的变量分配给Double变量时的差异。请注意,在这种情况下,Parse(String)方法的结果不会损失精度。

答案 4 :(得分:0)

在计算机中,π/ 2弧度不能完全等于90度,因为π是无限长的数。因此,除非计算机是∞位,否则不能指望用π进行完美的预测。

答案 5 :(得分:-3)

我刚刚意识到:

-3.20510345×10-9与-0.00000000320510345相同,非常接近于零。

谷歌转换为弧度是四舍五入的,而这种舍入会导致错误。

我的猜测是因为数字缺乏精确性而臭名昭着的Javascript也会产生不正确的弧度,因此它的cosign就不用了。

不知道如何解决这个问题 - 舍入是不可接受的,因为这对其他角度不起作用。