Bị sai số khi tính hàm dãy số trong C

Chào m.n mình có làm 1 bài tính hàm trong C. Đề của n đây:

Complete the given fen(double x, double y, int n) function, which calculates and returns the value fen(x, y, n) using the formula below:

và hàm tình mình cũng đã viết rất cẩn thận, mấy lần trước dùng hàm giai thừa bị tràn nên lần này rút kinh nghiệm.

double fen(double x,double y, int n) { // You should complete this function
  	// Write your statements here
	double sum=1,temp;
	int j=2,k=1;
	double a = (x*y*y) / 18;
	sum=1-a;
	for(int i=2;i<=n;i++)
	{
		for(;j<=i;j++)
		{
			a *= (x*y);
			for(;k<=(i+j);k++)
					a /= k;
		}
		temp = a/(k*k);
		temp = (i%2 == 0) ? temp : -temp;
		sum+=temp;
	}

    return sum; //This statement must be changed 
 }

Nhưng k hiểu sao vẫn k ra kết quả. Mình chạy debug đến khúc i=3 thì bắt đầu có sai số, kiểu như là 0.05 thì nó thành 0.0499999999…
Và kq k giống output như testcase. Ai giúp mình với đc k. Bất lực r :((

Code trên đọc muốn nổ não luôn :smiley: đại loại là mẫu có thêm hai thừa số i+j+1 nữa. Hai cái for j, k đó unroll là vừa vì j cùng tiến với i.

2 Likes

@@.
Mình sửa lại @@

double fen(double x,double y, int n) { // You should complete this function
  	// Write your statements here
	double sum=1,temp;
	double a = (x*y*y) / 18;
	sum = 1 - a;
	
	int k=1;
	for(int i=2;i<=n;i++)
	{
		
			a *= (x*y);
			for(;k<=(2*i+1);k++)
					a /= k;
		
		temp = a/(k-1);// k=6-1;
		temp = (i%2 == 0) ? temp : -temp;
		sum+=temp;
	}

    return sum; //This statement must be changed 
 }

Nhưng nó vẫn ra là 0.0090, mà testcase đ.a là 0.1628 :((

Xét i=2 là thấy không ổn rồi. Mẫu số lại dư ra 2*3 (vì k=1). Nhưng chưa hết.
Qua i=3 mới thấy rõ vấn đề, phần giai thừa chỉ có một thừa số 5, nhưng mẫu số cũ có đến 2 số 5.

2 Likes

sao i=2 lại dư ra 2*3 đc nhỉ @@. Thông não hộ mình với.
Vì k=1 mình khai báo ở ngoài for nên đâu có refresh đâu.

k=1 chia 1, k=2 chia 2, k=3 chia 3 :smiley:

1 Like

thanks bro@@. Ra là lúc gán a thì chia cho 3!*3 mất r @@

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