簡體   English   中英

用Java計算正弦和余弦

[英]Computing sine and cosine in Java

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);
        } 
    }
}

我一直在嘗試使用泰勒定理計算正弦和余弦。 但是,我最后給出的答案與實際答案相去甚遠。

我代碼中的最后一個方法提供階乘。 另兩種方法使用泰勒定理計算值。 這兩種方法的想法是保持計算,直到答案彼此之間的差異不大。

我早就忘記了泰勒定理(我早就知道了),所以我不會更深入地研究您的實現。 但是,我確實看到了這一點:

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

這是沒有意義的,因為&& n>10在第一個循環中不正確,因此該循環將立即退出。 還要檢查第二個for循環,因為它也不檢查for循環中聲明的int k = 0的值。 我敢肯定這就是問題所在,雖然可能不是唯一的問題。

首先,我同意Vucko的觀點,您應該擺脫n> 10,但是我認為這只是一個錯誤。

我假設這部分是為了避免溢出錯誤。

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

應當更改此設置,因為您可能希望一旦正確就停止循環,如果錯誤就繼續執行。 在for(A; B; C)的for循環中,如果B為true,則循環將繼續進行,因此應將其更改為以下內容。

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

手動檢查Nans怎么樣(我在整理代碼的同時清理了一點,盡管它可能更有效)

public static double workCos(double angle, double num){
    double ans = 0;
    for(int n = 0; n < num; n++) {
        double currAns = Math.pow(-1, n) * Math.pow(angle, 2*n) / fact(2*n);
        if(Double.isNaN(currAns))
            break;
        ans += currAns;
    }
    return ans;
}

對於泰勒級數,輸入必須為弧度而不是度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM