日期:2014-05-20  浏览次数:20593 次

求PI的整数倍的正弦值的问题?
我想使用JAVA求正弦值,发现在调试的时候求PI的整数倍的正弦值的结果不是预期中的。(JDK版本1.5.0_15)
  代码如下:
  import java.lang.*;

public class TestAngle
{
  public static void main(String[] arguments)
  {
  if(arguments.length > 0)
  {
  double a = Double.parseDouble(arguments[0]);
  double b = Math.sin(a * Math.PI);
  System.out.println(" " + a + " sin value is " + b);
  }
  else
  {
  System.out.println("please input value!");
  }
  }
}
  我在命令行中输入参数0或者0.5等数字的时候,显示的结果正确,但是输入1的时候计算结果是1.2246467991473532E-16,数学中PI的正弦值应该是0,为什么出现这样的结果?
   


------解决方案--------------------

------解决方案--------------------
1.2246467991473532E-16 和 0
有区别吗???已经非常接近了

造成这个的原因是,Math.sin中应该使用了 double 类型
而 double 是一个不精确的类型,在运算时很有可能出现近似值

至于为什么出现近似值,以前听过解释,但现在忘了。。。。。。
------解决方案--------------------
造成这样的结果原因有两个:

1,Math.PI 并不是一个非常精确的 pi 值,而是一个双精度浮点类型的值,与数学上的 pi
还是差那么一丁点的;

2,Math.sin 的运算方式,这个方法采用第三方类库实现的,是个本地方法,源代码看不到,
估计是根据迭代法计算出来的,因为在迭代法中两次的计算结果小于一个最小值的话
就作为结果返回了。

由于 Math.PI、Math.sin 并非进行精确计算的,再加上数学意义上不精确的 double 类型,
所以导致的结果是不精确的,这是必然现象。
------解决方案--------------------
的确象3楼说的那样,我没考虑全
------解决方案--------------------
如三楼所言

计算机并不能精确地表示现实中的数据,对于double,float等的表示不是精确的,你的PI本来就不是精确值,而Math.sin的对double类型的运算也不是完全意义上的精确,所以才会出现这样的偏差

但是,一般对于数学运算,都会有一个误差范围,只要在这个范围之内就算是计算正确,对于计算机的零值,好像是1.6r的负多少次方我忘了,只要误差小于这个数,就认为结果是0
------解决方案--------------------
探讨
造成这样的结果原因有两个:

1,Math.PI 并不是一个非常精确的 pi 值,而是一个双精度浮点类型的值,与数学上的 pi
还是差那么一丁点的;

2,Math.sin 的运算方式,这个方法采用第三方类库实现的,是个本地方法,源代码看不到,
估计是根据迭代法计算出来的,因为在迭代法中两次的计算结果小于一个最小值的话
就作为结果返回了。

由于 Math.PI、Math.sin 并非进行精确计算的,再加上数学意义上不精…