我试图在不使用java中的Math.sin()的情况下计算角度的正弦

我试图在不使用java中的Math.sin()的情况下计算角度的正弦,java,math,logic,trigonometry,Java,Math,Logic,Trigonometry,我试图不使用Math.sin()计算角度的正弦。我陷入了它的方程中,因为我一直得到错误的结果 注意,我有一种方法,可以将角度从度更改为弧度 public static double sin(double x, int precision) { //this method is simply the sine function double answer = 1, power = 1; int n = 2,factorial = 1; while (n<=prec

我试图不使用Math.sin()计算角度的正弦。我陷入了它的方程中,因为我一直得到错误的结果

注意,我有一种方法,可以将角度从度更改为弧度

public static double sin(double x, int precision) {
 //this method is simply the sine function
    double answer = 1, power = 1;
    int n = 2,factorial = 1;

    while (n<=precision) {

        power = (power * x * x *-1) +1 ; 
        factorial = (factorial * (n +1))* (n-1);
          answer = answer + ((power/factorial ));

        n = n + 2;

    }

    return answer;

}
公共静态双正弦(双x,整数精度){
//这种方法就是简单的正弦函数
双答案=1,功率=1;
int n=2,阶乘=1;

而(n看起来您正试图使用泰勒级数的一个特例计算以弧度为单位的角度正弦

sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ...
您的初始
答案
应为
x时为
1
。您的初始
power
也应为
x时为
1

double answer = x, power = x;
出于某种原因,在不应该添加的情况下,您正在将一个添加到结果的
power
部分

power = (power * x * x * -1);
您还需要修正您的
阶乘计算。乘以
n+1
n
,而不是
n+1
n-1

factorial = (factorial * (n + 1)) * (n);
通过这些修复,测试:

for (double angle = 0; angle <= Math.PI; angle += Math.PI / 4)
{
    System.out.println("sin(" + angle + ") = " + sin(angle, 10));
}

请注意,
x
的值越大,这将变得越不准确,这不仅是因为表示pi的不准确,还因为用于加和减大值的浮点计算。

看起来您正试图使用T的特例计算以弧度表示的角度正弦艾勒系列

sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ...
您的初始
答案
应为
x时为
1
。您的初始
power
也应为
x时为
1

double answer = x, power = x;
出于某种原因,在不应该添加的情况下,您正在将一个添加到结果的
power
部分

power = (power * x * x * -1);
您还需要修正您的
阶乘计算。乘以
n+1
n
,而不是
n+1
n-1

factorial = (factorial * (n + 1)) * (n);
通过这些修复,测试:

for (double angle = 0; angle <= Math.PI; angle += Math.PI / 4)
{
    System.out.println("sin(" + angle + ") = " + sin(angle, 10));
}

请注意,随着
x
的值越来越大,这将变得更加不准确,这不仅是因为表示pi的不准确,还因为用于加减大值的浮点计算。

IIRC该序列收敛速度较慢,为什么不改用CORDIC或bin搜索?该方程不是泰勒序列我期望看到的ies展开式。你从哪里得到的?这是不正确的。IIRC那个级数收敛很慢,为什么不使用CORDIC或bin搜索呢?这个方程不是我期望看到的泰勒级数展开式。你从哪里得到的?这是不正确的。做得好,但即使是阶乘也是个坏主意。有更好的方法这样做。不过你的想法是对的。谢谢你在正确的地方帮助你!!是的,我正在使用麦克劳林series@duffymo是的,还有其他方法可以优化/改进这一点,即使只是利用正弦函数的对称性,例如sin(x)=sin(π-x),sin(-x)=-sin(x)。至少这种方法不是每次迭代都从头开始计算阶乘;它是一种迭代计算。做得好,但即使是阶乘也是一个坏主意。有更好的方法可以做到这一点。不过,你的想法是正确的。谢谢你的帮助!是的,我正在使用maclaurinseries@duffymo是的,还有其他的方法来解决这个问题优化/改进这一点,即使只是利用正弦函数的对称性,例如sin(x)=sin(π-x),sin(-x)=-sin(x)。至少这种方法不是从头开始计算每次迭代的阶乘,而是一种迭代计算。