Code tính sinh(x) bị sai kết quả

Giúp em với ạ, e không biết em viết sai đoạn nào mà kq nó ra sai

package bai3;

import java.util.Scanner;

public class ex1 {
    public static void tongGT(int n) {
        int gt = 1;
        for(int i=1; i<=n;i++) {
            gt=gt*i;
        }
        return gt;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner k = new Scanner(System.in);
        System.out.println("nhap n =");
        int n = Integer.parseInt(k.nextLine());
        System.out.println("nhap x =");
        double x = k.nextDouble();
        double radian = Math.PI*x/180;
        double sinx = 1;

        for(int i = 1; i <= n; i++) {
            sinx=sinx + Math.pow(radian,2*i+1)/tongGt(2*i);
        }
        System.out.println("sin x ="+sinx);
    }
}
\sinh(x) \approx \sum_{n=1}^\infty \frac{x^{(2n+1)}}{(2n+1)!} = x + \frac{x^3}{3!} + \frac{x^5}{5!} + \frac{x^7}{7!} + \frac{x^9}{9!} + \dots

Có gì cấn cấn ở công thức này.
Rõ là n sẽ chạy từ 1.
Vậy thì \frac{x^{(2n+1)}}{(2n+1)!} khi n bằng 1 là: \frac{x^{(2 * +1)}}{(2 * 1 +1)!} = \frac{x^{3}}{3!}, không phải là giá trị x đầu tiên trong dãy tổng kia.
Công thức đúng phải là \frac{x^{(2n-1)}}{(2n-1)!}
2n - 1.
Bài này có thể tối ưu lại bằng cách lưu giá trị nhân dồn, dùng Math.pow và vòng lặp tính giai thừa nếu n quá lớn sẽ không hiệu quả

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?