• 締切済み

浮動小数点エラー

#include<stdio.h> main (){ float D[5][6] = { {0,0,151.9058382,111.8925551,238.1626765,145.6362657},   {0,151.9058382,0,256.9532465,317.3522119,232.5861795}, {0,111.8925551,256.9532465,0,181.0294098,114.6471}, {0,238.1626765,317.3522119,181.0294098,0,93.41311845} ,   {0,145.6362657,232.5861795,114.6471,93.41311845,0}, };   float data[100][100] ; int n=5; float sum; int i,l; for(i=1;i<=n-2;i++) { sum=0; for(l=i+2;l<=n;l++) { sum=sum+D[i][l]; } ◎ data[i]=D[i][i+1]/(sum/(n-(D+1)));  ←この行 } for (i=1;i<=n;i++){ printf("%f",data[i]); } return (0); } 上のプログラムで、◎の行に浮動小数点の不正な使用とエラーがでてしまいます。 参考書、ヘルプで調べたもののなぜエラーとなるか分かりませんでした。 解決できますでしょうか?

みんなの回答

  • MarrowG
  • ベストアンサー率53% (41/76)
回答No.3

プログラムを眺めていてもう1点気がつきましたので、追加しておきます。 data[i]=D[i][i+1]/(sum/(n-(D+1))); この最後にある「変数D」ですが、これはfloatの二次元配列で宣言されているため、floatへのポインタのポインタになります。 つまりアドレスが入るわけで、ここでの計算に必要なものとは思えません。 #D と書いた場合は &D[0][0] と同じ値になります。 またC言語のコンパイラ次第ですが、(D+1)の値も不定です。 仮にプログラムが正しく動いたとしても実行するたびに結果が違うことになりかねません。 配列とポインタについてもう一度参考書等でご確認ください。

  • MarrowG
  • ベストアンサー率53% (41/76)
回答No.2

