2016-08-26 7 views
-4

エントリがdiag[i][i] = 2/(2i+1)の対角行列を作成したいと思います。 ここに私のコードがあります。なぜそれが動作しないのかわかりません。それは、 diag[0][0]=2,diag[1][1]=2/3およびdiag[2][2]=2/5l=2である必要があります。 adiag[i][i]と異なる値を持つという事実も混乱します。 あなたが私を助けてくれることを願っています。シンプルな "forループ"はCの正しい数を計算しないでください

#include <stdio.h> 
#include <math.h> 

int main(void) 
{ 
    int l = 2; 
    int i , p; 
    double diag[l+1][l+1]; 
    int a; 

    for (i = 0; i < l+1; i++) 
    { 
     p = 2*i + 1; 
     printf("%d ", p); 
     printf("\n"); 
     diag[i][i] = 2 * 1/p; 
     printf("%d ", diag[i][i]); 
     printf("\n"); 
     a = 2* 1/p; 
     printf("%d ", a); 
     printf("\n"); 
    } 

} 
+1

これは、すべての時間の中で最も頻繁なFAQと同じです... '1/p'は浮動小数点ではなく' int'型で行われます。 – Lundin

答えて

1

これは、あなたがこのん

diag[i][i] = 2.0/p; 

pは整数である

diag[i][i] = 2 * 1/p; 

望むように動作しません。浮動除算を強制する必要があります。p> 1の場合は0を、p = 1の場合は1を返します。

+0

なぜ '2.0/p'ではないのですか? – EOF

+0

はい!私の目は画面の右側だけを見ていました:) –

+1

私は 'double p;'を最初に挙げました:-) – pmg

0

1/<any integer larger than 1>は常に0です。

職場ではINTEGER DIVISIONです。

1

二重の値を印刷するときは%f形式を使用し、使用したのは%dではありません。

代わりのprintf("%d ", diag[i][i]);は、printf("%f\n", diag[i][i]);

同じを使用しますが、diag[i][i]にその値を比較したい場合はdouble(ないint)として宣言されなければならないaの印刷値、のために行きます。

-1

私はあなたがこれをやっている理由を理解していません。

diag[i][i] = 2 * 1/p; 

あなたは変数の値がDIAG [i]の[i]を、あなたのようなこの変数を宣言する必要があると等しくなるようにしたい場合は、その

diag[i][i] = 2/p; 

ようにする必要がありますダブル。そして、それはdiag [i]と等しくなるはずです:

double a; 
a = diag[i][i]; 
0

これはCの古典的な問題です。どのタイプが計算に使用されていますか?このラインでは

diag[i][i] = 2 * 1/p; 

LHS(左手側)doubleあるので、あなたは(すなわちdouble)浮動小数点の結果を期待しています。ただし、RHS(右手側)にはintしかありません。したがって、2 * 1/pという計算は、タイプintを使用して行われます。計算が終了すると、結果はdoubleに変換されます。

計算を行う2/3intとして0int結果が結果0.6666を保持することができないように。その結果、0doubleに変換されます。したがって、期待通りになるのではなく、は0.0となります。

これを解決するには、RHS式に少なくとも1つのdoubleが必要です。これにより、計算が浮動小数点で実行されます。簡単な方法は次のとおりです。

diag[i][i] = 2.0/p; 
      ^^^ 
      floating point 

printf("%f ", diag[i][i]); 
     ^^ 
     Use %f for print of floating point 
関連する問題