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

Tình hình là em không biết code khúc (2n+1)!

  • 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

:smile:

5 Likes

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.

5 Likes

em bí hơn 1 ngày rồi @@

1 Like

1 ngày chắc cũng phải làm được 1 vài thứ chứ :smile: viết được bao nhiêu bạn cứ đưa hết lên đây :smile:

À tức là bạn đang không làm được hàm tính giai thừa hay như nào :smile:

1 Like

uhm, em không làm được code (2n+1)!

1 Like

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 :smile:

VD: https://www.google.com/search?q=tính+giai+thừa+trong+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 :sob:

1 Like

Thế thôi cho b code luôn nhá, ngâm cứu xem, mình viết = python :smile:

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 :smile: đặ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 :smile:

1 Like
#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

1 Like

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

1 Like

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é :slight_smile: nó ko như bạn nghĩ đâu.

1 Like

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

received_255358215712094
Tham khảo nhé

2 Likes
#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

2 Likes

mình không hiểu phần tính giai thừa này lắm, mong bạn giải thích

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