Я написал код, используя объект класса, для вычисления значения 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;
}
Для справки и пользы будущих читателей здесь "правильный" код:
#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.)
double e = terms > 0 ? 1.0 : 0.0, term = 1.0;
Разделение этого на два оператора улучшает его читабельность немного :)
for
. Если вы замените n < terms
на n <= terms
и поместите term /= n
после e += term
, то вы можете просто инициализировать e
в 0.0
, и троичный оператор исчезнет. Единственным недостатком является то, что вы делаете один ненужный term /= n
вычислений на последней итерации. На мой взгляд, это небольшая цена, чтобы заплатить, чтобы избавиться от безобразия троичного оператора.
Вы должны переместить инициализацию переменных из циклов - вы снова и снова перезапускаете их.
Боковое замечание: довольно бессмысленно ставить loopfactorial
в классе.
Я нашел три проблемы с вашим кодом, оба они похожи друг на друга 1. В loopfactorial()
value=1
должно быть определено до тела цикла 2. в main()
, sum=1.0
должно быть определено до тела цикла 3. в loopfactorial()
переменная цикла a
должна быть инициализирована либо 1, либо 2 вместо 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;
}
for (int a=0; ...)
sum=1.0;
внутри тела цикла?