我已经完成了从 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;
}
用 clang++ 或 g++ 编译 C++ 版本,我得到输出:-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 位小数,因此我更容易发现移植差异。
周围有 Fortran 大师吗?谢谢!