6

Fortran と C++ で計算された数値は、はるかに類似していると言っても過言ではありません。ただし、私が経験したことから、計算された数値は、小数点以下の桁数が少なすぎると発散し始めることがわかりました。以前の言語から後者の言語に一部のレガシー コードを移植するプロセス中に、この問題に遭遇しました。元の Fortran 77 コード...

  INTEGER M, ROUND
  DOUBLE PRECISION NUMERATOR, DENOMINATOR

  M = 2
  ROUND = 1
  NUMERATOR=5./((M-1+(1.3**M))**1.8)
  DENOMINATOR = 0.7714+0.2286*(ROUND**3.82)
  WRITE (*, '(F20.15)') NUMERATOR/DENOMINATOR
  STOP

... 0.842201471328735を出力しますが、C++ と同等です...

int m = 2;
int round = 1;
long double numerator = 5.0 / pow((m-1)+pow(1.3, m), 1.8);
long double denominator = 0.7714 + 0.2286 * pow(round, 3.82);
std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(15)
          << numerator/denominator << std::endl;
exit(1);

... 0.842201286195064を返します。つまり、計算された値は、小数点以下 6 桁までしか等しくありません。特に Fortran の支持者というわけではありませんが、数値計算機としての正当な評判を考えると、その結果を「正しい」ものと見なす傾向があると感じています。ただし、この計算値の違いの原因については興味があります。この不一致の理由を知っている人はいますか?

4

1 に答える 1

11

Fortran では、デフォルトで浮動小数点リテラルは単精度ですが、C/C++ では倍精度です。

したがって、Fortran コードでは、NUMERATOR を計算する式は単精度で行われます。最終結果を NUMERATOR 変数に代入する場合にのみ、倍精度に変換されます。

そして、DENOMINATOR 変数に割り当てられた値を計算する式についても同じことが言えます。

于 2010-05-03T10:46:22.867 に答える