-3

我写了这段代码。我认为这没关系,但是当我运行它时,我得到了一个糟糕的结果。此代码用于计算欧拉数。我会很感激你的回答。

我期望的结果大约是 2.718281828459045,我得到的结果是 2.718281745910644:

  • 2.718281828459045(预期)
  • 2.718281745910644(实际)

代码:

#include <stdio.h>

main() {

    int factor, counter, n = 1;
    float total = 0, division;

    while ( n <= 20 ) {
        counter = 1;
        factor = n;

    while ( counter < n ) {
        factor *= ( n - counter );
        counter++;
    } 

    division = 1.0 / factor;
    total = total + division;
    n++;
    }

    total = total + 1;

    printf( "La constante matematica e vale aproximadamente: %.20f\n", total);

    return 0;  

} /* Finaliza funcion main */
4

1 回答 1

4
while ( n <= 20 ) {
    contador = 1;
    factorial = n;

    while ( contador < n ) {
        factorial *= ( n - contador );
        contador++;
    } 
    // snip
    n++;

int,如果是 32 位整数类型,则最多只能容纳12!. 13! = 6227020800对于 32 位整数来说太大了。因此你有溢出,结果是完全错误的。

如果factorial是 adouble或 64 位整数而不是int.

您的计算给您的(相对较小的)错误是由于使用float而不是doublefor totaland division

我们计算一个很好的近似值e作为double

Prelude Text.FShow.RealFloat> FD $ exp 1
2.718281828459045090795598298427648842334747314453125

并将其转换为float

Prelude Text.FShow.RealFloat> FF $ realToFrac it
2.71828174591064453125

这是你得到的价值:2.718281745910644以不同的印刷精度为模。这与我们在计算exp 1为浮点数时得到的结果相同:

Prelude Text.FShow.RealFloat> FF $ exp 1
2.71828174591064453125

最接近float所需结果的值:

Prelude Text.FShow.RealFloat> FF 2.718281828459045
2.71828174591064453125
于 2012-12-14T19:41:15.957 回答