这是我最近重新审视的家庭作业问题。它要求我不要使用cmath
并编写一个函数来评估cos pi/3
。代码是
#include <iostream>
using namespace std;
double power(double x, int b) {
if (b>1) return x*power(x,b-1);
else if (b==0) return 1;
else return x;
}
double cosine(double x, int k) {
double tmp=0;
for (int n=0; n<=k; n++) {
tmp += power(-1,n) / factorial(2*n) * power(x,2*n);
}
return tmp;
}
int main() {
double x=3.1415/3;
int k=100;
cout << cosine(x,k) << endl;
}
我已经使用for循环编写了两个版本的double factorial(int a)
。
一个计数并成功输出0.500027
:
double factorial(int a) {
double tmp=1;
for (int i=1; i<=a; i++) {
tmp*=i;
}
return tmp;
}
另一个倒计时并输出inf
(但成功评估4!= 24):
double factorial(int a) {
double tmp=a;
for (int i=a; i>=1; i--) {
tmp*=i;
}
return tmp;
}
为什么倒计时循环无法提供收敛输出?
答案 0 :(得分:1)
第二个factorial()
两次乘以a
。试试这个:
double factorial(int a) {
double tmp=1; // use 1 instead of a
for (int i=a; i>=1; i--) {
tmp*=i;
}
return tmp;
}
请注意,使用double tmp=a;
并将i
初始化为a-1
并不好,因为它会生成factorial(0) = 0
,而factorial(0)
应为1。
第一个实现也将1乘以2,但乘以1不会影响结果。