Неверная логика в приближении e ^ 1 :(

0

Я написал код, используя объект класса, для вычисления значения e ^ 1 путем аппроксимации, используя суммирование рядов, приведенное ниже, но похоже, что я не могу заставить логику работать правильно. Я попытался запустить ее до 5 членов для приближения, но мой ответ был 1,2 только там, где он должен быть около 2,7038...

е ^ 1 задается рядом 1 + 1/1! + 1/2! + 1/3!...

#include <iostream>
#include <stdlib.h>
using namespace std;

class factorial
{
public:
double loopfactorial ( double y)
    {

        double value;
    for (int a=0; a<=y; a++)
        {
            value=1;

            value = value*a;
        }
        return value;
    }
};


int main()
{
factorial calcu;
int x;
double sum;
cout<<"Enter the number of terms to approximate exponent:"<<endl;
cin>>x;

for (int y=1; y<=x-1; y++)
{
int n = calcu.loopfactorial(y);

sum=1.0;
sum = sum + 1/n;
}

cout<<"The value of e is "<<sum<<endl;
    return 0;
}
  • 5
    Почему sum=1.0; внутри тела цикла?
  • 0
    @KerrekSB, а также в расчете факториала
Показать ещё 6 комментариев
Теги:

4 ответа

1

Для справки и пользы будущих читателей здесь "правильный" код:

#include <iostream>
#include <cstdlib>

int main()
{
    unsigned int terms;
    if (!(std::cout << "Number of terms: " && std::cin >> terms))
    {
        std::cout << "Error, I did not understand you.\n";
        return EXIT_FAILURE;
    }

    double e = terms > 0 ? 1.0 : 0.0, term = 1.0;
    for (unsigned int n = 1; n < terms; ++n)
    {
        term /= n;
        e += term;    // this is "e += 1/n!"
    }

    std::cout << "e is approximately " << e << "\n";
}

(Код может быть тривиально расширен для вычисления e x для любого x.)

  • 0
    double e = terms > 0 ? 1.0 : 0.0, term = 1.0; Разделение этого на два оператора улучшает его читабельность немного :)
  • 0
    Я склонен рассматривать троичного оператора как очень редко необходимое зло. В этом случае это необходимо только из-за способа построения цикла for . Если вы замените n < terms на n <= terms и поместите term /= n после e += term , то вы можете просто инициализировать e в 0.0 , и троичный оператор исчезнет. Единственным недостатком является то, что вы делаете один ненужный term /= n вычислений на последней итерации. На мой взгляд, это небольшая цена, чтобы заплатить, чтобы избавиться от безобразия троичного оператора.
Показать ещё 2 комментария
0

Вы должны переместить инициализацию переменных из циклов - вы снова и снова перезапускаете их.

Боковое замечание: довольно бессмысленно ставить loopfactorial в классе.

0

Я нашел три проблемы с вашим кодом, оба они похожи друг на друга 1. В loopfactorial() value=1 должно быть определено до тела цикла 2. в main(), sum=1.0 должно быть определено до тела цикла 3. в loopfactorial() переменная цикла a должна быть инициализирована либо 1, либо 2 вместо 0.

  • 0
    Спасибо! Прошло всего 7 недель с тех пор, как я начал C ++ без предшествующего опыта, поэтому некоторые концепции для меня довольно расплывчаты.
  • 0
    @ user3499156 круто, с ++ - самый простой шаг перед изучением любого другого языка программирования. Желаю вам удачи, продолжайте спрашивать, когда вы застряли, и не забудьте принять ответ, если он помог вам
0

Попробуйте переместить начальные значения за пределы цикла:

#include <iostream>
#include <stdlib.h>
using namespace std;

class factorial
{
public:
double loopfactorial ( double y)
    {

        double value;
        // MOVED INITIAL VALUE HERE
        value=1;
    for (int a=1; a<=y; a++)
        {
            value = value*a;
        }
        return value;
    }
};


int main()
{
factorial calcu;
int x;
double sum;
cout<<"Enter the number of terms to approximate exponent:"<<endl;
cin>>x;

// MOVED INITIAL VALUE HERE
sum=1.0;
for (int y=1; y<=x-1; y++)
{
int n = calcu.loopfactorial(y);

sum = sum + 1/n;
}

cout<<"The value of e is "<<sum<<endl;
    return 0;
}
  • 0
    «Почему ответ всегда 1?» : -S
  • 1
    @KerrekSB Разве вы не имеете в виду «Почему ответ всегда 0?». Посмотрите на цикл: for (int a=0; ...)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню