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);
}
}
}
在上面的代码中,我尝试计算正弦和余弦。不过我是 没有得到正确的结果。这看起来很合乎逻辑。要做到这一点,我是 使用泰勒的系列。你能告诉我我的问题是什么吗? 码?
答案 0 :(得分:1)
可悲的是,13!
及以上版本将溢出Java中的int
类型。
因此,num
中任何超过12的fact(int num)
值都会产生意外结果。
一种补救措施是使用long
来使你达到19!
,此时该系列应该充分融合。使用double
会产生更多的术语,任何精度损失都在系列方法的准确性范围内。
答案 1 :(得分:0)
我认为你的公式有点偏。 Take a look here.
尝试这样的罪: p>
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;
}