-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! = 622702080032ビット整数には大きすぎます。したがって、オーバーフローが発生し、結果は完全に間違っています。

factorialの代わりに、doubleまたは64ビット整数を使用すると、ある程度良い結果が得られる可能性がありintます。

計算で得られる(比較的小さい)エラーは、 forと:floatの代わりにを使用することによるものです。doubletotaldivision

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 に答える