ようこそ!CONFLEX iNSIDEへ!



 このブログでは,CONFLEXと呼ばれる 計算化学システムの開発陣が,計算化学を応援するための記事と,それと無関係(?)なネタや画像(写真)をアップしていく予定です.





 内容はどうしても化学者向けが中心になるので,一般の方には化学業界用語(?)などちょっと難しいかもしれません.けど,できるだけわかりやすく書いていきたいと思います.



人気blogランキングにほんブログ村 科学ブログにもエントリーしてますので,クリックをお願いします.


ということで,最新記事をどうぞ↓↓↓

2007年3月10日土曜日

「計算化学の計算結果はいつも正しいの?」-浮動小数点演算の落とし穴-




 計算化学に限らず、計算機上でソフトウェアを走らせれば、なんとなく“数値”は得られます。計算機を使う上で重要なのは、得られた数値の信頼性・妥当性を注意深く吟味しながら、計算結果から(計算化学の場合は化学的に)重要な知見を得ることです。問題の規模や質に対して近似法の向き・不向き、あるいはソフトの得て・不得手もあります。こうした計算の限界や制約を考慮すれば、計算機シミュレーションは(計算化学は化学の)研究開発の有用なツールとなります。反面こういった吟味無しに利用すると手痛いしっぺ返しにあうこと請け合いです。

 落とし穴の簡単な例をご紹介します。私がこの例を知ったとき、
なんか頭をごつんとやられた感じ

がしました。S. M. RumpがRound off errorの例として、"Reliability in computing: the role of interval methods in scientific computing" に紹介したものです [1]。Round off errorは、日本語では、情報落ちとして知られています。計算式は浮動小数点演算が40回程度のとっても簡単なものです。


  f(x,y) = 333.75y6 + x2(11x2y2 – y6 – 121y4 – 2) + 5.5y8 + x/(2y)

x = 77617, y = 33096の時、SUN SPARCstation/SLCでFortranプログラムで計算すると、

  (単精度) f = 6.33825 × 1029
  (倍精度) f = 1.1726039400532
  (4倍精度)f = 1.1726039400531786318588349045201838

正しい値は、可変長区間演算を用いて40桁表示すると、

  (-0:827396059946821368141165095479816292005,
   -0:827396059946821368141165095479816291986)


です。つまり、正しい答えは負の値(-0.83)ですが、計算値は正の値(1.17)です。一般に単精度演算より倍精度演算のほうが精度が高く、倍精度より4倍精度の方が正確ですが、このような背筋が寒くなるような例もあります。確かに計算機で用いられている浮動小数点演算は誤差が大きいのですが、たかだか40回程度の浮動小数点演算でこのようなことが起こることは驚きです。現在、ノートブックPCでも1秒間に1億回以上の演算が可能です。得られた答えの信頼性・妥当性を注意深く吟味するためには、計算対象に対する広い知識と洞察力が必要です。

 CONFLEX iNSIDEは計算化学を応援しています。




Reference:
  • [1] Siegfried M. Rump, "Algorithms for verified inclusions - theory and practice" in "Academic Press Perspectives In Computing; Vol. 19, Reliability in computing: the role of interval methods in scientific computing", Ramon E. Moore, Ed., Academic Press Professional, Inc., San Diego(CA), 1988, pp. 109-126.





2 件のコメント:

匿名 さんのコメント...

興味深いので,この式をExcelでやってみました.

A1にxの値77617,A2にyの値33096が入っているとして...

=333.75*A2*A2*A2*A2*A2*A2 + A1*A1*(11*A1*A1*A2*A2 - A2*A2*A2*A2*A2*A2 - 121*A2*A2*A2*A2 - 2) + 5.5*A2*A2*A2*A2*A2*A2*A2*A2 + A1/(2*A2)

という式を入力すると,なるほど間違っているなりに正しい値(1.17260394005318)が出てきます.

面白いことに,括弧内の”A2*A2*A2*A2*A2*A2”という記述を”A2^6”に変更すると...
不思議なことに,間違っている上に間違った値(-2.36118324143482E+21)が出てきます.

数値計算をする上で,これはとても厄介な問題ですなあ.

CONFLEX Master さんのコメント...

ロビーさん、コメントどうもありがとうございます。

なるほど、この例からExcelが倍精度で計算していることがわかりますが、同じように情報落ちしていますね。

ちなみに、”A2*A2*A2*A2*A2*A2*A2*A2”を”A2^8”としても、間違っている上に間違った値(1.18059162071741E+21)が出てきました.怖い話です。

今後ともよろしくお願いいたします。