0
#include<stdlib.h>
#include<stdio.h>

long double fact(unsigned long int n)
    /*The factorial of a positive integer by recursion*/
{
    if (n==0)
        return 1;
    else
        return n*fact(n-1);
}

int main()
{
    long double  sum, n;
    int i, m;
    printf("\t/*Code to find the approximate value of e */");
check:
    printf("\n\n\tPlease Enter the value of n := ");
    scanf("%lf", &n);
    sum=0;
    for (i=0; i<=n; i++)
        sum +=1/(fact(i));
    printf("\n\n\tThe appriximate value of e := %.15lg\n\n\t", sum);
    printf("Let's do this again? 1/ YES Any key/ NO := ");
    scanf("%d", &m);
    if (m==1)
        goto check;
    else (1);
    return 0;
}

このコードは、Visual C ++ 2010では完全に機能しましたが、DEVC++では機能しませんでした。eの値に対してゼロを返し続けました。誰かが理由を説明できますか?ありがとう!

4

3 に答える 3

1

これを使用scanf("%Lf", &n);するlongdoubleのフォーマット指定子は、、%Lfなので%le%lgこれを使用します

また、これらの点を考慮してください

Dev-C ++ GCC(MinGW)を使用します。この問題を修正するDev-C++アップデートの量はありません。

  1. Dev-C++は5年間更新されていません。息を止めないでください。

  2. 派生wxDev-C++が維持されます。

  3. コンパイラの更新が必要な場合は、www.mingw.orgにアクセスして、最新バージョンが古いDev-C++で引き続き機能することを期待してください。または、別のIDEまたはコンパイラを使用してください。VC ++ 2010 Express Edition(無料ではるかに優れたデバッガー)をお勧めします。コードはVC ++ 2008と同じように機能しますが、安全ではありません。

  4. 値が「0」であるとどのように判断しましたか?それは実際には0.000001のようなものであった可能性があり、あなたの尋問の方法はそれを丸めました。printステートメントではなく、デバッガーで値を表示する必要があります。残念ながら、Dev-C++のデバッガーは最悪です。

  5. ISO C標準ライブラリは、倍精度の関数のみを定義します。float用に定義されたバージョンが必要な場合は、C ++としてコンパイルし、を含める必要があります。Cは関数のオーバーロードをサポートしていないため、別の名前の関数がないとCで実行できません。

于 2012-05-05T16:10:05.707 に答える
0
scanf("%lf", &n);

%lf変換仕様は、を読み取るために使用されますdouble

%Lfを読むために使用する必要がありlong doubleます。

于 2012-05-05T16:08:50.310 に答える
0

scanf(...)が本当に読みたい番号を読み取るかどうかを確認しましたか?読んだ値を印刷してみてください。そしてまたライン

sum +=1/(fact(i));

疑わしいようです。整数を1より大きいもので割った値は、すべてのコンパイラで最適な場合、常に0になるはずです...代わりにこれを試すことができます。

sum +=1.0/(fact(i));

編集:申し訳ありませんが、ここで間違っていました。タイプ変換により、整数をlongdoubleで除算することが可能になります。

于 2012-05-05T16:12:49.817 に答える