C计算欧拉数的精度低于预期

时间:2012-12-14 19:36:24

标签: c floating-point

我写了这段代码。我认为这是可以的,但是当我运行它时,我得到了一个糟糕的结果。此代码用于计算欧拉数。我将非常感谢你的回答。

我期望的结果大约是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 */

1 个答案:

答案 0 :(得分:4)

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

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

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

如果factorialdouble或64位整数而不是int,您可能会得到一些好的结果。

您的计算给出的(相对较小的)错误是由于floatdouble使用total而不是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