Tình hình là em không biết code khúc (2n+1)!
Cần giúp đỡ bài tính giá trị sin(x) với độ chính xác và công thức cho trước
- Nêu rõ vấn đề và cung cấp đầy đủ thông tin khi hỏi bài tập: mục đích của code (hoặc đề bài), input, output, toàn bộ code đã viết (hoặc một phần code nghi ngờ lỗi), báo lỗi của trình biên dịch, ảnh chụp màn hình.
- Trau chuốt nội dung sẽ giúp người đọc thích hơn và đấy là một trong những kỹ năng cần thiết để trở thành một lập trình viên chuyên nghiệp
Cho người ta thấy bạn đã tốn sức với bài toán như thế nào, người ta mới có thể giúp bạn.
em bí hơn 1 ngày rồi @@
1 ngày chắc cũng phải làm được 1 vài thứ chứ viết được bao nhiêu bạn cứ đưa hết lên đây
À tức là bạn đang không làm được hàm tính giai thừa hay như nào
uhm, em không làm được code (2n+1)!
Google có nhiều lắm, bạn chỉ cần tìm “tính giai thừa trong” + ngôn ngữ bạn đang học là được
Mà sao n! em làm được, tới lúc gặp (2n+1)! làm ko được bực quá xóa luôn
Thế thôi cho b code luôn nhá, ngâm cứu xem, mình viết = python
def tinh_giai_thua(N):
giai_thua = 1
for i in range(1, N + 1):
giai_thua = giai_thua * i
return giai_thua
def tinh_sinx(x):
sinx = 0;
do_chinh_xac_can_co = 0.00001
do_chinh_xac_hien_thoi = do_chinh_xac_can_co + 1 # cong 1 de no lon hon do_chinh_xac_can_co
i = 0
while(do_chinh_xac_hien_thoi > do_chinh_xac_can_co):
phan_bien_thien = pow((-1), i) * ( float( pow(x, (2 * i + 1) ) ) / (tinh_giai_thua(2 * i + 1)) )
sinx = sinx + phan_bien_thien
do_chinh_xac_hien_thoi = abs(phan_bien_thien)
i += 1
return sinx
print tinh_sinx(3)
Mà thực ra code này mình vẫn thấy có vẻ không ổn lắm đặc biệt là chỗ độ chính xác, vì độ chính xác phải là hiệu của cái không chuẩn với cái chuẩn, ở đây mình chỉ lấy cái mới trừ cái cũ thôi, k biết có cách nào đúng hơn không
#include <stdio.h>
#include <conio.h>
#include<math.h>
int tinhgiaithua(int n)
{
int giai_thua = 1;
for (int i = 1; i <= n + 1; i++)
{
giai_thua = giai_thua*i;
}
return giai_thua;
}
void main()
{
int n, x;
double s = 0;
printf("Nhap n "); scanf_s("%d", &n);
printf("Nhap x "); scanf_s("%d", &x);
for (int i = 0; i <= n; i++)
{
s = s + pow(-1, i)*pow(x, 2 * i + 1) / (tinhgiaithua(2 * i + 1));
}
printf("Sin(%d)= %f", x, s);
_getch();
}
em sai chỗ nào vậy? tính kq sai
for(int i = 1; i <= n; i++)
Cho nó chạy từ 1 tới n để tính giai thừa chứ ko phải chạy tới n+1
Ok, thanks, đúng rồi, lỗi cơ bản thế nhìn không ra @@
Xem thử hướng dẫn này: http://chingovan.blogspot.com/2015/06/python-tim-gia-tri-cua-bieu-thuc-taylor.html
em làm theo cách này viết ra giấy thì đúng mà sao lại chạy sai ạ ?? mong mọi người giúp em. Em cám ơn nhiều ạ .
Bạn xem lại đoạn tính giai thừa trong code của bạn nhé nó ko như bạn nghĩ đâu.
Mình thấy pow(-1,i) là sao rồi bạn thử thay xem ko đúg đâu
À mà theo mình là thế này cái phần tính giải thừa ấy bạn khai báo ở trên là double j; rồi trong vòng for thì j=(2*i-2)*(2*i-1); gt = gt*j;
đấy đó là phần tính gt nhưng mà trong for cho i chạy từ 2 và xoá vòng t đi gán s=x luôn và sao bạn ko dùng pow(-1, 2*i-1)
chứ mình thấy “dau” ko ổn
Tham khảo nhé
#include<stdio.h>
double x;
int main(){
double sinx = 0;
scanf("%lf", &x);
double n = 1.000000;
double gt = x;
double u = 1.000000;
while( gt >= 0.0001 ){
sinx += u*gt;
u *= -1.00000;
gt *= (x*x)/(2*n*(2*n+1));
n++;
}
printf("%.6f", sinx);
return 0;
}
thử cái này xem
mình không hiểu phần tính giai thừa này lắm, mong bạn giải thích