Math.cos不准确

时间:2011-04-14 13:16:09

标签: javascript math floating-point

alert(Math.cos(Math.PI/2));

为什么结果不准确为零?这是不准确的,还是一些实现错误?

3 个答案:

答案 0 :(得分:11)

Math.PI/2pi/2的实际值的近似值。取这个近似值的精确余弦不会产生零。您获得的值是此精确值的近似值,直到基础浮点数据类型的精度。

使用一些任意精度库,您可以评估双精度pi/2与精确值之间的差异

 0.0000000000000000612323399573676588613032966137500529104874722961...

由于余弦的斜率接近零,你会发现pi/2近似值的余弦近似等于这个差值,实际上它是。

答案 1 :(得分:2)

浮点数通常是近似值。由于浮点数在内存中表示为二进制数乘以指数,因此通常只能表示2幂的总和。

1/3之类的分数不能写为二进制数,因此没有准确的浮点表示。甚至一些可以用十进制精确编写的数字,例如0.1,也不能用二进制精确表示,因此不能在浮点中正确表示。

PI是一个无理数,不能表示为浮点数,因此会出现舍入错误。如果不包括容差参数,请不要将浮点数相等。 This link has a good explanation of the basics.

答案 2 :(得分:0)

比较计算出的相等浮点数几乎总是一个坏主意,因为(正如其他人所说)它们是近似值,并且出现错误。

不是检查== b,而是检查相等于适合您的应用程序的阈值,如Math.abs(a-b)< 0.00001。在任何将数字表示为浮点值的编程语言中,这都是一种很好的做法。

如果你将整数存储在浮点变量中,只是加,减和乘,它们将保持整数(至少在它们越界之前)。但是,使用trig函数等进行划分会引入必须允许的错误。

-m @