本题要求实现一个函数,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e:
cos(x)=x0/0!−x2/2!+x4/4!−x6/6!+⋯
函数接口定义:
double funcos( double e, double x );
其中用户传入的参数为误差上限e
和自变量x
;函数funcos
应返回用给定公式计算出来、并且满足误差要求的cos(x)的近似值。输入输出均在双精度范围内。
裁判测试程序样例:
#include <stdio.h>
#include <math.h>
double funcos( double e, double x );
int main()
{
double e, x;
scanf("%lf %lf", &e, &x);
printf("cos(%.2f) = %.6f\n", x, funcos(e, x));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
0.01 -3.14
输出样例:
cos(-3.14) = -0.999899
补充代码:
double funcos( double e, double x )
{
double t, result = 1,item=1;
int temp = -1, b = 2;
do {
item *= b * (b - 1);//分母
t = temp * (pow(x, b) / item);
b = b + 2;
result += t;
temp *= -1; //下一项的符号
} while (fabs(t) >= e);
return result;
}
需要注意的是:
1.我在PTA尝试提交的时候发现当将分母item用Int类型表示的时候,PTA提交的时候,会显示“阶乘过大时,计算超时”,个人猜测是因为如果用int类型的数值进行计算,在编译时会有转化类型的过程。
2.直接采用阶乘的计算公式(即1*2*...*N)在提交时并不会显示“阶乘过大时,计算超时”。
如以下代码,是可以正常通过的:
double funcos( double e, double x )
{
double t, result = 1,item=1;
int temp = -1, b = 2, c;
do {
item = 1;
c = b;
while (c) {
item *= c;
c--;
}//分母
t = temp * (pow(x, b) / item);
b = b + 2;
result += t;
temp *= -1; //下一项的符号
} while (fabs(t) >= e);
return result;
}