01/10/2018, 15:46

Hỏi về cách tính sin(x)

input: c > 0 (vd: c = 0.0001) và số thực x
output:
sin x = x/1! - x^3/3! + x^5/5! - …+ (-1)^n * [ x^( 2n+1 ) ] / (2n+1)!
với điều kiện: abs([ x^( 2n+1 ) ] / (2n+1)!) <= c

#include <iostream>
#include <math.h>
using namespace std;
int tinhsinx()
{
 int n,j,gt=1,a;
 double kt,x,c,sinx = 0;
 cout << "c = "; cin >> c;
 cout << "x = "; cin >> x;
 for (n=0;kt<=c;n++)
 {
  if (n==0) {gt = 1;}
  else
  {
   a=gt;
   for(j=n;j<=(2*n+1);j++)
   {
   a=a*j;
   }
  }
  kt = abs(pow(x,(2*n+1))/a);
  if (n%2==0) {sinx = sinx + (pow (x,(2*n+1))/a);}
  else {sinx = sinx - (pow (x,(2*n+1))/a);}
 }
 cout << "sin x = " << sinx << endl;
}   
int main()
{
 tinhsinx ();
 return 0;
}

trong code mình thấy sai ở phần tính giai thừa, mọi người coi còn sai chỗ nào nữa không? chỉ mình sửa lại với. cảm ơn nhiều.
mới học nên thấy còn lạ quá …

rogp10 viết 17:54 ngày 01/10/2018
  1. Phải thu hẹp lại trong [-pi/2…pi/2] trước vì ct Maclaurin hội tụ xung quanh zero.
  2. Phần giai thừa không thể sử dụng int vì số quá lớn. Khi dùng ct Maclaurin thì nên tính các số hạng theo kiểu truy hồi.
  3. Còn có một đa thức bậc 6 chuẩn hơn đa thức này nữa.
minh viết 17:49 ngày 01/10/2018

e chưa hiểu cách "thu hẹp lại trong [-pi/2…pi/2] " . giải thích rõ hơn giúp e vs?

rogp10 viết 17:52 ngày 01/10/2018

Quay nửa vòng tròn thì sin(x+pi) = -sinx = sin(-x)
Vậy ta làm như sau: sin(5.3pi) = sin(5.3pi - 4pi) = sin(1.3pi) = sin(pi + 0.3pi) = sin(-0.3pi).

Bài liên quan
0