2016-07-15 20 views
-1

なぜ、次のコードが行列 'u'に対して間違った答えを与えるのか理解できません。行列「u」は同一性マトリクスと等しくなければならないが、値の一部のみが正しい。なぜこれが起こっているのかも理解できたら助けてくれますか?あなたは浮動小数点数(Floating point numbers)とない本当の「本物」の数字を操作しているので、行列乗算誤差 -

for (k=0; k<3; k++) { 

    int j; 
    for (j=0; j<3; j++) { 

     int h; 
     for (h=0; h<3; h++) { 


      u[k][j]+=(F[k][h])*(B[h][j]); 

     } 

    } 

} 

Matrix F 
2 -2.2 0.6 
-0 0.4 -0.2 
-3 3.2 -0.6 
Matrix B 
2 3 1 
3 3 2 
6 1 4 
Matrix u 
1 -4.44089e-16 0 
0 1 0 
8.88178e-16 1.33227e-15 1 
+1

興味深い「*コードは正しいが答えは間違っている*」;あなたは間違った出力を引き起こすと思いますか? –

+0

私は8.88178e-16のような数字はゼロと同じであるとは言いません。しかし、彼らは本当に本当に小さいです。したがって、算術精度によるエラーが発生している可能性があります。 – infixed

+0

ようこそ! [mcve]または[SSCCE(Short、Self Contained、Correct Example)](** http://sscce.org)でご質問を**編集** ** – NathanOliver

答えて

0

あなたの数学は、あなたが期待するかもしれない道を働いていない理由があります。浮動小数点数または複素数で正確な作業を行う場合は、浮動小数点演算を理解する必要があります。

実際に精度を気にせず、見栄えを良くしたい場合は、数値のゼロを定義し、それより小さいものをすべて実際のゼロに設定するのが簡単です。 1e-6のようなものが動作する可能性があります。いくつかのコード例は次のとおりです。あなたがuの異なる要素の合計を計算するために移動する際

for (int i = 0; i < 3; i++) 
    for (int j = 0; j < 3; j++) 
     u[i][j] = abs(u[i][j]) < 1e-6 ? 0 : u[i][j]; 
+0

これはちょうど「修正」されていますが、1.0でも同様の問題があります。実際には0.573も、それ以外の数もあります。あなたは推測することはできません。 – MSalters

0

u[k][j]=0を初期化。これは正常に動作するはずです。

for (k=0; k<3; k++) 
{ 
    int j; 
    for (j=0; j<3; j++) 
    { 
     int u[k][j]=0; 
     int h; 
     for (h=0; h<3; h++) 
     { 
      u[k][j]+=(F[k][h])*(B[h][j]); 
     } 
    } 
}