C++ 近似e^1的逻辑错误:(

C++ 近似e^1的逻辑错误:(,c++,C++,我已经使用class object编写了代码,通过使用下面给出的级数求和来近似计算e^1的值,但似乎我无法使逻辑正常工作。我尝试将其运行到5个近似项,但我的答案是1.2,只有在它应该在2.7038左右的地方 e^1由系列1+1/1!+1/2!+1/3 #include <iostream> #include <stdlib.h> using namespace std; class factorial { public: double loopfactorial ( d

我已经使用class object编写了代码,通过使用下面给出的级数求和来近似计算e^1的值,但似乎我无法使逻辑正常工作。我尝试将其运行到5个近似项,但我的答案是1.2,只有在它应该在2.7038左右的地方

e^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;
}
#包括
#包括
使用名称空间std;
类阶乘
{
公众:
双循环阶乘(双y)
{
双重价值;

对于(int a=0;a您应该将变量初始化从循环中移出-您正在一次又一次地重置它们


旁注:将
loopfactorial
放入类中是毫无意义的。

尝试将初始值移出循环:

#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;
}
#包括
#包括
使用名称空间std;
类阶乘
{
公众:
双循环阶乘(双y)
{
双重价值;
//将初始值移到这里
数值=1;

对于(inta=1;a我发现您的代码有三个问题,它们彼此相似 1.在
loopfactorial()
中,应在循环体之前定义
value=1
2.在
main()
中,应在循环体之前定义
sum=1.0

3.在
loopfactorial()
中,循环变量
a
应该用1或2而不是0进行初始化。

为了供将来的读者参考,以下是“正确”的代码:

#包括
#包括
int main()
{
无符号整数项;
如果(!(标准::术语)
{
标准:库特0?1.0:0.0,项=1.0;
for(无符号整数n=1;nstd::cout为什么
sum=1.0;
在循环体中?@KerrekSB和计算阶乘中也是hmmm,因为指数序列中有一个1?@BartlomiejLewandowski:这实际上是必需的,但将结果存储在
int
中将有助于解决下一个问题。@KerrekSB你指的是int n吗?我从n开始就想只是一些数字的阶乘。“为什么答案总是1?”:-S@KerrekSB你不是说“为什么答案总是0?”。看看循环:
for(int a=0;…)
@MikeHolt:发现得很好。我指的是
sum=sum+0
,但事实上我们有
sum=sum+0/0
。太好了。@KerrekSB我指的是
loopfactorial
中的代码。我甚至没有注意到
sum=sum+1/n
。所以它实际上更像是“为什么答案总是错误:除以0?” ;-)谢谢!我从没有背景的C++开始,只剩下7周了。所以,一些概念对我来说是非常模糊的。@ USSR34 915156酷,C++是学习任何其他编程语言之前最基本的步骤。祝你好运,不断问你什么时候卡住了,不要忘记接受答案,如果它帮助你<代码>双E=术语> 0?1.0:0.0,term=1.0;
我倾向于将三元运算符视为一种很少必要的邪恶。在这种情况下,它之所以必要,是因为
for
循环的构造方式。但是,如果将
n
替换为
n,则更可能的情况是,我会将此代码放在一个函数中,只需执行抢占式
If(terms<1)在函数顶部返回0.0;
。然后可以将循环保留在此处(从而避免在最后一次迭代中进行额外的除法),只需将
e
初始化为
1.0
。无论哪种方式,都可以省去三元运算符,这大大提高了可读性。@MikeHolt:当然,主题上的任何变化都是可能的。选择您最喜欢的。
#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";
}