
Visual C++(2005)付属のコマンドラインのコンパイラを使って(cl)コンパイルしたプログラムでは、出力したい値を格納するdouble型の変数の値が、-1.#IND00となってしまうのに対して、
まったく同じソースをgccでコンパイルした場合には、普通の数値が正常に出力され、その値は事前の予想どおりの傾向を持っていることから、まちがってはいないようです。
clではうまくいかず、gccではうまくいくのはなぜなのでしょうか。
関係があるかどうかわかりませんが、値の算出の過程でrand()を使っています。
No.5ベストアンサー
- 回答日時:
浮動小数点は誤差がつき物ですよね
#INDは不定のときに表示されるようなので誤差が重なって0.0 / 0.0 みたいな値になったのでしょう
ソースがないのではっきりはわかりませんが。
この回答への補足
rand()を使用したのは、ボックス・ミューラー法を用いるためで、
r1=(double)rand()/RAND_MAX;
r2=(double)rand()/RAND_MAX;
で、
"sqrt(-2*log(r1)) * cos(2*Pi*r2)"に続くのですが、ここでdouble型の範囲をこえてしまっていたようです。
0/0がどこかで生じていないかソースを確認しながら、再度ボックス・ミューラー法を調べる過程で見つけたページで理解しました。
(http://detail.chiebukuro.yahoo.co.jp/qa/question …)
gccでは工夫なしにうまくいく理由がわかりませんが、原因はわかりました。

No.3
- 回答日時:
何かしらバグがあるとしか言えません。
そもそもコンパイラが別物なので、たまたまうまくいっちゃったとか、言語仕様の観点からは間違ってないのにうまくいかないということも多々あります。
極端な例では、デフォルトで stdio.h をインクルードする仕様のコンパイラで学習をしていた子が、それに慣れたせいでVC++ではコンソールに文字列を表示することすらできなかったというケースがありました。
この回答への補足
変数のサイズをこえた値が出てきていたようです。あふれそうなときには、乱数を作り直す処理を加えれば、正常に値が求まりました。
gccではそのような工夫なしにうまくいっていたのが不思議なのですが、原因だけははっきりしました。
No.2
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CPUが16bitでも32bitOSでコンパ...
-
io.hをincludeするとそのような...
-
C++でアボート(Abort)で処理が...
-
Visual C++とVisual C++.NETの違い
-
0除算して、落ちるプログラムと...
-
コンパイルできない
-
ABAQUS ユーザーサブルーチン...
-
ファイルの開き方
-
CASLIIのプログラム(並び替え...
-
あるプログラムのコマンドライ...
-
正しい五十音順について
-
Bluestacks内でダウンロードし...
-
変化させるセルが変化しない
-
寿命
-
65536は2の何乗なのでしょうか?
-
自動クエリとはどういうもので...
-
Excelで4096点以上のFFTの方法
-
バッチファイルでUSB挿入時に実行
-
フローチャートの菱形が狭い。。。
-
VBAで仕様書は書きますか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
C++ で、「)」が必要 というエ...
-
C++でアボート(Abort)で処理が...
-
io.hをincludeするとそのような...
-
CPUが16bitでも32bitOSでコンパ...
-
graph.hがincludeできない
-
ABAQUS ユーザーサブルーチン...
-
Visual C++とVisual C++.NETの違い
-
Eclipseの環境設定について
-
変数(関数)名の頭に_
-
fortranでのNaNについて
-
PICマイコンによる乱数の表示に...
-
コンパイラについて
-
バイナリファイルとソースコー...
-
コンパイラの制限 : ヒープの領...
-
コンパイルできない
-
移植性の高いmakefileの作成
-
何も書いて無いのに警告が出る...
-
C/C++のインラインアセンブラに...
-
FORTRANとC++の連動について
おすすめ情報