十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
1.
站在用户的角度思考问题,与客户深入沟通,找到景县网站设计与景县网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站设计、网站建设、企业官网、英文网站、手机端网站、网站推广、申请域名、虚拟主机、企业邮箱。业务覆盖景县地区。
c语言中要编写sin函数,实质上要利用sin的泰勒公式,然后根据泰勒公式,将其中的每一项进行分解,最后用循环,累加计算出最终结果
2.
下面用for循环实现sin的算法,程序代码如下:
#include
#include
void
main()
{
int
i;
float
x,sum,a,b;
//sum代表和,a为分子,b为分母
char
s;
printf("please
input
x");
scanf("%f",x);
s=1;
sum=0;
a=x;
//分母赋初值
b=1;
//分子赋初值
for(i=1;a/b=1e-6;i++)
{
sum=sum+s*a/b;
//累加一项
a=a*x*x;
//求下一项分子
b=b*2*i*(2*i+1);
//求下一项分母
s*=-1;
}
printf("sum=%f\n",sum);
}
3.
关于上述程序的几点说明:上述程序的计算结果精确到小数点后六位;上述程序运用了sin的泰勒展开式
sin
x=x-x^3/3!+x^5/5!
......
,程序中将sin泰勒公式中的每一项拆成了分子,分母以及每一项前的符号这三项,以便于每一项的累加
#includestdio.h
#includemath.h
#define N 10000000
void main()
{
double sum=0;
int i;
for(i=0; iN; i++)
{
sum += sin((double)(i)/N)/N;
}
printf("%lf\n%lf",sum,1-cos(1));
}
N后面的0有点多了,不过这个数刚好能精确到小数点后6位。
当然,这个程序的算法实在是太垃圾了,效率非常的低下……
??
解法一 ∫sin(x)dx = cos(x) +c 积分公式
double jfSin(double x, double y)
{
return cos(y) - cos(x)
}
解法二 野蛮近似法
d是精度
double jfSin(double x, double y, double dx)
{ double ret;
for(; x =y; x+= dx)
{
ret += sin(x);
}
return ret;
}
有区别:这里假定pi是double型的变量
1)x为整型时,y=sin(x*pi/180);会先计算x*pi得到double型数据(因为pi的类型),然后再做除法
z=sin(x/180*pi);会先计算x/180得到整型数据(因为分子、分母均整型)小数部分被
截断了然后再与pi相乘得到double类型结果
应当写做:z=sin((double)x/180*pi);或z=sin(x/180.0*pi);
只要分子、分母中有一个数据类型是double的会使编译程序调用double类型的
运算步骤。
2)x是double型但取值很大时
y=sin(x*pi/180);会先计算x*pi,如果x的值大得x*pi会超出double类型表示范围时就会出问题
y=sin(x/180*pi);会先计算除法,这样先缩小得数再做乘法保证结果不会溢出