习题5-7 使用函数求余弦函数的近似值 (15 point(s))

本题要求实现一个函数,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e:
cos(x)=x^​0 /0!−x2/2!+x4/4!−x^6/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 j=1.0; //分子的次方 (初值为1,因为第一项分子最后结果为1)
	int t=-1; //中间变量(实现一正一负) (由于第一项是正的,所以这里应当为负的,因为循环从第二项开始算) 
	double sum=1.0; //cos近似值 (初值为1,因为第一项的值最后结果为1)
	int s=1; //循环变量 
	double p=1; //分母阶乘 (初值为1,因为第一项分母的阶乘为1)
	double m=j/p; //每一项的值(不含符号) 
	do
	{
    
    
		p=p*s*(s+1);  //分母阶乘 (公式的由来:一步一步验算,跟初值s有很大的关系)
		j=j*x*x;  //分子x的次方 
		sum=sum+j/p*t; //总和 
		m=j/p; //每一项的值 
		t=-t; //每次循环快结束的时候t要变号 
		s+=2; //循环变量加2 
	}
	while(m>=e); //当每一项的值大于误差时循环 
	return sum; //返回sum给funcos 
}

猜你喜欢

转载自blog.csdn.net/qq_44715943/article/details/114584376
今日推荐