根据麦克劳林公式计算任意角的正弦。
输入格式
x ε
注:x 为角(单位:弧度),ε 为计算精度。
输出格式
y
注:y 为 x 的正弦值。用 %f 格式限定符输出 6 位小数。
输入样例1
0.5235987755982989 0.00000001
输出样例1
0.500000
输入样例2
314.6828641345776 0.000001
输出样例2
0.500000
要求:所计算的最后一项的绝对值小于 ε。
注:pi=3.1415926535897932384626...。
代码如下:
#include <stdio.h>
#include <math.h>
int main()
{
double PI = 3.1415926535897932384626;
double x, u, z = 1, sum = 0;//x为角度,u为精度
double a, b = 1;
int i = 1, j = -1, k = 1;
scanf("%lf %lf",&x,&u);
while (fabs(x) > (PI))
{
x -= PI;//转换为小角度,减少运算
}
while (fabs(z) >= u)//使用最后一项的绝对值和U比较;如果最后一项是负值,循环会继续
{
j = -j;
a =j* pow(x, i);
i += 2;
z = a / b;
sum += z;
while (k < i)
{
k++;
b *= k;
}
}
printf("%.6f", sum);
return 0;
}
以为水平有限,只通过了8个测试点,如有大佬能够完善,恳请指点(- _ -)
---------------------------------------------------------------------------------------------------------------------------------
2022.12.30修改后如下:
#include <stdio.h>
#include <math.h>
int main()
{
double PI = 3.1415926535897932384626;
double x, u, z = 1, sum = 0;//x为角度,u为精度
double a, b = 1;
int i = 1, j = -1, k = 1;
scanf("%lf %lf", &x, &u);
while (fabs(x) > 2*PI)
{
if (x > 0)
x -= 2 * PI;
else
x = 2 * PI - x;
}
while (fabs(z) >= u)//使用最后一项的绝对值和U比较;如果最后一项是负值,循环会继续
{
j = -j;
a = j * pow(x, i);
i += 2;
z = a / b;
sum += z;
while (k < i)
{
k++;
b *= k;
}
}
printf("%.6f", sum);
return 0;
}