Fortran から C++ への移植を完了しましたが、COMPLEX 型にいくつかの違いがあることを発見しました。次のコードを検討してください。
PROGRAM CMPLX
COMPLEX*16 c
REAL*8 a
c = (1.23456789, 3.45678901)
a = AIMAG(1.0 / c)
WRITE (*, *) a
END
そしてC++:
#include <complex>
#include <iostream>
#include <iomanip>
int main()
{
std::complex<double> c(1.23456789, 3.45678901);
double a = (1.0 / c).imag();
std::cout << std::setprecision(15) << " " << a << std::endl;
}
C++ バージョンを clang++ または g++ でコンパイルすると、次の出力が得られます: -0.256561150444368 ただし、Fortran バージョンをコンパイルすると、-0.25656115049876993 が得られます。
つまり、どちらの言語も IEEE 754 に従っているのではないですか? Octave(Matlab)で次を実行すると:
octave:1> c=1.23456789+ 3.45678901i
c = 1.2346 + 3.4568i
octave:2> c
c = 1.2346 + 3.4568i
octave:3> output_precision(15)
octave:4> c
c = 1.23456789000000e+00 + 3.45678901000000e+00i
octave:5> 1 / c
ans = 9.16290109820952e-02 - 2.56561150444368e-01i
C++ バージョンと同じ結果が得られます。Fortran の COMPLEX 型はどうなっていますか? いくつかのコンパイラ フラグがありませんか? -ffast-math は何も変更しません。C++ と Fortran でまったく同じ 15 の 10 進数を生成したいので、移植の違いを簡単に見つけることができます。
Fortran の専門家はいますか? ありがとう!