计算正弦和余弦

时间:2016-03-03 14:16:03

标签: java runtime-error nan

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:");
        int n=kb.nextInt();
        System.out.println("Enter the angle for sine:");
        double anglesin=kb.nextDouble();
        System.out.println("Enter the number of expansions required:");
        int n2=kb.nextInt();
        System.out.println("Cosine: "+workCos(anglecos,n));
        System.out.println("Sine: " +workSin(anglesin,n2));

    }

    public static double workCos(double angle, int num){
        double ans=0;
        int times;
        for(int k=0;k<=num;k++){
            times=(2*k);

            ans=(ans + ((Math.pow(-1,k)*Math.pow(angle,times))/(fact(times))));

        }
        return ans;
    }

    public static double workSin(double angle, int num){
        double ans=(angle*Math.PI)/180;
        int times;
        for(int k=0;k<=num;k++){
            times=(2*k)+1;

            ans=(ans + ((Math.pow(-1,k)*Math.pow(angle,times))/(fact(times))));
            System.out.println(ans);
        }
        return ans;
    }

    public static int fact(int num){

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

    }
}

在上面的代码中,我尝试计算正弦和余弦。不过我是 没有得到正确的结果。这看起来很合乎逻辑。要做到这一点,我是 使用泰勒的系列。你能告诉我我的问题是什么吗? 码?

2 个答案:

答案 0 :(得分:1)

可悲的是,13!及以上版本将溢出Java中的int类型。

因此,num中任何超过12的fact(int num)值都会产生意外结果。

一种补救措施是使用long来使你达到19!,此时该系列应该充分融合。使用double会产生更多的术语,任何精度损失都在系列方法的准确性范围内。

答案 1 :(得分:0)

我认为你的公式有点偏。 Take a look here.

尝试这样的罪:

public static double workSin(double angle, int num){
    double ans = 0;
    for(int n = 1; n <= num; n++) {
        ans += Math.pow(-1, n - 1) * Math.pow(angle, 2*n - 1) / fact(2*n - 1);
        System.out.println(ans);
    }
    return ans;
}

和cos这样:

public static double workCos(double angle, int num) {
    double ans = 1;
    for(int n = 1; n < num; n++) {
        ans += Math.pow(-1, n) * Math.pow(angle, 2*n) / fact(2*n);
        System.out.println(ans);
    }
    return ans;
}