用Java计算正弦和余弦

时间:2016-03-05 09:55:09

标签: java sine cosine

import java.util.*;
import java.math.*;
public class SinCos{
    public static void main(String args[]){
        Scanner kb=new Scanner(System.in);
        System.out.println("Enter the angle for cosine: ");
        double anglecos=kb.nextDouble();
        System.out.println("Enter the number of expansions required:");
        double n=kb.nextDouble();
        System.out.println("Enter the angle for sine:");
        double anglesin=kb.nextDouble();
        System.out.println("Enter the number of expansions required:");
        double n2=kb.nextDouble();
        System.out.println("Cosine: "+workCos(anglecos,n));
        System.out.println("Sine: " +workSin(anglesin,n2));
    }

    public static double workCos(double angle, double num){
        double ans = 1;
        double ans2=0;

        for(int n = 1;((Math.round(ans * 10000.0) / 10000.0)==ans2)&&n>10; n++) {
            double times=2*n;
            ans2=Math.round(ans * 10000.0) / 10000.0;
            ans += Math.pow(-1, n) * Math.pow(angle, 2*n) / fact(times);
        }

        return ans;
    }

    public static double workSin(double angle, double num){
        double ans = 0;
        double ans2=0;
        double t;
        double t2;

        for(int k=0;(Math.round(ans * 10000.0) / 10000.0)==ans2;k++){
            ans2=Math.round(ans * 10000.0) / 10000.0;
            double times=2*k+1;
            ans += Math.pow(-1, k - 1) * Math.pow(angle, 2*k - 1) / fact(times);


        } return ans;
    }

    public static double fact(double num){
        if(num==0||num==1){
            return 1;
        }
        else{
            return num* fact(num-1);
        } 
    }
}

我一直试图用泰勒定理计算正弦和余弦。但是,我最后给出的答案远不及实际的答案。

我的代码中的最后一个方法给出了阶乘。另外两种方法使用泰勒定理计算值。这两种方法的想法是保持计算直到答案彼此之间的变化不大。

3 个答案:

答案 0 :(得分:0)

我早就忘记了泰勒的定理(我早就知道了),所以我不会深入研究你的实现。但是,我确实看到了这一点:

for(int n = 1;((Math.round(ans * 10000.0) / 10000.0)==ans2)&&n>10; n++)

这没有任何意义,因为这个循环将立即退出,因为&& n>10在第一次通过它时不是真的。还检查第二个for循环,因为它也不检查for循环中声明的int k = 0的值。我确定这是问题,但可能不是唯一的问题。

答案 1 :(得分:0)

首先,我同意Vucko,你应该摆脱n> 10但我认为这只是一个错误。

我假设这部分是为了避免溢出错误。

((public|private|protected|static|final|native|synchronized|abstract|transient)+\s)+[\$_\w\<\>\w\s\[\]]*\s+[\$_\w]+\([^\)]*\)?\s*

这应该改变,因为你可能希望循环在这个为真时停止并且如果这是假的则继续。在(A; B; C)的for循环中,如果B为真,循环将继续运行,因此您应将其更改为以下内容。

((Math.round(ans * 10000.0) / 10000.0)==ans2)

如何手动检查Nans(我在使用它的过程中清理了一些代码,虽然它可以提高效率)

((Math.round(ans * 10000.0) / 10000.0)!=ans2)

答案 2 :(得分:0)

输入必须是弧度而不是泰勒级数的度数。