OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
締切り
済み

浮動小数点エラー

  • すぐに回答を!
  • 質問No.186836
  • 閲覧数1364
  • ありがとう数0
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 0% (0/3)

#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);
}
上のプログラムで、◎の行に浮動小数点の不正な使用とエラーがでてしまいます。
参考書、ヘルプで調べたもののなぜエラーとなるか分かりませんでした。
解決できますでしょうか?
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全3件)

  • 回答No.1
レベル11

ベストアンサー率 33% (131/392)

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

float data[100];
と宣言するとエラーは出ないと思います。

そのままの宣言では、下のdata[i]は&data[i][0]になるのではないでしょうか?
◎ data[i]=D[i][i+1]/(sum/(n-(D+1)));  ←この行

昔のコンパイラーなら暴走確実ですネ!
では、
  • 回答No.2
レベル9

ベストアンサー率 53% (41/76)

>float data[100][100] ; この行のせいですね。 data変数は二次元配列であるのに、 data[i]=D[i][i+1]/(sum/(n-(D+1))); ここではdata変数を一次元配列として扱っているためです。 data[i]はdata[i][0]へのポインタであるため、代入できないとしてエラーになります。 またちょっと気になったんですが、配列要素は ...続きを読む
>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つ後(値は不明)のデータを見に行くことになり結果が不定となります。
最悪プログラムが落ちるかもしれません。
  • 回答No.3
レベル9

ベストアンサー率 53% (41/76)

プログラムを眺めていてもう1点気がつきましたので、追加しておきます。 data[i]=D[i][i+1]/(sum/(n-(D+1))); この最後にある「変数D」ですが、これはfloatの二次元配列で宣言されているため、floatへのポインタのポインタになります。 つまりアドレスが入るわけで、ここでの計算に必要なものとは思えません。 #D と書いた場合は &D[0][0] と同じ ...続きを読む
プログラムを眺めていてもう1点気がつきましたので、追加しておきます。

data[i]=D[i][i+1]/(sum/(n-(D+1)));

この最後にある「変数D」ですが、これはfloatの二次元配列で宣言されているため、floatへのポインタのポインタになります。
つまりアドレスが入るわけで、ここでの計算に必要なものとは思えません。
#D と書いた場合は &D[0][0] と同じ値になります。

またC言語のコンパイラ次第ですが、(D+1)の値も不定です。
仮にプログラムが正しく動いたとしても実行するたびに結果が違うことになりかねません。

配列とポインタについてもう一度参考書等でご確認ください。
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