54

私は PI に近似するプログラムを実行しており、long long を使用しようとしていますが、機能していません。ここにコードがあります

#include<stdio.h>
#include<math.h>
typedef long long num;
main(){
    num pi;
    pi=0;
    num e, n;
    scanf("%d", &n);
    for(e=0; 1;e++){
      pi += ((pow((-1.0),e))/(2.0*e+1.0));
      if(e%n==0)
        printf("%15lld -> %1.16lld\n",e, 4*pi);
      //printf("%lld\n",4*pi);
    }
}
4

4 に答える 4

73

%lldは標準的な C99 の方法ですが、私が使用しているコンパイラ (mingw32-gcc v4.6.0) では機能しません。このコンパイラでそれを行う方法は次のとおりです。%I64d

だからこれを試してください:

if(e%n==0)printf("%15I64d -> %1.16I64d\n",e, 4*pi);

scanf("%I64d", &n);

これを完全に移植可能な方法で行うために私が知っている唯一の方法は、 の定義を使用すること<inttypes.h>です。

あなたの場合、次のようになります。

scanf("%"SCNd64"", &n);
//...    
if(e%n==0)printf("%15"PRId64" -> %1.16"PRId64"\n",e, 4*pi);

それは本当に非常に醜いです...しかし、少なくとも移植可能です。

于 2011-06-19T03:49:43.167 に答える
3
  • あなたのscanf()声明も使用する必要があります%lld
  • ループには終了条件がありません。
  • 式に括弧が多すぎ、スペースが少なすぎます

    pi += pow(-1.0, e) / (2.0*e + 1.0);
    
  • ループの最初の反復で 1 を追加し、その後 'pi' の値にゼロを追加します。これは値をあまり変更しません。
  • intforの明示的な戻り値の型を使用する必要がありますmain()
  • 全体として、int main(void)引数を無視するタイミングを指定するのが最善ですが、それは他のステートメントよりも明確なステートメントではありません。
  • 私は C99 で与えられた明示的なライセンスが嫌いで、末尾からのリターンを省略し、main()自分では使用しません。return 0;明確にするために書いています。

を使用して記述した場合、アルゴリズム全体が疑わしいと思いますlong long。データ型はおそらくもっと似ているはずです(long doubleフォーマットの場合、おそらくフォーマットの場合。%Lfscanf()%19.16Lfprintf()

于 2011-06-19T03:51:15.090 に答える
0

まず、%d はint

% d%1.16lldは整数であるため、意味がありません

その typedef も不要です。型を直接使用すると、コードがはるかに読みやすくなります。

使用したいのは、doublepi を計算してから%forを使用するための type%1.16fです。

于 2011-06-19T02:40:14.857 に答える