Использование c ++ для нахождения предела сходящейся последовательности - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь получить оператор 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;
}

Я не лучший в математике или программировании / c ++, но мне кажется, что как только последовательность достигнет 3, оператор if не сработает.Когда я заменяю x = (1 / pow (i, 2) +3) на x = 3. Тогда оператор if запускает и завершает программу.Я что-то здесь упускаю?Пожалуйста, дайте мне знать в фиктивных терминах, если можете.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Поскольку double имеет точность около 16 десятичных знаков, вам нужно передать n = 100000000 в findK, чтобы выражение сходилось.Конечно, вы должны удалить std::cout<<x из программы, чтобы сделать ее достаточно быстрой.

0 голосов
/ 25 сентября 2019

Проблема здесь в том, что вы надеетесь, что бесконечная последовательность будет сходиться.То, что вы должны сделать, - это цикл до тех пор, пока он не станет почти нулевым, а не точно нулевым, используя, например, 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;
}

Это код ideone.com, но он не сходится, пока не истечет время процессора ...

...