C++ 和 Fortran 中的不同精度

EL *_*ine 4 c++ double fortran fortran77

对于我正在处理的项目,我用 C++ 编写了一个非常简单的函数:

Fne(x) = 0.124*x*x,问题是当我计算函数的值时

对于x = 3.8938458092314270Fortran 77 和 C++ 语言,我得到了不同的精确度。

对于 Fortran,我得到了,Fne(x) = 1.8800923323458316而对于 C++,我得到了Fne(x) = 1.8800923630725743. 对于这两种语言,Fne 函数都针对双精度值进行编码,并且还返回双精度值。

C++代码:

double FNe(double X) {
    double FNe_out;
    FNe_out = 0.124*pow(X,2.0);
    return FNe_out;
}
Run Code Online (Sandbox Code Playgroud)

Fortran 代码:

  real*8 function FNe(X)
  implicit real*8 (a-h,o-z)
  FNe = 0.124*X*X
  return
  end
Run Code Online (Sandbox Code Playgroud)

你能帮我找出这种差异的来源吗?

Hig*_*ark 7

差异的一个来源是 C++ 和 Fortran 对文字常量的默认处理,例如您的0.124. 默认情况下,Fortran 会将其视为单精度浮点数(在您可能使用的几乎所有计算机和编译器组合上),而 C++ 会将其视为双精度 fp 数。

在 Fortran 中,您可以kind通过像这样添加种类选择器后缀来指定fp 数字(或任何其他与此相关的内在数字常量,并且没有任何编译器选项来更改最可能的默认行为)的

0.124_8
Run Code Online (Sandbox Code Playgroud)

试试看,看看结果如何。

哦,当我在写的时候,你为什么像 1977 年那样写 Fortran?和所有其他的Fortran专家溜,是的,我知道,*8_8是不是最好的做法,但我没有在目前的时间上所有的扩展。