为什么 for 循环在递增计数和递减计数时表现不同?

Why does for-loop behave differently when counting up vs counting down?

这是一道我最近重温的作业题。它要求我不使用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-loops 写了两个版本的 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;
}

为什么倒计时循环无法给出收敛输出?

第二个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 两次,但乘以 1 不影响结果。