【问题标题】:cos of degrees not matching the cos of equivalent radians度数的 cos 与等效弧度的 cos 不匹配
【发布时间】:2014-03-07 23:39:50
【问题描述】:

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

度到弧度的转换是:

var rad = angle * Math.PI / 180

90度角equals1.57079633弧度

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

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

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

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

【问题讨论】:

    标签: javascript math radians


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 218k!?没注意,上次见你10k了!
    • 这是 Jon Skeet 认为值得回答的第一个问题。
    • Jon 提到的容差在正式论文中通常被称为 epsilon
    • @MrBell:嗯,我通常使用“epsilon”来表示最小的可表示增量(例如msdn.microsoft.com/en-us/library/system.double.epsilon.aspx),它不一定与您要表达的容差相同。但这可能只是我。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        同样取自MSDN

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            我才意识到:

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

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

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

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

            【讨论】:

            • 我不认为 JS 比其他任何使用浮点运算的东西更“因缺乏数字精度而臭名昭著”。此外,如果您将其添加为问题的编辑而不是将其作为答案发布,那会更好。
            • 当我开始写它作为答案时,没有其他答案。它确实回答了这个问题 - 如果我将它添加为编辑,人们会抱怨没有有效的问题。
            猜你喜欢
            • 1970-01-01
            • 2012-03-31
            • 2016-05-13
            • 1970-01-01
            • 2013-09-25
            • 2022-11-11
            • 2022-01-18
            • 1970-01-01
            相关资源
            最近更新 更多