• ベストアンサー

コンパイル環境の違いによる、浮動少数点の違い

不動少数(float)を使った、c言語の演算プログラムを作っています。 Aマシン(CentOS5, gcc3.4)でコンパイルした、"test_a.so"と"test_a.a"について、 Aマシンで実行した結果、両者の結果は一致します。 Bマシン(Fedora5, gcc3.0)でコンパイルした、"test_b.so"と"test_b.a"について、 Bマシンで実行した結果、両者の結果は一致します。 Aマシンで実行した結果、両者の結果が異なります。 結果の比較をすると、以下のようになります。 "test_a.so"=="test_a.a"!="test_b.so"!="test_b.a" (1)コンパイル環境と実行環境が違うと、浮動少数の演算に違いがでることがありますか? (2)コンパイル環境と実行環境が違うと、so と aに違いがでることがありますか? 上記2点について、ご存知の方いらっしゃいましたら教えてください。 お願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • arain
  • ベストアンサー率27% (292/1049)
回答No.2

ちなみに、 "test_a.so"と"test_a.a"をBマシンで実行した結果はどうなりますか? 理屈だけで言えば、 ・コンパイルラによるの構文解析及び変換処理の違い ・実行ファイルが使用する浮動小数点ライブラリの違い で結果が変わる可能性はあります。

mozori01
質問者

お礼

ご回答ありがとうございます。 >"test_a.so"と"test_a.a"をBマシンで実行した結果はどうなりますか? 結果が一致しました。 一致することもあるみたいです。 環境により変わる可能性がある。ということがわかれば、 とりあえず現時点で問題は無いと判断できます。 ありがとうございました。

その他の回答 (2)

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

(1)も(2)も、可能性としては「あります」としかいえません。 テストに用いたソースコード、コンパイルオプション、その他必要な情報を補足してください。

mozori01
質問者

お礼

ご回答ありがとうございます。 すいません、具体的な情報は載せることができません。 可能性としてあることがわかれば、現時点でとりあえず問題解決できそうです。 (結果の違いによる誤差は問題ない範囲のため。) ありがとうございました。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

どんな計算をしたときに結果がどう異なるのか、具体的に示すことは可能ですか? なお、「浮動小数点数」が正しい呼び名です。「少」ではなくて「小」です。

mozori01
質問者

補足

ご回答&補足ありがとうございます。 非常に膨大な計算をしているため、具体的に示すことはできません。 申し訳ございません。

