• 締切済み

理由がわかりません・・・

C言語でプログラムを作成して簡単な計算(ヒストグラムの平均値計算)をしているのですが、 使用するPCによって、異なる結果が出てしまいます。 コンパイラ(gcc)のバージョンも同じだし、計算に使用するデータも同じなので、原因が全くわかりません。特にランダム変数とか使っているわけでもありませんし・・・ どなたか、同じようなご経験をお持ちの方、原因が推測できるかた教えてください。

みんなの回答

  • sunasearch
  • ベストアンサー率35% (632/1788)
回答No.6

おそらく、#2さんがおっしゃられるように、ヒストグラムを作成する際に、度数を入れておく配列、もしくは平均を出すために合計を入れておく変数のいずれかが0に初期化されていないのが原因だと思います。 異なる結果というのが、小数点以下のレベルで異なる値なのか、見当はずれの値が出るのか、正しい結果が出ることがあるのかなどを示してもらえれば、解決が早いと思います。 #ソースを載せてもらえたら一番早いんですけどね。

noname#118114
noname#118114
回答No.5

計算時の値の丸め誤差が起きているのかもしれません。 これは小数点の値が正確に計算されない現象のことで、 原因はコンピューターは2進数で値を管理する為です。 もし、小数点の計算をしているのならこの丸め誤差が影響している可能性はあります。 この問題のコンピューターを使っている以上解決法はありません。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

自動変数やmallocで割り付けたメモリブロックの初期化を忘れているとかではありませんか? あるいは、環境変数やレジストリに依存する処理が含まれているとか...

  • yasuch
  • ベストアンサー率41% (27/65)
回答No.3

4台とも同じ処理系ですか? 処理系が違うのであれば、INT型の演算で1台だけ オーバーフローしたりするって可能性も考えられそうです。

peroncho
質問者

お礼

ご指摘ありがとうございます。 4台ともwindowsXPです。 おかしなPCは先日spywareが いたのでspybottで駆除したのですが、 必要なファイルを削除したとか 何か関係ありますかね・・・? コンパイラはその後、再インストールしてみたのですが変化なしです。

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.2

> 全く同じプログラムを4台のPCでコンパイル、実行 > してみたところ、1台のみ異なる誤った結果が出てしまいます。 正常なPCで作成した実行形式をおかしなPCに持ってきた場合は? 良くあるのは、配列を確保した際の配列の内容の初期値は未定義なので初期化しないと正しく動作しないのですが、3台のPCではたまたま0とか都合の良い数字で初期化されて、誤って正常動作のように見えてしまうとか。

peroncho
質問者

お礼

なるほど、同じ実行形式ファイルで 確認する必要もありますね。 試してみます! ありがとうございます。

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

まずは、 1 1 1 1 … などの結果の分かりきった単純なデータを使って、正しく計算されているか? 結果が違うのならどちらが違うか? あたりから調べてみては?

peroncho
質問者

お礼

早速回答いただきまして、ありがとうございます。 全く同じプログラムを4台のPCでコンパイル、実行 してみたところ、1台のみ異なる誤った結果が出てしまいます。 おかしなPCのコンパイラを再インストールもしてみたのですが、結果は変わりません。 何なんでしょうね・・・