>float data[100][100] ; この行のせいですね。 data変数は二次元配列であるのに、 data[i]=D[i][i+1]/(sum/(n-(D+1))); ここではdata変数を一次元配列として扱っているためです。 data[i]はdata[i][0]へのポインタであるため、代入できないとしてエラーになります。 またちょっと気になったんですが、配列要素は必ず[0]から始まります。 for(i=1;i<=n-2;i++) だと最初のデータは捨てられてしまいますし、 for (i=1;i<=n;i++){ ですと、最後よりもさらにもう1つ後(値は不明)のデータを見に行くことになり結果が不定となります。 最悪プログラムが落ちるかもしれません。

  • brogie
  • ベストアンサー率33% (131/392)
回答No.1

float data[100][100] ; を float data[100]; と宣言するとエラーは出ないと思います。 そのままの宣言では、下のdata[i]は&data[i][0]になるのではないでしょうか? ◎ data[i]=D[i][i+1]/(sum/(n-(D+1)));  ←この行 昔のコンパイラーなら暴走確実ですネ! では、

関連するQ&A

  • 浮動小数点の切り捨てで-0.5を-1に。

    こんにちは。 小数点以下を切り捨てたいときにキャストするために 以下のようにしたところ、 float  i ; for( i=-2.5f; i<3.5f; i+=1.0f ) {   printf( "%f %d\n", i, (int)i ) ; } -2.500000  -2 -1.500000  -1 -0.500000  0 0.500000  0 1.500000  1 2.500000  2 上記の様な結果になりましたが、これを -2.500000  -3 -1.500000  -2 -0.500000  -1 0.500000  0 1.500000  1 2.500000  2 のように-0.5なら-1にするようしたいのですが、 if文は使わずに計算だけで変換することは 可能でしょうか ?

  • エラー:浮動小数点の不正な使用

    /*月ごとの平均気温・降水量を構造体の配列に格納した後、 */ /*年間平均気温、年間平均降水量を求めるプログラムを作成せよ。*/ #include<stdio.h> void main(void) { int i; double total_kion, total_suiryo, av_kion, av_suiryo; struct YEAR_DATA{ double kion[12]; double suiryo[12]; }; struct YEAR_DATA data[12] = {{3.6, 50},{4.3, 61},{7.5, 98},{13.5, 153},{18.0, 162},{21.7, 210}, {25.6, 218},{26.8, 170},{22.8, 209},{16.9, 121},{11.4, 74},{6.2, 48}}; for(i=0 ; i<12 ; i++){ total_kion += data[i].kion; total_suiryo += data[i].suiryo; } av_kion = total_kion / 12; av_suiryo = total_suiryo /12; printf("年間平均気温 %lf\n", av_kion); printf("年間平均降水量 %lf\n", av_suiryo); } 構造体のところを勉強しています。 上の問題を解いてみたのですが、for文の中の2行に「浮動小数点の不正な使用」というエラーが起こってしまい、答も違っています。 どこが間違っているのか、ご指摘お願いします。

  • コンパイルエラー

    コンパイルしても、12行目(printf("%d番目の整数を入力してください。"i+1);が、関数呼び出しに)がないとでます。でもどこが間違っているか分かりません。 教えてください。お願いします。 #include <stdio.h> int main(void) { int num; int sum=0; int i; for(i=0; i<10; i++){ printf("%d番目の整数を入力してください。"i+1); scanf("%d", &num); sum+=num; } printf("合計は、%dです。\n", sum); return(0); }

  • 浮動小数点表現

    浮動小数点表現の問題で以下の実行結果を元にfloat型変数 f に与えた実数の実際に格納されているビット列を表示するプログラムを作りたいのですが、 #include<stdio.h> main() { float a; scanf("%f",&a); printf("%f",a); } この程度までしか作れません。ポインタを使ってアドレスを表示することは分るのですが…。 どなたか教えていただけると助かります。 実行結果 Size of Float : 4 byte Size of Int : 4 byte f=0.500000000000000 00111111000000000000000000000000

  • 構文エラー";"が型の前にありませんとは、どうしたら解決できるのですか。

    キーボードから正の整数を読み取り、n個の奇数を加算しディスプレイにかきだすプログラムです。;が型の前に必要というエラーがずっとでてきて、でも足りないところはわからないのですが、何が違うのでしょう??もうわけがわからなくて困ってます。お願いします。 /*演習1-3*/ #include<stdio.h> int main() { int i; int n; int sum=0; printf("%d¥n",n); for (i=1;i<=n;i+=2); int scanf("%d",&n); sum+=i; printf("1+2+...+n=%d\n",sum); return 0; }

  • C++の打切り誤差についてお聞きしたいのですが・・

    ↓のプログラムが、なぜ実行結果のsumが1ではなく1.000054や9.99999999999906e-001、9.9999999999990619e-001といった答えにになってしまうのでしょうか? 10000のところを512でやった場合は普通に1と出力されたのに・・・ #include <stdio.h> int main(void){ int i; float f; double d; f = 0.0; for(i = 0; i<10000; i++) { f += 1.0/10000; } printf("float: n=%d sum=%f\n", 10000, f); d = 0.0; for(i = 0; i<10000; i++) { d += 1.0/10000; }// end for printf("double:16.14e: n=%d sum=%16.14e\n", 10000, d); printf("double:18.16e: n=%d sum=%18.16e\n", 10000, d); return 0; } 実行結果 float: n=10000 sum=1.000054 double:16.14e: n=10000 sum=9.99999999999906e-001 double:18.16e: n=10000 sum=9.9999999999990619e-001 続行するには何かキーを押してください . . .

  • エラーの意味が…

    自分でプログラムを打ち、コンパイルしてみたんですけど 「c:10:警告:incompatible implicit declaration of built-in function 'printf'」とエラーが出てきました。 自分なりに10行目[ printf("%d :",b[i]); ]をいじってみたりは したのですが、上手くいきません。 いったいドコがおかしいのでしょうか? ご指導よろしくお願いします<(_ _)> ↓コレがそのプログラムです。 *************** int main(void){ int score[3][4]; int i,j,sum[3]={0}; score[0][0]=70; score[0][1]=80; score[0][2]=75; score[0][3]=60; score[1][0]=75; score[1][1]=83; score[1][2]=70; score[1][3]=70; score[2][0]=60; score[2][1]=76; score[2][2]=70; score[2][3]=55; char b[]="ABC"; for(i=0; i<3; i++){ printf("%d :",b[i]); for(j=0; j<4; j++){ printf("%3d",score[i][j]); sum[i]+=score[i][j];} printf(" : sum=%d, ave=%5.2f\n",sum[i],(float)sum[i]/4); } return 0; }

  • C言語!プログラム書いたのですがエラーです!

    課題内容 キーボードから数字を入力してその値までの合計を表示する。 さらに入力した値が偶数なら0から入力した値までのすべての偶数の和を 入力した値が奇数なら1から入力した値までのすべての奇数の和を表示するプログラム。 #include<stdio.h> int main(void) { int i, n, sum; sum=0; scanf("%d",&n); printf("入力値:%d\n", n); if(n%2 = 0) { for(i=0;i<=n;i+=2) { sum=sum+i; } printf("合計値:%d\n",sum); } else { for(i=1;i<=n;i+=2) { sum=sum+i; } printf("合計値:%d\n",sum); } return(0); } これでコンパイルすると10行目に左辺値が必要とでます。 どうすればよいでしょうか? 教えてください。よろしくお願いします。

  • 計算に誤差が出る?

    0.1 + 0.2 + 0.3・・・・・・ このように行うプログラムを2通りに分けて処理をして見ました。 以下にソースを載せます。 #include <stdio.h> int main() { float sum, i; float sum2; int f; for(i=0.1, sum=0.0; i<=100.0; sum+=(float)i, i+=0.1); printf("%f\n", sum); for(f=1, sum2=0.0; f<=1000; sum2+=(float)f/10.0, f++); printf("%f\n", sum2); return 0; } 初めのfor文と2番目のfor文では同じ処理を行っているのですが、計算結果が微妙に異なって出力されてしまいました。 理由が分かる方は教えてもらえないでしょうか?

  • C言語の配列について

    配列を20 定義し値を入力して合計値を出したいのですがどうすればよいのでしょうか 下のソースでエラーはおこりませんでした 何がちがうのでしょうか #include <stdio.h> int main() { int a[20]={}; int i, sum; printf("整数を入力してください:"); scanf("%d",&a); printf("\n"); for (i = 0; i < 10; i++) { sum += a[i]; } printf("sum= %d\n", sum); return 0; }