求C语言大神,利用泰勒公式计算sin(x)的值,要求输入x(弧度值),当精度小于10的负5次方时程
求C语言大神,利用泰勒公式计算sin(x)的值,要求输入x(弧度值),当精度小于10的负5次方时程序停止执行。...
求C语言大神,利用泰勒公式计算sin(x)的值,要求输入x(弧度值),当精度小于10的负5次方时程序停止执行。
展开
2个回答
展开全部
您好,这个题其实不难,控制好溢出套用泰勒展开式就好:
C语言程序如下,VC++6中测试通过:
#include <stdio.h>
#include <math.h>
#define PI 3.1415926 /*定义π的值*/
unsigned long fac(unsigned long n) /*计算阶乘*/
{
unsigned long i, m;
for(i=0,m=1; i<=n; i++)
{
if(i!=0) /*0的阶乘为1*/
m = m * i;
}
return m;
}
double fsin(double x) /*计算sin(x)*/
{
double tmp, t; /*tmp存储每次计算完的值*/
int i; /*t代表泰勒展开式每一项*/
while(x>=2*PI) /*最多只有2π个弧度*/
x = x - 2*PI; /*弧度范围转换*/
for(i=1,tmp=0.0; i<=6; i++) /*防止溢出*/
{ //设置i=6的原因是在VC6中13的阶乘会溢出
t = pow(x, 2*i-1)/fac(2*i-1); /*x^n/n!,n为从1开始的奇数*/
if(t>=0.00001) /*控制精度不小于10的-5次方*/
tmp = tmp + pow(-1, i-1)*t; /*确定各项的正负*/
else
break;
}
return tmp;
}
int main()
{
double r, tmp;
printf("输入弧度值(>=0),180°对应3.1415926弧度,以此类推...\n");
printf("弧度(rad):");
scanf("%lf", &r);
tmp = fsin(r);
printf("%.5lf\n", tmp);
}
假如要测试sin(30°),由于30°=π/6=0.523599rad,故测试时需要输入:0.523599:
这个题关键是控制好溢出,比如当i=7时,2*i-1=13,而13的阶乘是个很大的数字,(在VC6中)已经超出了无符号长整型的范围,所以i最多只能循环到6.
您的采纳是我们的动力(⊙v⊙)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询