• 締切済み

VisualBasic と Fortran の計算結果の相違

以下のような技術的な計算式があります。 C=8.9×107[7:べき数]×S/(X-Xa)2[2:べき数]×exp(-35.1×(Y-Ya)2[2:べき数]/(X-Xa)2[2:べき数]))- 221.1×H2[2:べき数] /(X-Xa)2 [2:べき数] 使用変数などの値の大まかな範囲   C : 求める変数   X,Y,Xa,Ya:0~20000 S:0~500   H:10~200 この式をVISUAL BASIC FOR EXCELとFORTRANでそれぞれ単精度計算した場合では,結果が小数点第3位ぐらいで相違があるのですが,当方のプログラムミスか言語が違うことによることなのか,どなたか教えてください。結構困っています。  よろしくお願いします。

みんなの回答

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.2

#1で述べたのはあくまで一般論です。 実際にどのくらいの誤差がでるかはやってみないと分かりません。 >exp(X)の計算では,Xの値が同じであれば,VisualBasicとFortranは同じ結果になるのでしょうか。 有効桁数までは同じだとは思いますが、その先はどうなるか分かりません。(違うかもしれないし、同じかもしれない) プログラムはマシン語に翻訳されて実行されます。 マシン語の計算は加減乗除しかありませんからexp(X)のような関数は、コンパイラによって加減乗除だけの式に変換されます。どのような式に変換されるかはコンパイラによって違いますから、計算結果が同じになるとは期待しないほうがいいでしょう。

magurored
質問者

お礼

大変参考になり,頭の中が整理できました。 お忙しい中,ご回答ありがとうございました。

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

結果が小数点第3位ぐらいで相違とありますが、同じ数字の桁数はどのくらいなのでしょうか? 単精度の有効桁数は6~7桁です。 この有効桁数は加減乗除などの計算を繰り返すことによってだんだんと少なくなっていきます。 また、計算式によっては、この有効桁数が大幅に減少する場合があります。例えば、 1000012312 - 1000012105 = 207 この計算結果の207は精度的には全く意味を持ちません。 VisualBasicとFortranで全く同じ計算をしたとしても、それぞれのコンパイラは独自に計算式を最適化をしていますから、有効桁数以降の桁については微妙に違ってきます。 その誤差は計算を繰り返すことによってさらに広がっていきますから、最終結果にどのくらいの誤差が出るは常に考えておく必要があります。 (誤算論という分野があるくらい難しい問題です) 技術計算などで複雑な計算をする場合は、少なくとも単精度ではなく倍精度を使うべきだと思います。

magurored
質問者

お礼

ご回答ありがとうございました。 例えば,(Y-Ya)2[2:べき数]で,YとYaとの値の関係から,0~15000の範囲で変化します。  exp(X)の計算では,Xの値が同じであれば,VisualBasicとFortranは同じ結果になるのでしょうか。  出来ましたらご教授お願いします。

関連するQ&A