塩崎です。 From: Haruhiko Okumura <okumura _at_ matsusaka-u.ac.jp> Subject: [linux-users:94067] Re: コンパイラにより解析結果が異なる Date: Wed, 17 Jul 2002 21:24:22 +0900 Message-ID: <20020717.212413.112625138.okumura _at_ matsusaka-u.ac.jp> > kameoka> 最適化を外してみると、それぞれ微妙に結果が変わったので、やはりコーディ > kameoka> ングに問題があるようですね。gcc-3.0.4だけは最適化しなくても同じ結果に > kameoka> なりました。 > > いえ,必ずしもコーディングに問題があるとは限りません。オプティマイズす > るとしないとでは途中を x86 の80ビットで計算するか64ビット double で計 > 算するか(格納するか,のほうが正しいですね)の違いがありうるので,結果 > は一般に異なります。大幅に異なればコンパイラのオプティマイザのバグに引っ > 掛かった可能性が大きく,小幅に異なるのは正常ですが,それがどれくらいか > は問題の性質によります。 実際、 double a,b,c,d; ... a = b*c*d; という単純なコードですら、ISO C の規格はこの掛け算をどういう順番で 評価するかを規定してないし、プロセッサ固有の最適化によって精度が 変化するケースもあるので、コンパイラや最適化オプションの違いに よって a に格納される「ビットパターン」は異なるのが一般的ですね。 結局のところ、浮動小数点数だと「同値」を判定するのも難しくて、 たとえば無邪気に double a, b; ... if (a==b) { ... } とやると意図しない結果になったりするわけです。 したがって、結果に対してどの程度の差までを許容するかをプログラムの 設計段階から定量的に考える必要があるし、それを満たせないほどの 誤差があるのならば、それは「コーディング(あるいは設計)に問題がある」 ということになりますね。 この辺の話は、大昔の C マガジンをひっくり返すと年に 1 回は載って ましたけど、最近はどうなんでしょうね。 書籍ならば、別の方が書いていた「数値計算の常識」はお薦めです。 # 伊理先生の(情報数学なのか語学なのかよくわからない)授業を受けてた。 では。 -- Takuya SHIOZAKI / ASTEC Products, Inc.
Follow-Ups:
- [linux-users:94071] Re: コンパイラにより解析結果が異なるSatoru Kameoka
- [linux-users:94048] Re: コンパイラにより解析結果が異なるHaruhiko Okumura
- [linux-users:94065] Re: コンパイラにより解析結果が異なるSatoru Kameoka
- [linux-users:94067] Re: コンパイラにより解析結果が異なるHaruhiko Okumura
- Prev by Subject: [linux-users:94067] Re: コンパイラにより解析結果が異なる
- Next by Subject: [linux-users:94069] Re: コンパイラにより解析結果が異なる
- Previous by thread: [linux-users:94067] Re: コンパイラにより解析結果が異なる
- Next by thread: [linux-users:94071] Re: コンパイラにより解析結果が異なる
- Indexes:[Main][Thread]