JavaScript中的三角函数无法正常工作?

4
我不明白为什么在JavaScript中使用三角函数时会得到一些非常奇怪的值。例如:
Math.sin(Math.PI); // returns 1.2246467991473532e-16, but should return 0
Math.cos(Math.PI/2); // returns 6.123233995736766e-17, but should return 0
Math.sin(3.14); // returns 0.0015926529164868282, whitch is ok but
Math.sin(3.141592); // returns 6.535897930762419e-7!

我在Mozilla和Chrome中尝试了这个,得到了相同的结果。这似乎是三角函数参数过于精确的原因。
请帮忙!

1
1.22e-16非常接近于零:确切地说,它是0.000000000000000122。由于Math.PI不是PI的完美表示,因为PI是无限的,不能包含在任何变量中,所以你总是会得到一个近似值。 - DarkerIvy
哦,我没有看到 e-16 ,所以我以为答案是错的。谢谢 @Darkerlvy。 - Nejc Jezersek
没问题。归根结底,浮点数非常精确 - 如此精确,以至于它们甚至可以显示自己的不完美之处。 - DarkerIvy
将错误放入上下文中,就像测量地球的周长,并且误差小于一个原子的大小。 - Blindman67
1个回答

1
您可以使用Number.EPSILON,并计算值与期望值的绝对差,检查它是否小于Number.EPSILON。如果为true,则该值的误差小于浮点运算可能存在的误差,Number.EPSILON表示大于1的最小浮点数与1之间的差。

console.log([
    [Math.sin(Math.PI), 0], 
    [Math.cos(Math.PI/2), 0],
    [Math.sin(3.14), 0.0015926529164868282],
    [Math.sin(3.141592), 6.535897930762419e-7]
].map(([a, b]) => Math.abs(a - b) < Number.EPSILON));

关于浮点数值的有限数字表示问题,以下是更多阅读资料:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接