用于计算e

时间:2018-01-25 02:26:00

标签: c series infinite

我被分配了一个Hw,要求我通过使用该系列来计算e的值:

  

1 + 1/1! + 1/2! + ... 1 / n!

必须计算e的值,直到达到n(由用户输入)的值。此外,必须计算1/n!的值,直到其值小于epsilon(也由用户输入)。

我编写了代码,但编译器有一些错误告诉我错误,例如关系比较,使用&#39 ;;'有谁可以帮我修复错误。先感谢您。

以下是我的代码:

#include<stdio.h>
int factorial (int i)
{
    if (i==0)
        return 1;
    else
        return i*factorial(i-1);
}

int main(void) {

    int i,n;
    float e,ep;

    printf("what is the value of epsilon: ");
    scanf("%f",&ep);

    printf("what is the value of n: ");
    scanf("%d",&n);

    for (i=1; i<=n, i++)
        e= 1+1/factorial(i);

    for(1/fatorial(i)<=ep)
        printf("The value of e for the entered value of epsilon and n:%f",e);

    return 0;
}

2 个答案:

答案 0 :(得分:0)

  1. 你没有对系列进行求和,但实际将e设置为1.

  2. 因为你把它设置为e + 1 / factorial(n)但是你的factorial()返回的int很可能高于1,所以除法是整数,1除以任何更大的数字将给0。

  3. 最后一个循环非常奇怪。您的意思是while而不是for吗?请注意,阶乘是错误的。此外,除了一遍又一遍地打印相同的消息之外,在循环体中没有做任何工作。

答案 1 :(得分:-1)

为了更加精确,我会使用double代替float

for (i=1; i<=n, i++)
    e= 1+1/factorial(i);

这是错误的,你没有添加到 e ,你总是分配最后一个 系列的值,始终为0( i = 1 除外)。所以你的 e 会 永远是1。

factorial是一个返回int的函数。 int除以int是。{ 一个int并且在C中任何 1 / x (对于 x &gt; 1, x 整数)都是0.你是使用 1.0或至少将其中一个参数投射到double(或float,如果你是的话 使用花车):

double e = 1; // initializing e

for(i = 1; i <= n; ++i)
    e += 1.0/factorial(i);
  

此外,必须计算 1 / n!的值,直到它的值小于 epsilon ,也是由用户输入的。

我不明白这意味着什么,如果 n 是用户给出的固定值, 你一直在计算什么?这真的是练习说的吗?

我的解释是:如果通过 n 步骤 | e_real - e_calculated | &GT;小量, 继续增加 n ,否则停止。那将是

#include <stdio.h>
#include <math.h>
#include <stdint.h>

uint64_t factorial (uint64_t i)
{
    if (i==0)
        return 1;
    else
        return i*factorial(i-1);
}

int main(void)
{
    int n;
    double e = 1;
    double epsilon;

    printf("what is the value of epsilon: ");
    scanf("%lf", &epsilon);

    printf("what is the value of n: ");
    scanf("%d",&n);

    int i = 1;
    while(1)
    {
        e += 1.0/factorial(i++);

        if(i >= n && (fabs(e - M_E) < epsilon))
            break;
    }

    printf("e: %.20lf, calculated e: %.20lf, error: %.20lf, steps: %d\n", M_E, e, fabs(e-M_E), i);

    return 0;
}

注意:如果您使用GCC,则必须使用-lm选项进行编译:

$ gcc e.c -oe -lm