関連するQ&A

  • C言語でヒストグラムを作成するプログラムを作りたいのですが

    C言語でヒストグラムを作成するプログラムを書いたのですが、正しい濃度値が出力されずに困っています。 ヘッダなしの2バイト画像データを読み込みヒストグラムを書き出すプログラムです。 gccを使っています。 よろしくお願いします。

  • gccコンパイラー

    今、gccでコンパイルするc言語のコンパイラーを探しています。 フリーでダウンロードできるいいコンパイラーはないでしょうか。 お勧めなどがありましたら教えてほしいです。 あと、C言語ではgccやbcc等のコンパイラーで プログラムソースの書き方容が変わったりするものなのでしょうか? 一応、ボーランド?のコンパイラーは持ってます。 ただ、今度OJTでUNIX環境のc言語開発の現場に行く事になり gccでコンパイルするもので勉強しとくようにいわれています。 宜しくお願いします。

  • プログラムを教えてください!

    レポートの質問です。 以下の問題のプログラムを作らなければいけないのですが、いろいろと調べてみてもまったくわかりません。 わかる方プログラム教えてください! 課題1 合同式法を用いて,区間[0,1] (区間[0,1)でも良い) の 一様乱数を100 万個生成し,以下を報告せよ.ただし,一様乱数の生成にはC 言語で自作したプログラムを用いること. (1a) 平均の数値計算結果 (1b) 標準偏差の数値計算結果 (1c) 一様乱数のヒストグラム.ヒストグラムは区間[0,1] を100 分割して 作成すること. 課題2 中心極限定理に基づく「間便法」を用いて,区間[0,1] (区 間[0,1)でも良い) の一様乱数から標準正規分布N(0,1)に従う正規乱数を100 万 個生成し,以下を報告せよ.ただし,正規乱数の生成にはC言語で自作したプ ログラムを用いること. (2a) 平均の数値計算結果 (2b) 標準偏差の数値計算結果 (2c) 正規乱数のヒストグラム.ヒストグラムは区間[-5, 5] を100 分割して 作成すること.

  • gcc バージョン違いによるコンパイルエラー

    C言語でWeb系のプログラムを作成している者です。 以前まで、OSはFreeBSD 4.11-RELEASE-p12・gccのバージョンは2.95.4でコンパイルできていたプログラムが、OSはFreeBSD 5.4-RELEASE-p8・gccのバージョンは・gccのバージョンは 3.4.2で、今まで出なかったようなエラーが沢山出現し、コンパイルできなくなってしまいました。 OSをインストールし直すのは、既に稼働中のサイトですので厳しく、GCCのバージョンを下げるかソースを書き換えるかして対処する方向で行きたいと考えております。 しかし、gccの2.95.4の圧縮ファイルはもう、gccの公式サイトに落ちておらず、バージョンダウンは難しそうです。 gccのバージョンによるコンパイルエラーを乗り越えた方、ご指摘など有りましたらお教えくださると幸いです。

  • ランダムで数を表示するには

    C言語を覚えたてなんですが 計算や変数を代入などは本にやり方が書いてあってわかったのですが たとえばサイコロやルーレットのプログラムを作るとして 1~6の数字がランダムででるようなプログラムをつくるには どうすればいいのでしょうか? また1が50%で、2が25%、3が10%で4~6が5%づつとか 出る確率を設定することとかも出来るのでしょうか?

  • 最初に使う変数のゼロクリアについて

    変数宣言をしてその変数を使用する場合、ゼロクリアというのは常識なのかも知れませんが、フォートランはデフォルトでゼロクリアになっていたと理解しています。てっきりそうだと思っていたのですが、フリーのフォートランコンパイラg95はゼロクリアになっていないみたいです。すなわちg95では変数宣言して値を明示的に与える前に使用するとゼロと思っていたのがとんでもない値になっていました。 コンパイラの仕様を読んでおくというのは数値計算を行う上で重要なことだと考えます。 前置きが長くなりました。質問ですが、コンパイラで変数宣言した時点でゼロクリアになっていないというのは言語としてはどのようなものがあるのでしょうか? 全部なのでしょうか。全部そうだと思っていた方が安全ではあると思いますが。 よろしくお願いします。

  • Visual C++では問題があるのにgccではうまくいく理由

    Visual C++(2005)付属のコマンドラインのコンパイラを使って(cl)コンパイルしたプログラムでは、出力したい値を格納するdouble型の変数の値が、-1.#IND00となってしまうのに対して、 まったく同じソースをgccでコンパイルした場合には、普通の数値が正常に出力され、その値は事前の予想どおりの傾向を持っていることから、まちがってはいないようです。 clではうまくいかず、gccではうまくいくのはなぜなのでしょうか。 関係があるかどうかわかりませんが、値の算出の過程でrand()を使っています。

  • Cをコマンドプロンプトから実行したい

     今晩は、Eclipse(CDT)でC言語を勉強している初心者です、宜しくお願いします。  WorkSpaceを作成して、そこに実際に作成したファイルを保存しています。  これをもし、コマンドプロンプトから動作させようとすると、どのファイルをどのように呼び出して、実行させて やればよいのでしょうか。  因みにEclipseのフォルダの中には、GNU>gcc>binというフォルダ構成?となっています。  また、GNU、gccのそれぞれの役割みたいなものはどういう意味でしょうか。  コンパイラらしきものというのはわかるのですが、色々と本を調べると、GNU、gccのどちらもコンパイラという風には 書いているのですが.........

  • PHPでは、あんま大きなプログラムは作れないの?

    PHPでは、あんま大きなプログラムは作れないの? だって、変数の宣言が必要ないから。 変数の宣言が必要ない、ってことは、 おかしな変数があっても、コンパイラーが 事前にチェックできないってことだし。 つまりそれって、デバッグが難しくなるってことでしょう? だから、 「デバッグがめんどくなってきたな、、、」 と感じたら、それは、そろそろJavaとかに 移行しろ、っていう、神からのメッセージでしょ? 変数を使うにあたって、あらかじめ、 宣言が必要な言語であれば、 宣言の無い変数が登場した段階でエラーではじくし、 デバッグも容易になるよね。 つまりそれって、プログラムが大規模になってきたら、 そういう厳密系な言語にシフトしたほうが ストレスがたまらなくっていいってことでしょう?

    • ベストアンサー
    • PHP
  • ヒストグラム平均化のアルゴリズム

    画像をヒストグラム平均化処理するプログラムを 作成したいのですが,具体的なアルゴリズムが わかりません.どなたか,教えてください.