2011-06-19 17 views
40

私はPIを近似するプログラムをやっていますが、私は長い間使っていますが、動作しません。 %dは整数あなたが行うのtypedefprintf 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); 
    } 
} 
+1

私はあなたの問題が 'printf'よりも' scanf'であると推測しています。 – Nemo

+0

'pow(( - 1.0)、e)'は 'e%2? 1:-1' –

答えて

-1

まずで、%dはそうint

%1.16lldのためであるが、必要もない、意味がありません直前の型を使用して、はるかに読みやすいコードを作成します。

pi を計算し、次に%fまたは%1.16fを使用する場合、使用するタイプはdoubleです。

+0

それは本当に "違法ではない" ...それはMSVC固有のものだと私は思います。 – Mehrdad

+2

@Mehrdad整数に小数点があるとき? –

+6

が正しくありません。 [spec for printf](http://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html)を読んでください。 '%lld'は' long long'を正確にどのように出力しますか? (もちろん、 '1.16'はあなたがしたいことをしないかもしれません...しかし、それは完全に有効です。これは、最小フィールド幅を1とし、16桁を出力することを意味します) – Nemo

53

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

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

+7

これはあなたのコンパイラではなく、ここで責任を負うCライブラリです。あなたは '%lld'をサポートしていないMicrosoft Cライブラリを使用しています。これはC99の機能です(' inttypes.h'でも可能です)。 – caf

+0

具体的には、msvcrt.dllは、もともとVC++ 6.0向けに書かれたC標準ライブラリの古代(1998年頃)バージョンで、後方互換性のためにWindowsと共に出荷されています。 MinGWはその古代版を使用しています。これは、Windows版の唯一のものです。しかし現代のVC++ランタイムは '%lld'を適切に処理します。 –

+0

Visual C++ 2013は%lld形式要素をサポートしているようです – user1741137

2
  • 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()フォーマットの場合は%Lfprintf()フォーマットの場合は%19.16Lf)のようになります。

0
double pi = 2 * acos(0.0); 
    int n; 
    scanf("%d",&n); //precision with which you want the value of pi 
    printf("%.*lf\n",n,pi); 
+1

このコードスニペットは解決策であるかもしれませんが、説明を含めて本当にあなたの投稿の質を向上させるのに役立ちます。将来読者の質問に答えていることを覚えておいてください。そうした人々はコード提案の理由を知らないかもしれません –

関連する問題