Java 基于Maclaurin展开的Sin近似

Java 基于Maclaurin展开的Sin近似,java,performance,taylor-series,Java,Performance,Taylor Series,我正在尝试编写自己的代码来计算rad角的近似值。到目前为止,我只对一个特定的数字范围进行了研究,但对于像500左右这样的大数字,我的研究是失败的。 附加子问题:哪个更有效-通过Math.pow()计算幂,还是当前的方法-仅使用乘法运算符 private static double sin_range(double rad) { double sin_rad = rad; while (sin_rad > 2 * Math.PI) { sin_rad -=

我正在尝试编写自己的代码来计算rad角的近似值。到目前为止,我只对一个特定的数字范围进行了研究,但对于像500左右这样的大数字,我的研究是失败的。 附加子问题:哪个更有效-通过Math.pow()计算幂,还是当前的方法-仅使用乘法运算符

private static double sin_range(double rad) {
    double sin_rad = rad;

    while (sin_rad > 2 * Math.PI) {
        sin_rad -= 2 * Math.PI;
    }
    return sin_rad;
}

private static double approx(double rad, int err) {
    double rad_in_range = sin_range(rad);
    double sin = rad_in_range, r = rad_in_range;
    int previous = 1, factorial = 1;

    for (int i = 0; i < err; i++) {

        factorial = (factorial * (previous + 1) * (previous + 2));
        r *= rad * rad;
        if ((i & 1) == 0) { //even
            sin -= r / factorial;
        } else { //odd
            sin += r / factorial;
        }
        previous += 2;
    }

    return sin;
}

public static void main(String[] args) {
    double approximated = approx(15, 5);
    System.out.println(approximated + " = " + Math.sin(15));
}
专用静态双正弦范围(双rad){
双正弦弧度=弧度;
而(sin_rad>2*Math.PI){
sin_rad-=2*Math.PI;
}
返回sin_rad;
}
专用静态双精度近似值(双精度,整数误差){
双rad_in_范围=sin_范围(rad);
双正弦=半径在半径范围内,r=半径在半径范围内;
int-previous=1,阶乘=1;
for(int i=0;i
您是否尝试过使用
BigDecimal
,因为它们可以更好地处理十进制值。对于第二个问题,最好使用
Math.pow()
,本机方法总是经过优化(和更新)。我认为您的系列术语不正确。500! 确实是一个很大的数字。我想说,您应该限制术语的数量,以匹配IEEE双精度浮点数的精度。这些仅允许18位有效数字。正弦级数二次收敛。为什么要求500个条件?@duffymo我的意思是大约(500,5),而不是大约(5500)。我认为这个方法的问题只是纯粹的数学问题,sin图看起来像什么,问题是糟糕的编码。以下是正弦图的外观: