用于常见角度的Java中Math.sin()的准确性

时间:2018-03-26 07:40:21

标签: java performance double precision floating-accuracy

我有两种方法来计算sin(pi)的导数,它用于uni - 一种使用常见的数值微分公式,另一种我重写如下:

// h = 1e−16 (part of assignment)
// f'(x) ~= (f(x+h)-f(x))/h  for sin(x)
public static double differentiateSin(double x) {
    return (Math.sin(x+h)-Math.sin(x))/h;
}

// using trigonometry
public static double differentiateSin2(double x) {
    return (2* ( Math.sin(h/2) * Math.cos(x+h/2) ) )  /h;
}

我知道浮点数不能完全表示,更不用说pi了,令我惊讶的是,我用第二种方法获得了非常精确的结果,而第一种方法完全偏离轨道!

数学(cos(Math.pi))给出一个精确的-1.0,我想这没关系,这是一个共同的角度 - 但我无法弄清楚是什么在这些方法之间产生了这样的差异。有更多的操作,我没有摆脱罪和cos,但我得到了完美的结果。

同样使'h'更大可以得到更合理的结果......那里会发生什么?

0 个答案:

没有答案