如何在c语言中创建正弦函数
我知道在如何在c语言中创建正弦函数,c,math,C,Math,我知道在math.h中有一个sin函数,但我想自己做这个函数,只是为了好玩。我基于正弦函数的Macluarin扩展创建了sin函数。 我写了一个幂函数和一个阶乘函数,它们在main中正常工作,但是它们在sin函数中不工作 这是我的密码: int main() { int i; double y; printf("\n\nPlease enter a value to find corresponding sin value\n"); scan
math.h
中有一个sin
函数,但我想自己做这个函数,只是为了好玩。我基于正弦函数的Macluarin扩展创建了sin
函数。
我写了一个幂函数和一个阶乘函数,它们在main
中正常工作,但是它们在sin
函数中不工作
这是我的密码:
int main()
{
int i;
double y;
printf("\n\nPlease enter a value to find corresponding sin value\n");
scanf("%d",&i);
y=sin(i);
printf("\nYour value is\n %f",y);
return 0;
}
double sin(int z)
{
int i=1;
double value,val2,val3,sum=0;
for(i=1;i<33;i+=2)
{
val2=power(z,i);
val3=factorial(i);
value=val2/val3;
if(((i-1)/2)%2!=0){
sum=sum-value; //((power(x,i))/factorial(i));
}else
{
sum=sum+value;
}
}
printf("\n%f\n",sum);
return sum;
}
int factorial(int x)
{
int i,sum=1;
for(i=1;i<=x;i++)
{
sum = sum*i;
}
return sum;
}
int power(int x,int y)
{
unsigned long long int i,sum=1;
for(i=1;i<=y;i++)
{
sum=sum*x;
}
return sum;
}
intmain()
{
int i;
双y;
printf(“\n\n请输入一个值以查找相应的sin值\n”);
scanf(“%d”、&i);
y=sin(i);
printf(“\n您的值是\n%f”,y);
返回0;
}
双正弦(整数z)
{
int i=1;
双值,val2,val3,和=0;
对于(i=1;i公式要求以弧度为单位的值,但您使用的是整数,所以我假设您给它度。这将使公式给出错误的值
您还可以使用int
s作为来自factorial()
和power()
的返回值,这将导致溢出。如果您有32位机器,即使给公式加2,也会溢出,因为int
只能增加到2^31-1,并且您试图得到2^33
另外,如果编译器没有抱怨您从返回类型为int
的函数返回了无符号长整型int
,请增加警告级别。int factorial()
溢出非常快。13!
不适合32位整数。21!
不适合64位整数
int power()
似乎完全关闭。为什么您希望参数x
为int
?顺便说一句,它也会很快溢出
计算McLauren级数(几乎)正确的方法是表示上一项的下一项:
term = (-1) * term * (x*x) / ((n+1)*(n+2));
sum += term;
n += 2;
它应该可以工作,但可能会导致数值不稳定,并且具有较大的x
。A是一个最终答案。正如其他人已经指出的那样,在它们自己的函数中计算幂
和阶乘
部分是一个坏主意,因为即使对于非常小的值,它也会溢出
您可以尝试组合计算,以便在每个循环中都有一个乘法
和一个除法
像这样:
#include <stdio.h>
// This function returns the contribution from the k'th element
double kth_contribution(double x, int k)
{
int i;
int s = -1.0;
double d = 1.0;
if (k < 0) return 0;
if (k == 1) return x;
if (k % 2 == 0) return 0;
if ((k-1) % 4 == 0) s = 1.0;
for (i=1; i<=k; ++i)
{
d = d * x / i;
}
d = s * d;
return d;
}
int main(void) {
int k;
int x = 1.0;
for (k=0; k<33; ++k)
{
printf("k=%d: %0.80f\n", k, kth_contribution(1.0, k));
}
return 0;
}
现在您只需要将所有贡献相加。如果您查看标准数学库,就像它们都做参数缩减一样。Macluarin系列最适合于较小的x值。因此,对于较大的x,您希望将x放入一个较小的范围内。如果我们可以在-pi/2和pi/2之间找到y,从而使x=y+2kpi或x=pi-y,则以弧度工作+2kpi
这将有助于使y进入一个小范围,意味着您需要更少的级数项来计算。除了溢出之外,使用整数将导致小数的截断。哦,您在调用函数之前声明了它们吗?在main
函数上方的某个地方确实有函数原型?如果使用它,这有什么用途离子如果((i-1)/2)%2!=0)
?@ARBY这是针对-
值的,如sum-x^3/3!
k=0: 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000
k=1: 1.00000000000000000000000000000000000000000000000000000000000000000000000000000000
k=2: 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000
k=3: -0.16666666666666665741480812812369549646973609924316406250000000000000000000000000
k=4: 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000
k=5: 0.00833333333333333321768510160154619370587170124053955078125000000000000000000000
k=6: 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000
k=7: -0.00019841269841269841252631711547849135968135669827461242675781250000000000000000
k=8: 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000
k=9: 0.00000275573192239858925109505932704578867742384318262338638305664062500000000000
k=10: 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000
k=11: -0.00000002505210838544172022386617932135366437762513669440522789955139160156250000
k=12: 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000
k=13: 0.00000000016059043836821615925802332523156679827680548555690620560199022293090820
k=14: 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000
k=15: -0.00000000000076471637318198174152558028953378813433183758263567142421379685401917
k=16: 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000
k=17: 0.00000000000000281145725434552099254097088490189675684814327692728763707918915316
....