web-dev-qa-db-ja.com

longfを印刷する方法

私は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);
    }
}
49
Carlos

%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);

それは本当に非常にいです...しかし、少なくともポータブルです。

62
karadoc
  • scanf()ステートメントも%lldも使用する必要があります。
  • ループには終了条件はありません。
  • 式に含まれる括弧が多すぎる、スペースが少なすぎる

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

long long;を使用して記述した場合、アルゴリズム全体は疑わしいと思います。データ型はおそらくlong doublescanf()形式の場合は%Lfで、printf()形式の場合は%19.16Lfのようになります。

3