本题要求实现一个函数,用下列公式求 cos(x) 的近似值,精确到最后一项的绝对值小于 e:
函数接口定义:
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
来源:
来源:PTA | 程序设计类实验辅助教学平台
链接:https://pintia.cn/problem-sets/13/exam/problems/468
提交:
题解:
/*
* 求 cos(x) 的近似值,精确到最后一项的绝对值小于 e
*/
double funcos(double e, double x) {
double result = 0;
// 第 k 项的值,由分母 denominator 和分子 numerator 组成
double item;
// item 项的分子
double numerator;
// item 项的分母
double denominator;
// 分子项幂指数:0、2、4······
double powerIndex = 0;
// 控制 item 正负号
int flag = 1;
do {
// 分子:x^0、x^2······
numerator = pow(x, powerIndex);
// 分母: 0!, 2!, 4!······
denominator = powerIndex == 0 ? 1 : denominator * (powerIndex - 1) * powerIndex;
// 第 k 项的值
item = flag * numerator / denominator;
// 累加结果
result += item;
// 改变分子幂指数
powerIndex += 2;
// 改变 item 项符号
flag = -flag;
} while (fabs(item) >= e);
return result;
}