我知道里面有一个sin
函数,math.h
但我想自己制作这个函数,只是为了好玩。我已经sin
基于正弦函数的 Macluarin 展开创建了函数。
我写了一个幂函数和一个阶乘函数,它们从 正常工作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;
}
Run Code Online (Sandbox Code Playgroud)
该公式期望以弧度为单位的值,但您使用的是整数,所以我假设您给它度数。这将使公式给出错误的值。
您还使用int
s 作为来自factorial()
and 的返回值,power()
这将导致溢出。如果你有 32 位机器,即使给你的公式 2 也会溢出,因为int
只能上升到 2^31-1 并且你试图获得 2^33。
此外,如果您的编译器没有抱怨您正在unsigned long long 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;
Run Code Online (Sandbox Code Playgroud)
它应该可以工作,但可能会导致大x
. 一个霍纳时间表是一个最终的答案。