6

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

从度到弧度的转换是:

var rad = angle * Math.PI / 180

90 度角等于1.57079633 弧度

90 度角的余弦等于0。1.57079633
弧度的余弦等于-3.20510345 × 10-9。

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

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

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

4

6 回答 6

12

一步完成,避免舍入错误

这如何避免舍入错误?这只是意味着舍入误差在单独的变量中不可用,仅此而已。

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

这正是您在处理浮点数时应该预料到的事情。不要与平等进行比较——在一定的容忍范围内进行比较。

于 2010-09-19T13:01:58.553 回答
1

总会有四舍五入的错误。无论如何,浮点在数学上并不准确,它只能精确到一定数量的有效数字。

更改您的代码,使其在出现 1/1000000000 左右的错误时不会“搞砸”。

于 2010-09-19T13:02:53.257 回答
1

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

于 2010-09-19T13:03:02.237 回答
1

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

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

您将始终必须小心处理此类事情。如上所述,10^-9 足够接近于零。

也取自MSDN

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

于 2010-09-19T13:10:58.260 回答
0

在计算机中,π/2 弧度不能完全等于 90 度,因为 π 是一个无限长的数。因此,除非计算机是 ∞ 位,否则不能期望 π 具有完美的精度。

于 2014-03-07T15:39:50.433 回答
-3

我才发现:

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

Google 对弧度的转换是四舍五入的,而该四舍五入会导致错误。

我的猜测是 Javascript,它因缺乏数字精度而臭名昭著,也会产生不正确的弧度,因此它的 cosign 是很远的。

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

于 2010-09-19T13:06:17.450 回答