使用c++求收敛数列的极限

Using c++ to find the limit of a convergent sequence

我正在尝试获取 if 语句以在满足收敛序列的限制时终止程序,在本例中为 3+(1/k^2) = 3。

#include <iostream>
#include <math.h>

int findK(int k)
{
        double x = 0;
        for(double i=2;i<k;i++)
        {
                x = (1/pow(i, 2)+3);
                if(std::fmod(x, 1.0) == 0)
                {
                        std::cout << "Sequence terminated at, " << i << "th term.\n";               
                        exit(0);
                }
                else
                {
                        std::cout << x;
                }
                if(i != k-1) std::cout << ", ";
        }
        std::cout << std::endl;
}

int main()
{
        int n = 453;
        findK(n);

        return 0;
}

我不是最擅长数学或 programming/c++ 但在我看来好像一旦序列达到 3,if 语句就不会触发。当我用 x = 3 替换 x = (1/pow(i, 2)+3) 时。然后 if 语句运行并终止程序。我在这里错过了什么吗?如果可以的话,请用虚拟术语告诉我。

这里的问题是你希望无限序列收敛。你应该做的是循环直到它几乎为零,而不是完全为零,例如使用 std::numeric_limits<double>::epsilon() 给我们这个代码 - 我添加了每次循环时输出 std::fmod() 结果的打印,这样你就可以看看发生了什么:

#include <iostream>
#include <cmath>
#include <limits>

int findK(int k)
{
        double x = 0;
        for(double i=2;i<k;i++)
        {
                x = (1/pow(i, 2)+3);
                if(std::fmod(x, 1.0) <= std::numeric_limits<double>::epsilon())
                {
                        std::cout << "Sequence terminated at, " << i << "th term.\n";               
                        exit(0);
                }
                else
                {
                        std::cout << x << "; " << std::fmod(x, 1.0) << ", ";
                }
                if(i != k-1) std::cout << ", ";
        }
        std::cout << std::endl;
}

int main()
{
        int n = 453;
        findK(n);

        return 0;
}

这是 the code on ideone.com,但它在处理器时间用完之前不会收敛...

因为double的精度大约为16位小数,所以需要将n=100000000传递给findK,表达式才能收敛。当然,您应该从程序中删除 std::cout<<x 以使其相当快。