代码之家  ›  专栏  ›  技术社区  ›  SamGoody

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

  •  5
  • SamGoody  · 技术社区  · 15 年前

    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 回复  |  直到 12 年前
        1
  •  11
  •   Jon Skeet    15 年前

    为了避免舍入误差,每一步都要完成。

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

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

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

        2
  •  1
  •   Matti Virkkunen    15 年前

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

    更改您的代码,使其不会在出现1/100000000的错误时“出错”。

        3
  •  1
  •   High Performance Mark    15 年前

    对于我们大多数人来说,在电脑上做大量的计算0 等于-3.20510345_ 10^-9,精确到您在处理浮点数时有权预期的任何合理程度。这是一个经常讨论的话题。

        4
  •  1
  •   Jason Plank Maksim Kondratyuk    14 年前

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

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

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

    也取自 MSDN :

    此外,由于双精度类型的精度损失,双精度值的算术运算和赋值运算的结果可能因平台而异。例如,在.NET框架的32位和64位版本中,指定文本双精度值的结果可能不同。以下示例说明了当文字值-4.4233060444772E-305和值为-4.4233060444772E-305的变量分配给双变量时的差异。注意,在这种情况下,parse(string)方法的结果不会受到精度损失的影响。

        5
  •  0
  •   Anonymous    12 年前

    在计算机中,/2弧度 不能 正好等于90度,因为是一个无限长的数字。因此,除非计算机是位的,否则人们不能期待完美的预言。

        6
  •  -3
  •   SamGoody    15 年前

    我刚刚意识到:

    -3.205100345_10-9与-0.00000000320510345相同,非常接近于零。

    谷歌对弧度的转换是四舍五入的,四舍五入会导致错误。

    我的猜测是,众所周知的是,javascript缺少数字的精确性,它也创建了一个不正确的弧度,因此它的cosign是远远不够的。

    但我不知道该如何解决这个问题——四舍五入是不可接受的,因为这对其他角度是行不通的。