- ベストアンサー
doubleからfloatにすると表示が変になる
- 下記のC言語の行列積のコードでは行列の変数をdoubleとしていますが、これをfloatに全て置き換えると、printfで表示させる結果がバグってしまいます。
- 原因は何でしょうか?
- 最近ひさしぶりにC言語を触ったので、しょうもないところでつまずきました。お願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
付け加えるなら「printfの%fと%lfを変える」のは意味がありません。 http://www.kijineko.co.jp/tech/superstitions/printf-format-for-double.html doubleで動作していたのは「C[N][N]の初期状態がたまたま0になっていた、または0になるようなオプション付きでコンパイルしていた、あるいは0になるような処理系だった」
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
とりあえず「printfとfscanfの書式を%fや%lfに変えたり戻したり」というのは「時間の無駄遣い」でしかない. float なんだから %f 以外ありえない. で, 初期化は?
お礼
解決しました。 初期化が問題だったようです。
- Tacosan
- ベストアンサー率23% (3656/15482)
本当に大丈夫なのか確認したいんで書き換えた後のプログラムを出してもらえないだろうかと思いつつ初期化は?
補足
書き換えた後のコード↓ printfとfscanfの書式を%fや%lfに変えたり戻したり。 ------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #define N 10 //N次の正方行列まで扱えるようにする void matrixmultiply(int n,float a[N][N],float b[N][N],float c[N][N]); int main(int argc, char** argv) { int i,j,n; float A[N][N],B[N][N],C[N][N]; FILE *readin1,*readin2; /*行列の値が書き込まれたファイルを開く*/ if((readin1=fopen("a.dat","r"))==NULL) { printf("a.datを開けません\n"); exit(1); } if((readin2=fopen("b.dat","r"))==NULL) { printf("b.datを開けません\n"); exit(1); } printf("行列の次数を入力してください\n"); scanf("%d",&n); printf("%d次の正方行列の掛け算を行います\n\n",n); /*ファイルから数値を読み込み、配列に代入する*/ for(i=0;i<n;i++) { for(j=0;j<n;j++) { fscanf(readin1,"%lf",&A[i][j]); fscanf(readin2,"%lf",&B[i][j]); } } matrixmultiply(n,A,B,C); //関数を呼び出し行列の掛け算を行う。 /*結果を表示する*/ printf("計算結果\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%lf ",C[i][j]); } printf("\n"); } fclose(readin1); fclose(readin2); return 0; } /*掛け算を行う行列2つと、結果を入れる行列を引数として受け取る。*/ void matrixmultiply(int n,float a[N][N],float b[N][N],float c[N][N]) { int i,j,k; /*受け取った2つの行列の掛け算を行う。*/ for(i=0;i<n;i++) { for(j=0;j<n;j++) { for(k=0;k<n;k++) { c[i][j]+=a[i][k]*b[k][j]; } } } } ------------------------------------------------------------ a.dat 0.577350 0.707107 -0.408248 -0.577350 0.707107 0.408248 0.577350 0.000000 0.816497 ------------------------------------------------------------ b.dat 0.577350 -0.577350 0.577350 0.707107 0.707107 0.000000 -0.408248 0.408248 0.816497
- Tacosan
- ベストアンサー率23% (3656/15482)
まさか, 「double とあるところをすべて float にしただけ」とかいう寝ぼけたことはしてませんよね?
補足
printfとfscanfの書式(%lfか%f)にも注意してみましたが、変わりませんでした。
お礼
解決しました。 初期化してないのが問題だったようです。 doubleで動いていたのはたまたまだったのですね。