関連するQ&A

  • VC6における浮動少数点数値について

    はじめて質問させて頂きます。 C言語の基礎演習レベルの題材ですが 想定外の結果が表示され解決できておりません。 内容としては2つのfloat型変数(以下ソースのb,c)に 全く同じ演算処理結果を代入し コンソール表示させるというプログラムです。 #include <stdio.h> void main() { float a = 0, k = 0; float b = 0; float c = 0; a = 0.2; k = 20.0; k += a; b = k - 20.0; c = k - 20.0; printf( "%f %f %f %f\n", a, b, c, k ); if( b == c ) { printf( "*\n" ); } while( getchar() != EOF ){} } 予想実行結果: 0.200000 0.200000 0.200000 20.200000 * 実際の結果: 0.200000 0.200000 0.200001 20.200001 当方、浮動少数点数値の扱いにも不慣れな為、原因不明です。 なぜこのような結果になるのか、どなたかご教授頂けないでしょうか。 宜しくお願い致します。

  • コンパイル ./aと./a.out の違い

    ほんとにcの初心者なのですが、 今Tera Termを使って、ソースを書いて、コンパイル、実行をしているのですが、 例えばtest.cというファイルを gcc test.c とやってコンパイルして、 a.outというファイルができます。 それを./aとやれば実行できると聞いてやってみたのですができません。 ./a.outはできるのですが なぜなのでしょうか??

  • C90とC99の計算結果の違い?

    C言語の質問です。 gcc version 4.3.2 (Ubuntu 4.3.2-1ubuntu12) 以下のプログラムをgccでコンパイル・実行すると(1)に入り,"a"が出力されます。unsigned intの計算なのでラップアラウンドが生じtest=4294716272となるのは私の期待どおりです。 ただ、gcc -std=c99でコンパイル・実行すると(2)に入り,"b"が出力されました。c99でコンパイル・実行すると計算結果がなぜ異なっているのかが分かりません。 long test = 0; unsigned int x = 184; unsigned int y = 251208; test = (x-y); if(test == 4294716272){ printf("a");// (1) }else if(test == -251024){ printf("b"); // (2) }

  • 浮動小数演算は実行環境の変化に応じて異なる結果に?

    プログラム(C++)について質問があります. 浮動小数演算を用いると,実行環境の変化に応じて結果が変わってしまうのでしょうか? プログラム中ではdouble演算を頻繁に用いています. (ソースコードは膨大すぎるため,申し訳ありませんが載せることが出来ません.) 小数演算をするために何気なくdouble(もしくはfloat)を使っていました. しかし,コンパイル後の実行ファイルを実行する環境に応じて結果が変わってしまうのでは・・・と思い始めました. そこで,ご質問なのですが, ・浮動小数を扱うと,実行環境(プロセッサ?)に応じて,結果は変わってしまいますか? また,もし誤差が生じてしまうならば,何か対処する方法はありますでしょうか? (整数演算にしろ!・・・と言うのは無しにさせて頂きます.) 初歩的な質問だと思いますが,宜しくお願い致します.

  • cygwinでクロスコンパイル環境の構築

    最新のcygwinをインストールしました、 (basicとgccを選択しインストールしました)。 CPUがARM9のクロスコンパイル環境を作成したいのですが、どなたかコンパイル方法を教えていただけないでしょうか? ARM7のコンパイル方法は以下のURLにあります http://www.tobysoft.net/wiki/index.php?Cygwin%2F%A5%AF%A5%ED%A5%B9%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB%B4%C4%B6%AD%A4%CE%B9%BD%C3%DB#w4ed454e

  • SolarisのプログラムをWindows環境でコンパイル

    Solaris環境でコンパイルを指定された、c言語で書かれたプログラムを Windows環境でコンパイル・実行するにはどうしたらよろしいでしょうか? 仮想マシン以外でありましたらよろしくお願いします。 makefile CC = gcc -g all: s s : s.o t.o s.o : s.c t.h t.o : t.c t.h clean: -rm s *.o out? core*

  • gccのコンパイルの結果ファイルは他のlinux環境で動きますか?

    gccのコンパイルの結果ファイルは他のlinux環境で動きますか? ソースコードを他のlinux環境に入れて再コンパイルする必要はありますか?

  • 32bitでコンパイルするには

    お世話になっております。 CentOSの64ビットマシンを使っています。 C言語の簡単なサンプルとして、ポインタ変数の長さを表示するプログラム(sizeof(ポンタ変数)をprintf)を作りました。 これをコンパイルして実行すると8と表示されますので、64bitとアプリケーションとしてコンパイルされたのだろうと思います。 次に32Bitアプリケーションとしてコンパイルするために-m32オプションを付けてコンパイルしたところ、以下のとおりエラーが出てしまい困っております。 gcc -m32 -o sample sample.c /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.4.7/libgcc_s.so when searching for -lgcc_s /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.4.7/libgcc_s.so when searching for -lgcc_s /usr/bin/ld: cannot find -lgcc_s collect2: ld returned 1 exit status 解決方法について教えていただければ幸いです。 コンパイラは、gcc-4.4.7-3.el6.x86_64をインストールしています。 よろしくお願いします。

  • gcc コンパイル killed

    gccでC言語で書いたコードをコンパイルしたところ コンパイルには成功したのですが 実行してみると killed と表示されてしまいます #include <stdio.h> int main(){ printf("TEST\n"); return 0; } こんな簡単なものでもコンパイル後、実行すると killedと表示されTESTと表示されません $gcc test.c -o test $./test killed $ この様になります。ldid -Sでコンパイルされたファイルを直すことは可能なのですが どのコードでも毎回、killedという表示になってしまいます 毎回毎回コンパイル後にldidコマンドを使用するのも嫌なので直したいのですが "再インストール以外"の方法で直してみたいです。今後、同じようなエラーが起きた際、役にも立ちますし、Cについての勉強にもなりますので (再インストールでは詳しい原因がわかりません) 原因をご存知の方がいましたらよろしくお願いします。(Linux)

  • コンパイルできない...

    学校のC言語のレポートを家でやろうと思ったのですが、ソースコードを変更していないのにコンパイル時にエラーがでます。おそらく環境の違いによるものだと思うのですが、そのへんには非常に疎いもので教えていただけないでしょうか? 実行したコンパイルは gcc -g -o abc abc.c fft.o -lm です。 学校はRed Hat Linuxで自宅はWindowsなのでcygwinを用いています。エラー文ではfft.oがうまく取り込めていないみたいです。

専門家に質問してみよう