[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[linux-users:94068] Re: コンパイラにより解析結果が異なる


塩崎です。


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.

この情報があなたの探していたものかどうか選択してください。
yes/まさにこれだ!   no/違うなぁ   part/一部見つかった   try/これで試してみる

あなたが探していた情報はどのようなことか、ご自由に記入下さい。特に「まさにこれだ!」と言う場合は記入をお願いします。
例:「複数のマシンからCATV経由でipmasqueradeを利用してWebを参照したい場合の設定について」
Follow-Ups: References: