私はPIに近いプログラムを実行していて、長い間使用しようとしていますが、機能していません。ここにコードがあります
#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);
}
}
%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);
それは本当に非常にいです...しかし、少なくともポータブルです。
scanf()
ステートメントも%lld
も使用する必要があります。式に含まれる括弧が多すぎる、スペースが少なすぎる
pi += pow(-1.0, e) / (2.0*e + 1.0);
main()
にはint
の明示的な戻り型を使用する必要があります。int main(void)
を指定するのが最善ですが、それは残りの部分よりも明確な記述ではありません。main()
の末尾からの戻り値を省略するためにC99で付与された明示的なライセンスを嫌い、自分で使用しないでください。 return 0;
を明示的に記述します。long long
;を使用して記述した場合、アルゴリズム全体は疑わしいと思います。データ型はおそらくlong double
(scanf()
形式の場合は%Lf
で、printf()
形式の場合は%19.16Lf
のようになります。