我们知道 的sin(x)= X-X ^3分之3!+的x ^ 10/10!-x ^7分之7!+的x ^9分之9!等等。我写了这段代码:
#include <iostream>
#include <math.h>
using namespace std;
const int m=19;
int factorial(int n) {
if (n==0){ return 1;}
return n*factorial(n-1);
}
int main() {
float x;
cin >> x;
float sum=0;
int k=1;
for (int i=1;i<=m;i+=2) {
sum+=(k*(powf(x,i)/factorial(i)));
k=k*(-1);
}
cout<<"series sum is equal :"<<sum<<endl;
return 0;
}
一个问题是当我输入x = 3时它给了我-10.9136,但我知道sin(x)的值范围是[-1,1]是什么问题?请帮帮我。
答案 0 :(得分:4)
问题在于由于破坏性取消而导致精度不足。
你有一个交替的系列,其中一些术语变得非常大。但是那些条款相互抵消了一个小的结果。由于float
精度有限,因此您的舍入误差大于最终值。
您可以使用双精度“减少”问题。但它不会消失。 sin/cos
的标准实现涉及通过2 pi
获取参数的模数以使其变小。
编辑:
我发现了另一个问题。 i = 19
时,您的阶乘函数中存在整数溢出。